From c8504957b3c3784e35f70ec89360b7a7044575b6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 26 Jun 2024 12:40:43 +0530 Subject: [PATCH] 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