diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 943857c59e8b0a145e3750e7428da00be43dbe8b..9a3f012feef6bfe41bdc0571bf27815e21f4c075 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,7 @@ variables: TESTV_DIR: "/usr/local/testv" LTV_DIR: "/usr/local/ltv" EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" - REFERENCE_TAG: "20231128_Update_Ittiam" + REFERENCE_BRANCH: "ivas-float-update" BUILD_OUTPUT: "build_output.txt" SCRIPTS_DIR: "/usr/local/scripts" EXIT_CODE_NON_BE: 123 @@ -92,7 +92,8 @@ stages: .setup-codec: &setup-codec - current_commit_sha=$(git rev-parse HEAD) ### build reference binaries - - git checkout $REFERENCE_TAG + - git checkout $REFERENCE_BRANCH + - git pull - make clean - make -j - mv ./IVAS_cod ./IVAS_cod_ref @@ -328,15 +329,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-mld-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-mld-anchor ivas-pytest-mld-dec: extends: @@ -349,15 +350,15 @@ ivas-pytest-mld-dec: - LEVEL_SCALING=1.0 <<: *ivas-pytest-mld-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-mld-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-mld-anchor ivas-pytest-mld-dec-lev-10: extends: @@ -370,15 +371,15 @@ ivas-pytest-mld-dec-lev-10: - LEVEL_SCALING=0.3162 <<: *ivas-pytest-mld-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-mld-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-mld-anchor ivas-pytest-mld-dec-lev+10: extends: diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index f51c45ee2c6a8e8a78acc0398424acdae26b664a..d6e4a7c672d91bb76b7e3e30fdca199c56285df7 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -297,6 +297,7 @@ + diff --git a/apps/renderer.c b/apps/renderer.c index bbc4213a17c246144aca1915a32a3bc846e55ddb..bafeec725a15ec43f098b528366779da6b75273a 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -643,6 +643,7 @@ int main( #ifdef IVAS_FLOAT_FIXED Word32 *outInt32Buffer; Word32 *inInt32Buffer; + Word32 gain_fx; #endif float *outFloatBuffer; IVAS_REND_AudioBuffer inBuffer; @@ -933,7 +934,9 @@ int main( } IVAS_REND_LfePanMtx lfePanMatrix; - +#ifdef IVAS_FLOAT_FIXED + IVAS_REND_LfePanMtx_fx lfePanMatrix_fx; +#endif /* parse input LFE panning matrix */ if ( args.lfeCustomRoutingEnabled && !isEmptyString( args.inLfePanningMatrixFile ) ) { @@ -968,17 +971,33 @@ int main( for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { +#ifndef IVAS_FLOAT_FIXED if ( ( error = IVAS_REND_AddInput( hIvasRend, args.inConfig.multiChannelBuses[i].audioConfig, &mcIds[i] ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } - if ( ( error = IVAS_REND_SetInputGain( hIvasRend, mcIds[i], args.inputGainGlobal * dBToLin( args.inConfig.multiChannelBuses[i].gain_dB ) ) ) != IVAS_ERR_OK ) + if ((error = IVAS_REND_SetInputGain(hIvasRend, mcIds[i], args.inputGainGlobal * dBToLin(args.inConfig.multiChannelBuses[i].gain_dB))) != IVAS_ERR_OK) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } +#else + IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.multiChannelBuses[i].audioConfig, &mcIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + gain_fx = (Word32) ( ( args.inputGainGlobal * dBToLin( args.inConfig.multiChannelBuses[i].gain_dB ) ) * ( 1u << 30 ) ); + + IF ((error = IVAS_REND_SetInputGain_fx(hIvasRend, mcIds[i], gain_fx)) != IVAS_ERR_OK) { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } +#endif if ( args.inConfig.multiChannelBuses[i].audioConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { @@ -998,7 +1017,16 @@ int main( args.lfePanningEnabled = false; } +#ifdef IVAS_FLOAT_FIXED + FOR( Word16 k = 0; k < IVAS_MAX_OUTPUT_CHANNELS; k++ ) + { + ( *lfePanMatrix_fx )[k] = (Word32) ( ( *lfePanMatrix )[k] * ( 1u << 31 ) ); + } + + IF ( ( error = IVAS_REND_SetInputLfeMtx_fx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx_fx *) &lfePanMatrix_fx ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_SetInputLfeMtx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx *) &lfePanMatrix ) ) != IVAS_ERR_OK ) +#endif // IVAS_FLOAT_FIXED { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1007,7 +1035,12 @@ int main( /* set panning gains for input LFE */ else if ( args.lfePanningEnabled ) { +#ifdef IVAS_FLOAT_FIXED + Word32 inputGain = (Word32) ( args.lfeConfigGain * ( 1u << 31 ) ); + IF( ( error = IVAS_REND_SetInputLfePos_fx( hIvasRend, mcIds[i], inputGain, (Word16) args.lfeConfigAzimuth, (Word16) args.lfeConfigElevation ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_SetInputLfePos( hIvasRend, mcIds[i], args.lfeConfigGain, args.lfeConfigAzimuth, args.lfeConfigElevation ) ) != IVAS_ERR_OK ) +#endif // IVAS_FLOAT_FIXED { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1027,7 +1060,16 @@ int main( exit( -1 ); } +#ifdef IVAS_FLOAT_FIXED + FOR( Word16 k = 0; k < IVAS_MAX_OUTPUT_CHANNELS; k++ ) + { + ( *lfePanMatrix_fx )[k] = (Word32) ( ( *lfePanMatrix )[k] * ( 1u << 31 ) ); + } + + if ( ( error = IVAS_REND_SetInputLfeMtx_fx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx_fx *) &lfePanMatrix_fx ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_SetInputLfeMtx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx *) &lfePanMatrix ) ) != IVAS_ERR_OK ) +#endif // IVAS_FLOAT_FIXED { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1036,7 +1078,12 @@ int main( /* set position based gains */ else { +#ifdef IVAS_FLOAT_FIXED + Word32 inputGain = (Word32) ( lfeRoutingConfigs[i]->lfe_gain_dB * ( 1u << 31 ) ); + IF( ( error = IVAS_REND_SetInputLfePos_fx( hIvasRend, mcIds[i], inputGain, (Word16) lfeRoutingConfigs[i]->lfe_azi, (Word16) lfeRoutingConfigs[i]->lfe_ele ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_SetInputLfePos( hIvasRend, mcIds[i], lfeRoutingConfigs[i]->lfe_gain_dB, lfeRoutingConfigs[i]->lfe_azi, lfeRoutingConfigs[i]->lfe_ele ) ) != IVAS_ERR_OK ) +#endif // IVAS_FLOAT_FIXED { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1046,6 +1093,7 @@ int main( } } +#ifndef IVAS_FLOAT_FIXED for ( i = 0; i < args.inConfig.numAudioObjects; ++i ) { if ( ( error = IVAS_REND_AddInput( hIvasRend, IVAS_AUDIO_CONFIG_OBA, &ismIds[i] ) ) != IVAS_ERR_OK ) @@ -1082,7 +1130,6 @@ int main( } } - for ( i = 0; i < args.inConfig.numMasaBuses; ++i ) { if ( ( error = IVAS_REND_AddInput( hIvasRend, args.inConfig.masaBuses[i].audioConfig, &masaIds[i] ) ) != IVAS_ERR_OK ) @@ -1097,6 +1144,61 @@ int main( exit( -1 ); } } +#else + FOR ( i = 0; i < args.inConfig.numAudioObjects; ++i ) + { + IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, IVAS_AUDIO_CONFIG_OBA, &ismIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + gain_fx = (Word32) ( args.inputGainGlobal * dBToLin( args.inConfig.audioObjects[i].gain_dB ) * ( 1u << 30 ) ); + IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, ismIds[i], gain_fx) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + /* With MASA output, all objects are handled at once, so add only one input having all objects in it */ + IF ( EQ_32(args.outConfig.audioConfig, IVAS_AUDIO_CONFIG_MASA1) || EQ_32(args.outConfig.audioConfig, IVAS_AUDIO_CONFIG_MASA2) ) + { + BREAK; + } + } + + FOR ( i = 0; i < args.inConfig.numAmbisonicsBuses; ++i ) + { + IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.ambisonicsBuses[i].audioConfig, &sbaIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + gain_fx = (Word32) ( args.inputGainGlobal * dBToLin( args.inConfig.ambisonicsBuses[i].gain_dB ) * ( 1u << 30 ) ); + IF ( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, sbaIds[i], gain_fx ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + FOR ( i = 0; i < args.inConfig.numMasaBuses; ++i ) + { + IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.masaBuses[i].audioConfig, &masaIds[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + gain_fx = (Word32) ( ( args.inputGainGlobal * dBToLin( args.inConfig.masaBuses[i].gain_dB ) ) * ( 1u << 30 ) ); + IF ( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, masaIds[i], gain_fx) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } +#endif // !IVAS_FLOAT_FIXED const int16_t totalNumInChannels = getTotalNumInChannels( hIvasRend, mcIds, ismIds, sbaIds, masaIds ); diff --git a/lib_com/arith_coder_fx.c b/lib_com/arith_coder_fx.c index 5fd4b472ea59005fd821661a2d48d5aa0705c583..ceb9b07dea791a277fa543a0c52861272d4645f3 100644 --- a/lib_com/arith_coder_fx.c +++ b/lib_com/arith_coder_fx.c @@ -87,7 +87,7 @@ Word32 expfp( /* o: Q31 */ * Returns: *pout1 = ( (base/65536)^(2*exp - 1) ) * 65536 * *pout2 = ( (base/65536)^(2*exp + 1) ) * 65536 * - * NOTE: This function must be in sync with ari_decode_14bits_pow() */ + * NOTE: This function must be in sync with ari_decode_14bits_pow_fx() */ void powfp_odd2( const Word16 base, /* Q15 */ const Word16 exp, /* Q0 */ diff --git a/lib_com/basop32.h b/lib_com/basop32.h index b0ad2a428b6b4e522d852f49fd98042d48027d34..372348816258225f5af55a0d20a2d9afce3a557c 100644 --- a/lib_com/basop32.h +++ b/lib_com/basop32.h @@ -239,6 +239,7 @@ Word32 L_abs( Word32 L_var1 ); /* Word32 DEPR_L_sat_co( Word32 L_var1, Flag Overflow, Flag Carry ); /* Long saturation, 4 */ Word16 norm_s( Word16 var1 ); /* Short norm, 1 */ Word16 div_s( Word16 var1, Word16 var2 ); /* Short division, 18 */ +Word32 div_w(Word32 L_num, Word32 L_den); Word16 norm_l( Word32 L_var1 ); /* Long norm, 1 */ #endif /* BASOP_NOGLOB */ diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index 40a3c3baa3383cc9259916dcd42483bf7f46f6d2..2760f4feb2a305deea136d65d2cda99aac9ca0d9 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -933,6 +933,104 @@ Word16 BASOP_Util_Divide3232_uu_1616_Scale(Word32 x, Word32 y, Word16 *s) return (z); } +Word32 div_w( Word32 L_num, Word32 L_den ) +{ + Word32 L_var_out = (Word32) 0; + Word16 iteration; + + + if ( L_den == (Word32) 0 ) + { + /* printf("Division by 0 in div_l, Fatal error in "); printStack(); */ + return ( 0 ); + } + + if ( ( L_num < (Word32) 0 ) || ( L_den < (Word32) 0 ) ) + { + /* printf("Division Error in div_l, Fatal error in "); printStack(); */ + return ( 0 ); + } + Word64 W_num, W_den; + W_num = W_deposit32_h( L_num ); + W_den = W_deposit32_h( L_den ); + + if ( W_num >= W_den ) + { + return MAX_32; + } + else + { + W_num = W_shr( W_num, (Word16) 1 ); + W_den = W_shr( W_den, (Word16) 1 ); + + for ( iteration = (Word16) 0; iteration < (Word16) 31; iteration++ ) + { + L_var_out = L_shl( L_var_out, (Word16) 1 ); + W_num = W_shl( W_num, (Word16) 1 ); + + if ( W_num >= W_den ) + { + W_num = W_sub( W_num, W_den ); + L_var_out = L_add( L_var_out, (Word32) 1 ); + } + } + + return L_var_out; + } +} + +Word32 BASOP_Util_Divide3232_Scale_cadence( Word32 x, Word32 y, Word16 *s ) +{ + Word32 z; + Word16 sx; + Word16 sy; + Word32 sign; + + /* assert (x >= (Word32)0); */ + assert( y != (Word32) 0 ); + + sign = 0; + move16(); + + IF( x < 0 ) + { + x = L_negate( x ); + sign = L_xor( sign, 1 ); + } + + IF( y < 0 ) + { + y = L_negate( y ); + sign = L_xor( sign, 1 ); + } + + IF( x == (Word32) 0 ) + { + *s = 0; + return ( (Word32) 0 ); + } + + sx = norm_l( x ); + x = L_shl( x, sx ); + x = L_shr( x, 1 ); + move16(); + *s = sub( 1, sx ); + + sy = norm_l( y ); + y = L_shl( y, sy ); + move16(); + *s = add( *s, sy ); + + z = div_w( x, y ); + + if ( sign != 0 ) + { + z = L_negate( z ); + } + + return z; +} + Word16 BASOP_Util_Divide3232_Scale(Word32 x, Word32 y, Word16 *s) { Word16 z; diff --git a/lib_com/basop_util.h b/lib_com/basop_util.h index 61b170af39e05cf657c5cfc8a228b35d6e2edad3..988fb937cbc3be601c42bc9731d812644af67939 100644 --- a/lib_com/basop_util.h +++ b/lib_com/basop_util.h @@ -325,6 +325,10 @@ Word16 BASOP_Util_Divide3232_Scale(Word32 x, /*!< i : Numerator*/ Word32 y, /*!< i : Denominator*/ Word16 *s); /*!< o : Additional scalefactor difference*/ +Word32 BASOP_Util_Divide3232_Scale_cadence(Word32 x, /*!< i : Numerator*/ + Word32 y, /*!< i : Denominator*/ + Word16 *s); /*!< o : Additional scalefactor difference*/ + /************************************************************************/ /*! diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index f8b27dd6115b81f66449d008e1d08ba8dd04eac4..10a30424705a4801e10c3e3f805731ed1a3cbdc8 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -856,12 +856,12 @@ void cldfbAnalysis_ts_fx( /* FFT of DST IV */ Word16 q_shift; - q_shift = sub(s_min(getScaleFactor32(rBuffer_fx, 2 * CLDFB_NO_CHANNELS_MAX), getScaleFactor32(iBuffer_fx, 2 * CLDFB_NO_CHANNELS_MAX)), find_guarded_bits_fx(M2)); + q_shift = sub(s_min(getScaleFactor32(rBuffer_fx, 2 * M2), getScaleFactor32(iBuffer_fx, 2 * M2)), find_guarded_bits_fx(M2)); *q_cldfb = add(*q_cldfb, q_shift); - for (Word16 ind = 0; ind < 2 * CLDFB_NO_CHANNELS_MAX; ind++) { + for (Word16 ind = 0; ind < 2 * M2; ind++) { rBuffer_fx[ind] = L_shl(rBuffer_fx[ind], q_shift); } - for (Word16 ind = 0; ind < 2 * CLDFB_NO_CHANNELS_MAX; ind++) { + for (Word16 ind = 0; ind < 2 * M2; ind++) { iBuffer_fx[ind] = L_shl(iBuffer_fx[ind], q_shift); } fft_cldfb_fx( rBuffer_fx, M2 ); @@ -878,12 +878,12 @@ void cldfbAnalysis_ts_fx( /* FFT of DCT IV */ fft_cldfb_fx( iBuffer_fx, M2 ); - q_shift = s_min(getScaleFactor32(rBuffer_fx, 2 * CLDFB_NO_CHANNELS_MAX), getScaleFactor32(iBuffer_fx, 2 * CLDFB_NO_CHANNELS_MAX)); + q_shift = s_min(getScaleFactor32(rBuffer_fx, 2 * M2), getScaleFactor32(iBuffer_fx, 2 * M2)); *q_cldfb = add(*q_cldfb, q_shift); - for (Word16 ind = 0; ind < 2 * CLDFB_NO_CHANNELS_MAX; ind++) { + for (Word16 ind = 0; ind < 2 * M2; ind++) { rBuffer_fx[ind] = L_shl(rBuffer_fx[ind], q_shift); } - for (Word16 ind = 0; ind < 2 * CLDFB_NO_CHANNELS_MAX; ind++) { + for (Word16 ind = 0; ind < 2 * M2; ind++) { iBuffer_fx[ind] = L_shl(iBuffer_fx[ind], q_shift); } @@ -1614,7 +1614,7 @@ void configureCldfb_ivas_fx( * * open and configures a CLDFB handle *--------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ @@ -1667,7 +1667,50 @@ 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 */ + const int32_t sampling_rate, /* i : sampling rate */ + CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ +) +{ + HANDLE_CLDFB_FILTER_BANK hs; + int16_t 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; + hs->prototype = prototype; + 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; + } + else + { + buf_len = hs->p_filter_length; + } + + 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; + + return IVAS_ERR_OK; +} +#endif #ifdef IVAS_FLOAT_FIXED ivas_error openCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 860fa74772bf2205c28ef11ef70d09175e531e5d..eec60bbd296fda785ba0814b0e587834536b489a 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -1745,7 +1745,7 @@ typedef enum _DCTTYPE #define MSNUMSUBFR 6 #define MSBUFLEN 5 -#define NOISE_HEADROOM 5 /* headroom of noise in generate_masking_noise */ +#define NOISE_HEADROOM 5 /* headroom of noise in generate_masking_noise_fx */ #define MSALPHACORALPHA_FLT 0.7f #define MSALPHACORMAX_FLT 0.3f diff --git a/lib_com/edct_fx.c b/lib_com/edct_fx.c index 1d1710a1b0fc33dffaca65c2f1371255f1a29793..8e3d4f5fe2f16d7daa1bfe03fe0c9118fbb3c0be 100644 --- a/lib_com/edct_fx.c +++ b/lib_com/edct_fx.c @@ -13,6 +13,9 @@ #include "math_32.h" +#ifdef IVAS_FLOAT_FIXED + + static Word16 get_edxt_factor( Word16 length ) /* Returns value of sqrtf(2.f/length) in Q15 */ { @@ -815,3 +818,4 @@ void edxt_fx( } return; } +#endif \ No newline at end of file diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index 1bfff493f685e98557f23c7f5120b02236905a73..7ebf70ec80a59a0bb8638b98b9dce72e2354441b 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -90,7 +90,7 @@ void initFdCngCom_flt( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ const float scale ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /* Calculate FFT scaling factor */ hFdCngCom->scalingFactor_flt = 1 / ( scale * scale * 8.f ); @@ -133,7 +133,7 @@ void initFdCngCom_flt( hFdCngCom->seed2 = 1; hFdCngCom->seed3 = 2; hFdCngCom->CngBitrate = -1; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /* Initialize noise estimation algorithm */ set_f( hFdCngCom->periodog_flt, 0.0f, PERIODOGLEN ); mhvals_flt( MSNUMSUBFR * MSSUBFRLEN, &( hFdCngCom->msM_win_flt ) ); @@ -149,7 +149,7 @@ void initFdCngCom_flt( hFdCngCom->offsetflag = 0; hFdCngCom->msFrCnt = MSSUBFRLEN; hFdCngCom->msMinBufferPtr = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hFdCngCom->msAlphaCor_flt, 0.3f, 2 ); hFdCngCom->coherence_flt = 0.5f; @@ -836,7 +836,7 @@ static void getmidbands( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- * AnalysisSTFT_flt() * @@ -1054,8 +1054,9 @@ void SynthesisSTFT_fx( preemph_ivas_fx( buf_fx + 1, PREEMPH_FAC, 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 ); + //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 ); for ( i = 0; i < hFdCngCom->frameSize; i++ ) { hFdCngCom->exc_cng_flt[i] = fix_to_float( hFdCngCom->exc_cng_32fx[i], Q_in - 9 ); @@ -1064,7 +1065,7 @@ void SynthesisSTFT_fx( return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- * SynthesisSTFT_dirac_flt() * @@ -1190,7 +1191,8 @@ void SynthesisSTFT_dirac_fx( v_multc_fixed(olapBuffer + (hFdCngCom->frameSize / 4) - (M + 1), fftScale, buf, M + 1 + hFdCngCom->frameSize); tmp = buf[0]; 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, 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 ); /* 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 )) diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index 37977473e27b67fb8c936b6d193c68c15d64f330..a559680b14e7dace47fc73014a37dfd1a4c3ee27 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -163,6 +163,7 @@ void ivas_initFdCngCom_fx( HANDLE_FD_CNG_COM hFdCngCom, Word16 scale ) set32_fx( hFdCngCom->olapBufferSynth_fx, 0, FFTLEN ); set32_fx( hFdCngCom->olapBufferSynth2_fx, 0, FFTLEN ); set32_fx( hFdCngCom->exc_cng_32fx, 0, L_FRAME16k ); + set16_fx( hFdCngCom->exc_cng, 0, L_FRAME16k ); hFdCngCom->likelihood_noisy_speech_32fx = 0; move32(); @@ -2461,11 +2462,8 @@ void SynthesisSTFT ( scale = 0; BASOP_rfft(fftBuffer, hFdCngCom->fftlen, &scale, 1); fftBufferExp = add(fftBufferExp, scale); -#ifdef EVS_FLOAT -#ifdef IVAS_FLOAT_FIXED hFdCngCom->fftBuffer_exp = fftBufferExp; -#endif -#endif // EVS_FLOAT + fftBufferExp = add(fftBufferExp, hFdCngCom->fftlenShift); /* Perform overlap-add */ @@ -2495,14 +2493,14 @@ void SynthesisSTFT ( { FOR (i=0; i < len4; i++) { - olapBuffer[i+1*len4] = add(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)); move16(); - olapBuffer[i+2*len4] = add(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)); move16(); } FOR (i=len3; i < len; i++) { - olapBuffer[i] = round_fx(L_shl(fftBuffer[i],fftBufferExp-15)); + olapBuffer[i] = round_fx_sat(L_shl_sat(fftBuffer[i],fftBufferExp-15)); } } diff --git a/lib_com/fft_fx.c b/lib_com/fft_fx.c index f8fb4c139b644cedfbc80c92067e857823269fec..d9f565befe9f63f4356a5d8ffe5c511678af908e 100644 --- a/lib_com/fft_fx.c +++ b/lib_com/fft_fx.c @@ -5467,6 +5467,24 @@ Word16 L_norm_arr( Word32 *arr, Word16 size ) return q; } +Word16 get_min_scalefactor( Word32 x, Word32 y ) +{ + Word16 scf = Q31; + IF( EQ_32( x, 0 ) && EQ_32( y, 0 ) ) + { + return 0; + } + IF( NE_32( x, 0 ) ) + { + scf = s_min( scf, norm_l( x ) ); + } + IF( NE_32( y, 0 ) ) + { + scf = s_min( scf, norm_l( y ) ); + } + return scf; +} + #if 0 /* Functions are already in fixed point and available in fft.c file */ diff --git a/lib_com/float_to_fix_ops.c b/lib_com/float_to_fix_ops.c index 4a1d8af75457bd16a4137811ae961dfb282cc9fa..736b2f38afba2e54d029318a3b4107ebeee6fcc2 100644 --- a/lib_com/float_to_fix_ops.c +++ b/lib_com/float_to_fix_ops.c @@ -85,11 +85,11 @@ float fixedToFloat_32( Word32 number, Word16 Q ) { if ( Q > 0 ) { - val = (float) ( ( number / ( 1 << ( Q - 31 ) ) ) / ( (unsigned int) MAX_32 + 1 ) ); + val = ( ( (float) number / ( 1 << ( Q - 31 ) ) ) / ( (unsigned int) MAX_32 + 1 ) ); } else { - val = (float) ( number * ( 1 << ( -Q - 31 ) ) * (unsigned int)MIN_32 ); + val = ( (float) number * ( 1 << ( -Q - 31 ) ) * (unsigned int) MIN_32 ); } } else @@ -111,7 +111,7 @@ Word32 floatToFixed_32( float number, Word16 Q ) } else { - val = ( number / ( 1 << ( -Q - 31 ) ) ) / (unsigned int)MIN_32; + val = ( number / ( 1 << ( -Q - 31 ) ) ) / (unsigned int) MIN_32; } if ( val >= 0.0f ) { @@ -269,15 +269,12 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed( //H_IGF_INFO hIGFInfo = &hPrivateData->igfInfo; //ACELP_config *pConfigAcelp = &( st->acelp_cfg ); Word16 i = 0, - Q_old_synth = 0, Q_syn = 0, Q_synth_history = 0, /*Q_fer_samples = 0,*/ + Q_old_synth = 0, Q_syn = 0,/* Q_synth_history = 0,*/ /*Q_fer_samples = 0,*/ Q_cldfbAna_cldfb_state = 0, Q_cldfbBPF_cldfb_state = 0, Q_cldfbSyn_cldfb_state = 0, Q_cldfbSynHB_cldfb_state = 0;//, //Q_pst_old_syn = 0, //delay_comp = 0; Word16 Q_lsf_cng = Q_factor( 6400 ); - Word16 Q_tcxltp_mem_in = 0, Q_tcxltp_mem_out = 0; - TD_BWE_DEC_HANDLE hBWE_TD = st->hBWE_TD; - Word16 Q_state_lsyn_filt_shb = 0, Q_state_lsyn_filt_dwn_shb = 0, Q_mem_resamp_HB = 0, Q_syn_overlap = 0, Q_int_3_over_2_tbemem_dec = 0, Q_mem_resamp_HB_32k = 0/*, Q_prev_fb_ener_adjust = 0 */; if ( tofix ) { @@ -302,24 +299,25 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed( IF( st->hTcxDec ) { - st->hTcxDec->Q_old_syn_Overl = Q_factor_arr( st->hTcxDec->old_syn_Overl_float, L_FRAME32k / 2 ) - 1; - st->hTcxDec->Q_syn_Overl_TDAC = Q_factor_arr( st->hTcxDec->syn_Overl_TDAC_float, L_FRAME32k / 2 ) - 1; - st->hTcxDec->Q_syn_Overl = Q_factor_arr( st->hTcxDec->syn_Overl_float, L_FRAME32k / 2 ) - 1; - st->hTcxDec->Q_syn_Overl_TDACFB = Q_factor_arr( st->hTcxDec->syn_Overl_TDACFB_float, L_FRAME32k / 2 ); - st->hTcxDec->Q_syn_OverlFB = Q_factor_arr( st->hTcxDec->syn_OverlFB_float, L_FRAME_MAX / 2 ); + //st->hTcxDec->Q_old_syn_Overl = Q_factor_arr( st->hTcxDec->old_syn_Overl_float, L_FRAME32k / 2 ) - 1; + //st->hTcxDec->Q_syn_Overl_TDAC = Q_factor_arr( st->hTcxDec->syn_Overl_TDAC_float, L_FRAME32k / 2 ) - 1; + //st->hTcxDec->Q_syn_Overl = Q_factor_arr( st->hTcxDec->syn_Overl_float, L_FRAME32k / 2 ) - 1; + //st->hTcxDec->Q_syn_Overl_TDACFB = Q_factor_arr( st->hTcxDec->syn_Overl_TDACFB_float, L_FRAME32k / 2 ); + //st->hTcxDec->Q_syn_OverlFB = Q_factor_arr( st->hTcxDec->syn_OverlFB_float, L_FRAME_MAX / 2 ); Q_old_synth = Q_syn; - Q_synth_history = Q_factor_arr( st->hTcxDec->synth_history, L_PROT48k + L_FRAME_MAX ); - floatToFixed_arr( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, st->hTcxDec->Q_old_syn_Overl, L_FRAME32k / 2 ); - floatToFixed_arr( st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->Q_syn_Overl_TDAC, L_FRAME32k / 2 ); - floatToFixed_arr( st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, st->hTcxDec->Q_syn_Overl, L_FRAME32k / 2 ); - floatToFixed_arr( st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->Q_syn_Overl_TDACFB, L_FRAME_MAX / 2 ); - floatToFixed_arr( st->hTcxDec->syn_OverlFB_float, st->hTcxDec->syn_OverlFB, st->hTcxDec->Q_syn_OverlFB, L_FRAME_MAX / 2 ); - floatToFixed_arr( st->hTcxDec->old_synth_float, st->hTcxDec->old_synth, Q_old_synth, OLD_SYNTH_INTERNAL_DEC ); - floatToFixed_arr( st->hTcxDec->synth_history, st->hTcxDec->synth_history_fx, Q_synth_history, L_PROT48k + L_FRAME_MAX ); + //Q_synth_history = Q_factor_arr( st->hTcxDec->synth_history, L_PROT48k + L_FRAME_MAX ); + //floatToFixed_arr( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, st->hTcxDec->Q_old_syn_Overl, L_FRAME32k / 2 ); + //floatToFixed_arr( st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->Q_syn_Overl_TDAC, L_FRAME32k / 2 ); + //floatToFixed_arr( st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, st->hTcxDec->Q_syn_Overl, L_FRAME32k / 2 ); + //floatToFixed_arr( st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->Q_syn_Overl_TDACFB, L_FRAME_MAX / 2 ); + //floatToFixed_arr( st->hTcxDec->syn_OverlFB_float, st->hTcxDec->syn_OverlFB, st->hTcxDec->Q_syn_OverlFB, L_FRAME_MAX / 2 ); + //floatToFixed_arr( st->hTcxDec->old_synth_float, st->hTcxDec->old_synth, Q_old_synth, OLD_SYNTH_INTERNAL_DEC ); + //floatToFixed_arr( st->hTcxDec->synth_history, st->hTcxDec->synth_history_fx, Q_synth_history, L_PROT48k + L_FRAME_MAX ); st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); - st->hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( st->hTcxDec->tcxltp_last_gain_unmodified_float, 15 ); + //st->hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( st->hTcxDec->tcxltp_last_gain_unmodified_float, 15 ); st->output_frame_fx = st->hTcxDec->L_frameTCX; - st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = floatToFixed( st->hTcxDec->CngLevelBackgroundTrace_bfi, 15 ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = floatToFixed( st->hTcxDec->CngLevelBackgroundTrace_bfi, 15 ); + //st->hTcxDec->conCngLevelBackgroundTrace = floatToFixed( st->hTcxDec->CngLevelBackgroundTrace_bfi, 15 ); //st->hTcxDec->conceal_eof_gain = (Word16) floatToFixed( st->hTcxDec->conceal_eof_gain_float, 14 ); } IF( st->hHQ_core ) @@ -353,19 +351,19 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed( IF( st->hTcxLtpDec ) { - Q_tcxltp_mem_in = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); - Q_tcxltp_mem_out = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); - floatToFixed_arr( st->hTcxLtpDec->tcxltp_mem_in_float, st->hTcxLtpDec->tcxltp_mem_in, Q_tcxltp_mem_in, TCXLTP_MAX_DELAY ); - floatToFixed_arr( st->hTcxLtpDec->tcxltp_mem_out_float, st->hTcxLtpDec->tcxltp_mem_out, Q_tcxltp_mem_out, L_FRAME48k ); + //Q_tcxltp_mem_in = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); + //Q_tcxltp_mem_out = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); + //floatToFixed_arr( st->hTcxLtpDec->tcxltp_mem_in_float, st->hTcxLtpDec->tcxltp_mem_in, Q_tcxltp_mem_in, TCXLTP_MAX_DELAY ); + //floatToFixed_arr( st->hTcxLtpDec->tcxltp_mem_out_float, st->hTcxLtpDec->tcxltp_mem_out, Q_tcxltp_mem_out, L_FRAME48k ); } st->last_gain_syn_deemph = 0; - IF( hBWE_TD ) - { - Q_syn_overlap = Q_factor_arr( hBWE_TD->syn_overlap, 20 ); - floatToFixed_arr( hBWE_TD->syn_overlap, hBWE_TD->syn_overlap_fx, Q_syn_overlap, 20 ); - } + //IF( hBWE_TD ) + //{ + // Q_syn_overlap = Q_factor_arr( hBWE_TD->syn_overlap, 20 ); + // floatToFixed_arr( hBWE_TD->syn_overlap, hBWE_TD->syn_overlap_fx, Q_syn_overlap, 20 ); + //} } else { @@ -392,26 +390,27 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed( } //st->TcxBandwidth_float = fixedToFloat( st->TcxBandwidth, 15 ); - IF( st->hBWE_TD != NULL ) - { - Q_syn_overlap = Q_factor_arr( hBWE_TD->syn_overlap, 20 ); - fixedToFloat_arr( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap, Q_syn_overlap, 20 ); - } + //IF( st->hBWE_TD != NULL ) + //{ + // Q_syn_overlap = Q_factor_arr( hBWE_TD->syn_overlap, 20 ); + // fixedToFloat_arr( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap, Q_syn_overlap, 20 ); + //} IF( st->hTcxDec ) { Q_old_synth = Q_syn; - Q_synth_history = Q_factor_arr( st->hTcxDec->synth_history, L_PROT48k + L_FRAME_MAX ); - st->hTcxDec->Q_old_syn_Overl = Q_factor_arr( st->hTcxDec->old_syn_Overl_float, L_FRAME32k / 2 ) - 1; - fixedToFloat_arr( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, st->hTcxDec->Q_old_syn_Overl, L_FRAME32k / 2 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->Q_syn_Overl_TDAC, 320 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->hTcxDec->Q_syn_Overl, 320 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->Q_syn_Overl_TDACFB, 480 ); - fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->hTcxDec->Q_syn_OverlFB, 480 ); - fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, Q_old_synth, OLD_SYNTH_INTERNAL_DEC ); - fixedToFloat_arr( st->hTcxDec->synth_history_fx, st->hTcxDec->synth_history, Q_synth_history, L_PROT48k + L_FRAME_MAX ); - st->hTcxDec->q_synth_history_fx = Q_synth_history; + //Q_synth_history = Q_factor_arr( st->hTcxDec->synth_history, L_PROT48k + L_FRAME_MAX ); + //st->hTcxDec->Q_old_syn_Overl = Q_factor_arr( st->hTcxDec->old_syn_Overl_float, L_FRAME32k / 2 ) - 1; + //fixedToFloat_arr( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, st->hTcxDec->Q_old_syn_Overl, L_FRAME32k / 2 ); + //fixedToFloat_arr( st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->Q_syn_Overl_TDAC, 320 ); + //fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->hTcxDec->Q_syn_Overl, 320 ); + //fixedToFloat_arr( st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->Q_syn_Overl_TDACFB, 480 ); + //fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->hTcxDec->Q_syn_OverlFB, 480 ); + //fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, Q_old_synth, OLD_SYNTH_INTERNAL_DEC ); + //fixedToFloat_arr( st->hTcxDec->synth_history_fx, st->hTcxDec->synth_history, Q_synth_history, L_PROT48k + L_FRAME_MAX ); + //st->hTcxDec->q_synth_history_fx = Q_synth_history; //st->hTcxDec->conceal_eof_gain_float = fixedToFloat( st->hTcxDec->conceal_eof_gain, 14 ); - st->hTcxDec->CngLevelBackgroundTrace_bfi = fixedToFloat( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, 15 ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi = fixedToFloat( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, 15 ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi = fix16_to_float( st->hTcxDec->conCngLevelBackgroundTrace,15-st->hTcxDec->conCngLevelBackgroundTrace_e ); } IF( st->hHQ_core ) @@ -443,16 +442,16 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed( Q_lsf_cng = Q_factor( 6400 ); IF( st->hTcxLtpDec != NULL ) { - Q_tcxltp_mem_in = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); - Q_tcxltp_mem_out = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); - fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_in, st->hTcxLtpDec->tcxltp_mem_in_float, Q_tcxltp_mem_in, TCXLTP_MAX_DELAY ); - fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_out, st->hTcxLtpDec->tcxltp_mem_out_float, Q_tcxltp_mem_out, L_FRAME48k ); + //Q_tcxltp_mem_in = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); + //Q_tcxltp_mem_out = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); + //fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_in, st->hTcxLtpDec->tcxltp_mem_in_float, Q_tcxltp_mem_in, TCXLTP_MAX_DELAY ); + //fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_out, st->hTcxLtpDec->tcxltp_mem_out_float, Q_tcxltp_mem_out, L_FRAME48k ); } IF( st->hTonalMDCTConc ) { FOR( i = 0; i < FDNS_NPTS; i++ ) { - st->hTonalMDCTConc->scaleFactorsBackground_flt[i] = fixedToFloat( st->hTonalMDCTConc->scaleFactorsBackground[i], 15 ); + //st->hTonalMDCTConc->scaleFactorsBackground_flt[i] = fixedToFloat( st->hTonalMDCTConc->scaleFactorsBackground[i], 15 ); } } } @@ -495,9 +494,6 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( //Q_pst_old_syn = 0, //delay_comp = 0; - Word16 Q_tcxltp_mem_in = 0, Q_tcxltp_mem_out = 0; - TD_BWE_DEC_HANDLE hBWE_TD = st->hBWE_TD; - Word16 Q_state_lsyn_filt_shb = 0, Q_state_lsyn_filt_dwn_shb = 0, Q_mem_resamp_HB = 0, Q_syn_overlap = 0, Q_int_3_over_2_tbemem_dec = 0, Q_mem_resamp_HB_32k = 0/*, Q_prev_fb_ener_adjust = 0*/; if ( tofix ) { @@ -523,24 +519,25 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( IF( st->hTcxDec ) { - st->hTcxDec->Q_old_syn_Overl = 0; - st->hTcxDec->Q_syn_Overl_TDAC = 0; - st->hTcxDec->Q_syn_Overl = 0; - st->hTcxDec->Q_syn_Overl_TDACFB = 0; - st->hTcxDec->Q_syn_OverlFB = 0; + //st->hTcxDec->Q_old_syn_Overl = 0; + //st->hTcxDec->Q_syn_Overl_TDAC = 0; + //st->hTcxDec->Q_syn_Overl = 0; + //st->hTcxDec->Q_syn_Overl_TDACFB = 0; + //st->hTcxDec->Q_syn_OverlFB = 0; Q_old_synth = 0; Q_synth_history = 0; - floatToFixed_arr( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, st->hTcxDec->Q_old_syn_Overl, L_FRAME32k / 2 ); - floatToFixed_arr( st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->Q_syn_Overl_TDAC, L_FRAME32k / 2 ); - floatToFixed_arr( st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, st->hTcxDec->Q_syn_Overl, L_FRAME32k / 2 ); - floatToFixed_arr( st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->Q_syn_Overl_TDACFB, L_FRAME_MAX / 2 ); - floatToFixed_arr( st->hTcxDec->syn_OverlFB_float, st->hTcxDec->syn_OverlFB, st->hTcxDec->Q_syn_OverlFB, L_FRAME_MAX / 2 ); - floatToFixed_arr( st->hTcxDec->old_synth_float, st->hTcxDec->old_synth, Q_old_synth, OLD_SYNTH_INTERNAL_DEC ); - floatToFixed_arr( st->hTcxDec->synth_history, st->hTcxDec->synth_history_fx, Q_synth_history, L_PROT48k + L_FRAME_MAX ); + //floatToFixed_arr( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, st->hTcxDec->Q_old_syn_Overl, L_FRAME32k / 2 ); + //floatToFixed_arr( st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->Q_syn_Overl_TDAC, L_FRAME32k / 2 ); + //floatToFixed_arr( st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, st->hTcxDec->Q_syn_Overl, L_FRAME32k / 2 ); + //floatToFixed_arr( st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->Q_syn_Overl_TDACFB, L_FRAME_MAX / 2 ); + //floatToFixed_arr( st->hTcxDec->syn_OverlFB_float, st->hTcxDec->syn_OverlFB, st->hTcxDec->Q_syn_OverlFB, L_FRAME_MAX / 2 ); + //floatToFixed_arr( st->hTcxDec->old_synth_float, st->hTcxDec->old_synth, Q_old_synth, OLD_SYNTH_INTERNAL_DEC ); + //floatToFixed_arr( st->hTcxDec->synth_history, st->hTcxDec->synth_history_fx, Q_synth_history, L_PROT48k + L_FRAME_MAX ); st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); - st->hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( st->hTcxDec->tcxltp_last_gain_unmodified_float, 15 ); + //st->hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( st->hTcxDec->tcxltp_last_gain_unmodified_float, 15 ); st->output_frame_fx = st->hTcxDec->L_frameTCX; - st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = floatToFixed( st->hTcxDec->CngLevelBackgroundTrace_bfi, 15 ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = floatToFixed( st->hTcxDec->CngLevelBackgroundTrace_bfi, 15 ); + //st->hTcxDec->conCngLevelBackgroundTrace = floatToFixed( st->hTcxDec->CngLevelBackgroundTrace_bfi, 15 ); //st->hTcxDec->conceal_eof_gain = (Word16) floatToFixed( st->hTcxDec->conceal_eof_gain_float, 14 ); } IF( st->hHQ_core ) @@ -573,19 +570,19 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( } IF( st->hTcxLtpDec ) { - Q_tcxltp_mem_in = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); - Q_tcxltp_mem_out = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); - floatToFixed_arr( st->hTcxLtpDec->tcxltp_mem_in_float, st->hTcxLtpDec->tcxltp_mem_in, Q_tcxltp_mem_in, TCXLTP_MAX_DELAY ); - floatToFixed_arr( st->hTcxLtpDec->tcxltp_mem_out_float, st->hTcxLtpDec->tcxltp_mem_out, Q_tcxltp_mem_out, L_FRAME48k ); + //Q_tcxltp_mem_in = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); + //Q_tcxltp_mem_out = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); + //floatToFixed_arr( st->hTcxLtpDec->tcxltp_mem_in_float, st->hTcxLtpDec->tcxltp_mem_in, Q_tcxltp_mem_in, TCXLTP_MAX_DELAY ); + //floatToFixed_arr( st->hTcxLtpDec->tcxltp_mem_out_float, st->hTcxLtpDec->tcxltp_mem_out, Q_tcxltp_mem_out, L_FRAME48k ); } st->last_gain_syn_deemph = 0; - IF( hBWE_TD ) - { - Q_syn_overlap = Q_factor_arr( hBWE_TD->syn_overlap, 20 ); - floatToFixed_arr( hBWE_TD->syn_overlap, hBWE_TD->syn_overlap_fx, Q_syn_overlap, 20 ); - } + //IF( hBWE_TD ) + //{ + // Q_syn_overlap = Q_factor_arr( hBWE_TD->syn_overlap, 20 ); + // floatToFixed_arr( hBWE_TD->syn_overlap, hBWE_TD->syn_overlap_fx, Q_syn_overlap, 20 ); + //} } else { @@ -612,28 +609,29 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( //st->hIGFDec->igfData.pSpecFlat_float = &st->hIGFDec->igfData.pSpecFlatBuf[0]; //st->hIGFDec->igfData.igfInfo.nfSeed = &st->hIGFDec->igfData.igfInfo.nfSeedBuf[0]; } - IF( st->hBWE_TD != NULL ) - { - Q_syn_overlap = Q_factor_arr( hBWE_TD->syn_overlap, 20 ); - fixedToFloat_arr( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap, Q_syn_overlap, 20 ); - } + //IF( st->hBWE_TD != NULL ) + //{ + // Q_syn_overlap = Q_factor_arr( hBWE_TD->syn_overlap, 20 ); + // fixedToFloat_arr( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap, Q_syn_overlap, 20 ); + //} IF( st->hTcxDec ) { Q_old_synth = Q_syn; Q_synth_history = 0; - st->hTcxDec->Q_old_syn_Overl = st->Q_syn + 1; - fixedToFloat_arr( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, st->hTcxDec->Q_old_syn_Overl, L_FRAME32k / 2 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->Q_syn_Overl_TDAC, 320 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->hTcxDec->Q_syn_Overl, 320 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->Q_syn_Overl_TDACFB, 480 ); - fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->hTcxDec->Q_syn_OverlFB, 480 ); - fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, Q_old_synth, OLD_SYNTH_INTERNAL_DEC ); - fixedToFloat_arr( st->hTcxDec->synth_history_fx, st->hTcxDec->synth_history, Q_synth_history, L_PROT48k + L_FRAME_MAX ); - st->hTcxDec->q_synth_history_fx = Q_synth_history; + //st->hTcxDec->Q_old_syn_Overl = st->Q_syn + 1; + //fixedToFloat_arr( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, st->hTcxDec->Q_old_syn_Overl, L_FRAME32k / 2 ); + //fixedToFloat_arr( st->hTcxDec->syn_Overl_TDAC, st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->Q_syn_Overl_TDAC, 320 ); + //fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->hTcxDec->Q_syn_Overl, 320 ); + //fixedToFloat_arr( st->hTcxDec->syn_Overl_TDACFB, st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->Q_syn_Overl_TDACFB, 480 ); + //fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->hTcxDec->Q_syn_OverlFB, 480 ); + //fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, Q_old_synth, OLD_SYNTH_INTERNAL_DEC ); + //fixedToFloat_arr( st->hTcxDec->synth_history_fx, st->hTcxDec->synth_history, Q_synth_history, L_PROT48k + L_FRAME_MAX ); + //st->hTcxDec->q_synth_history_fx = Q_synth_history; //st->hTcxDec->conceal_eof_gain_float = fixedToFloat( st->hTcxDec->conceal_eof_gain, 14 ); - st->hTcxDec->CngLevelBackgroundTrace_bfi = fixedToFloat( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, 15 ); - st->hTcxDec->conCngLevelBackgroundTrace = (Word16) st->hTcxDec->CngLevelBackgroundTrace_bfi_fx; st->hTcxDec->conCngLevelBackgroundTrace_e = 0; + //st->hTcxDec->CngLevelBackgroundTrace_bfi = fix16_to_float( st->hTcxDec->conCngLevelBackgroundTrace,15 - st->hTcxDec->conCngLevelBackgroundTrace_e); + //st->hTcxDec->CngLevelBackgroundTrace_bfi = fixedToFloat( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, 15 ); + //st->hTcxDec->conCngLevelBackgroundTrace = (Word16) st->hTcxDec->CngLevelBackgroundTrace_bfi_fx; st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; st->hTcxDec->conLastFrameLevel = st->hTcxDec->LastFrameLevel_bfi_fx; @@ -668,16 +666,16 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( IF( st->hTcxLtpDec != NULL ) { - Q_tcxltp_mem_in = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); - Q_tcxltp_mem_out = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); - fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_in, st->hTcxLtpDec->tcxltp_mem_in_float, Q_tcxltp_mem_in, TCXLTP_MAX_DELAY ); - fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_out, st->hTcxLtpDec->tcxltp_mem_out_float, Q_tcxltp_mem_out, L_FRAME48k ); + //Q_tcxltp_mem_in = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); + //Q_tcxltp_mem_out = Q_factor_arr( st->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); + //fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_in, st->hTcxLtpDec->tcxltp_mem_in_float, Q_tcxltp_mem_in, TCXLTP_MAX_DELAY ); + //fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_out, st->hTcxLtpDec->tcxltp_mem_out_float, Q_tcxltp_mem_out, L_FRAME48k ); } IF( st->hTonalMDCTConc ) { FOR( i = 0; i < FDNS_NPTS; i++ ) { - st->hTonalMDCTConc->scaleFactorsBackground_flt[i] = fixedToFloat( st->hTonalMDCTConc->scaleFactorsBackground[i], 15 ); + //st->hTonalMDCTConc->scaleFactorsBackground_flt[i] = fixedToFloat( st->hTonalMDCTConc->scaleFactorsBackground[i], 15 ); } } } @@ -688,18 +686,18 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( /*==========*/ for ( int p = 0; p < hTcxDec->old_synth_len; p++ ) { - hTcxDec->old_synth[p] = (Word16) ( hTcxDec->old_synth_float[p] ); + //hTcxDec->old_synth[p] = (Word16) ( hTcxDec->old_synth_float[p] ); } for ( int p = 0; p < hTcxDec->old_synth_lenFB; p++ ) { - hTcxDec->old_synthFB_fx[p] = (Word16) ( hTcxDec->old_synthFB[p] ); + //hTcxDec->old_synthFB_fx[p] = (Word16) ( hTcxDec->old_synthFB[p] ); } - st->hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( st->hTcxDec->tcxltp_last_gain_unmodified_float, 15 ); - if ( st->hTonalMDCTConc != NULL ) - { - floatToFixed_arr( st->hTonalMDCTConc->secondLastPcmOut_float, st->hTonalMDCTConc->secondLastPcmOut, 0, st->hTonalMDCTConc->nSamples ); - } + //st->hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( st->hTcxDec->tcxltp_last_gain_unmodified_float, 15 ); + //if ( st->hTonalMDCTConc != NULL ) + //{ + // floatToFixed_arr( st->hTonalMDCTConc->secondLastPcmOut_float, st->hTonalMDCTConc->secondLastPcmOut, 0, st->hTonalMDCTConc->nSamples ); + //} st->Q_syn = 0; @@ -709,7 +707,7 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( //} st->prev_Q_syn = st->Q_syn; //st->hTcxDec->conceal_eof_gain = (Word16) floatToFixed( st->hTcxDec->conceal_eof_gain_float, Q14 ); - st->hTcxDec->conCngLevelBackgroundTrace = (Word16) floatToFixed( st->hTcxDec->CngLevelBackgroundTrace_bfi, Q15 - st->hTcxDec->conCngLevelBackgroundTrace_e ); + //st->hTcxDec->conCngLevelBackgroundTrace = (Word16) floatToFixed( st->hTcxDec->CngLevelBackgroundTrace_bfi, Q15 - st->hTcxDec->conCngLevelBackgroundTrace_e ); if ( st->hTcxDec->conNoiseLevelMemory_e[0] < 0 ) { set16_fx( st->hTcxDec->conNoiseLevelMemory_e, 0, PLC_MIN_STAT_BUFF_SIZE ); @@ -718,15 +716,15 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; if ( hTcxLtpDec->tcxltp ) { - hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( hTcxDec->tcxltp_last_gain_unmodified_float, Q15 ); + //hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( hTcxDec->tcxltp_last_gain_unmodified_float, Q15 ); } floatToFixed_arr( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), 0, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); - if ( !st->tcxonly ) - { - floatToFixed_arr( st->p_bpf_noise_buf_float, st->p_bpf_noise_buf, 0, L_FRAME_16k ); - } + //if ( !st->tcxonly ) + //{ + // floatToFixed_arr( st->p_bpf_noise_buf_float, st->p_bpf_noise_buf, 0, L_FRAME_16k ); + //} st->mem_error = st->hBPF->pst_mem_deemp_err_fx; @@ -736,17 +734,18 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( //{ // st->hFdCngDec->hFdCngCom->periodog[p] = (Word32) ( st->hFdCngDec->hFdCngCom->periodog_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->periodog_exp ) ) ); //} - for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) - { - st->hFdCngDec->hFdCngCom->fftBuffer[p] = (Word32) ( st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); - } - st->hFdCngDec->msNoiseEst_exp = 31 - Q4; + + //for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) + //{ + // st->hFdCngDec->hFdCngCom->fftBuffer[p] = (Word32) ( st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); + //} + //st->hFdCngDec->msNoiseEst_exp = 31 - Q4; + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) { - st->hFdCngDec->msNoiseEst[p] = (Word32) ( st->hFdCngDec->msNoiseEst_float[p] * ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); + //st->hFdCngDec->msNoiseEst[p] = (Word32) ( st->hFdCngDec->msNoiseEst_float[p] * ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); // st->hFdCngDec->msPeriodog[p] = (Word32) ( st->hFdCngDec->msPeriodog_float[p] * ( 1u << ( 31 - st->hFdCngDec->msPeriodog_exp ) ) ); //st->hFdCngDec->msPeriodog_ST_fx[p] = (Word32) ( st->hFdCngDec->msPeriodog_ST[p] * ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) ); - } st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4 @@ -766,15 +765,6 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( //} } - IF(bfi && st->tonal_mdct_plc_active && NE_16(st->element_mode, IVAS_CPE_MDCT)) - { - FOR(Word16 ii = 0; ii < FDNS_NPTS; ii++) - { - f2me_16(st->hTonalMDCTConc->secondLastBlockData.scaleFactors_float[ii], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors[ii], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[ii]); - st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e = s_max(st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[ii]); - } - } - // u8bit to 16bit FOR(int l = 0; l < IGF_START_MX; l++) { @@ -783,11 +773,11 @@ void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( //st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = float_to_fix16(st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_flt, 15); - floatToFixed_arr(st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, st->Q_syn + 1, L_FRAME32k / 2); - floatToFixed_arr(st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->syn_Overl_TDAC, st->Q_syn, 320); - floatToFixed_arr(st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, st->Q_syn+1, 320); - floatToFixed_arr(st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->syn_Overl_TDACFB, st->Q_syn, 480); - floatToFixed_arr(st->hTcxDec->syn_OverlFB_float, st->hTcxDec->syn_OverlFB, st->Q_syn, 480); + //floatToFixed_arr(st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, st->Q_syn + 1, L_FRAME32k / 2); + //floatToFixed_arr(st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->syn_Overl_TDAC, st->Q_syn, 320); + //floatToFixed_arr(st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, st->Q_syn+1, 320); + //floatToFixed_arr(st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->syn_Overl_TDACFB, st->Q_syn, 480); + //floatToFixed_arr(st->hTcxDec->syn_OverlFB_float, st->hTcxDec->syn_OverlFB, st->Q_syn, 480); } } @@ -795,20 +785,20 @@ void fixed_to_float_stereo_tcx_core_dec( Decoder_State *st, Word16 *signal_out ) { - TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + //TCX_DEC_HANDLE hTcxDec = st->hTcxDec; //Word16 q_Aq; - st->hTcxDec->tcxltp_last_gain_unmodified_float = (Word16) fixedToFloat( st->hTcxDec->tcxltp_last_gain_unmodified, Q15 ); + //st->hTcxDec->tcxltp_last_gain_unmodified_float = (Word16) fixedToFloat( st->hTcxDec->tcxltp_last_gain_unmodified, Q15 ); if ( EQ_16( st->core, ACELP_CORE ) ) { for ( int p = 0; p < st->L_frame / 2; p++ ) { - st->hTcxDec->syn_OverlFB_float[p] = (float) st->hTcxDec->syn_OverlFB[p] / (float) pow( 2, st->Q_syn ); - st->hTcxDec->syn_Overl_float[p] = (float) st->hTcxDec->syn_Overl[p] / (float) pow( 2, st->Q_syn ); - st->hTcxDec->old_syn_Overl_float[p] = (float) st->hTcxDec->old_syn_Overl[p] * 2 * ( 1u << st->Q_syn ); - st->hTcxDec->syn_Overl_TDACFB_float[p] = (float) st->hTcxDec->syn_Overl_TDACFB[p] * 2 * (float) pow( 2, st->Q_syn ); - st->hTcxDec->syn_Overl_TDAC_float[p] = (float) st->hTcxDec->syn_Overl_TDAC[p] * 2 * (float) pow( 2, st->Q_syn ); + //st->hTcxDec->syn_OverlFB_float[p] = (float) st->hTcxDec->syn_OverlFB[p] / (float) pow( 2, st->Q_syn ); + //st->hTcxDec->syn_Overl_float[p] = (float) st->hTcxDec->syn_Overl[p] / (float) pow( 2, st->Q_syn ); + //st->hTcxDec->old_syn_Overl_float[p] = (float) st->hTcxDec->old_syn_Overl[p] * 2 * ( 1u << st->Q_syn ); + //st->hTcxDec->syn_Overl_TDACFB_float[p] = (float) st->hTcxDec->syn_Overl_TDACFB[p] * 2 * (float) pow( 2, st->Q_syn ); + //st->hTcxDec->syn_Overl_TDAC_float[p] = (float) st->hTcxDec->syn_Overl_TDAC[p] * 2 * (float) pow( 2, st->Q_syn ); } for ( int p = 0; p < st->L_frame; p++ ) { @@ -827,24 +817,24 @@ void fixed_to_float_stereo_tcx_core_dec( // st->mid_lsf_int = st->mid_lsf_int; //} - hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat( hTcxDec->tcxltp_last_gain_unmodified, Q15 ); + //hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat( hTcxDec->tcxltp_last_gain_unmodified, Q15 ); //st->hTcxDec->conceal_eof_gain_float = fixedToFloat( st->hTcxDec->conceal_eof_gain, Q14 ); - st->hTcxDec->CngLevelBackgroundTrace_bfi = fixedToFloat( st->hTcxDec->conCngLevelBackgroundTrace, 15 - st->hTcxDec->conCngLevelBackgroundTrace_e ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi = fix16_to_float( st->hTcxDec->conCngLevelBackgroundTrace, 15 - st->hTcxDec->conCngLevelBackgroundTrace_e ); - fixedToFloat_arr( hTcxDec->old_synth, hTcxDec->old_synth_float, 0, hTcxDec->old_synth_len ); - fixedToFloat_arr( hTcxDec->synth_history_fx, hTcxDec->synth_history, 0, NS2SA_fx2( st->output_Fs, PH_ECU_MEM_NS ) ); - st->hTcxDec->q_synth_history_fx = 0; + //fixedToFloat_arr( hTcxDec->old_synth, hTcxDec->old_synth_float, 0, hTcxDec->old_synth_len ); + //fixedToFloat_arr( hTcxDec->synth_history_fx, hTcxDec->synth_history, 0, NS2SA_fx2( st->output_Fs, PH_ECU_MEM_NS ) ); + //st->hTcxDec->q_synth_history_fx = 0; - fixedToFloat_arr( hTcxDec->old_synthFB_fx, hTcxDec->old_synthFB, 0, NS2SA_fx2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) + hTcxDec->old_synth_lenFB ); + //fixedToFloat_arr( hTcxDec->old_synthFB_fx, hTcxDec->old_synthFB, 0, NS2SA_fx2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) + hTcxDec->old_synth_lenFB ); - if ( !st->tcxonly ) - { - fixedToFloat_arr( st->p_bpf_noise_buf, st->p_bpf_noise_buf_float, 0, L_FRAME_16k ); - } + //if ( !st->tcxonly ) + //{ + // fixedToFloat_arr( st->p_bpf_noise_buf, st->p_bpf_noise_buf_float, 0, L_FRAME_16k ); + //} - st->hBPF->pst_mem_deemp_err_fx = st->mem_error; + st->hBPF->pst_mem_deemp_err_fx = (Word16)st->mem_error; /*=================================*/ if ( st->hFdCngDec != NULL && ( st->sr_core == INT_FS_12k8 || st->sr_core == INT_FS_16k ) && st->total_brate <= MAX_ACELP_BRATE ) { @@ -862,19 +852,20 @@ void fixed_to_float_stereo_tcx_core_dec( ( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && ( st->hFdCngDec->hFdCngCom->active_frame_counter > 0 ) ) || ( ( st->bfi == 1 ) && ( st->nbLostCmpt == 1 ) ) ) ) || ( st->m_frame_type == ZERO_FRAME ) ) { - st->hTcxDec->CngLevelBackgroundTrace_bfi = fix_to_float( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi = fix_to_float( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi = fix16_to_float( st->hTcxDec->conCngLevelBackgroundTrace, ( 15 - st->hTcxDec->conCngLevelBackgroundTrace_e) ); //st->cngTDLevel_float = fixedToFloat( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); - for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) - { - st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); - } + //for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) + //{ + // st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); + //} for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) { st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); } for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) { - st->hFdCngDec->bandNoiseShape_float[p] = ( (float) st->hFdCngDec->bandNoiseShape[p] / ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); + //st->hFdCngDec->bandNoiseShape_float[p] = ( (float) st->hFdCngDec->bandNoiseShape[p] / ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); } @@ -887,18 +878,21 @@ void fixed_to_float_stereo_tcx_core_dec( { for ( int p = 0; p < L_FRAME16k - st->hFdCngDec->hFdCngCom->startBand; p++ ) { - st->hFdCngDec->smoothed_psd[st->hFdCngDec->hFdCngCom->startBand + p] = ( (float) st->hFdCngDec->smoothed_psd_fx[st->hFdCngDec->hFdCngCom->startBand + p] / ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); + //st->hFdCngDec->smoothed_psd[st->hFdCngDec->hFdCngCom->startBand + p] = ( (float) st->hFdCngDec->smoothed_psd_fx[st->hFdCngDec->hFdCngCom->startBand + p] / ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); } + st->hFdCngDec->q_smoothed_psd = sub( 31 , st->hFdCngDec->msNoiseEst_exp ); } - int A_cng_q = 14; + //int A_cng_q = 14; if ( st->element_mode != IVAS_CPE_MDCT || st->core == ACELP_CORE ) { - A_cng_q = 15 - norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ); + //A_cng_q = 15 - norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ); } + //Scale_sig(st->hFdCngDec->hFdCngCom->A_cng, M + 1, A_cng_q - norm_s(st->hFdCngDec->hFdCngCom->A_cng[0] - 1)); + for ( int p = 0; p < M; p++ ) { - st->hFdCngDec->hFdCngCom->A_cng_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->A_cng[p] / ( 1u << A_cng_q ) ); + //st->hFdCngDec->hFdCngCom->A_cng_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->A_cng[p] / ( 1u << A_cng_q ) ); } } } @@ -918,11 +912,11 @@ void fixed_to_float_stereo_tcx_core_dec( } FOR( Word16 ind = 0; ind < L_FRAME32k / 2; ind++ ) { - st->hTcxDec->syn_Overl_float[ind] = (float) st->hTcxDec->syn_Overl[ind] / ( (float) pow( 2, st->Q_syn + 1 ) ); + //st->hTcxDec->syn_Overl_float[ind] = (float) st->hTcxDec->syn_Overl[ind] / ( (float) pow( 2, st->Q_syn + 1 ) ); } FOR( Word16 ind = 0; ind < L_FRAME_MAX / 2; ind++ ) { - st->hTcxDec->syn_OverlFB_float[ind] = (float) st->hTcxDec->syn_OverlFB[ind] / ( (float) pow( 2, st->Q_syn ) ); + //st->hTcxDec->syn_OverlFB_float[ind] = (float) st->hTcxDec->syn_OverlFB[ind] / ( (float) pow( 2, st->Q_syn ) ); } } } diff --git a/lib_com/guided_plc_util.c b/lib_com/guided_plc_util.c index 4d3d8bbb8ba3d1a9ddb178d9ea745a698ffd6cbd..910c114e257ac2b2f21dbdaca17afce7b4fc67ad 100644 --- a/lib_com/guided_plc_util.c +++ b/lib_com/guided_plc_util.c @@ -139,7 +139,7 @@ void getConcealedLP_flt( * * *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void RecLpcSpecPowDiffuseLc_flt( float *lspq, float *lsp_old, diff --git a/lib_com/isf_dec_amr_wb.c b/lib_com/isf_dec_amr_wb.c index 1a4159286ebaf276a0e85afb7014d01a4830212b..194354a386bbac2e8636dada74e64798a5ad92d4 100644 --- a/lib_com/isf_dec_amr_wb.c +++ b/lib_com/isf_dec_amr_wb.c @@ -46,7 +46,7 @@ * * Decoding of ISF parameters in AMR-WB IO mode *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void isf_dec_amr_wb( Decoder_State *st, /* i/o: State structure */ float *Aq, /* o : quantized A(z) for 4 subframes */ diff --git a/lib_com/ivas_arith.c b/lib_com/ivas_arith.c index a1d87d802d06b138bec0aa08db4342451a8a0846..852ddee0d678f21a979b1ebeef57daf75d1fce1b 100644 --- a/lib_com/ivas_arith.c +++ b/lib_com/ivas_arith.c @@ -42,7 +42,7 @@ * * Start arithemetic coding * - * Similar to ari_start_decoding_14bits(), but do not read past frame boundary. + * Similar to ari_start_decoding_14bits_fx(), but do not read past frame boundary. *-----------------------------------------------------------------------------------------*/ void ivas_ari_start_decoding_14bits_ext_1_lfe( diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 098eda07c014ea1cf0d42466dab14ee71540c83c..dae981352862bdd34dfbb55e26fdce08ef018807 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1046,14 +1046,15 @@ typedef enum /* Common SPAR metadata constants */ #define IVAS_ACTIVEW_DM_F_SCALE 0.5f -#define IVAS_ACTIVEW_DM_F_SCALE_FX ONE_IN_Q30 +#define IVAS_ACTIVEW_DM_F_SCALE_FX (1073741824) /* 0.5f in Q31 */ #define IVAS_ACTIVEW_DM_F_SCALE_DTX 0.25f -#define IVAS_ACTIVEW_DM_F_SCALE_DTX_FX ONE_IN_Q29 +#define IVAS_ACTIVEW_DM_F_SCALE_DTX_FX (536870912) /* 0.25f in Q31 */ #define IVAS_ACTIVEW_DM_F_SCALE_VLBR 0.25f -#define IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX ONE_IN_Q29 +#define IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX (536870912) /* 0.25f in Q31 */ #define IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN 24000 #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) #define MAX_QUANT_STRATS 3 @@ -1186,6 +1187,10 @@ enum #define MASA_MAXIMUM_DIRECTIONS 2 #define MASA_MAX_TRANSPORT_CHANNELS 2 +#ifdef NON_BE_FIX_1048_THRESHOLD_COH_BASOP +#define MASA_SUR_COH_THRESHOLD 1e-7f +#define MASA_SUR_COH_PRECISION 1e7f +#endif #define MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS 5 @@ -1420,6 +1425,15 @@ typedef struct { int16_t offset; float data[35]; } ACPL_QUANT_TABLE; + +#ifdef IVAS_FLOAT_FIXED +typedef struct { + Word16 nquant; + Word16 offset; + Word32 data[35]; +} ACPL_QUANT_TABLE_FX; +#endif // IVAS_FLOAT_FIXED + typedef struct { const int16_t (*alpha)[2]; @@ -1438,6 +1452,11 @@ typedef enum PARAM_MC_SYNTH_MONO_STEREO /* synthesis to mono or stereo */ } PARAM_MC_SYNTHESIS_CONF; +#ifdef IVAS_FLOAT_FIXED +#define PARAM_MC_REG_SX_FX (429496729) /* Regularization factor for mixing matrix calculation */ +#define PARAM_MC_REG_GHAT_FX (2147483) /* Regularization factor for mixing matrix calculation */ +#endif + #define PARAM_MC_REG_SX (0.2f) /* Regularization factor for mixing matrix calculation */ #define PARAM_MC_REG_GHAT (0.001f) /* Regularization factor for mixing matrix calculation */ #define PARAM_MC_MAX_PARAMETER_BANDS 20 /* Maximum number of parameter bands */ @@ -1586,7 +1605,7 @@ typedef enum #define GAIN_LFE 1.88364911f /* Gain applied to LFE during renderering */ #define GAIN_LFE_WORD32 2022552831 /* Gain applied to LFE during renderering */ #ifdef IVAS_FLOAT_FIXED -#define GAIN_LFE_FX 30862 /* Gain applied to LFE during renderering */ +#define GAIN_LFE_FX 30862 /*Q.14 Gain applied to LFE during renderering */ #endif // IVAS_FLOAT_FIXED #define LOW_BIT_RATE_BINAURAL_EQ_BINS 17 /* Number of bins in an EQ applied at low bit rates in binauralization */ #define LOW_BIT_RATE_BINAURAL_EQ_OFFSET 14 /* Offset of bins where the low-bit-rate EQ starts*/ diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index ec8c3e400b19bd0d9bd00640997cb99e0dc07ae7..180e27ddb78d028f7a1e8b676f2fea4694d8b7be 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -1122,6 +1122,166 @@ void computeDiffuseness_fx( #endif + +#ifdef IVAS_FLOAT_FIXED +/*------------------------------------------------------------------------- + * computeDiffuseness() + * + * + *------------------------------------------------------------------------*/ + +void computeDiffuseness_fixed( + Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], + const Word32 *buffer_energy, + const Word16 num_freq_bands, + Word32 *diffuseness, + Word16 *q_factor_intensity, + Word16 *q_factor_energy, + Word16 *q_diffuseness /*Ouput Q*/ +) +{ + Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; + Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; + Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; + Word16 i, j, k; + Word32 tmp = 0; + Word32 *p_tmp; + const Word32 *p_tmp_c; + Word16 min_q_shift1, min_q_shift2, exp1, exp2, q_tmp; + Word16 q_ene, q_intensity, q_intensity_slow; + + /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */ + + set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) ); + set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX ); + + /* Calculate max possible shift for the buffer buffer_energy and buffer_intensity */ + min_q_shift1 = Q31; + move16(); + min_q_shift1 = s_min( min_q_shift1, getScaleFactor32( buffer_energy, i_mult( DIRAC_NO_COL_AVG_DIFF, num_freq_bands ) ) ); + min_q_shift1 = sub( min_q_shift1, find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ) ); + + min_q_shift2 = Q31; + move16(); + min_q_shift2 = s_min( min_q_shift2, getScaleFactor32( buffer_energy, i_mult( DIRAC_NUM_DIMS, i_mult( DIRAC_NO_COL_AVG_DIFF, num_freq_bands ) ) ) ); + min_q_shift2 = find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ); + + q_ene = add( q_factor_energy[0], min_q_shift1 ); + move16(); + q_intensity = sub( q_factor_intensity[0], min_q_shift2 ); + move16(); + + FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) + { + /* Energy slow */ + p_tmp_c = buffer_energy + i_mult( i, num_freq_bands ); + + q_tmp = add( q_factor_energy[i], min_q_shift1 ); + FOR( k = 0; k < num_freq_bands; k++ ) + { + tmp = L_shl( p_tmp_c[k], min_q_shift1 ); + IF( LT_16( q_tmp, q_ene ) ) + { + energy_slow[k] = L_add( L_shr( energy_slow[k], sub( q_ene, q_tmp ) ), tmp ); + move32(); + } + ELSE + { + energy_slow[k] = L_add( energy_slow[k], L_shr( tmp, sub( q_tmp, q_ene ) ) ); + move32(); + } + } + q_ene = s_min( q_ene, q_tmp ); + + /* Intensity slow */ + q_tmp = sub( q_factor_intensity[i], min_q_shift2 ); + FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) + { + p_tmp = buffer_intensity[j][i]; + FOR( k = 0; k < num_freq_bands; k++ ) + { + tmp = L_shr( p_tmp[k], min_q_shift2 ); + IF( LT_16( q_intensity, q_tmp ) ) + { + intensity_slow[add( i_mult( j, num_freq_bands ), k )] = L_add( intensity_slow[add( i_mult( j, num_freq_bands ), k )], L_shr( tmp, sub( q_tmp, q_intensity ) ) ); + move32(); + } + ELSE + { + intensity_slow[add( i_mult( j, num_freq_bands ), k )] = L_add( L_shr( intensity_slow[add( i_mult( j, num_freq_bands ), k )], sub( q_intensity, q_tmp ) ), tmp ); + move32(); + } + } + } + q_intensity = s_min( q_intensity, q_tmp ); + } + + min_q_shift1 = getScaleFactor32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ) ); + min_q_shift1 = sub( min_q_shift1, idiv1616( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 2 ) ); + scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), min_q_shift1 ); + q_intensity = add( q_intensity, min_q_shift1 ); + + /* intensity_slow.^2 + intensity_slow_abs*/ + FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) + { + p_tmp = intensity_slow + i_mult( j, num_freq_bands ); + + FOR( k = 0; k < num_freq_bands; k++ ) + { + p_tmp[k] = Mpy_32_32( p_tmp[k], p_tmp[k] ); + move32(); + intensity_slow_abs[k] = L_add( intensity_slow_abs[k], p_tmp[k] ); + move32(); + } + } + q_intensity_slow = sub( add( q_intensity, q_intensity ), 31 ); + + /* Compute Diffuseness */ + p_tmp = intensity_slow_abs; + exp2 = 0; + move16(); + FOR( i = 0; i < num_freq_bands; ++i ) + { + exp1 = sub( 31, q_intensity_slow ); + 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 ); + + IF( LT_16( q_tmp, Q30 ) ) + { + tmp = L_sub( L_shr( ONE_IN_Q30, sub( Q30, q_tmp ) ), tmp ); + } + ELSE + { + tmp = L_sub( ONE_IN_Q30, L_shr( tmp, sub( q_tmp, Q30 ) ) ); + q_tmp = Q30; + } + + IF( GE_32( tmp, L_shl( 1, q_tmp ) ) ) + { + diffuseness[i] = ONE_IN_Q30; + move32(); + } + ELSE IF( LE_32( tmp, 0 ) ) + { + diffuseness[i] = 0; + move32(); + } + ELSE + { + diffuseness[i] = L_shl( tmp, sub( Q30, q_tmp ) ); + move32(); + } + } + *q_diffuseness = Q30; + move16(); + + return; +} +#endif + /*------------------------------------------------------------------------- * computeDiffuseness() * diff --git a/lib_com/ivas_filters.c b/lib_com/ivas_filters.c index 2d320fcacbc81ea9742b2fe81ff62da0912c3976..07c6783116a7c93a38f511aa5493a50639831907 100644 --- a/lib_com/ivas_filters.c +++ b/lib_com/ivas_filters.c @@ -43,11 +43,10 @@ /*------------------------------------------------------------------------------------------* * Local functions declaration *------------------------------------------------------------------------------------------*/ - -static void ivas_iir_2_filter( ivas_filters_process_state_t *filter_state, float *pIn_Out, const int16_t length, const int16_t stage ); - +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 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 /*-----------------------------------------------------------------------------------------* * Function ivas_filters_init() * @@ -116,18 +115,11 @@ 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[IVAS_FILTER_STAGE_0][i] = WORD322FL_SCALE(filter_state->num_fx[IVAS_FILTER_STAGE_0][i], 1); - filter_state->den[IVAS_FILTER_STAGE_0][i] = WORD322FL_SCALE(filter_state->den_fx[IVAS_FILTER_STAGE_0][i], 1); } filter_state->state_fx[0][0] = 0; filter_state->state_fx[0][1] = 0; filter_state->state_fx[0][2] = 0; - - filter_state->state[0][0] = WORD322FL_SCALE(filter_state->state_fx[0][0], 1); - filter_state->state[0][1] = WORD322FL_SCALE(filter_state->state_fx[0][1], 1); - filter_state->state[0][2] = WORD322FL_SCALE(filter_state->state_fx[0][2], 1); } ELSE { @@ -140,11 +132,6 @@ void ivas_filters_init_fx( 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[IVAS_FILTER_STAGE_0][i] = WORD322FL_SCALE(filter_state->num_fx[IVAS_FILTER_STAGE_0][i], 1); - filter_state->den[IVAS_FILTER_STAGE_0][i] = WORD322FL_SCALE(filter_state->den_fx[IVAS_FILTER_STAGE_0][i], 1); - filter_state->num[IVAS_FILTER_STAGE_1][i] = WORD322FL_SCALE(filter_state->num_fx[IVAS_FILTER_STAGE_1][i], 1); - filter_state->den[IVAS_FILTER_STAGE_1][i] = WORD322FL_SCALE(filter_state->den_fx[IVAS_FILTER_STAGE_1][i], 1); } filter_state->state_fx[0][0] = 0; @@ -153,13 +140,6 @@ void ivas_filters_init_fx( filter_state->state_fx[1][0] = 0; filter_state->state_fx[1][1] = 0; filter_state->state_fx[1][2] = 0; - - filter_state->state[0][0] = WORD322FL_SCALE(filter_state->state_fx[0][0], 1); - filter_state->state[0][1] = WORD322FL_SCALE(filter_state->state_fx[0][1], 1); - filter_state->state[0][2] = WORD322FL_SCALE(filter_state->state_fx[0][2], 1); - filter_state->state[1][0] = WORD322FL_SCALE(filter_state->state_fx[1][0], 1); - filter_state->state[1][1] = WORD322FL_SCALE(filter_state->state_fx[1][1], 1); - filter_state->state[1][2] = WORD322FL_SCALE(filter_state->state_fx[1][2], 1); } return; @@ -173,7 +153,6 @@ void ivas_filters_init_fx( * * Process call for selecting the type filter *-----------------------------------------------------------------------------------------*/ - 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 */ @@ -199,7 +178,6 @@ void ivas_filter_process( return; } - #ifdef IVAS_FLOAT_FIXED void ivas_filter_process_fx( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ @@ -235,7 +213,6 @@ void ivas_filter_process_fx( * * Process call for filtering a signal *-----------------------------------------------------------------------------------------*/ - static void ivas_iir_2_filter( ivas_filters_process_state_t *filter_state, float *pIn_Out, @@ -353,7 +330,7 @@ static void ivas_iir_2_filter_fx( 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)); + //filter_state->state[stage][j - 1] = WORD322FL_SCALE(filter_state->state_fx[stage][j - 1], sub(31, q_factor)); } } diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index bf04a9b35dd33df7dd71859cd3e7471c877fb201..873e7c609430f0ad878e5e97de970baeed0dc4be 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -739,6 +739,29 @@ ivas_error ivas_ism_config_fx( void ivas_ism_reset_metadata( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ ) +{ + hIsmMeta->azimuth_fx = 0; + move32(); + hIsmMeta->elevation_fx = 0; + move32(); + hIsmMeta->yaw_fx = 0; + move32(); + hIsmMeta->pitch_fx = 0; + move32(); + hIsmMeta->radius_fx = 1 << 9; + move16(); + + hIsmMeta->ism_metadata_flag = 0; + move16(); + hIsmMeta->non_diegetic_flag = 0; + move16(); + + return; +} + +void ivas_ism_reset_metadata_enc( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +) { hIsmMeta->azimuth_fx = 0; move32(); @@ -764,6 +787,16 @@ void ivas_ism_reset_metadata( return; } + +void ivas_ism_reset_metadata_API( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +) +{ + ivas_ism_reset_metadata_enc(hIsmMeta); + + return; +} + #else void ivas_ism_reset_metadata( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ @@ -779,6 +812,15 @@ void ivas_ism_reset_metadata( return; } + +void ivas_ism_reset_metadata_API( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +) +{ + ivas_ism_reset_metadata(hIsmMeta); + + return; +} #endif /*-------------------------------------------------------------------* @@ -787,14 +829,7 @@ void ivas_ism_reset_metadata( * Reset ISM metadata parameters *-------------------------------------------------------------------*/ -void ivas_ism_reset_metadata_API( - ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ -) -{ - ivas_ism_reset_metadata( hIsmMeta ); - return; -} /*-------------------------------------------------------------------* diff --git a/lib_com/ivas_mdct_imdct_fx.c b/lib_com/ivas_mdct_imdct_fx.c index d9c8a58ec1f72fd60a6f8b9516a5cbae6b1a8348..a9c7370fa8aa07f8db91f7d123069a5690db54fc 100644 --- a/lib_com/ivas_mdct_imdct_fx.c +++ b/lib_com/ivas_mdct_imdct_fx.c @@ -71,10 +71,12 @@ void ivas_tda_fx( Word16 i; Word16 len_by_2 = shr(length, 1); - FOR ( i = 0; i < len_by_2; i++ ) + 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( i_mult( length, 2 ), i ), 1 )], pIn[add( length, i )] ); + move32(); } return; @@ -105,23 +107,23 @@ void ivas_dct_windowing_fx( Copy32( pTemp_lfe, ( pOut_buf + fade_len + zero_pad_len ), dct_len ); - set32_fx(pOut_buf, 0, zero_pad_len); + set32_fx( pOut_buf, 0, zero_pad_len ); Copy32( ( pOut_buf + full_len - fade_len ), pBuffer_prev, fade_len ); - FOR ( i = 0; i < fade_len; i++ ) + FOR( i = 0; i < fade_len; i++ ) { - pOut_buf[zero_pad_len + i] = Mult_32_32(pOut_buf[zero_pad_len + i], pWindow_coeffs[i]); + pOut_buf[add( zero_pad_len, i )] = Mult_32_32( pOut_buf[add( zero_pad_len, i )], pWindow_coeffs[i] ); } - rem_len = full_len - ( zero_pad_len * 3 + fade_len ); + rem_len = sub( full_len, ( add( i_mult( zero_pad_len, 3 ), fade_len ) ) ); - FOR ( i = 0; i < rem_len; i++ ) + FOR( i = 0; i < rem_len; i++ ) { - pOut_buf[zero_pad_len * 3 + fade_len + i] = Mult_32_32(pOut_buf[zero_pad_len * 3 + fade_len + i], pWindow_coeffs[fade_len - i - 1]); + 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 )] ); } - set32_fx(&pOut_buf[full_len], 0, frame_len - full_len); + set32_fx( &pOut_buf[full_len], 0, sub( frame_len, full_len ) ); return; } diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 9cf0732c7258ef83dd9803afef420727841ec100..b3f04d7ef8ebc3b658852ea6bdfb26ee7b8c217c 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -951,7 +951,7 @@ static void sp2cart_fx( q[3] = mult( getSinWord16( ph3 ), s1s2 ); // q15 q[2] = mult( getCosWord16( ph3 ), s1s2 ); // q15 q[1] = mult( getCosWord16( ph2 ), s1 ); // q15 - q[0] = getCosWord16( ph1 ); // q14 + q[0] = shl_sat(getCosWord16( ph1 ), 1); //q15 return; } @@ -975,12 +975,12 @@ static Word16 calc_n2_fx( const Word16 ph1 ) { Word16 n2; - Word16 temp = mult( 23040, getSinWord16( ph1 ) ); // q8 + Word32 temp = L_mult( 23040, getSinWord16( ph1 ) ); // q8 n2 = round_fx( temp ); - + n2 = shr(n2, 7); IF( EQ_16( s_and( n2, 1 ), 0 ) ) { - n2 = add( n2, ONE_IN_Q8 ); + n2 = add( n2, 1 ); } return n2; @@ -1015,19 +1015,21 @@ static Word16 calc_n3_fx( const Word16 ph2 ) { Word16 n3; - Word16 temp1 = mult( 23040, getSinWord16( ph1 ) ); // q7 + q15 - q15 - n3 = round_fx( mult( temp1, getSinWord16( ph2 ) ) ); // q7 + q15 - q15 + Word16 temp1 = mult( getSinWord16( ph2 ), getSinWord16( ph1 ) ); // q7 + q15 - q15 + n3 = round_fx( L_mult( temp1, getSinWord16( ph2 ) ) ); // q7 + q15 - q15 + + n3 = shr(n3, 8); IF( EQ_16( n3, 0 ) ) { - n3 = ONE_IN_Q7; + n3 = 1; move16(); } ELSE { IF( ( s_and( n3, 1 ) ) == 1 ) { - n3 = add( n3, ONE_IN_Q7 ); + n3 = add( n3, 1 ); } } @@ -1438,7 +1440,7 @@ void pca_dec_s3_fx( Word16 num_fx = 12868; d_fx = idiv1616( num_fx, n1 ); // Q12 - ph1_q_fx = mult( index1, d_fx ); // Q12 + ph1_q_fx = i_mult( index1, d_fx ); // Q12 n2 = calc_n2_fx( ph1_q_fx ); @@ -1467,8 +1469,8 @@ void pca_dec_s3_fx( num_fx = 12868; move16(); - d_fx = idiv1616( num_fx, n1 ); // Q12 - ph2_q_fx = mult( index2, d_fx ); // Q12 + d_fx = idiv1616( num_fx, sub(n2, 1) ); // Q12 + ph2_q_fx = i_mult( index2, d_fx ); // Q12 } j = L_sub(j, ivas_pca_offset_index2[index2 + get_pca_offset_n2_fx( index1 )]); @@ -1486,8 +1488,9 @@ void pca_dec_s3_fx( { num_fx = 6434; move16(); - d_fx = idiv1616( num_fx, n3 ); // Q11 - ph3_q_fx = mult( index3, d_fx ); // Q11 + d_fx = idiv1616( num_fx, n3 ); // Q10 + ph3_q_fx = round_fx(L_mult( index3, d_fx )); // Q10 + //ph3_q_fx = shl(ph3_q_fx, 2); } sp2cart_fx( ph1_q_fx, ph2_q_fx, ph3_q_fx, q_fx ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 26fdae54ba8f55a26abb2f2cd338f7cf4954d937..a5b76f8d46d80a95ef601c812eb7443cfcca0a5c 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -503,7 +503,7 @@ ivas_error ivas_core_enc( 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 */ ); - +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_core_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ @@ -511,10 +511,24 @@ ivas_error ivas_core_dec( MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ const int16_t n_channels, /* i : number of channels to be decoded */ Word32 *output_fx[], /* o : output synthesis signal */ - float outputHB[][L_FRAME48k], /* o : output HB synthesis signal */ + Word32 outputHB[][L_FRAME48k], /* o : output HB synthesis signal */ Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ); +#else +ivas_error ivas_core_dec( + 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 */ + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + const int16_t n_channels, /* i : number of channels to be decoded */ + float *output[], /* o : output synthesis signal */ + float outputHB[][L_FRAME48k], /* o : output HB synthesis signal */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ +); +#endif + void encod_gen_2sbfr( Encoder_State *st, /* i/o: state structure */ @@ -1096,6 +1110,9 @@ void ivas_ism_reset_metadata( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handles */ ); +void ivas_ism_reset_metadata_enc( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +); void ivas_ism_reset_metadata_API( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handles */ ); @@ -1684,8 +1701,13 @@ int16_t res_bpf_adapt( const float *bpf_error_signal_8k, /* i : BPF modification signal */ float res_buf[STEREO_DFT_N_8k] /* i : residual buffer */ ); -#endif // IVAS_FLOAT_FIXED - +#else // IVAS_FLOAT_FIXED +Word16 res_bpf_adapt_ivas_fx( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ + const Word32 *bpf_error_signal_8k, /* i : BPF modification signal */ + Word32 res_buf[STEREO_DFT_N_8k] /* i : residual buffer Q12 */ +); +#endif void bpf_pitch_coherence( Decoder_State *st, /* i/o: decoder state structure */ const float pitch_buf[] /* i : pitch for each subframe [0,1,2,3] */ @@ -1753,9 +1775,6 @@ void stereo_dft_dec_core_switching( void init_basic_allpass( basic_allpass_t *ap, /* i/o: basic allpass structure */ const float *gains, /* i : allpass filter gains */ -#ifdef IVAS_FLOAT_FIXED - const Word32 *gains_fx, -#endif const int16_t *delays /* i : allpass filter delays */ ); @@ -4108,8 +4127,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 nchan_transport_old, /* i : number of TCs in previous frame */ Word16 numCldfbAnalyses_old, /* i : number of CLDFB analysis instances in previous frame */ - const Word16 numCldfbSyntheses_old, /* i : number of CLDFB synthesis instances in previous frame */ - const Word16 Q_cldfbSynDec + const Word16 numCldfbSyntheses_old /* i : number of CLDFB synthesis instances in previous frame */ ); #endif // IVAS_FLOAT_FIXED @@ -4446,6 +4464,17 @@ void computeDiffuseness_fx( ); #endif +#ifdef IVAS_FLOAT_FIXED +void computeDiffuseness_fixed( + Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], + const Word32 *buffer_energy, + const Word16 num_freq_bands, + Word32 *diffuseness , + Word16 *q_factor_intensity, + Word16 *q_factor_energy, + Word16 *q_diffuseness +); +#endif void ivas_dirac_dec_get_response( const int16_t azimuth, const int16_t elevation, @@ -4523,16 +4552,26 @@ void ivas_mc_paramupmix_dec_digest_tc( const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ const int16_t nSamplesForRendering /* i : number of samples provided */ ); - +#ifdef IVAS_FLOAT_FIXED void ivas_mc_paramupmix_dec_render( 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 */ - float *input_f[], /* i : core-coder transport channels */ - float *output_f[] /* i/o: synthesized core-coder transport channels */ + Word32 *input_fx[], /* i : core-coder transport channels */ + Word32 *output_fx[] /* i/o: synthesized core-coder transport channels */ ); +#else +void ivas_mc_paramupmix_dec_render( + 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 */ + float *input_f[], /* i : core-coder transport channels */ + float *output_f[] /* i/o: synthesized core-coder transport channels */ +); +#endif void ivas_param_mc_metadata_open( const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ #ifndef FIX_901_PARAMMC_DEAD_CODE @@ -4590,6 +4629,11 @@ void ivas_param_mc_enc( float *data_f[], /* i/o: input/transport MC data */ const int16_t input_frame /* i : input frame length */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_param_mc_dec_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); +#endif // IVAS_FLOAT_FIXED ivas_error ivas_param_mc_dec_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ @@ -4604,10 +4648,15 @@ ivas_error ivas_param_mc_dec_reconfig_fx( ivas_error ivas_param_mc_dec_reconfig( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); - +#ifdef IVAS_FLOAT_FIXED +void ivas_param_mc_dec_close_fx( + PARAM_MC_DEC_HANDLE *hParamMC_out /* i/o: Parametric MC decoder handle */ +); +#else void ivas_param_mc_dec_close( PARAM_MC_DEC_HANDLE *hParamMC /* i/o: Parametric MC decoder handle */ ); +#endif // IVAS_FLOAT_FIXED void ivas_param_mc_dec_read_BS( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ @@ -4622,6 +4671,12 @@ void ivas_param_mc_dec_digest_tc( float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output*/ ); +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 */ + Word32 *transport_channels_f_fx[], + Word16 transport_f_e ); + void ivas_param_mc_dec_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ @@ -4785,6 +4840,28 @@ int16_t computeMixingMatrices( float *Cr /* o : residual covariance matrix */ ); +#ifdef IVAS_FLOAT_FIXED +Word16 computeMixingMatrices_fx( + const Word16 num_inputs, /* i : number of input channels */ + const Word16 num_outputs, /* i : number of output channels */ + const Word32 *Cx, /* i : input channel covariance matrix */ + Word16 Cx_e, + const Word32 *Cy, /* i : target covariance matrix */ + Word16 Cy_e, + const Word32 *Q, /* i : prototype matrix (usually a upmix matrix) */ + Word16 Q_fx_e, + const Word16 energy_compensation_flag, /* i : flag indicating that the energy compensation should be performed (i.e. no residual mixing matrix will follow) */ + const Word32 reg_Sx_fx, /* i : regularization factor for the input channel singular values */ + Word16 reg_Sx_e, + const Word32 reg_ghat_fx, /* i : regularization factor for the normalization matrix */ + Word16 reg_ghat_e, + Word32 *mixing_matrix_fx, /* o : resulting mixing matrix */ + Word16 *mixing_matrix_out_e, + Word32 *Cr_fx, /* o : residual covariance matrix */ + Word16 *Cr_e +); +#endif + int16_t computeMixingMatricesResidual( const int16_t num_outputs, /* i : number of output channels */ const float *Cx, /* i : vector containing the diagonal diffuse prototype covariance */ @@ -4794,6 +4871,22 @@ int16_t computeMixingMatricesResidual( float *mixing_matrix /* o : resulting residual mixing matrix */ ); +#ifdef IVAS_FLOAT_FIXED +Word16 computeMixingMatricesResidual_fx( + const Word32 num_outputs, /* i : number of output channels */ + const Word32 *Cx_fx, /* i : vector containing the diagonal diffuse prototype covariance */ + const Word16 Cx_e, + const Word32 *Cy_fx, /* i : matrix containing the missing cov (Cr from computeMixingMatrices()) */ + const Word16 Cy_fx_e, + const Word32 reg_Sx_fx, /* i : regularization factor for the input channel singular values */ + const Word16 reg_Sx_e, + const Word32 reg_ghat_fx, /* i : regularization factor for the normalization matrix */ + const Word16 reg_ghat_e, + Word32 *mixing_matrix_fx, /* o : resulting residual mixing matrix */ + Word16 *mixing_matrix_ret_e +); +#endif + /*! r: error or success */ int16_t svd( float InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ @@ -4892,6 +4985,24 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( + Word32 *Cldfb_RealBuffer_in_fx, + Word32 *Cldfb_ImagBuffer_in_fx, + Word32 Cldfb_RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + Word32 Cldfb_ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ + Word32 *mixing_matrix_fx[], /* i : parameter band wise mixing matrices (direct part) */ + Word16 *mixing_matrix_e, /* i : parameter band wise mixing matrices (direct part) */ + Word32 *mixing_matrix_res_fx[], /* i : parameter band wise mixing matrices (residual part) */ + Word16 *mixing_matrix_res_e, /* i : parameter band wise mixing matrices (residual part) */ + const UWord16 slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const UWord16 slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const Word16 nX, /* i : number of input channels */ + const Word16 nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ +); +#endif + int16_t computeMixingMatricesISM( const int16_t num_inputs, const int16_t num_responses, @@ -5382,6 +5493,23 @@ void ivas_create_fullr_dmx_mat( ivas_spar_md_com_cfg *hMdCfg ); +#ifdef IVAS_FLOAT_FIXED +void ivas_create_fullr_dmx_mat_fx( + Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + Word16 q_pred_coeffs_re, + Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + Word16 q_dm_fv_re, + Word32 ***mixer_mat, + Word16 *q_mixer_mat, + const Word16 in_chans, + const Word16 start_band, + const Word16 end_band, + const Word16 active_w, + ivas_spar_md_com_cfg *hMdCfg +); +#endif // IVAS_FLOAT_FIXED + + void ivas_calc_c_p_coeffs( ivas_spar_md_t *pSparMd, float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], @@ -5396,18 +5524,18 @@ void ivas_calc_c_p_coeffs( ); #ifdef IVAS_FLOAT_FIXED void ivas_get_spar_md_from_dirac_fx( - float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float diffuseness[IVAS_MAX_NUM_BANDS], + 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, - float ***mixer_mat, + 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, - float Wscale_d[IVAS_MAX_NUM_BANDS], + Word32 Wscale_d[IVAS_MAX_NUM_BANDS], const uint8_t useLowerRes, const int16_t active_w_vlbr, const int16_t dyn_active_w_flag @@ -5511,7 +5639,14 @@ void ivas_spar_to_dirac( const int16_t bw, /* i : band joining factor */ const int16_t dyn_active_w_flag /* i : dynamic active W flag */ ); - +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 */ +); void ivas_spar_update_md_hist( ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ ); @@ -6316,10 +6451,15 @@ void ivas_spar_param_to_masa_param_mapping_fx( /*---------------------------------------------------------------------------------* * Binaural FastConv Renderer Prototypes *-----------------------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_binRenderer_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); +#else ivas_error ivas_binRenderer_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); +#endif void ivas_binRenderer_close( BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: decoder binaural renderer handle */ @@ -6352,13 +6492,24 @@ void ivas_binRenderer( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ ); +void ivas_binRenderer_fx( + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ + const int16_t numTimeSlots, /* i : number of time slots to render */ + Word32 Cldfb_RealBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + Word32 Cldfb_ImagBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + Word16 *Q_in /* i : LS signals exp */ +); + void ivas_binaural_add_LFE( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t output_frame, /* i : length of input frame */ float *input_f[], /* i : transport channels */ float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ ); -void ivas_binaural_add_LFE_fix( +void ivas_binaural_add_LFE_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word16 output_frame, /* i : length of input frame */ Word32 *input_fx[], /* i : transport channels */ @@ -6440,7 +6591,7 @@ void ivas_ism2sba_sf_fx( const Word16 offset, /* i : offset for the interpolatr */ const Word16 sba_order /* i : Ambisonic (SBA) order */ ); -#endif // IVAS_FLOAT_FIXED +#else // IVAS_FLOAT_FIXED void ivas_ism2sba_sf( float *buffer_in[], /* i : TC buffer */ float *buffer_out[], /* o : TD signal buffers */ @@ -6450,7 +6601,7 @@ void ivas_ism2sba_sf( const int16_t offset, /* i : offset for the interpolatr */ const int16_t sba_order /* i : Ambisonic (SBA) order */ ); - +#endif /*----------------------------------------------------------------------------------* * Amplitude Panning VBAP prototypes @@ -6737,7 +6888,7 @@ void ivas_lfe_enc_fx( ); #endif // IVAS_FLOAT_FIXED - +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_create_lfe_dec( LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ @@ -6755,7 +6906,7 @@ void ivas_lfe_dec( const int16_t bfi, /* i : BFI flag */ float output_lfe_ch[] /* o : output LFE synthesis */ ); - +#endif void ivas_lfe_tdplc( LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ const float *prevsynth, /* i : previous frame synthesis */ @@ -6798,7 +6949,6 @@ void ivas_filters_init_fx( ); #endif - void ivas_filter_process( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ float *pIn_Out, /* i : signal subject to filtering */ @@ -6846,6 +6996,9 @@ ivas_error ivas_osba_data_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ); #ifdef IVAS_FLOAT_FIXED +ivas_error ivas_osba_data_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +); ivas_error ivas_osba_dirac_td_binaural_jbm_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ @@ -6865,14 +7018,30 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( float *output_f[] /* o : rendered time signal */ ); - +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_osba_ism_metadata_dec_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word32 ism_total_brate, /* i : ISM total bitrate */ + Word16 *nchan_ism, /* o : number of ISM separated channels */ + Word16 nb_bits_metadata[] /* o : number of ISM metadata bits */ +); +#else ivas_error ivas_osba_ism_metadata_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int32_t ism_total_brate, /* i : ISM total bitrate */ int16_t *nchan_ism, /* o : number of ISM separated channels */ int16_t nb_bits_metadata[] /* o : number of ISM metadata bits */ ); - +#endif +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_osba_render_sf_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + Word32 *p_output[] /* o : rendered time signal */ +); +#else ivas_error ivas_osba_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ @@ -6880,7 +7049,12 @@ ivas_error ivas_osba_render_sf( uint16_t *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ float *output_f[] /* o : rendered time signal */ ); - +#endif +#ifdef IVAS_FLOAT_FIXED +void ivas_osba_data_close_fx( + SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ +); +#endif void ivas_osba_data_close( SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ ); diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 3779a30888b6118196d20e21c571b77209f8fe89..cdd3f2c3f18045fe97032b92a2b78035dbfa5b42 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -150,7 +150,6 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( ivas_error ivas_omasa_dec_config_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - Word16 Q_cldfbSynDec, /* i : Q factor for cldfb state */ Word16 *num_src, Word16 SrcInd[MAX_NUM_TDREND_CHANNELS], Word16 *data /* o : output synthesis signal */ @@ -370,7 +369,7 @@ void decoder_tcx_noisefilling_fx( Word16 *x_e, Word16 *gainlpc2, Word16 *gainlpc2_e, - int16_t *temp_concealment_method, + Word16 *temp_concealment_method, const Word16 gain_tcx, const Word16 gain_tcx_e, const Word16 *prm_sqQ, @@ -515,10 +514,15 @@ void stereo_dft_dec_analyze_fx( Word16 *q, Word16 *q_out_DFT ); +void init_basic_allpass_fx( + basic_allpass_t *ap, + const Word32 *gains_fx, + const Word16 *delays ); + void filter_with_allpass_fx( const Word32 *sig, /* i : allpass input signal */ Word32 *out, /* o : filtered output */ - const int16_t len, /* i : length of input */ + const Word16 len, /* i : length of input */ basic_allpass_t *ap, /* i/o: basic allpass structure */ Word16 q_shift ); @@ -526,7 +530,7 @@ void filter_with_allpass_fx( Word32 stereo_dft_dmx_swb_nrg_fx( const Word32 *dmx_k0, /* i : first subframe spectrum */ const Word32 *dmx_k1, /* i : second subframe spectrum */ - const int16_t frame_length, /* i : frame lanegth */ + const Word16 frame_length, /* i : frame lanegth */ const Word16 q0, const Word16 q1 ); @@ -682,22 +686,26 @@ Word16 masa_sq_fx( ); void ivas_compute_spar_params_fx( - Word32 * pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - const int16_t i_ts, - float ***mixer_mat, - const int16_t start_band, - const int16_t end_band, - const int16_t dtx_vad, - const int16_t num_ch, - const int16_t bands_bw, - const int16_t active_w, - const int16_t active_w_vlbr, - ivas_spar_md_com_cfg * hSparCfg, - ivas_spar_md_t * hSparMd, - float *pWscale, - const int16_t from_dirac, - const int16_t dyn_active_w_flag + Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 q_cov_real, + Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + Word16 *q_dm_fv_re, + const Word16 i_ts, + Word32 ***mixer_mat_fx, + Word16 *q_mixer_mat, + const Word16 start_band, + const Word16 end_band, + const Word16 dtx_vad, + const Word16 num_ch, + const Word16 bands_bw, + const Word16 active_w, + const Word16 active_w_vlbr, + ivas_spar_md_com_cfg *hSparCfg, + ivas_spar_md_t *hSparMd, + Word32 *pWscale_fx, + Word16 *q_pWscale, + const Word16 from_dirac, + const Word16 dyn_active_w_flag ); ivas_error ivas_ism_metadata_dec_fx( @@ -810,6 +818,13 @@ void ivas_lfe_dec_fx( Word32 output_lfe_ch[] /* o : output LFE synthesis */ ); +void ivas_lfe_tdplc_fx( + LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ + const Word32 *prevsynth, /* i : previous frame synthesis */ + Word32 *ytda, /* o : output time-domain buffer */ + const Word16 output_frame /* i : output frame length */ +); + void ivas_lfe_dec_close_fx( LFE_DEC_HANDLE *hLFE /* i/o: LFE decoder handle */ ); @@ -1300,8 +1315,8 @@ void add_HB_to_mono_dmx_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 output[L_FRAME48k], /* i/o: output synthesis */ Word32 outputHB[L_FRAME48k], /* i : HB synthesis */ - const int16_t last_core, /* i : last core, primary channel */ - const int16_t output_frame /* i : frame length */ + const Word16 last_core, /* i : last core, primary channel */ + const Word16 output_frame /* i : frame length */ ); void stereo_dft_dmx_out_reset_fx( @@ -1383,25 +1398,25 @@ void ivas_mdct_core_tns_ns_fx( void decoder_tcx_imdct_fx( Decoder_State *st, /* i/o: coder memory state */ - const int16_t L_frame_glob, /* i : frame length */ - const int16_t L_frameTCX_glob, - const int16_t L_spec, - const int16_t tcx_offset, - const int16_t tcx_offsetFB, - const int16_t L_frame, - const int16_t L_frameTCX, - const int16_t left_rect, + const Word16 L_frame_glob, /* i : frame length */ + const Word16 L_frameTCX_glob, + const Word16 L_spec, + const Word16 tcx_offset, + const Word16 tcx_offsetFB, + const Word16 L_frame, + const Word16 L_frameTCX, + const Word16 left_rect, Word32 x_fx[N_MAX], Word16 q_x, Word16 xn_buf_fx[], Word16 q_win, - const uint16_t kernelType, /* i : TCX transform kernel type */ - const int16_t fUseTns, /* i : flag that is set if TNS data is present */ + const UWord16 kernelType, /* i : TCX transform kernel type */ + const Word16 fUseTns, /* i : flag that is set if TNS data is present */ Word16 synth_fx[], /* i/o: synth[-M..L_frame] */ Word16 synthFB_fx[], - const int16_t bfi, /* i : Bad frame indicator */ - const int16_t frame_cnt, /* i : frame counter in the super frame */ - const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ + const Word16 bfi, /* i : Bad frame indicator */ + const Word16 frame_cnt, /* i : frame counter in the super frame */ + const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ); void ivas_sba_dirac_stereo_dec_fx( @@ -1411,6 +1426,14 @@ void ivas_sba_dirac_stereo_dec_fx( const Word16 mcmasa /* i : McMASA flag */ ); +ivas_error ivas_osba_render_sf_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + Word32 *p_output[] /* o : rendered time signal */ +); + void ivas_hq_core_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure fx */ Word16 synth[], /* o : output synthesis */ @@ -1640,7 +1663,7 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot_fx( const Word16 nchan_in /* i : number of input channels */ ); -void configureFdCngDec_fx( +void configureFdCngDec_ivas_fx( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the FD-based CNG process */ const Word16 bwidth, const Word32 total_brate, @@ -1730,7 +1753,8 @@ void TonalMDCTConceal_Detect_ivas_fx( const TonalMDCTConcealPtr hTonalMDCTConc, const Word32 pitchLag, Word16 * numIndices, - const PsychoacousticParameters* psychParamsCurrent + const PsychoacousticParameters* psychParamsCurrent, + Word16 element_mode ); Word16 GetPLCModeDecision_ivas_fx( @@ -1753,7 +1777,8 @@ void ivas_DetectTonalComponents_fx( const Word16 nSamples, const Word16 nSamplesCore, Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ - const PsychoacousticParameters* psychParamsCurrent + const PsychoacousticParameters* psychParamsCurrent, + Word16 element_mode ); ivas_error stereo_dft_dec_create_fx( @@ -1779,7 +1804,7 @@ ivas_error stereo_memory_dec_fx( const Word16 nchan_transport /* i : number of transport channels*/ ); -void ivas_initFdCngDec_fx( +void initFdCngDec_ivas_fx( DEC_CORE_HANDLE st, /* i/o: decoder state structure */ Word16 scale ); @@ -1936,6 +1961,13 @@ ivas_error ivas_spar_dec_fx( Word16 *nb_bits_read /* o : number of MD bits read */ ); +void ivas_spar_md_dec_process_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ +); + ivas_error TDREND_Update_object_positions_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ const Word16 num_src, /* i : number of sources to render */ @@ -2051,4 +2083,79 @@ void td_bwe_dec_init_ivas_fx( TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ const Word32 output_Fs /* i : output sampling rate */ ); + +void ivas_dirac_dec_render_sf_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] +); + +void ivas_dirac_dec_render_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 nchan_transport, /* i : number of transport channels */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_dirac_dec_read_BS_fx( + const int32_t 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 */ +); + +ivas_error ivas_dirac_dec_config_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const DIRAC_CONFIG_FLAG flag_configopen /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ +); + +void ivas_dirac_dec_output_synthesis_cov_close_fx( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i : handle for the covariance synthesis parameters */ + DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state /* i/o: handle for the covariance synthesis state */ +); + +ivas_error ivas_init_decoder_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +ivas_error ivas_ism_dec_config_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const ISM_MODE last_ism_mode, /* i/o: last ISM mode */ + UWord16 *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ + Word16 *data /* o : output synthesis signal */ +); + +ivas_error ivas_ism_metadata_dec_create_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 n_ISms, /* i : number of objects */ + 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 */ +); + +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 */ +); +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 */ +); +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 */ +); #endif diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 038c09f5d4d98ec1abc94fd75acb30818ad32866..39fb8cd235adffc00bbc701e8ad480680316e920 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -2784,7 +2784,7 @@ const float ivas_param_mc_quant_ild_5d1_48[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = }; #ifdef IVAS_FLOAT_FIXED -//Q7 +//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 , @@ -2798,10 +2798,10 @@ const float ivas_param_mc_quant_icc[PARAM_MC_SZ_ICC_QUANTIZER] = }; #ifdef IVAS_FLOAT_FIXED -//Q14 +//Q15 const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER] = { - -16220 ,-9650 ,0 ,6023 ,9845 ,13782 ,15352 ,16384 , + -32440,-19300,0,12046,19690,27563,30703,32767 }; #endif @@ -3950,6 +3950,26 @@ 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, @@ -3968,7 +3988,7 @@ 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 @@ -9021,6 +9041,70 @@ 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, diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index cbbe264584ec2ce03c92e3344b570e6ba57e6370..360d5095a1f60b873922786085af5071da29dd46 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -451,9 +451,11 @@ 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]; @@ -567,5 +569,9 @@ 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 /* IVAS_ROM_COM_H */ #endif diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index 31db19315c04c9a32ca09fba61e24bba5d0a2fb7..e1c22014aedf3e3a1c4928ba5348c6d3c302fcc4 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -87,7 +87,7 @@ void sns_compute_scf_fx( x[i] = 0; FOR( n = 0; n < bw; ( ++n, ++k ) ) { - x[i] = L_add( x[i], spectrum[k] ); + x[i] = L_add_sat( x[i], spectrum[k] ); } x[i] /= bw; } @@ -101,7 +101,7 @@ void sns_compute_scf_fx( x[i] = 0; FOR( n = 0; n < bandLengths[i]; ( ++n, ++k ) ) { - x[i] = L_add( x[i], spectrum[k] ); + x[i] = L_add_sat( x[i], spectrum[k] ); } x[i] /= bandLengths[i]; } diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 743a706350e26bd885237dc492675ec6197815a5..d7ccff598883edb8d311ea01a806eff2fe8e310d 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -71,7 +71,9 @@ #define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29 ( 1610612736 ) #define IVAS_P_NORM_SCALING ( 1.0f ) +#define IVAS_P_NORM_SCALING_FX ( ONE_IN_Q31 ) // Q31 #define IVAS_P_NORM_SCALING_DTX ( 0.75f ) +#define IVAS_P_NORM_SCALING_DTX_FX ( 1610612736 ) // Q31 #define IVAS_MAT_DIM_3 ( 3 ) #define IVAS_MAT_DIM_2 ( 2 ) @@ -99,16 +101,21 @@ static void ivas_get_pred_coeffs_fx( const Word16 res_ind, Word16 *q_pred_coeffs, Word16 *q_dm_fv_re ); + static void ivas_reorder_array( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t order[IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t start_band, const int16_t end_band ); +static void ivas_reorder_array_fx(Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], const Word16 in_chans, const Word16 order[IVAS_SPAR_MAX_CH], Word32 ***mixer_mat, const Word16 start_band, const Word16 end_band); static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, const int16_t active_w_vlbr, float *pWscale, const int16_t dyn_active_w_flag ); +static void ivas_get_Wscaling_factor_fx(Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 q_cov_real, Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], Word16 q_pred_coeffs_re, Word32 ***mixer_mat, Word16 q_mixer_mat, const Word16 start_band, const Word16 end_band, const Word16 dtx_vad, const Word16 num_ch, const Word16 *pNum_dmx, const Word16 bands_bw, const Word16 active_w, const Word16 active_w_vlbr, Word32 *pWscale, Word16 *q_pWscale, const Word16 dyn_active_w_flag ); static void ivas_calc_post_pred_per_band( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t num_ch, const int16_t band_idx, float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ); +static void ivas_calc_post_pred_per_band_fx(Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 q_cov_real, Word32 ***mixer_mat, Word16 q_mixer_mat, const Word16 num_ch, const Word16 band_idx, Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *q_postpred_cov_re); static int16_t ivas_is_mat_inv( float in_re[MAX_MAT_DIM][MAX_MAT_DIM], const int16_t dim ); +static Word16 ivas_is_mat_inv_fx(Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], Word16 q_in_re, const Word16 dim); static void ivas_calc_mat_inv( float in_re[MAX_MAT_DIM][MAX_MAT_DIM], const int16_t dim, float out_re[MAX_MAT_DIM][MAX_MAT_DIM] ); - +static void ivas_calc_mat_inv_fx(Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], Word16 q_in_re, const Word16 dim, Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM], Word16 *q_out_re); /*-----------------------------------------------------------------------------------------* * Function ivas_get_bw_idx_from_sample_rate() @@ -1020,6 +1027,120 @@ static void ivas_get_Wscaling_factor( } +#ifdef IVAS_FLOAT_FIXED + +static void ivas_get_Wscaling_factor_fx( + Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 q_cov_real, + Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + Word16 q_pred_coeffs_re, + Word32 ***mixer_mat, + Word16 q_mixer_mat, + const Word16 start_band, + const Word16 end_band, + const Word16 dtx_vad, + const Word16 num_ch, + const Word16 *pNum_dmx, + const Word16 bands_bw, + const Word16 active_w, + const Word16 active_w_vlbr, + Word32 *pWscale, + Word16 *q_pWscale, + const Word16 dyn_active_w_flag ) +{ + Word16 b, ch, q_tmp, q_postpred_cov_re; + Word32 dm_f_local, abs_val; + Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + q_postpred_cov_re = 0; move16(); + + FOR ( ch = 0; ch < IVAS_SPAR_MAX_CH; ch++ ) + { + set32_fx( postpred_cov_re[ch], 0, IVAS_SPAR_MAX_CH ); + } + + IF ( EQ_16(dtx_vad, 0) ) + { + dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; // Q31 + move32(); + } + ELSE IF( NE_16(active_w_vlbr, 0) ) + { + dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; // Q31 + move32(); + } + ELSE + { + dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_FX; // Q31 + move32(); + } + + FOR ( b = start_band; b < end_band; b++ ) + { + pWscale[b] = 1; + move32(); + + test(); + IF ( EQ_16( active_w, 1 ) && EQ_16( dyn_active_w_flag, 0 ) ) + { + Word16 guard_bits, q_Gw_sq, q_g_sq, q_min, tmp_exp; + Word32 Gw_sq, g_sq, tmp; + + g_sq = 0; + move32(); + + IF ( NE_16(num_ch, pNum_dmx[i_mult( b, bands_bw)]) ) + { + ivas_calc_post_pred_per_band_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, b, postpred_cov_re, &q_postpred_cov_re); + } + + Gw_sq = BASOP_Util_Divide3232_Scale(cov_real[0][0][b], L_max( postpred_cov_re[0][0], IVAS_FIX_EPS ), &tmp_exp); + q_Gw_sq = add(sub(15, tmp_exp), sub(q_cov_real, q_postpred_cov_re)); + + guard_bits = find_guarded_bits_fx(num_ch); + + FOR ( ch = 0; ch < 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); + } + q_g_sq = sub(add(q_pred_coeffs_re, q_pred_coeffs_re), add(31, guard_bits)); + + tmp_exp = sub(31, q_Gw_sq); + Gw_sq = Sqrt32(Gw_sq, &tmp_exp); + q_Gw_sq = sub(31, tmp_exp); + + tmp = Mpy_32_32( ONE_IN_Q31 /*4 in Q28*/, Mpy_32_32(dm_f_local, g_sq) ); + q_tmp = sub(q_g_sq, 3); + + q_min = s_min(q_Gw_sq, q_tmp); + Gw_sq = L_shr(Gw_sq, sub(q_Gw_sq, q_min)); + q_Gw_sq = q_min; move16(); + tmp = L_shr(tmp, sub(q_tmp, q_min)); + + tmp = L_add(Gw_sq, tmp); + + tmp_exp = sub(31, q_min); + tmp = Sqrt32(tmp, &tmp_exp); + q_tmp = sub(31, tmp_exp); + + q_min = s_min(q_Gw_sq, q_tmp); + Gw_sq = L_shr(Gw_sq, sub(q_Gw_sq, q_min)); + q_Gw_sq = q_min; move16(); + 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*/); + q_pWscale[b] = q_Gw_sq; + move16(); + } + } + + return; +} + +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_create_fullr_dmx_mat() * @@ -1131,6 +1252,134 @@ void ivas_create_fullr_dmx_mat( return; } +#ifdef IVAS_FLOAT_FIXED + +void ivas_create_fullr_dmx_mat_fx( + Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + Word16 q_pred_coeffs_re, + Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], + Word16 q_dm_fv_re, + Word32 ***mixer_mat, + Word16 *q_mixer_mat, + const Word16 in_chans, + const Word16 start_band, + const Word16 end_band, + const Word16 active_w, + ivas_spar_md_com_cfg *hMdCfg) +{ + Word16 i, j, k, b; + const Word16 *order; + Word32 max_val_tmp_p2; + Word32 tmp_p1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + Word32 tmp_p2_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + Word32 down_mix_mat1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + Word16 remix_unmix_order; + Word16 nbands; + + max_val_tmp_p2 = 0; move32(); + + nbands = sub(end_band, start_band); + remix_unmix_order = hMdCfg->remix_unmix_order; move16(); + + order = remix_order_set[remix_unmix_order]; move16(); + + FOR (i = 0; i < in_chans; i++) + { + FOR (j = 0; j < in_chans; j++) + { + set32_fx(&tmp_p1_re[i][j][start_band], 0, nbands); + set32_fx(&tmp_p2_re[i][j][start_band], 0, nbands); + set32_fx(&down_mix_mat1_re[i][j][start_band], 0, nbands); + } + } + + FOR (j = 0; j < in_chans; j++) + { + FOR (b = start_band; b < end_band; b++) + { + tmp_p2_re[j][j][b] = L_shl(1, q_pred_coeffs_re); move32(); + max_val_tmp_p2 = L_max(max_val_tmp_p2, L_abs(tmp_p2_re[j][j][b])); + } + } + + FOR (j = 1; j < in_chans; j++) + { + FOR (b = start_band; b < end_band; b++) + { + tmp_p2_re[j][0][b] = -pred_coeffs_re[j - 1][b]; move32(); + max_val_tmp_p2 = L_max(max_val_tmp_p2, L_abs(tmp_p2_re[j][0][b])); + } + } + + IF (EQ_16(active_w, 1)) + { + Word16 guard_bits; + Word32 max_val, tmp_re; + + max_val = 0; move32(); + + FOR (j = 0; j < in_chans; j++) + { + FOR (b = start_band; b < end_band; b++) + { + tmp_p1_re[j][j][b] = L_shl(1, q_dm_fv_re); move32(); + max_val = L_max(max_val, L_abs(tmp_p1_re[j][j][b])); + } + } + + FOR (j = 1; j < in_chans; j++) + { + FOR (b = start_band; b < end_band; b++) + { + tmp_p1_re[0][j][b] = dm_fv_re[j - 1][b]; move32(); + max_val = L_max(max_val, L_abs(tmp_p1_re[0][j][b])); + } + } + + guard_bits = add(norm_l(max_val), norm_l(max_val_tmp_p2)); + guard_bits = s_max(sub(find_guarded_bits_fx(sub(end_band, start_band)), guard_bits), 0); + /* 4x4 mult */ + FOR (i = 0; i < in_chans; i++) + { + FOR (j = 0; j < in_chans; j++) + { + FOR (k = 0; k < in_chans; k++) + { + FOR (b = start_band; b < end_band; b++) + { + tmp_re = L_shr(Mpy_32_32(tmp_p2_re[i][k][b], tmp_p1_re[k][j][b]), guard_bits); + down_mix_mat1_re[i][j][b] = L_add(down_mix_mat1_re[i][j][b], tmp_re); move32(); + } + } + } + } + *q_mixer_mat = sub(add(q_dm_fv_re, q_pred_coeffs_re), add(31, guard_bits)); + } + ELSE + { + FOR (j = 0; j < in_chans; j++) + { + FOR (k = 0; k < in_chans; k++) + { + FOR (b = start_band; b < end_band; b++) + { + down_mix_mat1_re[j][k][b] = tmp_p2_re[j][k][b]; move32(); + } + } + } + *q_mixer_mat = q_pred_coeffs_re; + } + + IF (NE_16(remix_unmix_order, 3)) + { + ivas_reorder_array_fx(down_mix_mat1_re, in_chans, order, mixer_mat, start_band, end_band); + } + + return; +} + +#endif // IVAS_FLOAT_FIXED + /*-----------------------------------------------------------------------------------------* * Function ivas_reorder_array() @@ -1164,6 +1413,34 @@ static void ivas_reorder_array( return; } +#ifdef IVAS_FLOAT_FIXED +static void ivas_reorder_array_fx( + Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], + const Word16 in_chans, + const Word16 order[IVAS_SPAR_MAX_CH], + Word32 ***mixer_mat, + const Word16 start_band, + const Word16 end_band ) +{ + Word16 i, j, b, idx; + + FOR ( i = 0; i < in_chans; i++ ) + { + idx = order[i]; move16(); + + FOR ( j = 0; j < in_chans; j++ ) + { + FOR ( b = start_band; b < end_band; b++ ) + { + mixer_mat[i][j][b] = in_re[idx][j][b]; + move32(); + } + } + } + + return; +} +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_calc_post_pred_per_band() @@ -1235,6 +1512,129 @@ static void ivas_calc_post_pred_per_band( } +#ifdef IVAS_FLOAT_FIXED + +static void ivas_calc_post_pred_per_band_fx( + Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 q_cov_real, + Word32 ***mixer_mat, + Word16 q_mixer_mat, + const Word16 num_ch, + const Word16 band_idx, + Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 *q_postpred_cov_re ) +{ + Word16 i, j, k, guard_bits, tmp, q_temp_mat; + Word32 dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word32 max_val; + Word64 tmp_re; + + max_val = 1; + move32(); + FOR ( i = 0; i < num_ch; i++ ) + { + FOR ( j = 0; j < num_ch; j++ ) + { + dmx_mat_conj[i][j] = mixer_mat[j][i][band_idx]; + move32(); + max_val = L_max(max_val, L_abs(dmx_mat_conj[i][j])); + } + } + + guard_bits = find_guarded_bits_fx(num_ch); + + tmp = norm_l(max_val); + IF(LT_16(tmp, guard_bits)) + { + guard_bits = sub(guard_bits, tmp); + } + ELSE + { + guard_bits = 0; + move16(); + } + + FOR ( i = 0; i < num_ch; i++ ) + { + set32_fx( temp_mat[i], 0, num_ch ); + set32_fx( postpred_cov_re[i], 0, num_ch ); + } + + max_val = 1; + move32(); + /* num_ch x num_ch mult */ + FOR ( i = 0; i < num_ch; i++ ) + { + FOR ( j = 0; j < num_ch; j++ ) + { + tmp_re = 0; + 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))) + { + tmp_re = 0; + } + temp_mat[i][j] = W_extract_l(W_shr(tmp_re, q_mixer_mat)); // Q = (q_cov_real - guard_bits) + move32(); + max_val = L_max(max_val, L_abs(temp_mat[i][j])); + } + } + q_temp_mat = sub(q_cov_real, guard_bits); + + guard_bits = find_guarded_bits_fx(num_ch); + + tmp = norm_l(max_val); + IF(LT_16(tmp, guard_bits)) + { + guard_bits = sub(guard_bits, tmp); + } + ELSE + { + guard_bits = 0; + move16(); + } + + /* num_ch x num_ch mult */ + FOR ( i = 0; i < num_ch; i++ ) + { + FOR ( j = i; 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(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))) + { + tmp_re = 0; move64(); + } + + postpred_cov_re[i][j] = W_extract_l(W_shr(tmp_re, q_mixer_mat)); + move32(); + } + } + + *q_postpred_cov_re = sub(q_temp_mat, guard_bits); + + FOR ( i = 0; i < num_ch; i++ ) + { + FOR ( j = 0; j < i; j++ ) + { + postpred_cov_re[i][j] = postpred_cov_re[j][i]; + move32(); + } + } + + return; +} + +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_calc_p_coeffs_per_band() * @@ -1421,13 +1821,233 @@ static void ivas_calc_p_coeffs_per_band( if ( i == j ) { pSparMd->band_coeffs[b_ts_idx].P_re[j - num_dmx] = cov_uu_re[i - num_dmx][j - num_dmx]; +#ifdef IVAS_FLOAT_FIXED + pSparMd->band_coeffs[b_ts_idx].P_re_fx[j - num_dmx] =(Word32) (pSparMd->band_coeffs[b_ts_idx].P_re[j - num_dmx] *ONE_IN_Q22); +#endif + } + } + } + } + + return; +} + +#ifdef IVAS_FLOAT_FIXED + +static void ivas_calc_p_coeffs_per_band_fx( + ivas_spar_md_t *pSparMd, + const Word16 i_ts, + Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 q_postpred_cov_re, + const Word16 num_ch, + const Word16 dtx_vad, + const Word16 num_dmx, + const Word16 band_idx ) +{ + Word16 i, j, k; + Word16 m; + Word32 factor; + Word32 recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS]; + Word32 trace; + Word32 p_norm_scaling; + Word16 q_cov_uu_re; + Word32 cov_dd_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1]; + Word32 cov_uu_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1]; + Word16 b_ts_idx; + + b_ts_idx = add(band_idx, imult1616(i_ts, IVAS_MAX_NUM_BANDS)); + + IF( NE_16( num_dmx, num_ch ) ) + { + 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++ ) + { + set32_fx( recon_uu_re[i], 0, 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]; + move32(); + } + } + q_cov_uu_re = q_postpred_cov_re; + move16(); + + IF ( 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]; + move32(); + } + } + + Word16 q_C_re = pSparMd->band_coeffs[b_ts_idx].q_C_re_fx; move16(); + + IF ( EQ_16( num_dmx, 2 ) ) + { + Word32 re1, re2; + + re1 = W_extract_l(W_shr( W_mult0_32_32(pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], cov_dd_re[0][0]), q_C_re)); + re2 = W_extract_l(W_shr(W_mult0_32_32(pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], cov_dd_re[0][0]), q_C_re)); + + recon_uu_re[0][0] = W_extract_l(W_shr(W_mult0_32_32(pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1), q_C_re)); + 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)); + + FOR ( i = 0; i < 2; i++ ) + { + FOR ( j = 0; j < 2; j++ ) + { + cov_uu_re[i][j] = L_sub(cov_uu_re[i][j], recon_uu_re[i][j]); + move32(); + } + } + } + ELSE IF ( EQ_16( num_dmx, 3 ) ) + { + Word32 re1[2], re2; + set32_fx( re1, 0, 2 ); + + FOR ( j = 0; j < 2; j++ ) + { + FOR ( k = 0; k < 2; k++ ) + { + Word32 re; + re = W_extract_l(W_shr(W_mult0_32_32(pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][k], cov_dd_re[k][j]), q_C_re)); + re1[j] = L_add(re1[j], re); + move32(); + } + } + + re2 = W_extract_l(W_shr(W_mult0_32_32(pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1[0]), q_C_re)); + recon_uu_re[0][0] = re2; 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); + + cov_uu_re[0][0] = L_sub(cov_uu_re[0][0], recon_uu_re[0][0]); + } + ELSE IF ( EQ_16( num_dmx, 4 ) ) + { + /* Step 1: Multiply C * cov_dd * C' */ + Word32 re1[3], re; + + FOR ( i = 0; i < num_ch - num_dmx; i++ ) + { + set32_fx( re1, 0, 3 ); + FOR ( m = 0; m < num_dmx - 1; m++ ) + { + FOR ( k = 0; k < num_dmx - 1; k++ ) + { + re = W_extract_l(W_shr(W_mult0_32_32(pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][k], cov_dd_re[k][m]), q_C_re)); + re1[m] = L_add(re1[m], re); + move32(); + } + } + FOR ( j = 0; j < num_ch - num_dmx; j++ ) + { + FOR ( m = 0; m < num_dmx - 1; m++ ) + { + re = W_extract_l(W_shr(W_mult0_32_32(pSparMd->band_coeffs[b_ts_idx].C_re_fx[j][m], re1[m]), q_C_re)); + recon_uu_re[i][j] = L_add(recon_uu_re[i][j], re); + move32(); + } + } + } + + /* Step 2: cov_uu - recon_uu */ + FOR ( i = 0; i < num_ch - num_dmx; i++ ) + { + FOR ( j = 0; j < num_ch - num_dmx; j++ ) + { + cov_uu_re[i][j] = L_sub(cov_uu_re[i][j], recon_uu_re[i][j]); + move32(); + } + } + } + } + + p_norm_scaling = IVAS_P_NORM_SCALING_FX; + move32(); + + test(); + IF ( EQ_16( dtx_vad, 0 ) && EQ_16( num_dmx, 1 ) ) + { + p_norm_scaling = IVAS_P_NORM_SCALING_DTX_FX; + move32(); + } + + trace = 0; + move32(); + + FOR ( i = num_dmx; i < num_ch; i++ ) + { + trace = L_add(trace, L_abs(cov_uu_re[i - num_dmx][i - num_dmx])); + } + + factor = L_max( IVAS_FIX_EPS, postpred_cov_re[0][0] ); + factor = L_max( factor, Mpy_32_32( p_norm_scaling, trace ) ); + + Word16 factor_exp = 0; move16(); + factor = BASOP_Util_Divide3232_Scale(L_shl(1, q_postpred_cov_re), factor, &factor_exp); + factor = L_shl_sat(factor, factor_exp); + + /* normalise Hermitian (except for rounding) cov_uu */ + FOR ( i = num_dmx; i < num_ch; i++ ) + { + FOR ( j = num_dmx; j < num_ch; j++ ) + { + 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)); + move32(); + } + ELSE + { + /* set off-diag elements to zero */ + cov_uu_re[i - num_dmx][j - num_dmx] = 0; + move32(); } } } + + Word16 cov_uu_re_exp; + /* take sqrt of max of diags and zero */ + 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))); + move32(); move32(); + } + + /* save into MD struct */ + FOR ( i = num_dmx; i < num_ch; i++ ) + { + FOR ( j = num_dmx; j < num_ch; j++ ) + { + 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]; + move32(); + } + } + } + pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = q_cov_uu_re; + move16(); } return; } +#endif // IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* @@ -1525,6 +2145,130 @@ static void ivas_calc_c_coeffs_per_band( return; } +#ifdef IVAS_FLOAT_FIXED + +static void ivas_calc_c_coeffs_per_band_fx( + ivas_spar_md_t *pSparMd, + const Word16 i_ts, + Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 q_post_pred_cov_re, + const Word16 num_ch, + const Word16 num_dmx, + const Word16 band_idx, + const Word16 dtx_vad) +{ + Word16 i, j, k; + + /* worst case for cov_ud is actually 12 x 3 */ + Word32 cov_ud_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; + Word32 cov_dd_re[FOA_CHANNELS - 1][FOA_CHANNELS - 1]; + Word32 cov_dd_re_inv[FOA_CHANNELS - 1][FOA_CHANNELS - 1]; + Word16 q_cov_dd_re_inv; + Word32 trace_cov_dd_re; + Word32 abs_trace; + Word16 b_ts_idx; + + b_ts_idx = add(band_idx, imult1616(i_ts, IVAS_MAX_NUM_BANDS)); + + IF (EQ_16(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)); + pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0; move16(); + return; + } + + FOR (i = num_dmx; i < num_ch; i++) + { + FOR (j = 1; j < num_dmx; j++) + { + cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; + move32(); + } + } + + 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]; + } + } + + trace_cov_dd_re = 0; + move32(); + + FOR (i = 0; i < num_dmx - 1; i++) + { + trace_cov_dd_re = L_add(trace_cov_dd_re, cov_dd_re[i][i]); + } + trace_cov_dd_re = Mpy_32_32(trace_cov_dd_re, 10737418 /* 0.005f in Q31*/); + + abs_trace = L_abs(trace_cov_dd_re); + + 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)); + pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0; move16(); + } + ELSE + { + FOR (i = 0; i < 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)) + { + 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)); + 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); + + 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 (j = 0; j < num_dmx - 1; j++) + { + C_re_fx[i][j] = 0; + move64(); + FOR (k = 0; k < 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(); + } + IF(LT_64(max_val, W_abs(C_re_fx[i][j]))) + { + max_val = W_abs(C_re_fx[i][j]); + } + } + } + + tmp = s_max(sub(32, W_norm(max_val)), 0); + + FOR(i = 0; i < num_ch - num_dmx; i++) + { + FOR(j = 0; j < 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); + } + } + + return; +} + +#endif // IVAS_FLOAT_FIXED + /*-----------------------------------------------------------------------------------------* * Function ivas_calc_c_p_coeffs() @@ -1563,6 +2307,9 @@ void ivas_calc_c_p_coeffs( for ( j = 0; j < num_dmx - 1; j++ ) { pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].C_re[i][j] = 0.0f; +#ifdef IVAS_FLOAT_FIXED + pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[i][j] = 0; +#endif } } } @@ -1576,14 +2323,79 @@ void ivas_calc_c_p_coeffs( for ( i = num_dmx; i < num_ch; i++ ) { pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].P_re[i - num_dmx] = 0; +#ifdef IVAS_FLOAT_FIXED + pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].P_re_fx[i - num_dmx] = 0; +#endif + } + } + } + + return; +} + +#ifdef IVAS_FLOAT_FIXED + +void ivas_calc_c_p_coeffs_fx( + ivas_spar_md_t *pSparMd, + Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 q_cov_real, + const Word16 i_ts, + Word32 ***mixer_mat, + Word16 q_mixer_mat, + const Word16 num_ch, + const Word16 num_dmx, + const Word16 band_idx, + const Word16 dtx_vad, + const Word16 compute_p_flag, + const Word16 dyn_active_w_flag ) +{ + Word16 i, j, q_postpred_cov_re; + Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + IF ( NE_16( num_dmx, num_ch )) + { + ivas_calc_post_pred_per_band_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, band_idx, postpred_cov_re, &q_postpred_cov_re ); + + IF ( NE_16(num_dmx, 1 )) + { + ivas_calc_c_coeffs_per_band_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, num_dmx, band_idx, dtx_vad ); + } + + IF ( dyn_active_w_flag ) + { + FOR ( i = 0; i < num_ch - num_dmx; i++ ) + { + FOR ( j = 0; j < num_dmx - 1; j++ ) + { + pSparMd->band_coeffs[band_idx + 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; + move16(); + } + IF ( EQ_16( compute_p_flag, 1 ) ) + { + ivas_calc_p_coeffs_per_band_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, dtx_vad, num_dmx, band_idx ); + } + + IF ( dyn_active_w_flag ) + { + 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; + move32(); } + pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].q_P_re_fx = 0; + move16(); } } return; } +#endif // IVAS_FLOAT_FIXED + static void ivas_calc_mat_det( double in_re[MAX_MAT_DIM][MAX_MAT_DIM], @@ -1636,6 +2448,71 @@ static void ivas_calc_mat_det( return; } +#ifdef IVAS_FLOAT_FIXED + +static void ivas_calc_mat_det_fx( + Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], + Word16 q_in_re, + const Word16 dim, + Word64 *det_re, + Word16 *q_det_re +) +{ + IF ( EQ_16( dim, IVAS_MAT_DIM_3)) + { + Word64 re1, re2, re; + re1 = W_mult0_32_32(in_re[1][1], in_re[2][2]); + re2 = W_mult0_32_32(in_re[1][2], in_re[2][1]); + re = W_sub_nosat(re1, re2); + + re1 = W_mult0_32_32(in_re[0][0], W_extract_h(re)); + + *det_re = re1; + move64(); + + re1 = W_mult0_32_32(in_re[1][0], in_re[2][2]); + re2 = W_mult0_32_32(in_re[1][2], in_re[2][0]); + re = W_sub_nosat(re1, re2); + + re1 = W_mult0_32_32(in_re[0][1], W_extract_h(re)); + + *det_re = W_sub_nosat(*det_re, re1); + + 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]); + re = W_sub_nosat(re1, re2); + + re1 = W_mult0_32_32(in_re[0][2], W_extract_h(re)); + + *det_re = W_add_nosat(*det_re, re1); + + *q_det_re = add(q_in_re, sub(add(q_in_re, q_in_re), 32)); + } + ELSE IF(EQ_16(dim, IVAS_MAT_DIM_2)) + { + Word64 re1, re2; + 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); + *q_det_re = add(q_in_re, q_in_re); + } + ELSE IF( EQ_16( dim, IVAS_MAT_DIM_1)) + { + *det_re = in_re[0][0]; + move32(); + *q_det_re = q_in_re; + move16(); + } + ELSE + { + assert(!"matrix dimention not supported!"); + } + + return; +} + +#endif // IVAS_FLOAT_FIXED + /*-----------------------------------------------------------------------------------------* * Function ivas_get_mat_cofactor() @@ -1673,6 +2550,44 @@ static void ivas_get_mat_cofactor( } +#ifdef IVAS_FLOAT_FIXED + +static void ivas_get_mat_cofactor_fx( + Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], + Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM], + const Word16 row, + const Word16 col ) +{ + Word16 i, j; + Word16 r = 0, c = 0; + move16(); move16(); + + FOR ( i = 0; i < MAX_MAT_DIM; i++ ) + { + FOR ( j = 0; j < MAX_MAT_DIM; j++ ) + { + test(); + IF ( NE_16(i, row) && NE_16(j, col) ) + { + out_re[r][c] = in_re[i][j]; + move64(); + c = add(c, 1); + } + } + IF ( EQ_16(c, 2 )) + { + r = add(r, 1); + c = 0; + move16(); + } + } + + return; +} + +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_calc_mat_inv() * @@ -1772,6 +2687,118 @@ static void ivas_calc_mat_inv( return; } +#ifdef IVAS_FLOAT_FIXED + +static void ivas_calc_mat_inv_fx( + Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], + Word16 q_in_re, + const Word16 dim, + Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM], + Word16 *q_out_re) +{ + Word64 det; + Word16 one_by_det, q_one_by_det; + Word16 i, j, q_tmp; + + IF ( EQ_16(dim, IVAS_MAT_DIM_1)) + { + det = W_mult0_32_32(in_re[0][0], in_re[0][0]); + /* assert to catch cases when input is singular matrix*/ + assert(det > 0); + + //det = (dbl_in_re[0][0] * dbl_in_re[0][0]); + //det = 1 / det = 1 / (dbl_in_re[0][0] * dbl_in_re[0][0]); + //dbl_out_re[0][0] = dbl_in_re[0][0] * det = dbl_in_re[0][0] * (1 / (dbl_in_re[0][0] * dbl_in_re[0][0])); + //dbl_out_re[0][0] = 1 / dbl_in_re[0][0]; + + one_by_det = BASOP_Util_Divide3232_Scale(1, in_re[0][0], &q_tmp); + q_one_by_det = sub(15, add(q_tmp, q_in_re)); + + out_re[0][0] = one_by_det; move32(); + *q_out_re = q_one_by_det; move16(); + } + ELSE IF(EQ_16(dim, IVAS_MAT_DIM_2)) + { + Word64 det_re; + Word16 q_det_re; + + ivas_calc_mat_det_fx(in_re, q_in_re, dim, &det_re, &q_det_re); + q_tmp = W_norm(det_re); + q_tmp = s_max(sub(32, q_tmp),0); + + det_re = W_shr(det_re, q_tmp); + q_det_re = sub(q_det_re, q_tmp); + + det = W_mult0_32_32(W_extract_l(det_re), W_extract_l(det_re)); + /* assert to catch cases when input is singular matrix*/ + assert(det > 0); + + one_by_det = BASOP_Util_Divide3232_Scale(1, W_extract_l(det_re), &q_tmp); //Q = (15 - (q_tmp + q_det_re)) + + 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[1][0] = -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); + + *q_out_re = sub(q_in_re, add(q_tmp, q_det_re)); // Q = (15-(q_tmp + q_det_re)) + q_in_re - 15 + } + ELSE IF(EQ_16(dim, IVAS_MAT_DIM_3)) + { + Word32 fac_re[IVAS_MAT_DIM_3][IVAS_MAT_DIM_3]; + Word64 det_re, W_tmp; + Word16 q_det_re, q_W_tmp = 0; move16(); + Word16 sign = 1; move16(); + + ivas_calc_mat_det_fx(in_re, q_in_re, dim, &det_re, &q_det_re); + q_tmp = W_norm(det_re); + q_tmp = s_max(sub(32, q_tmp), 0); + + det_re = W_shr(det_re, q_tmp); + q_det_re = sub(q_det_re, q_tmp); + + IF(EQ_64(det_re, 0)) + { + det_re = 1; move64(); + } + + one_by_det = BASOP_Util_Divide3232_Scale(1, W_extract_l(det_re), &q_tmp); + q_one_by_det = sub(15, add(q_tmp, q_det_re)); + + FOR (i = 0; i < dim; i++) + { + FOR (j = 0; j < dim; j++) + { + ivas_get_mat_cofactor_fx(in_re, fac_re, i, j); + ivas_calc_mat_det_fx(fac_re, q_in_re, IVAS_MAT_DIM_2, &W_tmp, &q_W_tmp); + + out_re[j][i] = Mpy_32_16_1(W_extract_h(W_tmp), one_by_det); move32(); + out_re[j][i] = W_extract_l(W_mult0_32_32(out_re[j][i], sign)); move32(); + + IF ( s_and(add(i, j), 1) == 0) + { + sign = -1; move16(); + } + ELSE + { + sign = 1; move16(); + } + } + } + *q_out_re = sub(add(sub(q_W_tmp, 32), q_one_by_det), 15); + } + ELSE + { + assert(!"matrix dimension not supported!"); + } + + return; +} + +#endif // IVAS_FLOAT_FIXED + /*-----------------------------------------------------------------------------------------* * Function ivas_is_mat_inv() @@ -1808,6 +2835,35 @@ static int16_t ivas_is_mat_inv( return is_det_zero; } +#ifdef IVAS_FLOAT_FIXED + +static Word16 ivas_is_mat_inv_fx( + Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], + Word16 q_in_re, + const Word16 dim) +{ + Word16 is_det_zero = 0, q_det_re = 0, tmp; move16(); move16(); + Word64 det, det_re; + + ivas_calc_mat_det_fx(in_re, q_in_re, dim, &det_re, &q_det_re); + + tmp = W_norm(det_re); + tmp = s_max(sub(32, tmp), 0); + + det_re = W_shr(det_re, tmp); + q_det_re = sub(q_det_re, tmp); + + det = W_mult0_32_32(W_extract_l(det_re), W_extract_l(det_re)); + + IF (LE_64( det, IVAS_FIX_EPS)) + { + is_det_zero = 1; move16(); + } + + return is_det_zero; +} +#endif // IVAS_FLOAT_FIXED + /*-----------------------------------------------------------------------------------------* * Function ivas_compute_spar_params() @@ -1872,81 +2928,97 @@ void ivas_compute_spar_params( #ifdef IVAS_FLOAT_FIXED void ivas_compute_spar_params_fx( Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 q_cov_real, Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - const int16_t i_ts, - float ***mixer_mat, - const int16_t start_band, - const int16_t end_band, - const int16_t dtx_vad, - const int16_t num_ch, - const int16_t bands_bw, - const int16_t active_w, - const int16_t active_w_vlbr, + Word16 *q_dm_fv_re, + const Word16 i_ts, + Word32 ***mixer_mat_fx, + Word16 *q_mixer_mat, + const Word16 start_band, + const Word16 end_band, + const Word16 dtx_vad, + const Word16 num_ch, + const Word16 bands_bw, + const Word16 active_w, + const Word16 active_w_vlbr, ivas_spar_md_com_cfg *hSparCfg, ivas_spar_md_t *hSparMd, - float *pWscale, - const int16_t from_dirac, - const int16_t dyn_active_w_flag ) + Word32 *pWscale_fx, + Word16 *q_pWscale, + const Word16 from_dirac, + const Word16 dyn_active_w_flag ) { Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; - float pred_coeffs_re_flt[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; - float dm_fv_re_flt[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; - int16_t b, i, ndm; - int16_t q_pred_coeffs; - int16_t q_dm_fv_re; - float cov_real_flt[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][12]; - float *p_cov_real_flt[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - for ( i = 0; i < num_ch; i++ ) - { - for ( int j = 0; j < num_ch; j++ ) + Word16 b, i, ndm; + Word16 q_pred_coeffs; + + ivas_get_pred_coeffs_fx( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w, active_w_vlbr, dtx_vad, from_dirac, dyn_active_w_flag, hSparMd->res_ind, &q_pred_coeffs, q_dm_fv_re ); + + ivas_create_fullr_dmx_mat_fx( pred_coeffs_re, q_pred_coeffs, dm_fv_re, *q_dm_fv_re, mixer_mat_fx, q_mixer_mat, num_ch, start_band, end_band, active_w, hSparCfg ); + + ivas_get_Wscaling_factor_fx( cov_real, q_cov_real, pred_coeffs_re, q_pred_coeffs, mixer_mat_fx, *q_mixer_mat, start_band, end_band, dtx_vad, num_ch, hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, active_w_vlbr, pWscale_fx, q_pWscale, dyn_active_w_flag ); + + FOR (b = start_band; b < end_band; b++) + { + Word16 tmp_exp, q_tmp, tmp; + Word16 onebyscale_fx = BASOP_Util_Divide3232_Scale(L_shl(1, q_pWscale[b]), pWscale_fx[b], &tmp_exp); + q_tmp = sub(15, tmp_exp); + + tmp = sub(add(q_pred_coeffs, q_tmp), 15); + FOR (i = 0; i < 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); + move32(); + IF (LT_16( 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)); + 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)); + 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; move16(); + + FOR (i = 0; i < num_ch; i++) + { + mixer_mat_fx[0][i][b] = W_extract_l(W_shr(W_mult0_32_32(mixer_mat_fx[0][i][b], pWscale_fx[b]), q_pWscale[b])); + move32(); + } + } + + FOR ( b = start_band; b < end_band; b++ ) + { + ndm = hSparCfg->num_dmx_chans_per_band[b * bands_bw]; move16(); + + IF ( NE_16( ndm, num_ch ) ) { - for ( int k = 0; k < 12; k++ ) + 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; + IF( NE_16(ndm, 1 )) { - cov_real_flt[i][j][k] = (float) cov_real[i][j][k] / ONE_IN_Q30; + for (i = 0; i < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; i++) + { + for (int j = 0; j < IVAS_SPAR_MAX_DMX_CHS - 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[b + i_ts * IVAS_MAX_NUM_BANDS].q_C_re_fx = Q22; } - p_cov_real_flt[i][j] = cov_real_flt[i][j]; - } - } - - ivas_get_pred_coeffs_fx( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w, active_w_vlbr, dtx_vad, from_dirac, dyn_active_w_flag, hSparMd->res_ind, &q_pred_coeffs, &q_dm_fv_re ); - for ( b = start_band; b < end_band; b++ ) - { - for ( i = 0; i < num_ch - 1; i++ ) - { - pred_coeffs_re_flt[i][b] = (float) pred_coeffs_re[i][b] / ( 1 << q_pred_coeffs ); - dm_fv_re_flt[i][b] = (float) dm_fv_re[i][b] / ( 1 << q_dm_fv_re ); - } - } - - ivas_create_fullr_dmx_mat( pred_coeffs_re_flt, dm_fv_re_flt, mixer_mat, num_ch, start_band, end_band, active_w, hSparCfg ); + q_tmp = hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_P_re_fx; - ivas_get_Wscaling_factor( p_cov_real_flt, pred_coeffs_re_flt, mixer_mat, start_band, end_band, dtx_vad, num_ch, hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, active_w_vlbr, pWscale, dyn_active_w_flag ); - - for ( b = start_band; b < end_band; b++ ) - { - float onebyscale = 1.0f / pWscale[b]; - Word32 onebyscale_fx = (Word32) ( onebyscale * ( (UWord32) 1 << ( 53 - q_pred_coeffs ) ) ); - for ( i = 0; i < num_ch - 1; i++ ) - { - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[i] = pred_coeffs_re_flt[i][b] * onebyscale; - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[i] = Mpy_32_32( pred_coeffs_re[i][b], onebyscale_fx ); // q_pred_coeffs + (53 - q_pred_coeffs) - 31 = Q22 - } - - for ( i = 0; i < num_ch; i++ ) - { - mixer_mat[0][i][b] *= pWscale[b]; - } - } - - for ( b = start_band; b < end_band; b++ ) - { - ndm = hSparCfg->num_dmx_chans_per_band[b * bands_bw]; - - if ( ndm != num_ch ) - { - ivas_calc_c_p_coeffs( hSparMd, p_cov_real_flt, i_ts, mixer_mat, num_ch, ndm, b, dtx_vad, 1, dyn_active_w_flag ); + for (int j = 0; j < 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[b + i_ts * IVAS_MAX_NUM_BANDS].q_P_re_fx = Q22; } } @@ -1969,36 +3041,23 @@ Word32 diff_norm_order3_table[8] = { 0, 1879048192, 939524096, 626349376, 469762 #define ONE_BY_FIVE_Q31 429496729 #define ONE_BY_SEVEN_Q31 306783378 void ivas_get_spar_md_from_dirac_fx( - float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float diffuseness[IVAS_MAX_NUM_BANDS], + Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + Word32 ele_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS], const int16_t n_ts, - float ***mixer_mat, + Word32 ***mixer_mat_fx, 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, - float Wscale_d[IVAS_MAX_NUM_BANDS], + Word32 Wscale_d[IVAS_MAX_NUM_BANDS], const uint8_t useLowerRes, const int16_t active_w_vlbr, const int16_t dyn_active_w_flag ) { - Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - Word32 ele_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS]; - for ( int i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - for ( int j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - azi_dirac_fx[i][j] = (Word32)(azi_dirac[i][j] * ( 1 << 22 )); - ele_dirac_fx[i][j] = (Word32)(ele_dirac[i][j] * ( 1 << 22 )); - } - diffuseness_fx[i] = (Word32)(diffuseness[i] * ( 1 << 30 )); - } - int16_t num_ch, band, i, j; int16_t block, ch; @@ -2013,20 +3072,23 @@ void ivas_get_spar_md_from_dirac_fx( 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]; - float Wscale[IVAS_MAX_NUM_BANDS]; - //Word32 Wscale_fx[IVAS_MAX_NUM_BANDS]; - float mixer_mat_local[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][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]; 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]; + //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]; + //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; int16_t ndm, foa_ch, hoa2_ch; - float P_dir_fact[IVAS_SPAR_MAX_CH - 1]; + //float P_dir_fact[IVAS_SPAR_MAX_CH - 1]; Word32 P_dir_fact_fx[IVAS_SPAR_MAX_CH - 1]; const int16_t *remix_order; @@ -2049,38 +3111,38 @@ void ivas_get_spar_md_from_dirac_fx( { for ( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ ) { - pMixer_mat[i][j] = mixer_mat_local[i][j]; + //pMixer_mat[i][j] = mixer_mat_local[i][j]; pMixer_mat_fx[i][j] = mixer_mat_local_fx[i][j]; } - ppMixer_mat[i] = pMixer_mat[i]; + //ppMixer_mat[i] = pMixer_mat[i]; ppMixer_mat_fx[i] = pMixer_mat_fx[i]; } 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 ) ) ) { - float P_norm[3]; + //float P_norm[3]; Word32 P_norm_fx[3]; int16_t idx; ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1]; // ndm max value of 4 - P_norm[0] = 0.0f; + //P_norm[0] = 0.0f; P_norm_fx[0] = 0; for ( i = 0; i < max( 0, 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[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[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[1] = 0.0f; + // P_norm[1] = 0.0f; P_norm_fx[1] = 0; for ( ; i < max( 0, 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[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[1] *= diff_norm_order2 / min( diff_norm_order2, max( 0, min( num_ch, hoa2_ch ) - ndm ) ); @@ -2088,11 +3150,11 @@ void ivas_get_spar_md_from_dirac_fx( 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[2] = 0.0f; + //P_norm[2] = 0.0f; P_norm_fx[2] = 0; for ( ; i < 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[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[2] *= diff_norm_order3 / min( diff_norm_order3, max( 0, num_ch - ndm ) ); @@ -2102,9 +3164,9 @@ void ivas_get_spar_md_from_dirac_fx( for ( i = 0; i < max( 0, 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[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] ); + //P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[0] ); if ( P_dir_fact_fx[idx] == 0 ) { P_dir_fact_fx[idx] = 0; @@ -2118,9 +3180,9 @@ void ivas_get_spar_md_from_dirac_fx( for ( ; i < max( 0, 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[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] = ( 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] ); + //P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[1] ); if ( P_dir_fact_fx[idx] == 0 ) { P_dir_fact_fx[idx] = 0; @@ -2134,9 +3196,9 @@ void ivas_get_spar_md_from_dirac_fx( for ( ; i < 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[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] = ( 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] ); + //P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[2] ); if ( P_dir_fact_fx[idx] == 0 ) { P_dir_fact_fx[idx] = 0; @@ -2162,7 +3224,7 @@ void ivas_get_spar_md_from_dirac_fx( if ( 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) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg_fx, 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 ); /*for ( int l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) { response_avg[l] = (float) response_avg_fx[l] / ( 1 << 30 ); @@ -2171,7 +3233,7 @@ void ivas_get_spar_md_from_dirac_fx( 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) azi_dirac[band][0], (int16_t) ele_dirac[band][0], response_avg_fx, 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 ); /*for ( int l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) { response_avg[l] = (float) response_avg_fx[l] / ( 1 << 30 ); @@ -2182,7 +3244,7 @@ void ivas_get_spar_md_from_dirac_fx( 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) azi_dirac[band][block], (int16_t) ele_dirac[band][block], &( response_fx[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 ); /*for ( int l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) { response[block][l] = (float) response_fx[block][l] / ( 1 << 30 ); @@ -2191,7 +3253,7 @@ void ivas_get_spar_md_from_dirac_fx( /* average responses in all subframes*/ { - float norm; + //float norm; Word32 norm_fx; Word16 norm_q; int16_t num_ch_order, hoa2_ch_order; @@ -2212,7 +3274,7 @@ void ivas_get_spar_md_from_dirac_fx( } /*normalize 1st order*/ - norm = 0.0f; + //norm = 0.0f; norm_fx = 0; norm_q = 0; for ( ch = 1; ch < foa_ch; ch++ ) @@ -2222,7 +3284,7 @@ void ivas_get_spar_md_from_dirac_fx( } norm_q = 31 - ( 30 + 30 - 31 ); - norm = max( EPSILON, sqrtf( norm ) ); + //norm = max( EPSILON, sqrtf( norm ) ); if ( norm_fx ) { norm_fx = Sqrt32( norm_fx, &norm_q ); @@ -2261,7 +3323,7 @@ void ivas_get_spar_md_from_dirac_fx( } /*normalize 2nd order*/ - norm = 0.0f; + //norm = 0.0f; norm_fx = 0; for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) { @@ -2269,7 +3331,7 @@ void ivas_get_spar_md_from_dirac_fx( norm_fx = norm_fx + Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ); } norm_q = 31 - ( 29 + 29 - 31 ); - norm = max( EPSILON, sqrtf( norm ) ); + //norm = max( EPSILON, sqrtf( norm ) ); if ( norm_fx ) { norm_fx = Sqrt32( norm_fx, &norm_q ); @@ -2305,14 +3367,14 @@ void ivas_get_spar_md_from_dirac_fx( } /*normalize 3rd order*/ - norm = 0.0f; + //norm = 0.0f; 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_q = 31 - ( 29 + 29 - 31 ); - norm = max( EPSILON, sqrtf( norm ) ); + //norm = max( EPSILON, sqrtf( norm ) ); if ( norm_fx ) { norm_fx = Sqrt32( norm_fx, &norm_q ); @@ -2450,33 +3512,36 @@ void ivas_get_spar_md_from_dirac_fx( pCov_real_fx[i][j] = cov_real_dirac_fx[i][j]; } } - static int frame_counter; + /*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 - ivas_compute_spar_params_fx( pCov_real_fx, dm_fv_re_fx, 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 ); -#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); - } - } - } +// #ifdef IVAS_FLOAT_FIXED - 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 + 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 ); - if ( mixer_mat != NULL ) +// #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 ) { for ( band = start_band; band < end_band; band++ ) { @@ -2486,7 +3551,7 @@ void ivas_get_spar_md_from_dirac_fx( { for ( j = 0; j < num_ch; j++ ) { - mixer_mat[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = ppMixer_mat[i][j][band]; + mixer_mat_fx[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = ppMixer_mat_fx[i][j][band]; } } @@ -2494,7 +3559,7 @@ void ivas_get_spar_md_from_dirac_fx( { for ( j = 0; j < num_ch; j++ ) { - mixer_mat[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = 0.0f; + mixer_mat_fx[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = 0; } } @@ -2502,7 +3567,7 @@ void ivas_get_spar_md_from_dirac_fx( { for ( j = 0; j < num_ch; j++ ) { - mixer_mat[0][j][band + i_ts * IVAS_MAX_NUM_BANDS] *= Wscale_d[band]; + 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]); } } } @@ -5568,8 +6633,8 @@ void ivas_spar_set_bitrate_config_fx( pSpar_md_cfg->active_w = ivas_spar_br_table_consts[table_idx].active_w; pSpar_md_cfg->agc_bits_ch_idx = ivas_spar_br_table_consts[table_idx].agc_bits_ch_idx; -#if 0 //Some issues - ivas_spar_get_uniform_quant_strat_fx(pSpar_md_cfg, table_idx); +#if 1 //Some issues + 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); diff --git a/lib_com/ivas_spar_com_quant_util.c b/lib_com/ivas_spar_com_quant_util.c index c1933745dd6b00b76d1c37df809808c1cfef1eab..763eb9d84f8190ad56f34c1be3a8ff6801b5e584 100644 --- a/lib_com/ivas_spar_com_quant_util.c +++ b/lib_com/ivas_spar_com_quant_util.c @@ -41,6 +41,8 @@ #include #include "wmc_auto.h" #include "prot_fx1.h" + + /*-----------------------------------------------------------------------------------------* * Function ivas_quantise_real_values() * @@ -133,6 +135,7 @@ void ivas_quantise_real_values_fx( } +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* * Function ivas_spar_get_uniform_quant_strat() * @@ -160,67 +163,59 @@ void ivas_spar_get_uniform_quant_strat( pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; pSpar_md_com_cfg->quant_strat[i].PR.min = -1.2f; - pSpar_md_com_cfg->quant_strat[i].PR.min_fx = -644245094/2; pSpar_md_com_cfg->quant_strat[i].PR.max = 1.2f; - pSpar_md_com_cfg->quant_strat[i].PR.max_fx = 644245094/2; + pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; pSpar_md_com_cfg->quant_strat[i].C.min = -0.8f; - pSpar_md_com_cfg->quant_strat[i].C.min_fx = -429496729/2; pSpar_md_com_cfg->quant_strat[i].C.max = 0.8f; - pSpar_md_com_cfg->quant_strat[i].C.max_fx = 429496729/2; + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[1] = Pr_q_lvl; pSpar_md_com_cfg->quant_strat[i].P_r.min = 0; - pSpar_md_com_cfg->quant_strat[i].P_r.min_fx = 0; pSpar_md_com_cfg->quant_strat[i].P_r.max = 0.8f; - pSpar_md_com_cfg->quant_strat[i].P_r.max_fx = 429496729/2; + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[0] = Pc_q_lvl; pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; pSpar_md_com_cfg->quant_strat[i].P_c.min = -0.8f; - pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = -429496729/2; pSpar_md_com_cfg->quant_strat[i].P_c.max = 0.8f; - pSpar_md_com_cfg->quant_strat[i].P_c.max_fx = 429496729/2; + } else { pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; pSpar_md_com_cfg->quant_strat[i].PR.max = 1; - pSpar_md_com_cfg->quant_strat[i].PR.max_fx = 536870912/2; pSpar_md_com_cfg->quant_strat[i].PR.min = -1; - pSpar_md_com_cfg->quant_strat[i].PR.min_fx = -536870912/2; + pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; pSpar_md_com_cfg->quant_strat[i].C.max = 2; - pSpar_md_com_cfg->quant_strat[i].C.max_fx = 1073741824/2; pSpar_md_com_cfg->quant_strat[i].C.min = -2; - pSpar_md_com_cfg->quant_strat[i].C.min_fx = -1073741824/2; + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[1] = Pr_q_lvl; pSpar_md_com_cfg->quant_strat[i].P_r.max = 1.0f; - pSpar_md_com_cfg->quant_strat[i].P_r.max_fx = 536870912/2; pSpar_md_com_cfg->quant_strat[i].P_r.min = 0; - pSpar_md_com_cfg->quant_strat[i].P_r.min_fx = 0; + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[0] = Pc_q_lvl; pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; pSpar_md_com_cfg->quant_strat[i].P_c.max = 0.5; - pSpar_md_com_cfg->quant_strat[i].P_c.max_fx = 268435456/2; pSpar_md_com_cfg->quant_strat[i].P_c.min = -0.5; - pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = -268435456/2; + } } return; } -#if 0 -void ivas_spar_get_uniform_quant_strat_fx( +#else +void ivas_spar_get_uniform_quant_strat( ivas_spar_md_com_cfg *pSpar_md_com_cfg, const Word16 table_idx) { @@ -230,58 +225,58 @@ void ivas_spar_get_uniform_quant_strat_fx( pSpar_md_com_cfg->num_quant_strats = MAX_QUANT_STRATS; - FOR (i = 0; i < pSpar_md_com_cfg->num_quant_strats; i++) + for ( i = 0; i < pSpar_md_com_cfg->num_quant_strats; i++ ) { - PQ_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; - C_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; - Pr_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; - Pc_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][3]; - - IF (active_w) - { - pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; - pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; - pSpar_md_com_cfg->quant_strat[i].PR.min_fx = -1288490188;//Q30 - pSpar_md_com_cfg->quant_strat[i].PR.max_fx = 1288490188;//Q30 - - pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; - pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; - pSpar_md_com_cfg->quant_strat[i].C.min_fx = -858993459;//Q30 - pSpar_md_com_cfg->quant_strat[i].C.max_fx = 858993459;//Q30 - - pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; - pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[1] = Pr_q_lvl; - pSpar_md_com_cfg->quant_strat[i].P_r.min_fx = 0; - pSpar_md_com_cfg->quant_strat[i].P_r.max_fx = 858993459;//Q30 - - pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[0] = Pc_q_lvl; - pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; - pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = -858993459;//Q30 - pSpar_md_com_cfg->quant_strat[i].P_c.max_fx = 858993459;//Q30 - } - ELSE - { - pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; - pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; - pSpar_md_com_cfg->quant_strat[i].PR.max_fx = ONE_IN_Q30;//Q30 - pSpar_md_com_cfg->quant_strat[i].PR.min_fx = -ONE_IN_Q30;//Q30 - - pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; - pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; - pSpar_md_com_cfg->quant_strat[i].C.max_fx = 2147483648;//Q30 - pSpar_md_com_cfg->quant_strat[i].C.min_fx = -2147483648;//Q30 - - pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; - pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[1] = Pr_q_lvl; - pSpar_md_com_cfg->quant_strat[i].P_r.max_fx = ONE_IN_Q30;//Q30 - pSpar_md_com_cfg->quant_strat[i].P_r.min_fx = 0; - - pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[0] = Pc_q_lvl; - pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; - pSpar_md_com_cfg->quant_strat[i].P_c.max_fx = 536870912;//Q30 - pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = -536870912;//Q30 - } - } + PQ_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; + C_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; + Pr_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; + Pc_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][3]; + + if ( active_w ) + { + pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; + pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; + pSpar_md_com_cfg->quant_strat[i].PR.min_fx = -322122547;//1.2*Q28 + pSpar_md_com_cfg->quant_strat[i].PR.max_fx = 322122547;//1.2*Q28 + + pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; + pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; + pSpar_md_com_cfg->quant_strat[i].C.min_fx = -214748364; + pSpar_md_com_cfg->quant_strat[i].C.max_fx = 214748364;//.8*Q28 + + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[1] = Pr_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_r.min_fx = 0; + pSpar_md_com_cfg->quant_strat[i].P_r.max_fx = 214748364;//.8*Q28 + + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[0] = Pc_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = -214748364;//.8*Q28 + pSpar_md_com_cfg->quant_strat[i].P_c.max_fx = 214748364; //.8*Q28 + } + else + { + pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; + pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; + pSpar_md_com_cfg->quant_strat[i].PR.max_fx = ONE_IN_Q28; + pSpar_md_com_cfg->quant_strat[i].PR.min_fx = -ONE_IN_Q28; + + pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; + pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; + pSpar_md_com_cfg->quant_strat[i].C.max_fx = 2 *ONE_IN_Q28; + pSpar_md_com_cfg->quant_strat[i].C.min_fx = -2*ONE_IN_Q28; + + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[1] = Pr_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_r.max_fx = ONE_IN_Q28; + pSpar_md_com_cfg->quant_strat[i].P_r.min_fx = 0; + + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[0] = Pc_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; + pSpar_md_com_cfg->quant_strat[i].P_c.max_fx = ONE_IN_Q27; //.5* Q28 + pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = -ONE_IN_Q27;//.5* Q28 + } + } return; } @@ -402,22 +397,11 @@ void ivas_map_prior_coeffs_quant( } #endif -void ivas_spar_quant_dtx_init_fx( - ivas_spar_md_t *spar_md, - Word32 *min_max) -{ - spar_md->min_max_fx[0] = min_max[0]; - spar_md->min_max_fx[1] = min_max[1]; - - return; -} - /*-----------------------------------------------------------------------------------------* * Function ivas_spar_quant_dtx_init() * * Init SPAR MD with minmax vals *-----------------------------------------------------------------------------------------*/ - void ivas_spar_quant_dtx_init( ivas_spar_md_t *spar_md, float *min_max ) @@ -427,7 +411,7 @@ void ivas_spar_quant_dtx_init( return; } -#if 0 + void ivas_spar_quant_dtx_init_fx( ivas_spar_md_t *spar_md, Word32 *min_max) @@ -437,7 +421,7 @@ void ivas_spar_quant_dtx_init_fx( return; } -#endif + /*-----------------------------------------------------------------------------------------* * Function ivas_copy_band_coeffs_idx_to_arr() * @@ -496,7 +480,6 @@ void ivas_copy_band_coeffs_idx_to_arr( * * clear band coeffs array in SPAR MD *-----------------------------------------------------------------------------------------*/ - void ivas_clear_band_coeffs( ivas_band_coeffs_t *pband_coeffs, const uint16_t num_bands ) @@ -506,22 +489,17 @@ void ivas_clear_band_coeffs( for ( i = 0; i < num_bands; i++ ) { set_zero( (float *) pband_coeffs[i].C_re, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); - 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 ) ); set_zero( (float *) pband_coeffs[i].P_re, ( IVAS_SPAR_MAX_CH - 1 ) ); - set32_fx( (Word32 *) pband_coeffs[i].P_re_fx, 0, ( IVAS_SPAR_MAX_CH - 1 ) ); set_zero( (float *) pband_coeffs[i].C_quant_re, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); - set32_fx( (Word32 *) pband_coeffs[i].C_quant_re_fx, 0, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); set_zero( (float *) pband_coeffs[i].P_quant_re, ( IVAS_SPAR_MAX_CH - 1 ) ); - set32_fx( (Word32 *) pband_coeffs[i].P_quant_re_fx, 0, ( IVAS_SPAR_MAX_CH - 1 ) ); set_zero( pband_coeffs[i].pred_re, ( IVAS_SPAR_MAX_CH - 1 ) ); - set32_fx( pband_coeffs[i].pred_re_fx, 0, ( IVAS_SPAR_MAX_CH - 1 ) ); set_zero( pband_coeffs[i].pred_quant_re, ( IVAS_SPAR_MAX_CH - 1 ) ); - set32_fx( pband_coeffs[i].pred_quant_re_fx, 0, ( IVAS_SPAR_MAX_CH - 1 ) ); + } return; } -#if 0 + void ivas_clear_band_coeffs_fx( ivas_band_coeffs_t *pband_coeffs, const UWord16 num_bands) @@ -540,7 +518,7 @@ void ivas_clear_band_coeffs_fx( return; } -#endif + /*-----------------------------------------------------------------------------------------* * Function ivas_clear_band_coeff_idx() * diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 753f3cd1052c43482c6df48eb2476e3696da62c4..3b70fb63b7dbeae46e92d667aa46d403452ac603 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -59,11 +59,6 @@ typedef struct int16_t ism_metadata_flag; /* flag whether metadata are coded in particular frame of particular object */ int16_t last_ism_metadata_flag; /* last frame ism_metadata_flag */ - float azimuth; /* azimuth value read from the input metadata file */ - float elevation; /* elevation value read from the input metadata file */ - float radius; /* radius value read from the input metadata file */ - float yaw; /* yaw value read from the input metadata file */ - float pitch; /* pitch value read from the input metadata file */ #ifdef IVAS_FLOAT_FIXED Word32 azimuth_fx; /* azimuth value read from the input metadata file */ // q = 22 Word32 elevation_fx; /* elevation value read from the input metadata file */ // q = 22 @@ -71,6 +66,11 @@ typedef struct Word32 yaw_fx; /* yaw value read from the input metadata file */ // q = 22 Word32 pitch_fx; /* pitch value read from the input metadata file */ // q = 22 #endif + float azimuth; /* azimuth value read from the input metadata file */ + float elevation; /* elevation value read from the input metadata file */ + float radius; /* radius value read from the input metadata file */ + float yaw; /* yaw value read from the input metadata file */ + float pitch; /* pitch value read from the input metadata file */ int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ @@ -187,8 +187,11 @@ typedef struct ivas_band_coeffs_t float C_quant_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; float P_quant_re[IVAS_SPAR_MAX_CH - 1]; + Word16 q_pred_re_fx; Word32 pred_re_fx[IVAS_SPAR_MAX_CH - 1]; + Word16 q_C_re_fx; Word32 C_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; + Word16 q_P_re_fx; Word32 P_re_fx[IVAS_SPAR_MAX_CH - 1]; Word32 pred_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; Word32 C_quant_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; @@ -709,15 +712,15 @@ typedef struct ivas_filters_process_state_t { int16_t order; int16_t filt_len; - 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]; #ifdef IVAS_FLOAT_FIXED 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 + 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]; } ivas_filters_process_state_t; diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index e24e688a168be2028afd3d5b8ff5f9ca77ac7fe1..deee92b719df10824542d0b6bcdd313a730875b2 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -130,16 +130,18 @@ static void interpTargetChannel_fx( Word32 spread_factor2_fx; Word64 tempD1_fx, tempD2_fx; - d = -( currShift - prevShift ); - signShift = ( d >= 0 ) ? ( 1 ) : ( -1 ); + d = sub( prevShift, currShift ); + signShift = GE_16( d, 0 ) ? ( 1 ) : ( -1 ); + move16(); - IF( d == 0 ) + IF( EQ_16( d, 0 ) ) { /* this can happen in DFT->TD switching */ return; } N = L_shift_adapt; + move16(); Word32 *table_pointer = NULL; Word32 *inv_table_pointer = NULL; Word32 *table_D1_pointer = NULL; @@ -149,29 +151,31 @@ static void interpTargetChannel_fx( table_pointer = table_596; inv_table_pointer = inv_table_596; table_D1_pointer = tableD1_596; - break; + BREAK; case 298: table_pointer = table_298; inv_table_pointer = inv_table_298; table_D1_pointer = tableD1_298; - break; + BREAK; case 290: table_pointer = table_290; inv_table_pointer = inv_table_290; table_D1_pointer = tableD1_290; - break; + BREAK; case 145: table_pointer = table_145; inv_table_pointer = inv_table_145; table_D1_pointer = tableD1_145; - break; + BREAK; default: assert( 0 ); } factor_fx = table_pointer[L_abs( d )]; + move32(); interp_factor2_fx = L_shr( factor_fx, 1 ); spread_factor2_fx = inv_table_pointer[L_abs( d )]; + move32(); /* start from (target - N - d + 1) : (extra lag = step1) :to: (target - 1 - d) : (extra lag = d) */ /* sinc interp by a factor of 2 */ @@ -185,20 +189,23 @@ static void interpTargetChannel_fx( IF( 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( ( i - SINC_ORDER1 ), 1 ), 1 ); - lim2 = shr((i + SINC_ORDER1), 1); + lim2 = shr( ( 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] ); + move32(); } } ELSE { ptr2_fx[i] = ptr1_fx[shr( i, 1 )]; + move32(); } } @@ -206,15 +213,16 @@ 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(); - tempF1_fx = L_sub( d * factor_fx, ( signShift == 1 ? ONE_IN_Q12 : -( ONE_IN_Q12 ) ) ); + tempF1_fx = L_sub( d * factor_fx, ( EQ_16( signShift, 1 ) ? ONE_IN_Q12 : -( ONE_IN_Q12 ) ) ); FOR( k = 0; k < N - 1; k++ ) { Word32 local = ( ( (Word64) tempF1_fx * spread_factor2_fx ) >> 31 ) - ONE_IN_Q12; - Word32 sign_local = local > 0 ? 1 : -1; + Word32 sign_local = GT_32( local, 0 ) ? 1 : -1; Word32 local_int = (Word32) W_shr( W_abs( local ), 12 ); Word32 res_a1, res_a2, res_a3; Word32 res_b1, res_b2, res_b3; @@ -233,48 +241,56 @@ static void interpTargetChannel_fx( } y_fx[0] = ptr1_fx[lim1]; + move32(); y_fx[1] = ptr1_fx[lim1 + 1]; + move32(); y_fx[2] = ptr1_fx[lim1 + 2]; + move32(); y_fx[3] = ptr1_fx[lim1 + 3]; + move32(); x_fx[0] = lim1 * interp_factor2_fx; + move32(); x_fx[1] = L_add( x_fx[0], interp_factor2_fx ); + move32(); x_fx[2] = L_add( x_fx[1], interp_factor2_fx ); + move32(); x_fx[3] = L_add( x_fx[2], interp_factor2_fx ); + move32(); - res_a1 = ( tempF1_fx - x_fx[0] ); - res_a2 = ( tempF1_fx - x_fx[1] ); - res_a3 = ( tempF1_fx - x_fx[2] ); + 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_b1 = ( tempF1_fx - x_fx[1] ); - res_b2 = ( tempF1_fx - x_fx[2] ); - res_b3 = ( tempF1_fx - x_fx[3] ); + 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_c1 = ( tempF1_fx - x_fx[0] ); - res_c2 = ( tempF1_fx - x_fx[2] ); - res_c3 = ( tempF1_fx - x_fx[3] ); + 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_d1 = ( tempF1_fx - x_fx[0] ); - res_d2 = ( tempF1_fx - x_fx[1] ); - res_d3 = ( tempF1_fx - x_fx[3] ); + 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 ) ); - tempa = res_a - res_b; - tempb = res_c - res_d; + 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, ( signShift == 1 ? ONE_IN_Q12 : -( ONE_IN_Q12 ) ) ) ); + tempF1_fx = (Word32) W_add( tempF1_fx, L_sub( factor_fx, ( EQ_16( signShift, 1 ) ? ONE_IN_Q12 : -( ONE_IN_Q12 ) ) ) ); } ptr1_fx = target_fx; Copy32( ptr2_fx, ptr1_fx, N - 1 ); @@ -302,35 +318,42 @@ static void targetCh_AlignStereoDFT_fx( Word32 fadeOutBuff_fx[L_SHIFT_ADAPT_MAX]; Word32 fadeInBuff_fx[L_SHIFT_ADAPT_MAX]; - d = -( currShift - prevShift ); + d = sub( prevShift, currShift ); Copy32( target_fx + d, fadeOutBuff_fx, L_shift_adapt ); Copy32( target_fx, fadeInBuff_fx, L_shift_adapt ); - IF( L_shift_adapt > 0 ) + IF( GT_16( L_shift_adapt, 0 ) ) { alpha_fx = 0; + move32(); SWITCH( L_shift_adapt ) { case 596: winSlope_fx = 3603160; - break; + move32(); + BREAK; case 298: winSlope_fx = 7206320; - break; + move32(); + BREAK; case 290: winSlope_fx = 7405116; - break; + move32(); + BREAK; case 145: winSlope_fx = 14810232; - break; + move32(); + BREAK; default: winSlope_fx = ONE_IN_Q31; - break; + move32(); + BREAK; } FOR( i = 0; i < L_shift_adapt; i++ ) { target_fx[i] = L_add( Mpy_32_32( alpha_fx, fadeInBuff_fx[i] ), Mpy_32_32( L_sub( ONE_IN_Q31, alpha_fx ), fadeOutBuff_fx[i] ) ); + move32(); alpha_fx = L_add_sat( alpha_fx, winSlope_fx ); } @@ -359,7 +382,7 @@ void adjustTargetSignal_fx( { /* inter-frame shift variation and target shifting */ - IF( method == 0 ) + IF( EQ_16( method, 0 ) ) { interpTargetChannel_fx( target_fx, prevShift, currShift, L_shift_adapt ); } diff --git a/lib_com/lsf_dec_bfi.c b/lib_com/lsf_dec_bfi.c index 62f41f93728e0a926bab8226f72003265ab9f86b..34eede552b984dbcfa6f43692eb886f69869705d 100644 --- a/lib_com/lsf_dec_bfi.c +++ b/lib_com/lsf_dec_bfi.c @@ -262,7 +262,7 @@ const float *PlcGetlsfBase_flt( /* high rates, return value is never used; the correct value changes dynamically and is not available during PLC; therefore, the setting is kept as before (without the define PLC_FIX_XSF_HANDLING); the - correct value would be isf[m] as returned by lpc_unquantize_flt() + correct value would be isf[m] as returned by lpc_unquantize() during normal decoding */ if ( sr_core == 32000 ) diff --git a/lib_com/lsf_dec_bfi_fx.c b/lib_com/lsf_dec_bfi_fx.c index a8012671e6b1add6838db18fea3466ccfa11df0b..45a3bb1d70438bbabda9b0242f0f4691f76f0c10 100644 --- a/lib_com/lsf_dec_bfi_fx.c +++ b/lib_com/lsf_dec_bfi_fx.c @@ -266,7 +266,7 @@ Word16 const * PlcGetLsfBase ( /* high rates, return value is never used; the correct value changes dynamically and is not available during PLC; therefore, the setting is kept as before (without the define PLC_FIX_XSF_HANDLING); the - correct value would be isf[m] as returned by lpc_unquantize() + correct value would be isf[m] as returned by lpc_unquantize_fx() during normal decoding */ IF(EQ_32(sr_core,32000)) { diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index 8cd86a314652c3272162f05f763d6264f522d2fd..be45576b7951bf6d65dc95976585089fb9f8e32a 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -221,7 +221,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ } /* interpolation */ - datastep = shr(div_s(shl(fac_den,8), shl(fac_num,11)),12); + datastep = shr(div_s(shl(fac_den,7), shl(fac_num,10)),12); /* equivalent to 'datastep = fac_den % fac_num' */ temp_n = i_mult2(datastep,fac_num); /*Q0*/ fracstep = sub(fac_den,temp_n); diff --git a/lib_com/mslvq_com.c b/lib_com/mslvq_com.c index 39a1c4c69927c2f27108a11532227b573a4ab68a..77fb370a729bef1d0c1f37be36d28dfa9bb72364 100644 --- a/lib_com/mslvq_com.c +++ b/lib_com/mslvq_com.c @@ -919,7 +919,11 @@ void deindex_lvq_SHB( /* find idx_leader */ i = 1; +#ifdef NONBE_FIX_1054_NEGATIVE_LVQ_INDEX + while ( index > table_no_cv[i] ) +#else while ( index >= table_no_cv[i] ) +#endif { i++; } diff --git a/lib_com/options.h b/lib_com/options.h index 1b2c564d798cfe361e91a89774ab8d5f3053f23c..366354dc890d594c3814771366c0b9b3bc016745 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -68,6 +68,12 @@ /* #################### 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 */ + +/* #################### End FIXES switches ############################ */ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ @@ -94,6 +100,7 @@ #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 #define ISM_DISABLE #define FIX_TMP_714 @@ -101,7 +108,6 @@ #define EVS_FUNC_MODIFIED //#define DEBUGGING //#define DBG_WAV_WRITER -#define EVS_FLOAT #define EVS_FLOAT_ENC //#define DUMPS_ENABLED #define FIX_667_DISABLE_INITIAL_PLC_SUPPRESSION @@ -119,7 +125,6 @@ #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 - /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 2341895efdd46d2ba0bc8fdb0fc5b1bdb2be1671..bc84c7a920ab03adc7e609ce4ef9cc7c4fb0706b 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -749,7 +749,7 @@ float lsf_stab( const int16_t L_frame /* i : frame length */ ); -void amr_wb_dec_init_flt( +void amr_wb_dec_init( AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ ); @@ -2530,6 +2530,7 @@ void calc_st_filt( const int16_t extl /* i : extension layer info */ ); + void scale_st_ivas( const float *sig_in, /* i : postfilter input signal */ float *sig_out, /* i/o: postfilter output signal */ @@ -4720,7 +4721,7 @@ void updt_dec_common( const float *synth /* i : decoded synthesis */ ); -void td_cng_dec_init_flt( +void td_cng_dec_init( DEC_CORE_HANDLE st /* i/o: decoder state structure */ ); @@ -5304,7 +5305,7 @@ void HQ_nbfec_init_flt( HQ_NBFEC_HANDLE hHQ_nbfec /* i/o: HQ NB FEC data handle */ ); -ivas_error evs_dec_flt( +ivas_error evs_dec( Decoder_State *st, /* i/o: Decoder state structure */ float mem_hp20_out[L_HP20_MEM], /* i/o: HP filter memory for synthesis */ float *output, /* o : output synthesis signal */ @@ -5315,7 +5316,7 @@ void get_next_frame_parameters( Decoder_State *st /* i/o: Decoder state structure */ ); -ivas_error amr_wb_dec_flt( +ivas_error amr_wb_dec( Decoder_State *st, /* i/o: decoder state structure */ float mem_hp20_out[L_HP20_MEM], /* i/o: HP filter memory for synthesis */ float *output /* o : synthesis output */ @@ -5545,7 +5546,7 @@ void hq_core_dec( float *output /* o : LB synthesis in case of ACELP-HQ switch */ ); -void IMDCT_flt( +void IMDCT( float *x, float *old_syn_overl, float *syn_Overl_TDAC, @@ -6730,7 +6731,7 @@ void ifft3( ); /*! r: updated estimate of background noise */ -void minimumStatistics_flt( +void minimumStatistics( float *noiseLevelMemory, /* i/o: internal state */ int16_t *noiseLevelIndex, /* i/o: internal state */ int16_t *currLevelIndex, /* i/o: internal state (circular buffer) */ @@ -6866,7 +6867,7 @@ void D_ACELP_indexing_ivas( int16_t prm[], int16_t *BER_detect ); -void D_ACELP_decode_43bit_flt( +void D_ACELP_decode_43bit( uint16_t idxs[], float code[], int16_t *pulsestrack ); @@ -7110,7 +7111,7 @@ int16_t Mode2_gain_enc_mless( const int16_t coder_type /* i : type of coder */ ); -void decode_acelp_gains_flt( +void decode_acelp_gains( const float *code, const int16_t gains_mode, const float mean_ener_code, @@ -7124,7 +7125,7 @@ void decode_acelp_gains_flt( float *code2, float *gain_code2 ); -void gain_dec_gacelp_uv_flt( +void gain_dec_gacelp_uv( int16_t index, /* i/o: Quantization index vector */ const float *code, /* i : algebraic code excitation */ const float *code2, /* i : algebraic code excitation */ @@ -7263,14 +7264,14 @@ int16_t encode_lpc_avq( const int16_t element_mode /* i : element mode */ ); -int16_t dlpc_avq_flt( +int16_t dlpc_avq( int16_t *index, /* i : Quantization indices */ float *LSF_Q, /* o : Quantized LSF vectors */ const int16_t numlpc, /* i : Number of sets of lpc */ const int32_t sr_core /* i : internal sampling rate */ ); -int16_t decode_lpc_avq_flt( +int16_t decode_lpc_avq( Decoder_State *st, /* i/o: decoder state structure */ const int16_t numlpc, /* i : Number of sets of lpc */ int16_t *param_lpc, /* o : lpc parameters */ @@ -7821,7 +7822,7 @@ int16_t ari_start_decoding_14bits_prm_ivas( int16_t bp, Tastat *s ); -Word16 ari_start_decoding_14bits_prm_fx_ivas( +Word16 ari_start_decoding_14bits_prm_ivas_fx( const Word16 *ptr, Word16 bp, Tastat *s @@ -7930,7 +7931,7 @@ void tcx_arith_encode_envelope( const int16_t low_complexity /* i : low-complexity flag */ ); -void tcx_arith_decode_envelope_flt( +void tcx_arith_decode_envelope( Decoder_State *st, /* i/o: coder state */ float q_spectrum[], /* o : quantised MDCT coefficients */ const int16_t L_frame, /* i : frame or MDCT length */ @@ -7946,7 +7947,7 @@ void tcx_arith_decode_envelope_flt( const int16_t low_complexity /* i : low-complexity flag */ ); -void tcx_arith_decode_envelope_fx( +void tcx_arith_decode_envelope_ivas_fx( Decoder_State *st, /* i/o: coder state */ Word32 q_spectrum[], /* o : quantised MDCT coefficients */ Word16 *q_spectrum_e, /* o : MDCT exponent */ @@ -8103,7 +8104,7 @@ void coder_tcx_post( const float *Ai /* i : Unquantized (interpolated) LPC coefficients */ ); -void decoder_tcx_flt( +void decoder_tcx( Decoder_State *st, /* i/o: coder memory state */ int16_t prm[], /* i : parameters */ float A[], /* i : coefficients NxAz[M+1] */ @@ -8115,7 +8116,7 @@ void decoder_tcx_flt( const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ); -void decoder_tcx_post_flt( +void decoder_tcx_post( Decoder_State *st, /* i/o: decoder memory state */ float *synth, float *synthFB, @@ -8155,7 +8156,7 @@ void coder_acelp_rf( float *syn_rf /* i/o: pointer to RF synthesis */ ); -void decoder_acelp_flt( +void decoder_acelp( Decoder_State *st, /* i/o: coder memory state */ int16_t prm[], /* i : parameters */ const float A[], /* i : coefficients NxAz[M+1] */ @@ -8410,7 +8411,7 @@ int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( float *dist_ptr /* i/o: updated MSE vector for stage1 */ ); -void PulseResynchronization_flt( +void PulseResynchronization( const float *src_exc, /* i : Input excitation buffer */ float *dst_exc, /* o : output excitation buffer */ const int16_t nFrameLength, /* i : frame length */ @@ -8419,7 +8420,7 @@ void PulseResynchronization_flt( const float pitchEnd /* i : Pitch at the end of the current frame */ ); -void con_acelp_flt( +void con_acelp( float A[], /* i : coefficients NxAz[M+1] */ const int16_t coder_type, /* i : ACELP coder type */ float synth[], /* i/o: synthesis */ @@ -8432,7 +8433,7 @@ void con_acelp_flt( float *bwe_exc /* o : excitation for SWB TBE */ ); -void con_tcx_flt( +void con_tcx( Decoder_State *st, /* i/o: coder memory state */ float synth[], /* i/o: synth[] */ const float coh, /* i : coherence of stereo signal */ @@ -8578,7 +8579,7 @@ void lpc_quantization( int16_t *bits_param_lpc, int16_t *no_param_lpc ); -void lpc_unquantize_flt( +void lpc_unquantize( Decoder_State *st, float *lsf, float *lsp, @@ -8839,21 +8840,21 @@ void generate_comfort_noise_enc( Encoder_State *st /* i/o: encoder state structure */ ); -void generate_comfort_noise_dec_flt( +void generate_comfort_noise_dec( float **bufferReal, /* o : Real part of input bands */ float **bufferImag, /* o : Imaginary part of input bands */ Decoder_State *st, /* i/o: decoder state structure */ const int16_t nchan_out /* i : number of output channels */ ); -void generate_comfort_noise_dec_hf_flt( +void generate_comfort_noise_dec_hf( float **bufferReal, /* o : Real part of input bands */ float **bufferImag, /* o : Imaginary part of input bands */ HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ const int16_t cng_flag /* i : CNG Flag */ ); -void generate_masking_noise_flt( +void generate_masking_noise( float *timeDomainBuffer, /* i/o: time-domain signal */ HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ const int16_t length, /* i : frame size */ @@ -8880,11 +8881,11 @@ void generate_masking_noise_ivas_fx( ); #endif -void generate_masking_noise_update_seed_flt( +void generate_masking_noise_update_seed( HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ); -void generate_masking_noise_mdct_flt( +void generate_masking_noise_mdct( float *mdctBuffer, /* i/o: time-domain signal */ HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ); @@ -8930,16 +8931,6 @@ void generate_stereo_masking_noise( #ifdef IVAS_FLOAT_FIXED void generate_stereo_masking_noise_fx( - float *syn, /* i/o: time-domain signal */ - 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 generate_stereo_masking_noise_16fx( Word16 *syn, /* i/o: time-domain signal */ Word16 Q_syn, Decoder_State *st, /* i/o: decoder state structure */ @@ -9029,17 +9020,17 @@ void lpc_from_spectrum_flt( const int16_t stop, const float preemph_fac ); -ivas_error createFdCngDec_flt( +ivas_error createFdCngDec( HANDLE_FD_CNG_DEC *hFdCngDec ); -void deleteFdCngDec_flt( +void deleteFdCngDec( HANDLE_FD_CNG_DEC *hFdCngDec ); -void initFdCngDec_flt( +void initFdCngDec( DEC_CORE_HANDLE st /* i/o: decoder state structure */ ); -void configureFdCngDec_flt( +void configureFdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the FD-based CNG process */ const int16_t bwidth, const int32_t total_brate, @@ -9047,7 +9038,7 @@ void configureFdCngDec_flt( const int16_t last_L_frame, const int16_t element_mode ); -void ApplyFdCng_flt( +void ApplyFdCng( float *timeDomainInput, float *powerSpectrum, float **realBuffer, /* i/o: Real part of the buffer */ @@ -9056,7 +9047,7 @@ void ApplyFdCng_flt( const int16_t concealWholeFrame, /* i : binary flag indicating frame loss */ const int16_t is_music ); -void generate_comfort_noise_dec_flt( +void generate_comfort_noise_dec( float **bufferReal, /* o : Real part of input bands */ float **bufferImag, /* o : Imaginary part of input bands */ Decoder_State *st, /* i/o: decoder state structure */ @@ -9073,7 +9064,7 @@ float cng_energy( const int16_t len /* i : vector length */ ); -void FdCng_decodeSID_flt( +void FdCng_decodeSID( Decoder_State *st /* i/o: decoder state structure */ ); @@ -9098,7 +9089,7 @@ void FdCng_exc_flt( float *bwe_exc /* o : LP excitation for BWE */ ); -void noisy_speech_detection_flt( +void noisy_speech_detection( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: FD_CNG structure */ const int16_t vad, /* i : VAD flag */ const float syn[] /* i : input time-domain frame */ @@ -9575,7 +9566,7 @@ void longshiftleft( const int16_t len /* i : length of vector a[] and d[] */ ); -void open_decoder_LPD_flt( +void open_decoder_LPD( Decoder_State *st, /* i/o: decoder state structure */ const int32_t total_brate, /* i : total bitrate */ const int32_t last_total_brate, /* i : last total bitrate */ @@ -9615,7 +9606,7 @@ void reconfig_decoder_LPD_ivas( const int16_t L_frame_old /* i : frame length */ ); -void mode_switch_decoder_LPD_flt( +void mode_switch_decoder_LPD( Decoder_State *st, /* i/o: decoder state structure */ const int16_t bwidth, /* i : audio bandwidth */ const int32_t total_brate, /* i : total bitrate */ @@ -9625,7 +9616,7 @@ void mode_switch_decoder_LPD_flt( const int16_t last_element_mode /* i : last element mode */ ); -void dec_acelp_tcx_frame_flt( +void dec_acelp_tcx_frame( Decoder_State *st, /* i/o: decoder state structure */ int16_t *concealWholeFrame, /* i/o: concealment flag */ float *output, /* o : synthesis */ @@ -9637,7 +9628,7 @@ void dec_acelp_tcx_frame_flt( STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ ); -void decoder_LPD_flt( +void decoder_LPD( Decoder_State *st, /* i/o: decoder memory state pointer */ float signal_out[], /* o : signal with LPD delay (7 subfrs) */ float signal_outFB[], /* o : synthesis @output_FS */ @@ -9856,7 +9847,7 @@ void fer_energy( const int16_t useOffset /* i : speech pointer offset (0 or L_FRAME) */ ); -float getLevelSynDeemph_flt( +float getLevelSynDeemph( const float h1Init[], /* i : input value or vector to be processed */ const float A[], /* i : LPC coefficients */ const int16_t lenLpcExc, /* i : length of the LPC excitation buffer */ @@ -9864,14 +9855,14 @@ float getLevelSynDeemph_flt( const int16_t numLoops /* i : number of loops */ ); -void genPlcFiltBWAdap_flt( +void genPlcFiltBWAdap( const int32_t sr_core, /* i : core sampling rate */ float *lpFiltAdapt, /* o : filter coefficients for filtering codebooks in case of flc */ const int16_t type, /* i : type of filter, either 0 : lowpass or 1 : highpass */ const float alpha /* i : fade out factor [0 1) used decrease filter tilt */ ); -void highPassFiltering_flt( +void highPassFiltering( const int16_t last_good, /* i : last classification type */ const int16_t L_buffer, /* i : buffer length */ float exc2[], /* i/o: unvoiced excitation before the high pass filtering */ @@ -9879,7 +9870,7 @@ void highPassFiltering_flt( const int16_t l_fir_fer /* i : high pass filter length */ ); -int16_t GetPLCModeDecision_flt( +int16_t GetPLCModeDecision( Decoder_State *st /* i/o: decoder memory state pointer */ ); diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index 4d748545e2b6c76e918e6ba3d3e1816fb8dcfeb0..88ece4c551ddd6519acca7b2583fa14492ef2d5f 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -359,7 +359,8 @@ void SWB_BWE_decoding_fx( Word16 *prev_weight, /* i/o: excitation weight value of last frame */ const Word16 extl, /* i : extension layer */ Word16 Q_syn - , const Word16 last_extl /* i : extension layer of last frame */ + , const Word16 last_extl, /* i : extension layer of last frame */ + Word16 element_mode /* i : element mode */ ); void time_envelop_shaping_fx( @@ -770,7 +771,7 @@ void v_sort(Word16 *r, const Word16 lo, const Word16 up); void compute_poly_product_fx(Word16 *coef, Word32 *p, Word16 order); -void dec_prm_hm( +void dec_prm_hm_fx( Decoder_State *st, Word16 *prm_hm, const Word16 L_frame @@ -2519,7 +2520,8 @@ void SWB_BWE_decoding_fx( Word16 *prev_weight, /* i/o: excitation weight value of last frame */ const Word16 extl, /* i : extension layer */ Word16 Q_syn - , const Word16 last_extl /* i : extension layer of last frame */ + , const Word16 last_extl, /* i : extension layer of last frame */ + Word16 element_mode /* i : element mode */ ); void time_envelop_shaping_fx( @@ -4252,6 +4254,8 @@ Word16 find_guarded_bits_fx(Word32 n); Word16 L_norm_arr(Word32* arr, Word16 size); +Word16 get_min_scalefactor( Word32 x, Word32 y ); + void edct2_fx_ivas( const Word16 n, const Word16 isgn, @@ -5806,7 +5810,7 @@ void swb_CNG_dec_ivas_fx( const Word16 Qsyn /* i : Q value of ACELP core synthesis */ ); -void td_cng_dec_init( +void td_cng_dec_init_fx( DEC_CORE_HANDLE st /* i/o: decoder state structure */ ); @@ -5904,7 +5908,8 @@ void DetectTonalComponents( const Word32 secondLastPowerSpectrum[], const Word16 nSamples, const Word16 nSamplesCore, - Word16 floorPowerSpectrum /* i: lower limit for power spectrum bins */ + Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ + Word16 element_mode #ifdef IVAS_CODE_MDCT_GSHAPE , const PsychoacousticParameters* psychParamsCurrent #endif @@ -5933,7 +5938,8 @@ void RefineTonalComponents( const Word32 secondLastPowerSpectrum[], const Word16 nSamples, const Word16 nSamplesCore, - const Word16 floorPowerSpectrum /* i: lower limit for power spectrum bins */ + const Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ + Word16 element_mode #ifdef IVAS_CODE_MDCT_GSHAPE , const PsychoacousticParameters* psychParamsCurrent #endif @@ -6014,7 +6020,8 @@ void TonalMDCTConceal_SaveTimeSignal( void TonalMDCTConceal_Detect( const TonalMDCTConcealPtr self, /*IN */ const Word32 pitchLag, /*IN */ - Word16 * umIndices /*OUT*/ + Word16 * umIndices, /*OUT*/ + Word16 element_mode /* IN */ #ifdef IVAS_CODE_MDCT_GSHAPE , const PsychoacousticParameters* psychParamsCurrent #endif @@ -6157,12 +6164,12 @@ void TonalMDCTConceal_Apply( ); //dec_post_fx - void Init_post_filter( + void Init_post_filter_fx( PFSTAT_HANDLE hPFstat /* i : core decoder parameters */ ); /* (i) : core decoder parameters */ - void nb_post_filt( + void nb_post_filt_fx( const Word16 L_frame, /* i : frame length */ PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16* psf_lp_noise, /* i : Long term noise Q8 */ @@ -6175,7 +6182,7 @@ void TonalMDCTConceal_Apply( const Word16 disable_hpf /* i : flag to diabled HPF */ ); - void formant_post_filt( + void formant_post_filt_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ Word16 *Aq, /* i : LP filter coefficient */ @@ -6187,7 +6194,7 @@ void TonalMDCTConceal_Apply( ); #ifdef IVAS_FLOAT_FIXED - void formant_post_filt_fx( + void formant_post_filt_ivas_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ Word16 *Aq, /* i : LP filter coefficient */ @@ -6198,7 +6205,7 @@ void TonalMDCTConceal_Apply( const Word16 off_flag /* i : off flag */ ); #endif - void Filt_mu( + void Filt_mu_fx( Word16 * sig_in, /* i : signal (beginning at sample -1) */ Word16 * sig_out, /* o : signal with tilt */ Word16 parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ @@ -6206,7 +6213,7 @@ void TonalMDCTConceal_Apply( ); #ifdef IVAS_FLOAT_FIXED - void Filt_mu_fx( + void Filt_mu_ivas_fx( Word16 * sig_in, /* i : signal (beginning at sample -1) */ Word16 * sig_out, /* o : signal with tilt */ Word16 parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ @@ -6214,14 +6221,14 @@ void TonalMDCTConceal_Apply( const Word16 extl ); #endif - void scale_st( + void scale_st_fx( const Word16 * sig_in, /* i : postfilter i signal */ Word16 * sig_out, /* i/o: postfilter o signal */ Word16 * gain_prec, /* i/o: last value of gain for subframe */ Word16 L_subfr ); - void blend_subfr2( + void blend_subfr2_fx( Word16 *sigIn1, /* i : i signal for fade-out */ Word16 *sigIn2, /* i : i signal for fade-in */ Word16 *sigOut /* o : output signal */ @@ -6293,7 +6300,7 @@ void init_tcx_cfg_fx( Word16 Q_syn, Word16 bpf_noise_buf[] /* o : BPF error signal (at int_fs) */ ); - void addBassPostFilterFx( + void addBassPostFilter_fx( const Word16 *harm_timeIn_Fx, Word32 **rAnalysis_Fx, Word32 **iAnalysis_Fx, @@ -6346,7 +6353,7 @@ void init_tcx_cfg_fx( ); //er_sync_exc_fx.c - void PulseResynchronization( + void PulseResynchronization_fx( Word16 /*float*/ const * const src_exc, /*i Q15*/ Word16 /*float*/ * const dst_exc, /*o Q15*/ Word16 /*int*/ const nFrameLength, /*i Q0 */ @@ -6806,7 +6813,7 @@ void GSC_dec_init_ivas_fx( const Word16 L_subfr /* i : subframe length */ ); #endif - +#ifdef IVAS_FLOAT_FIXED //dec4t64_fx.c void dec_acelp_4t64_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ @@ -6814,11 +6821,12 @@ void GSC_dec_init_ivas_fx( Word16 code[], /* o : algebraic (fixed) codebook excitation Q9*/ const Word16 Opt_AMR_WB ); +#endif + void D_ACELP_decode_43bit_fx(UWord16 idxs[], Word16 code[], Word16 *pulsestrack); - void D_ACELP_decode_43bit(UWord16 idxs[], Word16 code[], Word16 *pulsestrack); - +#ifdef IVAS_FLOAT_FIXED //dec_acelp_fx.c - void D_ACELP_indexing( + void D_ACELP_indexing_fx( Word16 code[], PulseConfig config, Word16 num_tracks, @@ -6826,8 +6834,8 @@ void GSC_dec_init_ivas_fx( , Word16 *BER_detect ); - void fcb_pulse_track_joint_decode(UWord16 *idxs, Word16 wordcnt, UWord32 *index_n, Word16 *pulse_num, Word16 track_num); - + void fcb_pulse_track_joint_decode_fx(UWord16 *idxs, Word16 wordcnt, UWord32 *index_n, Word16 *pulse_num, Word16 track_num); +#endif //dec2t32_fx.c void dec_acelp_2t32_fx( @@ -7045,18 +7053,18 @@ void GSC_dec_init_ivas_fx( //fd_cng_dec_fx.c - ivas_error createFdCngDec(HANDLE_FD_CNG_DEC* hFdCngDec); + ivas_error createFdCngDec_fx(HANDLE_FD_CNG_DEC* hFdCngDec); - void initFdCngDec( + void initFdCngDec_fx( DEC_CORE_HANDLE st, /* i/o: decoder state structure */ Word16 scale ); /* Delete the instance of type FD_CNG */ - void deleteFdCngDec(HANDLE_FD_CNG_DEC* hFdCngDec); + void deleteFdCngDec_fx(HANDLE_FD_CNG_DEC* hFdCngDec); /* Configure CLDFB-CNG */ - void configureFdCngDec( + void configureFdCngDec_fx( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the CLDFB-based CNG process */ Word16 bandwidth, Word32 bitrate, @@ -7066,7 +7074,7 @@ void GSC_dec_init_ivas_fx( ); /* Apply the CLDFB-based CNG */ - Word16 ApplyFdCng( + Word16 ApplyFdCng_fx( Word16* timeDomainInput, /* i : pointer to time domain i */ Word16 Q, #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT @@ -7080,7 +7088,7 @@ void GSC_dec_init_ivas_fx( Word16 is_music ); - Word16 ApplyFdCng_fx( + Word16 ApplyFdCng_ivas_fx( Word16 *timeDomainInput, /* i : pointer to time domain input */ Word16 Q, Word32 *powerSpectrum, @@ -7094,7 +7102,7 @@ void GSC_dec_init_ivas_fx( ); /* Perform noise estimation */ - void perform_noise_estimation_dec( + void perform_noise_estimation_dec_fx( const Word16* timeDomainInput, /* i: pointer to time domain i */ const Word16 Q, #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT @@ -7111,7 +7119,7 @@ void GSC_dec_init_ivas_fx( #endif ); - void perform_noise_estimation_dec_fx( + void perform_noise_estimation_dec_ivas_fx( const Word16 *timeDomainInput, /* i: pointer to time domain input */ const Word16 Q, Word32 *power_spectrum, @@ -7126,17 +7134,17 @@ void GSC_dec_init_ivas_fx( ); /* Decode the CLDFB-CNG bitstream */ - void FdCng_decodeSID(HANDLE_FD_CNG_COM st, /* i/o: FD_CNG structure containing all buffers and variables */ + void FdCng_decodeSID_fx(HANDLE_FD_CNG_COM st, /* i/o: FD_CNG structure containing all buffers and variables */ Decoder_State *corest); /* i/o: decoder state structure */ - void noisy_speech_detection( + void noisy_speech_detection_fx( HANDLE_FD_CNG_DEC hFdCngDec,/* i/o: FD_CNG structure */ const Word16 vad, /* i : VAD flag */ const Word16* syn, /* i : i time-domain frame */ const Word16 Q ); - void generate_comfort_noise_dec( + void generate_comfort_noise_dec_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 */ @@ -7147,7 +7155,7 @@ void GSC_dec_init_ivas_fx( ); void - generate_comfort_noise_dec_hf(Word32 **bufferReal, /* o : matrix to real part of i bands */ + 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 */ Decoder_State *stdec @@ -7162,18 +7170,18 @@ void generate_comfort_noise_dec_hf_ivas_fx( ); /* Generate the comfort noise based on the target noise level */ - void generate_masking_noise(Word16 *timeDomainBuffer, /* i/o: time-domain signal */ + void generate_masking_noise_fx(Word16 *timeDomainBuffer, /* i/o: time-domain signal */ Word16 Q, HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing all buffers and variables */ , Word16 length , Word16 core ); - void generate_masking_noise_update_seed( + void generate_masking_noise_update_seed_fx( HANDLE_FD_CNG_COM st /* i/o : pointer to FD_CNG_COM structure */ ); - void generate_masking_noise_mdct(Word32 *mdctBuffer, /* i/o: time-domain signal */ + void generate_masking_noise_mdct_fx(Word32 *mdctBuffer, /* i/o: time-domain signal */ Word16 *mdctBuffer_e, /* i/o: exponent time-domain signal */ HANDLE_FD_CNG_COM st /* i/o: FD_CNG structure containing all buffers and variables */ , Word16 L_frame @@ -7195,7 +7203,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ ); - void destroy_cldfb_decoder( + void destroy_cldfb_decoder_fx( Decoder_State *st_fx /* o: Decoder static variables structure */ ); @@ -7259,10 +7267,10 @@ void generate_comfort_noise_dec_hf_ivas_fx( const Word16 hq_core_type, /* i : HQ core type */ const Word16 core_switching_flag /* i : ACELP->HQ switching frame flag */ ); - void HQ_core_dec_init( + void HQ_core_dec_init_fx( HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ ); - void HQ_nbfec_init( + void HQ_nbfec_init_fx( HQ_NBFEC_HANDLE hHQ_nbfec /* i/o: HQ NB FEC data handle */ ); @@ -7557,7 +7565,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( Decoder_State *st_fx /* o : Decoder static variables structure */ ); - void amr_wb_dec_init( + void amr_wb_dec_init_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ ); @@ -7677,7 +7685,8 @@ void generate_comfort_noise_dec_hf_ivas_fx( Word16 *bfi_pitch, /* i/o: update of the estimated pitch for FEC */ Word16 *bfi_pitch_frame, /* o : frame length when pitch was updated */ Word16 *upd_cnt /* i/o: update counter */ - , const Word16 coder_type /* i : coder_type */ + , const Word16 coder_type, /* i : coder_type */ + Word16 element_mode /* i : element mode */ ); //FEC_scale_sync_fx.c @@ -7729,6 +7738,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( Word16 dct_buffer_out[], /* o : DCT output buffer (qdct)*/ Word16 filt_lfE[], /* i/o: long term spectrum energy Q15 */ const Word16 last_core, /* i : last core */ + const Word16 element_mode, /* i : element mode */ const Word16 *pitch_buf, /* i : current frame pitch information Q6*/ Word16 *LDm_enh_lp_gbin, /* o : smoothed suppression gain, per bin FFT Q15*/ const Word16 Q_exc, /* i : excitation scaling */ @@ -7785,6 +7795,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( #endif ); +#ifdef IVAS_FLOAT_FIXED //dec_amr_wb_fx.c void decod_amr_wb_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -7796,6 +7807,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( Word16 *voice_factors_fx, /* o : voicing factors */ Word16 *gain_buf /* o : floating pitch gain for each subframe Q14 */ ); +#endif //rst_dec_fx.c void CNG_reset_dec_fx( @@ -7832,7 +7844,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( ); //core_dec_init_fx.c - void open_decoder_LPD( + void open_decoder_LPD_fx( Decoder_State* st, const Word32 total_brate, #ifdef NEW_IVAS_OPEN_DEC @@ -8143,8 +8155,9 @@ void generate_comfort_noise_dec_hf_ivas_fx( Word16 *ni_seed_fx /* i/o: random seed */ ); +#ifdef IVAS_FLOAT_FIXED //dec_acelp_tck_main_fx.c - Word16 dec_acelp_tcx_frame( + Word16 dec_acelp_tcx_frame_fx( Decoder_State* st, /* i/o: decoder state structure */ Word16* concealWholeFrame, /* i/o: concealment flag */ Word16* pcmBuf, /* o : synthesis */ @@ -8157,9 +8170,10 @@ void generate_comfort_noise_dec_hf_ivas_fx( , STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ #endif ); +#endif //dec_LPD_fx.c - void decoder_LPD( + void decoder_LPD_fx( Word16 signal_out[], /* o : signal with LPD delay (7 subfrs) */ Word16 signal_outFB[], /* o : synthesis @output_FS */ Word16* total_nbbits, /* i/o: number of bits / decoded bits */ @@ -8174,7 +8188,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( ); //core_dec_switch_fx.c - void mode_switch_decoder_LPD(Decoder_State *st, Word16 bandwidth_in, Word32 bitrate, Word16 frame_size_index + void mode_switch_decoder_LPD_fx(Decoder_State *st, Word16 bandwidth_in, Word32 bitrate, Word16 frame_size_index ); #ifdef IVAS_FLOAT_FIXED @@ -8286,38 +8300,38 @@ void IGFSCFDecoderDecode( ); //ari_dec_fx.c -Word16 ari_decode_overflow(Tastat *s); +Word16 ari_decode_overflow_fx(Tastat *s); -void ari_start_decoding_14bits( +void ari_start_decoding_14bits_fx( Decoder_State *st, Tastat *s ); -Word16 ari_start_decoding_14bits_prm(const Word16 *ptr, Word16 bp, Tastat *s); +Word16 ari_start_decoding_14bits_prm_fx(const Word16 *ptr, Word16 bp, Tastat *s); -Word16 ari_decode_14bits_s17_ext( +Word16 ari_decode_14bits_s17_ext_fx( Decoder_State *st, Tastat *s, UWord16 const *cum_freq ); -Word16 ari_decode_14bits_s27_ext( +Word16 ari_decode_14bits_s27_ext_fx( Decoder_State *st, Tastat *s, UWord16 const *cum_freq ); -Word16 ari_decode_14bits_bit_ext( +Word16 ari_decode_14bits_bit_ext_fx( Decoder_State *st, Tastat *s ); -Word16 ari_decode_14bits_pow(Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s, Word16 base); +Word16 ari_decode_14bits_pow_fx(Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s, Word16 base); -Word16 ari_decode_14bits_sign(Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s); +Word16 ari_decode_14bits_sign_fx(Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s); //dec_prm_fx.c -void getTCXparam( +void getTCXparam_fx( Decoder_State *st, /* i/o: Decoder State handle */ Decoder_State *st0, /* i : bitstream */ CONTEXT_HM_CONFIG hm_cfg, /* i/o: HM config */ @@ -8329,7 +8343,7 @@ void getTCXparam( Word16 nTnsBitsTCX10[2], const Word16 pre_past_flag ); -void dec_prm( +void dec_prm_fx( Word16 *coder_type, Word16 param[], /* (o) : decoded parameters */ Word16 param_lpc[], /* (o) : LPC parameters */ @@ -8339,7 +8353,7 @@ void dec_prm( Word16 *bitsRead ); -void getLPCparam( +void getLPCparam_fx( Decoder_State *st, /* i/o: decoder memory state */ Word16 param_lpc[], /* o : LTP parameters */ Decoder_State *st0, /* i : bitstream */ @@ -8570,13 +8584,13 @@ void init_igf_dec( ); //dlpc_avq_fx.c -Word16 dlpc_avq( +Word16 dlpc_avq_fx( Word16 *index, /* (i) Quantization indices */ Word16 *LSF_Q, /* (o) Quantized LSF vectors */ Word16 numlpc, /* (i) Number of sets of lpc */ Word32 sr_core ); -Word16 decode_lpc_avq( +Word16 decode_lpc_avq_fx( Decoder_State* st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ Word16* param_lpc /* o : lpc parameters */ @@ -8587,8 +8601,8 @@ Word16 decode_lpc_avq( #endif ); -//decode_lpc_avq declaration with IVAS_CODE_AVQ_LPC enabled -Word16 decode_lpc_avq_ivas( +//decode_lpc_avq_ivas_fx declaration with IVAS_CODE_AVQ_LPC enabled +Word16 decode_lpc_avq_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ Word16 *param_lpc /* o : lpc parameters */ @@ -8665,7 +8679,7 @@ Word16 RCcontextMapping_decode2_no_mem_s17_LCS_fx( ); //core_dec_reconf_fx.c -void reconfig_decoder_LPD(Decoder_State *st, Word16 bits_frame, Word16 bandwidth_mode, Word32 bitrate, Word16 L_frame_old); +void reconfig_decoder_LPD_fx(Decoder_State *st, Word16 bits_frame, Word16 bandwidth_mode, Word32 bitrate, Word16 L_frame_old); #ifdef IVAS_FLOAT_FIXED void reconfig_decoder_LPD_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ @@ -8677,7 +8691,7 @@ void reconfig_decoder_LPD_ivas_fx( #endif // IVAS_FLOAT_FIXED //er_utils_fx.c -void minimumStatistics(Word16* noiseLevelMemory, /* Q15, internal state */ +void minimumStatistics_fx(Word16* noiseLevelMemory, /* Q15, internal state */ Word16* noiseLevelIndex, /* Q0, internal state */ Word16* currLevelIndex, /* Q0, internal state (circular buffer) */ Word16* noiseEstimate, /* Q15, previous estimate of background noise */ @@ -8690,7 +8704,7 @@ void minimumStatistics(Word16* noiseLevelMemory, /* Q15, internal sta Word16 currentFrameLevel_e); /* exponent of currentFrameLevel */ -Word16 getLevelSynDeemph( /*10Q5*/ +Word16 getLevelSynDeemph_fx( /*10Q5*/ Word16 h1Init[], /* i: i value or vector to be processed */ /* Q15 */ Word16 const A[], /* i: LPC coefficients */ /* Qx */ Word16 const lpcorder, /* i: LPC order */ /* Q0 */ @@ -8700,14 +8714,14 @@ Word16 getLevelSynDeemph( /*10Q5*/ Word16 *Exp /* o: exponent of return value Q15 */ ); -void genPlcFiltBWAdap( +void genPlcFiltBWAdap_fx( Word32 const sr_core, /*Q(15-exp) */ -#ifdef EVS_FLOAT + IF(EQ_16(element_mode, EVS_MONO)) + { #ifdef BASOP_NOGLOB - EnergyL_16 = round_fx_sat(L_shl_sat(L_tmp, add(exp, 4))); /* Q3 */ + Energy_16 = round_fx_sat(L_shl_sat(L_tmp, add(exp, 4))); #else - Energy_16 = round_fx(L_shl(L_tmp,add(exp,4))); /*Q3 */ + EnergyL_16 = round_fx( L_shl( L_tmp, add( exp, 4 ) ) ); #endif -#else + } + ELSE + { #ifdef BASOP_NOGLOB - Energy_16 = round_fx_sat( L_shl_sat( L_tmp, add( exp, 4 ) ) ); /* Q3 */ + EnergyL_16 = round_fx_sat(L_shl_sat(L_tmp, add(exp, 4))); /* Q3 */ #else - EnergyL_16 = round_fx( L_shl( L_tmp, add( exp, 4 ) ) ); /*Q3 */ + Energy_16 = round_fx(L_shl(L_tmp,add(exp,4))); /*Q3 */ #endif -#endif // EVS_FLOAT + } IF(NE_16(last_extl, SWB_BWE) && NE_16(last_extl,FB_BWE)) { diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index 170f4f5e5311fc1820e6bfdbc16d3ce1c55786c4..b27fb86b2f0610084573d5a4570fac2d5c658bf8 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -1365,7 +1365,7 @@ void GenShapedSHBExcitation( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * GenSHBSynth() * diff --git a/lib_com/tcx_ltp.c b/lib_com/tcx_ltp.c index 5c79b03d1c4f1ef9af59af10d3d6190259a893f4..e4c86f2b104d694a89401b079ce7c6a67997f490 100644 --- a/lib_com/tcx_ltp.c +++ b/lib_com/tcx_ltp.c @@ -801,7 +801,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_flt( * * *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void tcx_ltp_post_flt( Decoder_State *st, TCX_LTP_DEC_HANDLE hTcxLtpDec, diff --git a/lib_com/tec_com_flt.c b/lib_com/tec_com_flt.c index b8a9c4e01d6a428affe258757ac9105deace74de..3d64b60484544c269cd1731a622de040a7126394 100644 --- a/lib_com/tec_com_flt.c +++ b/lib_com/tec_com_flt.c @@ -269,7 +269,7 @@ static float calcCorrelationCoefficient2( } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- * resetTecDec() * diff --git a/lib_dec/ACcontextMapping_dec_fx.c b/lib_dec/ACcontextMapping_dec_fx.c index 10b177c9f92f68341a490c9df27f70973daff6d1..3cbeae48409378ceb29453980e992f0e9b33338e 100644 --- a/lib_dec/ACcontextMapping_dec_fx.c +++ b/lib_dec/ACcontextMapping_dec_fx.c @@ -130,7 +130,7 @@ Word16 ACcontextMapping_decode2_no_mem_s17_LC( } /* Start Decoding */ - ari_start_decoding_14bits(st, &as); + ari_start_decoding_14bits_fx(st, &as); overflow_bit_pos = st->next_bit_pos; move16(); @@ -180,7 +180,7 @@ Word16 ACcontextMapping_decode2_no_mem_s17_LC( assert(tmp >= 0 && tmp < 4096); pki = ari_lookup_s17_LC[tmp]; move16(); - r = ari_decode_14bits_s17_ext(st, &as, ari_pk_s17_LC_ext[pki]); + r = ari_decode_14bits_s17_ext_fx(st, &as, ari_pk_s17_LC_ext[pki]); IF (LT_16(r, VAL_ESC)) { diff --git a/lib_dec/FEC.c b/lib_dec/FEC.c index ed3492b844dac0e63e1dc47777729178c3f7bcef..c05d32b872c230fc0206d202f2f7a1948254230c 100644 --- a/lib_dec/FEC.c +++ b/lib_dec/FEC.c @@ -56,7 +56,7 @@ static void pulseRes_preCalc( Word16 *cond1, Word16 *cond2, Word32 *cond3, Word1 * * Calculation of excitation signal *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void FEC_exc_estim( Decoder_State *st, /* i/o: Decoder static memory */ const int16_t L_frame, /* i : length of the frame */ @@ -267,7 +267,7 @@ void FEC_exc_estim( if ( ( cond1 < 0 ) && ( new_pit > 0 ) && ( cond2 != 0 ) && ( cond3 > 0 ) && extrapolationFailed == 0 ) { mvr2r( exc, exc - L_frame - L_SUBFR, L_frame + L_SUBFR ); - PulseResynchronization_flt( exc - L_frame - L_SUBFR, exc, L_frame, L_frame / L_SUBFR, Tc, new_pit ); + PulseResynchronization( exc - L_frame - L_SUBFR, exc, L_frame, L_frame / L_SUBFR, Tc, new_pit ); } } diff --git a/lib_dec/FEC_HQ_core.c b/lib_dec/FEC_HQ_core.c index 6060f47f7d0cf7c016b6e2283d1ac54fa0c5941e..4a336eccf809995ae904389f1dbbcf8d8097f3e6 100644 --- a/lib_dec/FEC_HQ_core.c +++ b/lib_dec/FEC_HQ_core.c @@ -47,7 +47,7 @@ #include "prot_fx2.h" #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * Local prototypes *---------------------------------------------------------------------*/ @@ -1332,7 +1332,7 @@ static void Smoothing_vector_scaledown_NB( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*--------------------------------------------------------------------------* * time_domain_FEC_HQ() * diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index bbe4bb5a3f1a69d4e44f7ef5605c5592dec085a8..ba285662532751db2b385e4020511781b547a21a 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -2131,7 +2131,7 @@ static void hq_phase_ecu( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------- * hq_ecu() * diff --git a/lib_dec/FEC_fx.c b/lib_dec/FEC_fx.c index 7b4b7fe98a6b6bcd108fb1edbf2f72abc617008a..2dc26d6a30760233ec403c10a3c3056aeca9591c 100644 --- a/lib_dec/FEC_fx.c +++ b/lib_dec/FEC_fx.c @@ -10,7 +10,7 @@ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ #include "basop_util.h" - +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ @@ -440,7 +440,7 @@ void FEC_exc_estim_fx( ) { Copy(exc,exc-L_frame-L_SUBFR,L_frame+L_SUBFR); - PulseResynchronization(exc-L_frame-L_SUBFR, exc, L_frame, nb_subfr, L_deposit_h(Tc/*Q0*/)/*15Q16*/, L_deposit_h(new_pit/*Q0*/)/*15Q16*/); + PulseResynchronization_fx(exc-L_frame-L_SUBFR, exc, L_frame, nb_subfr, L_deposit_h(Tc/*Q0*/)/*15Q16*/, L_deposit_h(new_pit/*Q0*/)/*15Q16*/); } } test(); @@ -870,3 +870,4 @@ void gain_dec_bfi_fx( return; } +#endif diff --git a/lib_dec/FEC_lsf_estim.c b/lib_dec/FEC_lsf_estim.c index 622a9fe7699aa81b83889902fbfe92bc5a1866a8..54d3ea811d2a02d2129dd25745a495cc1c216263 100644 --- a/lib_dec/FEC_lsf_estim.c +++ b/lib_dec/FEC_lsf_estim.c @@ -47,7 +47,7 @@ * - LSP calculation * - A(z) calculation *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void FEC_lsf2lsp_interp_flt( Decoder_State *st, /* i/o: Decoder static memory */ const int16_t L_frame, /* i : length of the frame */ diff --git a/lib_dec/FEC_pitch_estim.c b/lib_dec/FEC_pitch_estim.c index 8001be7c1fea6ea0647ea95f0c4c3d54ab919190..725bbca8e91550e59047cc35405d19a3f60acd66 100644 --- a/lib_dec/FEC_pitch_estim.c +++ b/lib_dec/FEC_pitch_estim.c @@ -40,7 +40,7 @@ #include "cnst.h" #include "prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------* * FEC_pitch_estim() * diff --git a/lib_dec/FEC_pitch_estim_fx.c b/lib_dec/FEC_pitch_estim_fx.c index 93ebde8f827d40b1709292b3dd77281dad0b5262..2b5446093a3235c7128de9a4f7ad5a6678be3661 100644 --- a/lib_dec/FEC_pitch_estim_fx.c +++ b/lib_dec/FEC_pitch_estim_fx.c @@ -46,7 +46,8 @@ void FEC_pitch_estim_fx( Word16 *bfi_pitch, /* i/o: update of the estimated pitch for FEC */ Word16 *bfi_pitch_frame, /* o : frame length when pitch was updated */ Word16 *upd_cnt /* i/o: update counter */ - ,const Word16 coder_type /* i : coder_type */ + ,const Word16 coder_type, /* i : coder_type */ + Word16 element_mode /* i : element mode */ ) { Word16 tmp,tmp1,tmp2,tmp3; @@ -63,16 +64,9 @@ void FEC_pitch_estim_fx( #else tmp16k2 = shl(tmp16k1,1); /*Q6 1.4f * old_pitch_buf[2*NB_SUBFR16k-1]*/ #endif -#ifdef EVS_FLOAT -#if 1//def IVAS_CODE + test(); test(); - IF (EQ_16(last_core, HQ_CORE) || EQ_16(last_core, TCX_20_CORE) || EQ_16(last_core, TCX_10_CORE)) -#else - IF( EQ_16(last_core,HQ_CORE)) -#endif -#else - IF( EQ_16( last_core, HQ_CORE ) ) -#endif // EVS_FLOAT + 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)))) { *bfi_pitch = pitch_buf[shr(L_frame,6)-1]; move16(); diff --git a/lib_dec/LD_music_post_filter.c b/lib_dec/LD_music_post_filter.c index 536141bffe71599a720cc25ee43c479f62f463e2..a17dcdfb6e8c45fa457b001fdc05939275d8ad24 100644 --- a/lib_dec/LD_music_post_filter.c +++ b/lib_dec/LD_music_post_filter.c @@ -70,7 +70,7 @@ static void analy_sp_dct( const float dct_in[], float dct_buf[], float *fr_bands static void find_enr_dct( const float data[], float band[], float *ptE, float *Etot, const int16_t min_band, const int16_t max_band, float *Bin_E, const float bin_freq ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------* * LD_music_post_filter() * @@ -727,6 +727,7 @@ void Post_music_postP( * * Initialize LD music postfilter state structure *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void music_postfilt_init_flt( MUSIC_POSTFILT_HANDLE hMusicPF /* i/o: LD music postfilter handle */ @@ -734,21 +735,21 @@ void music_postfilt_init_flt( { int16_t i; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hMusicPF->dct_post_old_exc, 0, DCT_L_POST - OFFSET2 ); #endif #ifdef IVAS_FLOAT_FIXED set_val_Word16( hMusicPF->dct_post_old_exc_fx, 0, DCT_L_POST - OFFSET2 ); #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hMusicPF->LDm_enh_min_ns_gain = (float) pow( 10.0f, -12 / 20.0f ); #endif #ifdef IVAS_FLOAT_FIXED hMusicPF->LDm_enh_min_ns_gain_fx = (Word16)(0x2027); #endif hMusicPF->LDm_last_music_flag = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hMusicPF->LDm_lt_diff_etot, 0, MAX_LT ); hMusicPF->LDm_thres[0] = TH_0_MIN; hMusicPF->LDm_thres[1] = TH_1_MIN; @@ -765,7 +766,7 @@ void music_postfilt_init_flt( #endif hMusicPF->LDm_nb_thr_1 = 0; hMusicPF->LDm_nb_thr_3 = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hMusicPF->LDm_mem_etot = 0.0f; #endif #ifdef IVAS_FLOAT_FIXED @@ -774,7 +775,7 @@ void music_postfilt_init_flt( for ( i = 0; i < VOIC_BINS_HR; i++ ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hMusicPF->LDm_enh_lp_gbin[i] = 1.0f; hMusicPF->LDm_enh_lf_EO[i] = 0.01f; #endif @@ -786,7 +787,7 @@ void music_postfilt_init_flt( for ( i = 0; i < MBANDS_GN_LD; i++ ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hMusicPF->LDm_bckr_noise[i] = E_MIN; #endif #ifdef IVAS_FLOAT_FIXED @@ -801,3 +802,40 @@ void music_postfilt_init_flt( #endif return; } +#else + void music_postfilt_init_flt( + MUSIC_POSTFILT_HANDLE hMusicPF /* i/o: LD music postfilter handle */ + ) + { + int16_t i; + + set_f(hMusicPF->dct_post_old_exc, 0, DCT_L_POST - OFFSET2); + + hMusicPF->LDm_enh_min_ns_gain = (float)pow(10.0f, -12 / 20.0f); + hMusicPF->LDm_last_music_flag = 0; + set_f(hMusicPF->LDm_lt_diff_etot, 0, MAX_LT); + hMusicPF->LDm_thres[0] = TH_0_MIN; + hMusicPF->LDm_thres[1] = TH_1_MIN; + hMusicPF->LDm_thres[2] = TH_2_MIN; + hMusicPF->LDm_thres[3] = TH_3_MIN; + hMusicPF->LDm_nb_thr_1 = 0; + hMusicPF->LDm_nb_thr_3 = 0; + hMusicPF->LDm_mem_etot = 0.0f; + + for (i = 0; i < VOIC_BINS_HR; i++) + { + hMusicPF->LDm_enh_lp_gbin[i] = 1.0f; + hMusicPF->LDm_enh_lf_EO[i] = 0.01f; + } + + for (i = 0; i < MBANDS_GN_LD; i++) + { + hMusicPF->LDm_bckr_noise[i] = E_MIN; + } + + set_f(hMusicPF->filt_lfE, 1.0f, DCT_L_POST); + hMusicPF->last_nonfull_music = 0; + + return; + } +#endif \ No newline at end of file diff --git a/lib_dec/LD_music_post_filter_fx.c b/lib_dec/LD_music_post_filter_fx.c index 042791463c56510f66e330f8bed2aa5da12eff16..b723289bde2deb78f089fa2f30e7f4b577bd8b4b 100644 --- a/lib_dec/LD_music_post_filter_fx.c +++ b/lib_dec/LD_music_post_filter_fx.c @@ -794,6 +794,7 @@ void Prep_music_postP_fx( Word16 dct_buffer_out[], /* o : DCT output buffer (qdct)*/ Word16 filt_lfE[], /* i/o: long term spectrum energy Q15?*/ const Word16 last_core, /* i : last core */ + const Word16 element_mode, /* i : element mode */ const Word16 *pitch_buf, /* i : current frame pitch information Q6*/ Word16 *LDm_enh_lp_gbin, /* o : smoothed suppression gain, per dct bin Q14*/ const Word16 Q_exc, /* i : excitation scaling */ @@ -814,15 +815,7 @@ void Prep_music_postP_fx( /*------------------------------------------------------------* * Resetting some memories in case of switching *------------------------------------------------------------*/ -#ifdef EVS_FLOAT -#if 1//def _DIFF_FLOAT_FIX_ - IF( EQ_16(last_core,HQ_CORE) || EQ_16(last_core, TCX_20_CORE) || EQ_16(last_core, TCX_10_CORE) ) -#else - IF(EQ_16(last_core, HQ_CORE)) -#endif -#else - IF( EQ_16( last_core, HQ_CORE ) ) -#endif // EVS_FLOAT + 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) ) ) ) { set16_fx( filt_lfE, 4096, DCT_L_POST ); set16_fx( LDm_enh_lp_gbin, 16384, VOIC_BINS_HR ); diff --git a/lib_dec/TonalComponentDetection_fx.c b/lib_dec/TonalComponentDetection_fx.c index c7357cc7d342f8ae4e16d5d58824e0e0081dcc3e..1cc38172d90f9e698264281d2735d7e4aca31780 100644 --- a/lib_dec/TonalComponentDetection_fx.c +++ b/lib_dec/TonalComponentDetection_fx.c @@ -31,7 +31,7 @@ static void findCandidates(const Word16 nSamples, const Word32 * MDCTSpectrum, c static void modifyThreshold(Word16 i, Word16 F0, Word16 threshold, Word16 * thresholdModification); static void modifyThresholds(Word16 F0, Word16 origF0, Word16 * thresholdModification); static void RefineThresholdsUsingPitch(const Word16 nSamples, const Word16 nSamplesCore, const Word32 powerSpectrum[], const Word32 lastPitchLag, const Word32 currentPitchLag, Word16 * pF0, Word16 * thresholdModification); -static void findTonalComponents(Word16 * indexOfTonalPeak, Word16 * lowerIndex, Word16 * upperIndex, Word16 *numIndexes, Word16 nSamples, const Word32 * powerSpectrum, Word16 F0, Word16 * thresholdModification); +static void findTonalComponents(Word16 * indexOfTonalPeak, Word16 * lowerIndex, Word16 * upperIndex, Word16 *numIndexes, Word16 nSamples, const Word32 * powerSpectrum, Word16 F0, Word16 * thresholdModification, Word16 element_mode); /*-------------------------------------------------------------------* * DetectTonalComponents() @@ -58,7 +58,8 @@ void ivas_DetectTonalComponents_fx( const Word16 nSamples, const Word16 nSamplesCore, Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ - const PsychoacousticParameters* psychParamsCurrent + const PsychoacousticParameters* psychParamsCurrent, + Word16 element_mode /* i: element mode */ ) { Word16 F0; @@ -109,7 +110,7 @@ void ivas_DetectTonalComponents_fx( RefineThresholdsUsingPitch(nSamples, nSamplesCore, secondLastPowerSpectrum, lastPitchLag, currentPitchLag, &F0, thresholdModification); /* Find peaks in the second last frame */ - findTonalComponents(indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, F0, thresholdModification); + findTonalComponents(indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, F0, thresholdModification, element_mode); } #endif @@ -128,7 +129,8 @@ void DetectTonalComponents( const Word32 secondLastPowerSpectrum[], const Word16 nSamples, const Word16 nSamplesCore, - Word16 floorPowerSpectrum /* i: lower limit for power spectrum bins */ + Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ + Word16 element_mode #ifdef IVAS_CODE_MDCT_GSHAPE , const PsychoacousticParameters* psychParamsCurrent #endif @@ -164,7 +166,7 @@ void DetectTonalComponents( RefineThresholdsUsingPitch(nSamples, nSamplesCore, secondLastPowerSpectrum, lastPitchLag, currentPitchLag, &F0, thresholdModification); /* Find peaks in the second last frame */ - findTonalComponents(indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, F0, thresholdModification); + findTonalComponents(indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, F0, thresholdModification, element_mode); } /*-------------------------------------------------------------------* @@ -194,7 +196,8 @@ void RefineTonalComponents( const Word32 secondLastPowerSpectrum[], const Word16 nSamples, const Word16 nSamplesCore, - const Word16 floorPowerSpectrum /* i: lower limit for power spectrum bins */ + const Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ + Word16 element_mode #ifdef IVAS_CODE_MDCT_GSHAPE ,const PsychoacousticParameters* psychParamsCurrent #endif @@ -209,7 +212,7 @@ void RefineTonalComponents( DetectTonalComponents(newIndexOfTonalPeak, newLowerIndex, newUpperIndex, &newNumIndexes, lastPitchLag, currentPitchLag, lastMDCTSpectrum, - lastMDCTSpectrum_exp, scaleFactors, scaleFactors_exp, scaleFactors_max_e, secondLastPowerSpectrum, nSamples, nSamplesCore, floorPowerSpectrum + lastMDCTSpectrum_exp, scaleFactors, scaleFactors_exp, scaleFactors_max_e, secondLastPowerSpectrum, nSamples, nSamplesCore, floorPowerSpectrum, element_mode #ifdef IVAS_CODE_MDCT_GSHAPE , psychParamsCurrent #endif @@ -975,7 +978,8 @@ static void findTonalComponents( Word16 nSamples, /* IN */ const Word32 * powerSpectrum, /* IN */ Word16 F0, /* IN */ - Word16 * thresholdModification) /* IN */ + Word16 * thresholdModification, /* IN */ + Word16 element_mode) /* IN */ { Word32 envelope[L_FRAME_MAX]; Word32 smoothedSpectrum[L_FRAME_MAX]; @@ -1029,11 +1033,8 @@ static void findTonalComponents( } /* Side lobe increase must be 2 times smaller than the decrease to the foot */ /* Eq. to 2.0f*powerSpectrum[lowerIdx-1]/powerSpectrum[lowerIdx] > powerSpectrum[lowerIdx]/powerSpectrum[j] */ -#ifdef EVS_FLOAT - IF( GT_64( W_mult_32_32( L_shl( powerSpectrum[upperIdx + 1], 1 ), powerSpectrum[j] ), W_mult_32_32( powerSpectrum[upperIdx], powerSpectrum[upperIdx] ) ) ) -#else - IF( GT_32( Mpy_32_32( L_shl( powerSpectrum[upperIdx + 1], 1 ), powerSpectrum[j] ), Mpy_32_32( powerSpectrum[upperIdx], powerSpectrum[upperIdx] ) ) ) -#endif // EVS_FLOAT + IF( (EQ_16(element_mode, EVS_MONO) && GT_32( Mpy_32_32( L_shl( powerSpectrum[upperIdx + 1], 1 ), powerSpectrum[j] ), Mpy_32_32( powerSpectrum[upperIdx], powerSpectrum[upperIdx] ) ) ) || + (NE_16(element_mode, EVS_MONO) && ( GT_64( W_mult_32_32( L_shl( powerSpectrum[upperIdx + 1], 1 ), powerSpectrum[j] ), W_mult_32_32( powerSpectrum[upperIdx], powerSpectrum[upperIdx] ) ) ) ) ) { BREAK; } diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index 053904fdd9fa166e837f6029d56ae35ed2e045d6..325bfc5b5c1f3e509a6a23b714c7b7cdb06b7133 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -49,7 +49,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * acelp_core_dec() * @@ -149,7 +149,7 @@ ivas_error acelp_core_dec( /* Only run parameter decoding in SID frames */ if ( st->core_brate == SID_2k40 ) { - FdCng_decodeSID_flt( st ); + FdCng_decodeSID( st ); } for ( i = 0; i < NPART; i++ ) @@ -157,7 +157,7 @@ ivas_error acelp_core_dec( st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] + ( 1 - STEREO_DFT_FD_FILT ) * st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[i]; } - ApplyFdCng_flt( NULL, NULL, NULL, NULL, st, 0, 0 ); + ApplyFdCng( NULL, NULL, NULL, NULL, st, 0, 0 ); } else { @@ -515,7 +515,7 @@ ivas_error acelp_core_dec( { if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) { - FdCng_decodeSID_flt( st ); + FdCng_decodeSID( st ); *sid_bw = 0; } @@ -527,7 +527,7 @@ ivas_error acelp_core_dec( { st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] + ( 1 - STEREO_DFT_FD_FILT ) * st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[i]; } - ApplyFdCng_flt( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } if ( !read_sid_info ) @@ -541,7 +541,7 @@ ivas_error acelp_core_dec( } } - generate_comfort_noise_dec_flt( NULL, NULL, st, nchan_out ); + generate_comfort_noise_dec( NULL, NULL, st, nchan_out ); FdCng_exc_flt( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old, st->first_CNG, st->lspCNG, Aq, lsp_new, lsf_new, exc, exc2, bwe_exc ); @@ -612,11 +612,11 @@ ivas_error acelp_core_dec( nb_bits = -1; } - config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &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 ); + config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &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 ); if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME ) { - config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &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 ); + config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &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 ); } } @@ -1117,7 +1117,7 @@ ivas_error acelp_core_dec( if ( st->idchan == 0 && ( st->flag_cna || ( st->cng_type == FD_CNG && st->total_brate <= ACELP_32k ) || ( st->cng_type == LP_CNG && st->core_brate <= SID_2k40 ) ) ) { /*Noisy speech detector*/ - noisy_speech_detection_flt( st->hFdCngDec, st->VAD, syn ); + noisy_speech_detection( st->hFdCngDec, st->VAD, syn ); 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; } @@ -1131,7 +1131,7 @@ ivas_error acelp_core_dec( { /*Noise estimate*/ - ApplyFdCng_flt( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } if ( !st->cna_dirac_flag ) @@ -1165,7 +1165,7 @@ ivas_error acelp_core_dec( { set_f( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 0.0f, st->hFdCngDec->hFdCngCom->fftlen ); } - generate_masking_noise_flt( syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + generate_masking_noise( syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); } } } @@ -1196,7 +1196,7 @@ ivas_error acelp_core_dec( /*Noise estimate*/ if ( st->idchan == 0 && ( nchan_out == 2 || ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) ) ) { - ApplyFdCng_flt( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } } } @@ -1301,7 +1301,7 @@ ivas_error acelp_core_dec( /*WB/SWB-FD_CNG*/ if ( ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && ( st->cng_type == FD_CNG ) && ( st->hFdCngDec->hFdCngCom->numCoreBands < st->cldfbSyn->no_channels ) ) { - generate_comfort_noise_dec_hf_flt( realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); + generate_comfort_noise_dec_hf( realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); if ( st->hFdCngDec->hFdCngCom->regularStopBand < st->cldfbSyn->no_channels ) { diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index a80a0853ce5abfa98692bc10892ac403e9d57257..360f9bd7e9e567b312a91eabeef39e32cad93adb 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -11,7 +11,7 @@ #include "ivas_prot_fx.h" #include "ivas_cnst.h" /* Common constants */ #include "cnst.h" /* Common constants */ - +#ifdef IVAS_FLOAT_FIXED /*==========================================================================*/ /* FUNCTION : void acelp_core_dec_fx () */ /*--------------------------------------------------------------------------*/ @@ -157,12 +157,12 @@ ivas_error acelp_core_dec_fx( { if (st->cng_type == FD_CNG) { - configureFdCngDec(st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode); + configureFdCngDec_fx(st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode); /* Only run parameter decoding in SID frames */ if (st->core_brate == SID_2k40) { - FdCng_decodeSID(st); + FdCng_decodeSID_fx(st); } for (i = 0; i < NPART; i++) @@ -171,14 +171,14 @@ ivas_error acelp_core_dec_fx( } #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - ApplyFdCng(NULL, NULL, NULL, NULL, st, 0, 0); + ApplyFdCng_fx(NULL, NULL, NULL, NULL, st, 0, 0); #else - ApplyFdCng(NULL, NULL, NULL, NULL, st, 0, 0); + ApplyFdCng_fx(NULL, NULL, NULL, NULL, st, 0, 0); #endif } else { - configureFdCngDec(st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode); + configureFdCngDec_fx(st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode); /* decode CNG parameters */ CNG_dec(st, last_element_mode, Aq, lsp_new, lsf_new, &allow_cn_step, sid_bw, q_env); @@ -623,7 +623,7 @@ ivas_error acelp_core_dec_fx( { IF( EQ_32(st_fx->core_brate,SID_2k40) && NE_16(st_fx->element_mode, IVAS_CPE_MDCT) ) { - FdCng_decodeSID(st_fx->hFdCngDec->hFdCngCom, st_fx); + FdCng_decodeSID_fx(st_fx->hFdCngDec->hFdCngCom, st_fx); *sid_bw=0; move16(); } @@ -637,9 +637,9 @@ ivas_error acelp_core_dec_fx( st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] + (1 - STEREO_DFT_FD_FILT) * st->hFdCngDec->hFdCngCom->sidNoiseEst[i]; } #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - ApplyFdCng(syn, 0, NULL, realBuffer, imagBuffer, NULL, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); + ApplyFdCng_fx(syn, 0, NULL, realBuffer, imagBuffer, NULL, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); #else - ApplyFdCng(syn, realBuffer, imagBuffer, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); + ApplyFdCng_fx(syn, realBuffer, imagBuffer, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); #endif } if (!read_sid_info) @@ -653,7 +653,7 @@ ivas_error acelp_core_dec_fx( } } #endif - generate_comfort_noise_dec( NULL, NULL, NULL, st_fx, &(st_fx->Q_exc), 2, -1 ); + generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &(st_fx->Q_exc), 2, -1 ); FdCng_exc(st_fx->hFdCngDec->hFdCngCom, &st_fx->CNG_mode, st_fx->L_frame, st_fx->lsp_old_fx, st_fx->first_CNG, st_fx->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx); @@ -1051,10 +1051,10 @@ ivas_error acelp_core_dec_fx( /* Extrapolation of the last future part, windowing and high resolution DCT transform */ qdct = 0; #ifdef _DIFF_FLOAT_FIX_ /* FLoat point using last_core which fits with the inner part of the function */ - Prep_music_postP_fx(exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_core, pitch_buf_fx, + Prep_music_postP_fx(exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_core, st_fx->element_mode, pitch_buf_fx, hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &qdct); #else - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_coder_type, pitch_buf_fx, + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_coder_type, st_fx->element_mode, pitch_buf_fx, hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &qdct ); #endif /* LD music post-filter */ @@ -1117,7 +1117,7 @@ ivas_error acelp_core_dec_fx( *------------------------------------------------------------*/ FEC_pitch_estim_fx( st_fx->Opt_AMR_WB, st_fx->last_core, st_fx->L_frame, st_fx->clas_dec, st_fx->last_good, pitch_buf_fx, st_fx->old_pitch_buf_fx, - &st_fx->bfi_pitch_fx, &st_fx->bfi_pitch_frame, &st_fx->upd_cnt, st_fx->coder_type ); + &st_fx->bfi_pitch_fx, &st_fx->bfi_pitch_frame, &st_fx->upd_cnt, st_fx->coder_type, st_fx->element_mode ); /*------------------------------------------------------------* * FEC - Smooth the speech energy evolution when recovering after a BAD frame @@ -1333,13 +1333,13 @@ ivas_error acelp_core_dec_fx( { st_fx->hPFstat->on = 1; move16(); - nb_post_filt( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, st_fx->coder_type, st_fx->BER_detect, 0 ); + nb_post_filt_fx( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, st_fx->coder_type, st_fx->BER_detect, 0 ); } ELSE { st_fx->hPFstat->on = 0; move16(); - nb_post_filt( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); + nb_post_filt_fx( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); } } ELSE @@ -1376,7 +1376,7 @@ ivas_error acelp_core_dec_fx( Copy( syn_fx, temp_buf + L_SYN_MEM, L_FRAME16k ); st_fx->hPFstat->on = 1; move16(); - formant_post_filt( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0); + formant_post_filt_fx( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0); } ELSE IF( GE_16(st_fx->last_bwidth,WB)) { @@ -1386,9 +1386,9 @@ ivas_error acelp_core_dec_fx( Copy( syn_fx, temp_buf + M, L_SUBFR ); Residu3_fx ( Aq_fx, temp_buf + M, temp_buf+M+L_SUBFR, L_SUBFR, 1 ); E_UTIL_synthesis ( 1, Aq_fx, temp_buf+M+L_SUBFR, temp_buf, L_SUBFR, st_fx->hPFstat->mem_stp+L_SYN_MEM-M, 0, M ); - scale_st ( syn_fx, temp_buf, &st_fx->hPFstat->gain_prec, L_SUBFR ); + scale_st_fx ( syn_fx, temp_buf, &st_fx->hPFstat->gain_prec, L_SUBFR ); Copy( temp_buf, syn_fx, L_SUBFR/2 ); - blend_subfr2( temp_buf + L_SUBFR/2, syn_fx + L_SUBFR/2, syn_fx + L_SUBFR/2 ); + blend_subfr2_fx( temp_buf + L_SUBFR/2, syn_fx + L_SUBFR/2, syn_fx + L_SUBFR/2 ); } st_fx->hPFstat->on = 0; move16(); @@ -1414,7 +1414,7 @@ ivas_error acelp_core_dec_fx( (EQ_16(st_fx->cng_type, LP_CNG) && LE_32(st_fx->total_brate, SID_2k40)))) { /*Noisy speech detector*/ - noisy_speech_detection(st_fx->hFdCngDec, st_fx->VAD, syn_fx, st_fx->Q_syn); + 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(st_fx->hFdCngDec->hFdCngCom->flag_noisy_speech != 0) @@ -1435,9 +1435,9 @@ ivas_error acelp_core_dec_fx( { #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT PMT("Code for IVAS_CODE_CNG_FIX185_PLC_FADEOUT not done") - ApplyFdCng(syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); + ApplyFdCng_fx(syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); #else - ApplyFdCng(syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, (EQ_16(st_fx->coder_type, AUDIO) && st_fx->GSC_noisy_speech == 0)); + ApplyFdCng_fx(syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, (EQ_16(st_fx->coder_type, AUDIO) && st_fx->GSC_noisy_speech == 0)); #endif } /* CNA: Generate additional comfort noise to mask potential coding artefacts */ @@ -1477,7 +1477,7 @@ ivas_error acelp_core_dec_fx( { set_f(st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0.0f, st->hFdCngDec->hFdCngCom->fftlen); } - generate_masking_noise(syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out); + generate_masking_noise_fx(syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out); } } } @@ -1509,9 +1509,9 @@ ivas_error acelp_core_dec_fx( if (st->idchan == 0 && (nchan_out == 2 || (st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40))) { #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - ApplyFdCng(syn, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); + ApplyFdCng_fx(syn, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); #else - ApplyFdCng(syn, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); + ApplyFdCng_fx(syn, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); #endif } } @@ -1541,7 +1541,7 @@ ivas_error acelp_core_dec_fx( #else IF(st_fx->flag_cna && NE_16(st_fx->coder_type, AUDIO)) { - generate_masking_noise(syn_fx, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, 0); + generate_masking_noise_fx(syn_fx, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, 0); } ELSE IF(st_fx->flag_cna && st_fx->coder_type == AUDIO && st_fx->last_core == ACELP_CORE && st_fx->last_coder_type != AUDIO) { @@ -1640,7 +1640,7 @@ ivas_error acelp_core_dec_fx( i = CLDFB_NO_COL_MAX; move16(); } - addBassPostFilterFx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate(st_fx->Q_syn), + addBassPostFilter_fx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate(st_fx->Q_syn), i, st_fx->cldfbAna->no_col, st_fx->cldfbAna->no_channels, &scaleFactor ); /* set output mask for upsampling */ @@ -1666,7 +1666,7 @@ ivas_error acelp_core_dec_fx( { IF((EQ_32(st_fx->core_brate, FRAME_NO_DATA) || EQ_32(st_fx->core_brate, SID_2k40)) && (EQ_16(st_fx->cng_type, FD_CNG)) && (LT_16(st_fx->hFdCngDec->hFdCngCom->numCoreBands, st_fx->cldfbSyn->no_channels))) { - generate_comfort_noise_dec_hf(realBuffer, imagBuffer, &scaleFactor.hb_scale, st_fx); + generate_comfort_noise_dec_hf_fx(realBuffer, imagBuffer, &scaleFactor.hb_scale, st_fx); st_fx->cldfbSyn->bandsToZero = 0; move16(); @@ -1825,3 +1825,4 @@ ivas_error acelp_core_dec_fx( return IVAS_ERR_OK; } +#endif diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index d8c97fabfab68050def18f3b38714ea8f3791f9d..5c76a407c0120f675ce910edd32e7e179348bfa0 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -78,91 +78,51 @@ ivas_error acelp_core_dec_ivas_fx( const int16_t read_sid_info /* i : read SID info flag */ ) { - //Word16 output_fx[960], synth_fx16[960],/* save_hb_synth_fx[960],*/ voice_factors_fx[NB_SUBFR16k], old_syn_12k8_16k_fx[960], pitch_buf_out_fx[NB_SUBFR16k], tdm_lspQ_PCh_fx[M], tdm_lsfQ_PCh_fx[M]; Word32 synth_fx[960], save_hb_synth_fx[960]/*, bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET]*/; - /*for (int i = 0; i < M; i++) { - tdm_lsfQ_PCh_fx[i] = (Word16)(tdm_lsfQ_PCh[i] * 2.56f); - } - floatToFixed_arr((float *)tdm_lspQ_PCh, tdm_lspQ_PCh_fx, Q15, M); - if (save_hb_synth) { - floatToFixed_arrL(save_hb_synth, save_hb_synth_fx, 0, L_FRAME48k); - } - floatToFixed_arrL(bwe_exc_extended, bwe_exc_extended_fx, 0, L_FRAME32k + NL_BUFF_OFFSET);*/ - //float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */ Word16 old_exc_fx[L_EXC_DEC], *exc_fx; /* excitation signal buffer */ - //float syn_tmp[L_FRAME16k + L_SUBFR], *syn; /* synthesis signal buffer */ Word16 syn_tmp_fx[L_FRAME16k + L_SUBFR], *psyn_fx; /* synthesis signal buffer */ int16_t output_frame; /* frame length at output sampling freq. */ - //float lsf_new[M]; /* LSFs at the end of the frame */ Word16 lsf_new_fx[M]; /* LSFs at the end of the frame Qlog2(2.56) */ - //float lsp_new[M]; /* LSPs at the end of the frame */ Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ - //float lsp_mid[M]; /* LSPs in the middle of the frame */ Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ - //float Aq[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ - //float old_exc2[L_FRAME16k + L_EXC_MEM], *exc2; /* total excitation buffer */ Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ - //float mem_tmp[M]; /* temporary synthesis filter memory */ Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ - //float enr_q; /* E information for FER protection */ Word32 enr_q_fx; /* E information for FER protection */ - //float tmp_noise; /* Long term temporary noise energy */ Word16 tmp_noise_fx; /* Long term temporary noise energy */ - //float Es_pred; /* predicted scaled innov. energy */ Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ - //float FEC_pitch; /* FEC pitch */ Word16 FEC_pitch_fx; /* FEC pitch */ - //float old_bwe_exc[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ - //float *bwe_exc; /* Excitation for SWB TBE */ Word16 *bwe_exc_fx; /* Excitation for SWB TBE */ int16_t i, j, int_fs; int16_t tc_subfr; int16_t allow_cn_step; - //float temp_buf[L_FRAME16k + L_SYN_MEM]; Word16 temp_buf_fx[L_FRAME16k + L_SYN_MEM]; int16_t last_pulse_pos; int16_t T0_tmp; int16_t do_WI; - //float dct_buffer[DCT_L_POST]; Word16 dct_buffer_fx[DCT_L_POST]; - //float exc_buffer[DCT_L_POST]; Word16 exc_buffer_fx[DCT_L_POST]; - //float dct_exc_tmp[L_FRAME16k]; Word16 dct_exc_tmp_fx[L_FRAME16k]; - //float bpf_error_signal[L_FRAME16k]; int16_t nb_bits; /* number of bits */ int16_t indice; /* parameter indices to write */ - //float gain_buf[NB_SUBFR16k]; Word16 gain_buf_fx[NB_SUBFR16k]; Word16 syn_fx_tmp2[L_FRAME_16k]; Word16 pitch_buf_tmp[NB_SUBFR16k]; Word16 update_flg; - //float q_env[20]; Word32 q_env_fx[20]; - //float exc3[L_FRAME16k]; Word16 exc3_fx[L_FRAME16k]; - //float syn1_tmp[L_FRAME16k + 2], *syn1; Word16 syn1_tmp_fx[L_FRAME16k + 2], *syn1_fx; - //float *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX]; -#ifdef IVAS_FLOAT_FIXED Word32 *realBuffer_fx[CLDFB_NO_COL_MAX], *imagBuffer_fx[CLDFB_NO_COL_MAX]; Word32 realBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word32 imagBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; -#endif // IVAS_FLOAT_FIXED - //float realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - //float imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; int16_t LSF_Q_prediction; /* LSF prediction mode */ Word16 avoid_lpc_burst_on_recovery; - //float tmpF; Word16 tmpF_fx; int16_t uc_two_stage_flag; int16_t tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; - //float *old_exc_s; /* Start of last excitation frame */ Word16 *old_exc_s_fx; /* Start of last excitation frame */ - //float *p_tdm_Pri_pitch_buf; Word16 *p_tdm_Pri_pitch_buf_fx; int16_t local_element_mode; ivas_error error; @@ -189,75 +149,46 @@ ivas_error acelp_core_dec_ivas_fx( { if ( st->cng_type == FD_CNG ) { - //configureFdCngDec_flt( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); - configureFdCngDec( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; /* Only run parameter decoding in SID frames */ if ( st->core_brate == SID_2k40 ) { - //FdCng_decodeSID_flt( st ); FdCng_decodeSID_ivas_fx( st ); - //FdCng_decodeSID(st->hFdCngDec->hFdCngCom, st ); rescale_fdCngDec(st->hFdCngDec, old_NoiseEstExp - st->hFdCngDec->hFdCngCom->sidNoiseEstExp); } for ( i = 0; i < NPART; i++ ) { - //st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] + ( 1 - STEREO_DFT_FD_FILT ) * st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[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] ) ); } -#ifdef IVAS_FLOAT_FIXED - - for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) - { - st->hFdCngDec->bandNoiseShape[p] = (Word32) ( st->hFdCngDec->bandNoiseShape_float[p] * ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); - } - - ApplyFdCng_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); + ApplyFdCng_ivas_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); if (st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0) { Scale_sig32(st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; } -#else - ApplyFdCng_flt( NULL, NULL, NULL, NULL, st, 0, 0 ); -#endif // IVAS_FLOAT_FIXED } else { - //configureFdCngDec_flt( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); - configureFdCngDec( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); /* decode CNG parameters */ - //CNG_dec( st, last_element_mode, Aq, lsp_new, lsf_new, &allow_cn_step, sid_bw, q_env ); CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx); /* comfort noise generation */ - //CNG_exc( st->core_brate, st->L_frame, &st->hTdCngDec->Enew, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->hTdCngDec->num_ho, q_env, st->hTdCngDec->lp_env, st->hTdCngDec->old_env, st->hTdCngDec->exc_mem, st->hTdCngDec->exc_mem1, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); - //mvr2r( Aq, st->Aq_cng_float, M + 1 ); Copy( Aq_fx, st->Aq_cng, M + 1 ); /* update old LSP and LSF vector */ - /*mvr2r( lsf_new, st->lsf_old, M ); - mvr2r( lsp_new, st->lsp_old, M );*/ Copy( lsf_new_fx, st->lsf_old_fx, M ); Copy( lsp_new_fx, st->lsp_old_fx, M ); - /*Local fix2float (to be removed)*/ - //fixedToFloat_arr(st->Aq_cng, st->Aq_cng_float, Q14 - norm_s(st->Aq_cng[0]), M + 1); - /*fixedToFloat_arr(Aq_fx, Aq, Q12, NB_SUBFR16k * (M + 1)); - fixedToFloat_arr(lsp_new_fx, lsp_new, Q15, M); - for (i = 0; i < M; i++) { - lsf_new[i] = lsf_new_fx[i] / 2.56f; - }*/ } - //set_f( output, 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( 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_f( synth, 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. */ 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. */ /* CN generation done in DFT domain */ @@ -271,14 +202,6 @@ ivas_error acelp_core_dec_ivas_fx( *----------------------------------------------------------------*/ /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ - /*for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - realBuffer[i] = realBufferTmp[i]; - imagBuffer[i] = imagBufferTmp[i]; - }*/ -#ifdef IVAS_FLOAT_FIXED for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { set32_fx( realBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); @@ -286,17 +209,11 @@ ivas_error acelp_core_dec_ivas_fx( realBuffer_fx[i] = realBufferTmp_fx[i]; imagBuffer_fx[i] = imagBufferTmp_fx[i]; } -#endif // IVAS_FLOAT_FIXED /*----------------------------------------------------------------* * Initialization *----------------------------------------------------------------*/ LSF_Q_prediction = -1; - /*set_f( syn_tmp, 0, L_SUBFR ); - syn = syn_tmp + L_SUBFR; - syn1_tmp[0] = 0; - syn1_tmp[1] = 0; - syn1 = syn1_tmp + 2;*/ set_s(syn_tmp_fx, 0, L_SUBFR); psyn_fx = syn_tmp_fx + L_SUBFR; @@ -332,59 +249,43 @@ ivas_error acelp_core_dec_ivas_fx( 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 ) ) { - /*set_zero( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, FFTLEN ); - set_zero( hStereoCng->olapBufferSynth22, FFTLEN );*/ set_s( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, FFTLEN ); set_s( hStereoCng->olapBufferSynth22_fx, 0, FFTLEN ); } st->clas_dec = st->last_good; - //enr_q = 0.0f; - /*Es_pred = 0.0f; - tmp_noise = 0.0f;*/ enr_q_fx = 0; Es_pred_fx = 0; tmp_noise_fx = 0; - //mvr2r( st->old_exc, old_exc, L_EXC_MEM_DEC ); Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); - //exc = old_exc + L_EXC_MEM_DEC; exc_fx = old_exc_fx + L_EXC_MEM_DEC; if ( st->hWIDec != NULL ) { - //mvr2r( st->hWIDec->old_exc2, old_exc2, L_EXC_MEM ); Copy( st->hWIDec->old_exc2_fx, old_exc2_fx, L_EXC_MEM ); } else { - //set_f( old_exc2, 0, L_EXC_MEM ); set_s( old_exc2_fx, 0, L_EXC_MEM ); } - //exc2 = old_exc2 + L_EXC_MEM; exc2_fx = old_exc2_fx + L_EXC_MEM; if ( st->hBWE_TD != NULL ) { - //mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 ); Copy( st->hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); - //bwe_exc = old_bwe_exc + PIT16k_MAX * 2; bwe_exc_fx = old_bwe_exc_fx + PIT16k_MAX * 2; } else { - //bwe_exc = NULL; bwe_exc_fx = NULL; } last_pulse_pos = 0; do_WI = 0; - //st->GSC_noisy_speech = 0; st->GSC_noisy_speech = 0; - //st->relax_prev_lsf_interp = 0; st->relax_prev_lsf_interp = 0; - //set_zero( gain_buf, NB_SUBFR16k ); set_s( gain_buf_fx, 0, NB_SUBFR16k ); if ( st->L_frame == L_FRAME ) @@ -420,7 +321,6 @@ ivas_error acelp_core_dec_ivas_fx( 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; - //p_tdm_Pri_pitch_buf = hStereoTD->tdm_Pri_pitch_buf; p_tdm_Pri_pitch_buf_fx = hStereoTD->tdm_Pri_pitch_buf_fx; } else @@ -432,7 +332,6 @@ ivas_error acelp_core_dec_ivas_fx( tdm_low_rate_mode = 1; } tdm_Pitch_reuse_flag = 0; - //p_tdm_Pri_pitch_buf = NULL; p_tdm_Pri_pitch_buf_fx = NULL; } @@ -447,29 +346,19 @@ ivas_error acelp_core_dec_ivas_fx( if ( st->hPFstat->on != 0 ) { int16_t mem_syn_r_size_old, mem_syn_r_size_new; - - //mem_syn_r_size_old = (int16_t) ( 1.25 * st->last_L_frame / 20.f ); - //mem_syn_r_size_new = (int16_t) ( 1.25 * st->L_frame / 20.f ); mem_syn_r_size_old = mult_r( 2048, st->last_L_frame ); mem_syn_r_size_new = mult_r( 2048, st->L_frame ); - //lerp_flt( st->hPFstat->mem_stp_flt + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp_flt + 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_flt( st->hPFstat->mem_pf_in_flt + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in_flt + 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 ); } /* convert quantized LSP vector */ - //st->rate_switching_reset = lsp_convert_poly( st->lsp_old, st->L_frame, 0 ); st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 ); /* convert old quantized LSF vector */ - //lsp2lsf( st->lsp_old, st->lsf_old, M, int_fs ); lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, int_fs ); /* FEC - update adaptive LSF mean vector */ - //mvr2r( st->lsf_old, st->lsfoldbfi1, M ); - //mvr2r( st->lsf_old, st->lsfoldbfi0, M ); - //mvr2r( st->lsf_old, st->lsf_adaptive_mean, M ); 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 ); @@ -477,15 +366,12 @@ ivas_error acelp_core_dec_ivas_fx( /* Reset LPC mem */ if ( st->sr_core == INT_FS_16k ) { - //mvr2r( GEWB2_Ave, st->mem_AR, M ); Copy( GEWB2_Ave_fx, st->mem_AR_fx, M ); } else { - //mvr2r( GEWB_Ave, st->mem_AR, M ); Copy( GEWB_Ave_fx, st->mem_AR_fx, M ); } - //set_zero( st->mem_MA, M ); set_s( st->mem_MA_fx, 0, M ); /* update synthesis filter memories */ @@ -494,11 +380,7 @@ ivas_error acelp_core_dec_ivas_fx( { dec = DEC_IVAS; } - //synth_mem_updt2_flt( st->L_frame, st->last_L_frame, st->old_exc, st->mem_syn_r_float, st->mem_syn2, NULL, dec ); synth_mem_updt2( st->L_frame, st->last_L_frame, st->old_exc_fx, st->mem_syn_r, st->mem_syn2_fx, NULL, dec ); - //mvr2r( st->old_exc, old_exc, L_EXC_MEM_DEC ); - //mvr2r( st->mem_syn2, st->mem_syn1, M ); - //mvr2r( st->mem_syn2, st->mem_syn3, M ); Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); Copy_Scale_sig(st->mem_syn2_fx, st->mem_syn1_fx, M, sub(-1, st->Q_syn)); /*Q-1*/ Copy( st->mem_syn2_fx, st->mem_syn3_fx, M ); @@ -511,30 +393,25 @@ ivas_error acelp_core_dec_ivas_fx( { IF(EQ_16(st->last_L_frame, L_FRAME32k)) { - //tmpF = (float) 12800 / (float) 32000; tmpF_fx = 13107; } ELSE IF(EQ_16(st->last_L_frame, 512)) { - //tmpF = (float)12800/(float)25600; tmpF_fx = 16384; } ELSE /* st->last_L_frame == L_FRAME16k */ { - //tmpF = (float) 12800 / (float) 16000; tmpF_fx = 26214; } FOR(i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++) { - //st->old_pitch_buf[i - 1] = tmpF * st->old_pitch_buf[i]; st->old_pitch_buf_fx[i - 1] = Mpy_32_16_1(st->old_pitch_buf_fx[i], tmpF_fx); move32(); } FOR(i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++) { - //st->old_pitch_buf[i - 2] = tmpF * st->old_pitch_buf[i]; st->old_pitch_buf_fx[i - 2] = Mpy_32_16_1(st->old_pitch_buf_fx[i], tmpF_fx); move32(); } @@ -545,38 +422,31 @@ ivas_error acelp_core_dec_ivas_fx( Word16 exp = 0; IF(EQ_16(st->last_L_frame,L_FRAME32k)) { - /* (float)16000/(float)32000; */ tmpF_fx = 16384; } ELSE IF(EQ_16(st->last_L_frame,512)) { - /* tmpF = (float)16000/(float)25600; */ tmpF_fx = 20480; } ELSE /* st->last_L_frame == L_FRAME12k8 */ { - /* tmpF = (float)16000/(float)12800; */ tmpF_fx = 20480; //Q14 exp = 1; } FOR(i = 2 * NB_SUBFR - 1; i >= NB_SUBFR; i--) { - //st->old_pitch_buf[i + 2] = tmpF * st->old_pitch_buf[i]; st->old_pitch_buf_fx[i + 2] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); move32(); } - //st->old_pitch_buf[NB_SUBFR + 1] = st->old_pitch_buf[NB_SUBFR + 2]; st->old_pitch_buf_fx[NB_SUBFR + 1] = st->old_pitch_buf_fx[NB_SUBFR + 2]; move32(); FOR(i = NB_SUBFR - 1; i >= 0; i--) { - //st->old_pitch_buf[i + 1] = tmpF * st->old_pitch_buf[i]; st->old_pitch_buf_fx[i + 1] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); move32(); } - //st->old_pitch_buf[0] = st->old_pitch_buf[1]; st->old_pitch_buf_fx[0] = st->old_pitch_buf_fx[1]; move32(); } @@ -589,21 +459,16 @@ ivas_error acelp_core_dec_ivas_fx( move16(); IF(EQ_16(st->bfi_pitch_frame, L_FRAME32k)) { - /* (float)12800/(float)32000; */ tmpF_fx = 13107; } ELSE IF(EQ_16(st->bfi_pitch_frame, 512)) { - /* (float)12800/(float)25600; */ tmpF_fx = 16384; } ELSE /* st->bfi_pitch_frame == L_FRAME16k */ { - /* (float)12800/(float)16000; */ tmpF_fx = 26214; } - //st->bfi_pitch *= tmpF; - //st->bfi_pitch_frame = L_FRAME; st->bfi_pitch_fx = mult_r(st->bfi_pitch_fx, tmpF_fx); st->bfi_pitch_frame = L_FRAME; move16(); @@ -614,32 +479,23 @@ ivas_error acelp_core_dec_ivas_fx( Word16 exp = 0; IF(EQ_16(st->bfi_pitch_frame,L_FRAME32k)) { - /* (float)16000/(float)32000; */ tmpF_fx = 16384; } ELSE IF(EQ_16(st->bfi_pitch_frame,512)) { - /* tmpF = (float)16000/(float)25600; */ tmpF_fx = 20480; } ELSE /* st->bfi_pitch_frame == L_FRAME12k8 */ { - /* tmpF = (float)16000/(float)12800; */ tmpF_fx = 20480; //Q14 exp = 1; } - //st->bfi_pitch *= tmpF; - //st->bfi_pitch_frame = L_FRAME16k; st->bfi_pitch_fx = mult_r( shl_sat( st->bfi_pitch_fx, exp ), tmpF_fx ); st->bfi_pitch_frame = L_FRAME16k; move16(); } } - /*Local fix2float (to be removed)*/ - /*fixedToFloat_arr(old_exc_fx, old_exc, st->Q_exc, L_EXC_DEC); - fixedToFloat_arr(gain_buf_fx, gain_buf, Q14, NB_SUBFR16k);*/ - if ( st->last_bwidth == NB && st->bwidth != NB && st->ini_frame != 0 ) { st->rate_switching_reset = 1; @@ -683,15 +539,12 @@ ivas_error acelp_core_dec_ivas_fx( /* decode CNG parameters */ if ( st->cng_type == LP_CNG ) { - //CNG_dec( st, last_element_mode, Aq, lsp_new, lsf_new, &allow_cn_step, sid_bw, q_env ); CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); for (int nsf = 0; nsf < NB_SUBFR16k; nsf++) { Scale_sig(Aq_fx + (nsf * (M + 1)), M + 1, norm_s(Aq_fx[nsf * (M + 1)]) - Q2); Aq_fx[nsf * (M + 1)] = ONE_IN_Q12; } Copy( Aq_fx, st->Aq_cng, M + 1 ); - /*Local fix2float (to be removed)*/ - //fixedToFloat_arr(st->Aq_cng, st->Aq_cng_float, Q12, M + 1); /* comfort noise generation */ local_element_mode = st->element_mode; @@ -699,9 +552,7 @@ ivas_error acelp_core_dec_ivas_fx( { local_element_mode = IVAS_SCE; /* For DFT Stereo mono decoding, run CNG_exc as in SCE */ } - //CNG_exc( st->core_brate, st->L_frame, &st->hTdCngDec->Enew, &st->hTdCngDec->cng_seed, exc, exc2, &st->lp_ener, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), bwe_exc, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->hTdCngDec->num_ho, q_env, st->hTdCngDec->lp_env, st->hTdCngDec->old_env, st->hTdCngDec->exc_mem, st->hTdCngDec->exc_mem1, sid_bw, &st->hTdCngDec->cng_ener_seed1, exc3, st->Opt_AMR_WB, local_element_mode ); CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), bwe_exc_fx, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, exc3_fx, st->Opt_AMR_WB, local_element_mode ); - //mvr2r( Aq, st->Aq_cng_float, M + 1 ); } else @@ -709,12 +560,10 @@ ivas_error acelp_core_dec_ivas_fx( if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) { - //FdCng_decodeSID_flt( st ); Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; FdCng_decodeSID_ivas_fx( st ); rescale_fdCngDec(st->hFdCngDec, old_NoiseEstExp - st->hFdCngDec->hFdCngCom->sidNoiseEstExp); Scale_sig(st->hFdCngDec->hFdCngCom->A_cng, M + 1, norm_s(st->hFdCngDec->hFdCngCom->A_cng[0]) - Q2); - //st->hFdCngDec->hFdCngCom->A_cng[0] = ONE_IN_Q12; *sid_bw = 0; } @@ -724,16 +573,9 @@ ivas_error acelp_core_dec_ivas_fx( for ( i = 0; i < NPART; i++ ) { - //st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] + ( 1 - STEREO_DFT_FD_FILT ) * st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[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] ) ); } -#ifdef IVAS_FLOAT_FIXED - /* local float2fix (to be removed) */ - for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) - { - st->hFdCngDec->bandNoiseShape[p] = (Word32) ( st->hFdCngDec->bandNoiseShape_float[p] * ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); - } 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); @@ -742,23 +584,18 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig32(st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp - new_cngNoiseLevelExp); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = new_cngNoiseLevelExp; - ApplyFdCng_fx(psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + 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->hFdCngCom->cngNoiseLevelExp < 0) { Scale_sig32(st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; } -#else - ApplyFdCng_flt( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); -#endif // IVAS_FLOAT_FIXED } if ( !read_sid_info ) { - //float noise_lvl_highest; Word32 noise_lvl_highest_fx; - //noise_lvl_highest = st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand - 1]; noise_lvl_highest_fx = st->hFdCngDec->hFdCngCom->cngNoiseLevel[st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand - 1]; for ( int16_t b = st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand; b < st->hFdCngDec->hFdCngCom->stopBand; b++ ) { @@ -766,13 +603,10 @@ ivas_error acelp_core_dec_ivas_fx( } } - //generate_comfort_noise_dec_flt( NULL, NULL, st, nchan_out ); - generate_comfort_noise_dec(NULL, NULL, NULL, st, &(st->Q_exc), 1, nchan_out); + generate_comfort_noise_dec_fx(NULL, NULL, NULL, st, &(st->Q_exc), 1, nchan_out); - //FdCng_exc_flt( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old, st->first_CNG, st->lspCNG, Aq, lsp_new, lsf_new, exc, exc2, bwe_exc ); 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); - //mvr2r( exc2, exc3, st->L_frame ); Copy( exc2_fx, exc3_fx, st->L_frame ); } @@ -796,46 +630,37 @@ ivas_error acelp_core_dec_ivas_fx( /* update past excitation signals for LD music post-filter */ if ( st->hMusicPF != NULL ) { - //mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - //mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); /* Update music post processing values */ /* Filter energies update */ for ( i = 0; i < DCT_L_POST; i++ ) { - //st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; st->hMusicPF->filt_lfE_fx[i] = add( 9830, mult_r( 22937, st->hMusicPF->filt_lfE_fx[i] ) ); } } /* synthesis at 12.8kHz sampling rate */ - //syn_12k8( st->L_frame, Aq, exc2, syn, st->mem_syn2, 1 ); Aq_fx[0] = ONE_IN_Q12; syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - //syn_12k8( st->L_frame, Aq, exc3, syn1, st->mem_syn3, 1 ); syn_12k8_fx( st->L_frame, Aq_fx, exc3_fx, syn1_fx, st->mem_syn3_fx, 1, st->Q_exc, st->Q_syn ); st->Q_syn_cng = st->Q_syn; st->Q_exc_cng = st->Q_exc; /* reset the decoder */ - //CNG_reset_dec( st, pitch_buf, voice_factors ); CNG_reset_dec_fx( st, pitch_buf_fx, voice_factors_fx ); /* update st->mem_syn1 for ACELP core switching */ - //mvr2r( st->mem_syn3, st->mem_syn1, M ); Copy_Scale_sig( st->mem_syn3_fx, st->mem_syn1_fx, M, sub(-1, st->Q_syn)); /* update old synthesis for classification */ - //mvr2r( syn1 + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); Copy( syn1_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); /* save and delay synthesis to be used by SWB BWE */ Copy_Scale_sig(syn1_fx, temp_buf_fx, st->L_frame, sub(-1, st->Q_syn)); 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_float, &st->hBWE_FD->mem_deemph_old_syn ); save_old_syn_fx(st->L_frame, syn1_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); } @@ -885,9 +710,7 @@ ivas_error acelp_core_dec_ivas_fx( if ( st->hTdCngDec != NULL && ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) ) { - //mvr2r( st->lspCNG, st->lsp_old, M ); Copy( st->lspCNG_fx, st->lsp_old_fx, M ); - //lsp2lsf( st->lspCNG, st->lsf_old, M, int_fs ); lsp2lsf_fx( st->lspCNG_fx, st->lsf_old_fx, M, int_fs ); } @@ -897,9 +720,7 @@ ivas_error acelp_core_dec_ivas_fx( if ( !st->use_acelp_preq ) { - //st->mem_preemp_preQ = 0.0f; st->mem_preemp_preQ_fx = 0; - //st->last_nq_preQ = 0; st->last_nq_preQ = 0; st->last_code_preq = 0; } @@ -911,12 +732,10 @@ ivas_error acelp_core_dec_ivas_fx( if ( !tdm_lp_reuse_flag ) { - //lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode, tdm_lsfQ_PCh ); lsf_dec_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode/*, tdm_lsfQ_PCh*/ ); } else { - //const float *pt_interp_2; const Word16 *pt_interp_2_fx; if ( st->active_cnt != 1 ) @@ -924,48 +743,36 @@ ivas_error acelp_core_dec_ivas_fx( int16_t beta_index; beta_index = get_next_indice( st, TDM_IC_LSF_PRED_BITS ); - //tdm_SCh_lsf_reuse( DEC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, NULL, &beta_index ); - //tdm_SCh_lsf_reuse_ivas_fx( DEC, st->element_brate, lsf_new_fx, lsp_new_fx, tdm_lsfQ_PCh_fx, NULL, &beta_index ); tdm_SCh_lsf_reuse_fx(DEC, st->element_brate, lsf_new_fx, lsp_new_fx, tdm_lsfQ_PCh_fx, NULL, &beta_index); } else { - //mvr2r( tdm_lspQ_PCh, lsp_new, M ); Copy( tdm_lspQ_PCh_fx, lsp_new_fx, M ); - //mvr2r( tdm_lspQ_PCh, lsp_new, M ); Copy( tdm_lsfQ_PCh_fx, lsf_new_fx, M ); } if ( st->rate_switching_reset ) { /* extrapolation in case of unstable LSF convert */ - //mvr2r( lsp_new, st->lsp_old, M ); Copy( lsp_new_fx, st->lsp_old_fx, M ); - //mvr2r( lsf_new, st->lsf_old, M ); Copy( lsf_new_fx, st->lsf_old_fx, M ); } - //pt_interp_2 = interpol_frac_12k8; pt_interp_2_fx = interpol_frac_fx; if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED ) { - //pt_interp_2 = intercpol_frac2; pt_interp_2_fx = interpol_frac2_fx; } if ( st->active_cnt == 1 ) { - //mvr2r( lsp_new, st->lsp_old, M ); Copy( lsp_new_fx, st->lsp_old_fx, M ); - //lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core ); lsp2lsf_fx( lsp_new_fx, st->lsf_old_fx, 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 ); 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 = lsf_stab( lsf_new, st->lsf_old, 0, st->L_frame ); st->stab_fac_fx = lsf_stab_ivas_fx( lsf_new_fx, st->lsf_old_fx, 0, st->L_frame ); } for (int nsf = 0; nsf < NB_SUBFR16k; nsf++) { @@ -975,17 +782,11 @@ ivas_error acelp_core_dec_ivas_fx( if ( st->last_core == HQ_CORE && st->element_mode > EVS_MONO ) { /* Prepare ACB memory from last HQ frame */ - //old_exc_s = st->old_exc + L_EXC_MEM_DEC - st->L_frame; old_exc_s_fx = st->old_exc_fx + L_EXC_MEM_DEC - st->L_frame; - //tmpF = *old_exc_s; tmpF_fx = *old_exc_s_fx; - //st->mem_deemph = old_exc_s_fx[st->L_frame - 1]; st->mem_deemph_fx = old_exc_s_fx[st->L_frame - 1]; - //preemph( old_exc_s, st->preemph_fac_float, L_FRAME16k, &tmpF ); preemph_fx( old_exc_s_fx, st->preemph_fac, L_FRAME16k, &tmpF_fx ); - //mvr2r( old_exc_s + st->L_frame - M, st->mem_syn2, M ); Copy(old_exc_s_fx + st->L_frame - M, st->mem_syn2_fx, M ); - //residu( Aq, M, old_exc_s, old_exc + L_EXC_MEM_DEC - st->L_frame, st->L_frame ); Residu3_fx( Aq_fx, old_exc_s_fx, old_exc_fx + L_EXC_MEM_DEC - st->L_frame, st->L_frame, 0 ); } @@ -994,12 +795,10 @@ ivas_error acelp_core_dec_ivas_fx( /* Prepare ACB memory of old_bwe_exc */ if ( st->L_frame == L_FRAME ) { - //lerp_flt( old_exc, old_bwe_exc, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); } else { - //lerp_flt( old_exc, old_bwe_exc, L_EXC_MEM_DEC * 2, L_EXC_MEM_DEC ); lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC * 2, L_EXC_MEM_DEC ); } } @@ -1013,19 +812,16 @@ ivas_error acelp_core_dec_ivas_fx( last_pulse_pos = 0; /* decode the last glottal pulse position */ - //T0_tmp = FEC_pos_dec( st, &last_pulse_pos, &enr_q, nb_bits ); T0_tmp = FEC_pos_dec_fx( st, &last_pulse_pos, &enr_q_fx, nb_bits ); if ( st->last_core != HQ_CORE || ( st->last_core == HQ_CORE && st->last_con_tcx ) ) { if ( st->clas_dec == SIN_ONSET && last_pulse_pos != 0 && st->prev_bfi == 1 ) { - //FEC_SinOnset( old_exc + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q, Aq, st->L_frame ); 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 ( ( st->coder_type == GENERIC || st->coder_type == VOICED ) && last_pulse_pos != 0 && st->old_bfi_cnt == 1 && st->hWIDec != NULL ) { - //do_WI = FEC_enhACB( st->L_frame, st->last_L_frame, old_exc + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st->bfi_pitch ); 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 ); } } @@ -1038,7 +834,6 @@ ivas_error acelp_core_dec_ivas_fx( if ( st->stab_fac_fx == 0 && st->old_bfi_cnt > 0 && st->clas_dec != VOICED_CLAS && st->clas_dec != ONSET && st->relax_prev_lsf_interp == 0 && !( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) ) { - //int_lsp4( st->L_frame, st->lsp_old, lsp_mid, lsp_new, Aq, M, 2 ); int_lsp4_fx( st->L_frame, st->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); } @@ -1049,7 +844,6 @@ ivas_error acelp_core_dec_ivas_fx( if ( nb_bits > 0 ) { indice = get_next_indice( st, nb_bits ); - //Es_pred_dec( &Es_pred, indice, nb_bits, uc_two_stage_flag ); Es_pred_dec_fx( &Es_pred_fx, indice, nb_bits, uc_two_stage_flag ); } @@ -1061,18 +855,15 @@ ivas_error acelp_core_dec_ivas_fx( { if ( st->coder_type <= UNVOICED ) { - //tdm_low_rate_dec( st, dct_exc_tmp, &tmp_noise, pitch_buf, voice_factors, exc, exc2, bwe_exc, lsf_new ); 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( st, sharpFlag, Aq, pitch_buf, voice_factors, exc, exc2, bwe_exc, gain_buf, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf ); 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 ( st->element_mode == IVAS_CPE_TD ) { - //tmp_noise = st->lp_gainc; tmp_noise_fx = shr_r(st->lp_gainc_fx, 3); /*Q0*/ } } @@ -1084,15 +875,12 @@ ivas_error acelp_core_dec_ivas_fx( st->Q_exc = 0; move16(); /* SC-VBR - NELP frames */ - //decod_nelp( st, &tmp_noise, pitch_buf, exc, exc2, voice_factors, bwe_exc, st->bfi, gain_buf ); 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 ( st->coder_type == UNVOICED ) { /* UNVOICED frames */ - //decod_unvoiced( st, Aq, Es_pred, uc_two_stage_flag, &tmp_noise, pitch_buf, voice_factors, exc, exc2, bwe_exc, gain_buf ); - //decod_unvoiced_fx( st, Aq_fx, st->coder_type, &tmp_noise_fx, pitch_buf_out_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx); 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*/ } @@ -1101,7 +889,6 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig(exc_fx - L_EXC_MEM, L_EXC_MEM, -st->Q_exc); st->Q_exc = 0; /* SC-VBR - PPP frames */ - //if ( ( error = decod_ppp( st, Aq, pitch_buf, exc, exc2, voice_factors, bwe_exc, gain_buf, st->bfi ) ) != IVAS_ERR_OK ) 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; @@ -1112,13 +899,11 @@ ivas_error acelp_core_dec_ivas_fx( } else if ( st->coder_type == TRANSITION ) { - //decod_tran( st, st->L_frame, tc_subfr, Aq, Es_pred, pitch_buf, voice_factors, exc, exc2, bwe_exc, unbits, sharpFlag, gain_buf ); 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 ( st->coder_type == AUDIO || ( st->coder_type == INACTIVE && st->inactive_coder_type_flag ) ) { /* AUDIO and INACTIVE frames (coded by GSC technology) */ - //decod_audio( st, dct_exc_tmp, Aq, &tmp_noise, pitch_buf, voice_factors, exc, exc2, bwe_exc, lsf_new, gain_buf, tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf ); 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 @@ -1129,8 +914,6 @@ ivas_error acelp_core_dec_ivas_fx( else { /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ - //if ( ( error = decod_gen_voic( st, st->L_frame, sharpFlag, Aq, Es_pred, do_WI, pitch_buf, voice_factors, exc, exc2, bwe_exc, unbits, gain_buf, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf ) ) != IVAS_ERR_OK ) - //if ( ( error = decod_gen_voic_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_out_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 ) 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; @@ -1138,20 +921,16 @@ ivas_error acelp_core_dec_ivas_fx( if ( st->element_mode == IVAS_CPE_TD ) { - //tmp_noise = st->lp_gainc; tmp_noise_fx = shr_r(st->lp_gainc_fx, 3); /*Q0*/ } } - //printf("\nnextBitPos: %d ", st->next_bit_pos); /* synthesis for ACELP core switching and SWB BWE */ - //syn_12k8( st->L_frame, Aq, exc, temp_buf, st->mem_syn1, 1 ); 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( st->L_frame, temp_buf, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac_float, &st->hBWE_FD->mem_deemph_old_syn ); 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 ); } @@ -1167,7 +946,6 @@ ivas_error acelp_core_dec_ivas_fx( if ( !( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) && st->nelp_mode_dec != 1 && !( st->element_mode == IVAS_SCE && tdm_low_rate_mode ) ) { - //stat_noise_uv_dec( st, lsp_new, lsp_mid, Aq, exc2, uc_two_stage_flag ); stat_noise_uv_dec_fx(st, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag); } @@ -1179,9 +957,6 @@ ivas_error acelp_core_dec_ivas_fx( /* update past excitation signals for LD music post-filter */ if ( st->hMusicPF != NULL ) { - /*mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); - mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - mvr2r( st->hMusicPF->dct_post_old_exc, exc_buffer, DCT_L_POST - OFFSET2 );*/ 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 ); @@ -1198,17 +973,13 @@ ivas_error acelp_core_dec_ivas_fx( Word16 qdct = 0; /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - //Prep_music_postP( exc_buffer, dct_buffer, st->hMusicPF->filt_lfE, st->last_core, pitch_buf, st->hMusicPF->LDm_enh_lp_gbin ); - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct); + 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); /* LD music post-filter */ - //LD_music_post_filter( st->hMusicPF, dct_buffer, dct_buffer, st->core_brate, AUDIO, last_coder_type ); 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 */ - //mvr2r( st->mem_syn2, mem_tmp, M ); Copy( st->mem_syn2_fx, mem_tmp_fx, M ); - //Post_music_postP( dct_buffer, exc_buffer, exc2, st->mem_syn2, st->mem_syn2, Aq, syn ); 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); @@ -1237,16 +1008,13 @@ ivas_error acelp_core_dec_ivas_fx( 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); - //mvr2r( st->mem_syn2, mem_tmp, M ); Copy( st->mem_syn2_fx, mem_tmp_fx, M ); - //syn_12k8( st->L_frame, Aq, exc2, syn, st->mem_syn2, 1 ); syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn); if ( st->hMusicPF != NULL ) { for ( i = 0; i < DCT_L_POST; i++ ) { - //st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; st->hMusicPF->filt_lfE_fx[i] = round_fx(L_mac((1228 << (16)), 22938, st->hMusicPF->filt_lfE_fx[i])); } } @@ -1256,7 +1024,6 @@ ivas_error acelp_core_dec_ivas_fx( * FEC - Estimate the classification information *------------------------------------------------------------*/ - //FEC_clas_estim( syn, pitch_buf, st->L_frame, st->coder_type, st->codec_mode, st->mem_syn_clas_estim, &st->clas_dec, &st->lp_ener_bfi, st->Opt_AMR_WB, &st->decision_hyst, NULL, NULL, NULL, NULL, NULL, NULL, temp_buf, 0, 0, 0, 0, 0, 0, st->last_core_brate, st->acelp_cfg.FEC_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, @@ -1266,9 +1033,8 @@ ivas_error acelp_core_dec_ivas_fx( * FEC - Estimate pitch *------------------------------------------------------------*/ - //FEC_pitch_estim( st->Opt_AMR_WB, st->last_core, st->L_frame, st->clas_dec, st->last_good, pitch_buf, st->old_pitch_buf, &st->bfi_pitch, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type ); 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->bfi_pitch_fx, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type, st->element_mode); /*------------------------------------------------------------* * FEC - Smooth the speech energy evolution when recovering after a BAD frame @@ -1277,7 +1043,6 @@ ivas_error acelp_core_dec_ivas_fx( move16(); Copy_Scale_sig(pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k, -Q6); - //FEC_scale_syn( st->L_frame, st->clas_dec, st->last_good, syn, pitch_buf, st->enr_old, enr_q, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av_float, &st->lp_ener_FEC_max_float, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, exc, exc2, Aq, &st->old_enr_LP_float, mem_tmp, st->mem_syn2, st->last_con_tcx && ( st->L_frameTCX_past != st->L_frame ) && ( st->last_core != ACELP_CORE ), 0 ); 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); @@ -1285,16 +1050,10 @@ ivas_error acelp_core_dec_ivas_fx( /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ if ( ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->total_brate <= ACELP_7k20 ) || ( st->total_brate == ACELP_7k20 ) || ( st->total_brate == ACELP_8k00 ) ) { - //fer_energy( st->L_frame, st->clas_dec, syn, pitch_buf[( ( st->L_frame ) >> 6 ) - 1], &st->enr_old, st->L_frame ); 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); } } - //printf("\n%f ",st->hBWE_FD->mem_deemph_old_syn); - /*printf("\n"); - for (int nm = 0; nm < NS2SA(16000, DELAY_FD_BWE_ENC_NS); nm++) { - printf("%f ", st->hBWE_FD->old_syn_12k8_16k[nm]); - }*/ } /* End of GOOD FRAME */ /*----------------------------------------------------------------* @@ -1318,10 +1077,8 @@ ivas_error acelp_core_dec_ivas_fx( } /* LSF estimation and A(z) calculation */ - //lsf_dec_bfi_flt( MODE1, lsf_new, st->lsf_old, st->lsf_adaptive_mean, NULL, st->mem_MA, st->mem_AR, st->stab_fac, 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, st->bwidth ); 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_flt( st, st->L_frame, Aq, lsf_new, lsp_new ); FEC_lsf2lsp_interp(st, st->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx); for (int nsf = 0; nsf < NB_SUBFR16k; nsf++) { Scale_sig(Aq_fx + (nsf * (M + 1)), M + 1, norm_s(Aq_fx[nsf * (M + 1)]) - Q2); @@ -1334,7 +1091,6 @@ ivas_error acelp_core_dec_ivas_fx( st->Q_exc = 0; move16(); - //decod_nelp( st, &tmp_noise, pitch_buf, exc, exc2, voice_factors, bwe_exc, st->bfi, gain_buf ); 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]; @@ -1343,28 +1099,23 @@ ivas_error acelp_core_dec_ivas_fx( else { /* calculation of excitation signal */ - //FEC_exc_estim( st, st->L_frame, exc, exc2, dct_exc_tmp, pitch_buf, voice_factors, &FEC_pitch, bwe_exc, lsf_new, &tmp_noise ); 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); 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); - //tmp_noise = st->lp_gainc; tmp_noise_fx = shr_r(st->lp_gainc_fx, 3); /*Q0*/ /* SC-VBR */ - //st->prev_gain_pit_dec = st->lp_gainp; st->prev_gain_pit_dec_fx = st->lp_gainp_fx; } /* synthesis for ACELP core switching and SWB BWE */ - //syn_12k8( st->L_frame, Aq, exc, temp_buf, st->mem_syn1, 1 ); 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( st->L_frame, temp_buf, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac_float, &st->hBWE_FD->mem_deemph_old_syn ); 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); } @@ -1374,22 +1125,18 @@ ivas_error acelp_core_dec_ivas_fx( /* update past excitation signals for LD music post-filter */ if ( st->hMusicPF != NULL ) { - //mvr2r( st->hMusicPF->dct_post_old_exc + L_FRAME, st->hMusicPF->dct_post_old_exc, DCT_L_POST - L_FRAME - OFFSET2 ); Copy(st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2); - //mvr2r( exc2, st->hMusicPF->dct_post_old_exc + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); Copy(exc2_fx, st->hMusicPF->dct_post_old_exc_fx + (DCT_L_POST - L_FRAME - OFFSET2), L_FRAME); /* Update music post processing values */ /* Filter energies update */ for ( i = 0; i < DCT_L_POST; i++ ) { - //st->hMusicPF->filt_lfE[i] = 0.3f + 0.7f * st->hMusicPF->filt_lfE[i]; st->hMusicPF->filt_lfE_fx[i] = round_fx(L_mac((1228 << (16)), 22938, st->hMusicPF->filt_lfE_fx[i])); } /* Update circular buffer, keep last energy difference unchanged */ for ( i = 1; i < MAX_LT; i++ ) { - //st->hMusicPF->LDm_lt_diff_etot[i - 1] = st->hMusicPF->LDm_lt_diff_etot[i]; st->hMusicPF->LDm_lt_diff_etot_fx[i - 1] = st->hMusicPF->LDm_lt_diff_etot_fx[i]; } } @@ -1411,24 +1158,19 @@ ivas_error acelp_core_dec_ivas_fx( if ( ( st->total_brate == ACELP_7k20 ) || ( st->total_brate == ACELP_8k00 ) ) { - //mvr2r( st->mem_syn2, mem_tmp, M ); Copy(st->mem_syn2_fx, mem_tmp_fx, M); } - //syn_12k8( st->L_frame, Aq, exc2, syn, st->mem_syn2, 1 ); 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 ) { - //mvr2r( exc2 + st->L_frame - L_EXC_MEM, st->hWIDec->old_exc2, L_EXC_MEM ); Copy(exc2_fx + st->L_frame - L_EXC_MEM, st->hWIDec->old_exc2_fx, L_EXC_MEM); - //mvr2r( syn + st->L_frame - L_EXC_MEM, st->hWIDec->old_syn2, 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; - //mvr2r( syn + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); Copy(psyn_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM); /*------------------------------------------------------------* @@ -1440,59 +1182,38 @@ ivas_error acelp_core_dec_ivas_fx( { Copy_Scale_sig(pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k, -Q6); - //FEC_scale_syn( st->L_frame, st->clas_dec, st->last_good, syn, pitch_buf, st->enr_old, enr_q, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av_float, &st->lp_ener_FEC_max_float, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, exc, exc2, Aq, &st->old_enr_LP_float, mem_tmp, st->mem_syn2, st->last_con_tcx && ( st->L_frameTCX_past != st->L_frame ) && ( st->last_core != ACELP_CORE ), 0 ); 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); } /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - //fer_energy( st->L_frame, st->last_good, syn, FEC_pitch, &st->enr_old, st->L_frame ); 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 ( st->nelp_mode_dec != 1 ) { /* modify the excitation signal of stationary unvoiced frames */ - //stat_noise_uv_mod( st->coder_type, 0, st->lsp_old, lsp_new, lsp_new, Aq, exc2, 1, &st->ge_sm, &st->uv_count, &st->act_count, st->lspold_s, &st->noimix_seed, &st->min_alpha, &st->exc_pe, st->core_brate, st->bwidth ); 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); } } -#ifdef IVAS_FLOAT_FIXED - //floatToFixed_arr(Aq, Aq_fx, Q12, NB_SUBFR16k * (M + 1)); IF(st->hBWE_TD != NULL) { IF(EQ_16(st->L_frame, L_FRAME)) { - //Copy_Scale_sig(Aq_fx + 2 * (M + 1), st->hBWE_TD->cur_sub_Aq_fx, norm_s((Aq_fx + 2 * (M + 1))[0]) - Q2,(M + 1)); Copy( Aq_fx + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); } ELSE { - //Copy_Scale_sig( Aq_fx + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, norm_s( (Aq_fx + 3 * (M + 1))[0] ) - Q2, ( M + 1 ) ); Copy( Aq_fx + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); } } -#else - 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 /*--------------------------------------------------------* * Apply NB postfilter in case of 8kHz output *--------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED test(); IF(EQ_16(st->last_bwidth, NB) && st->hPFstat != NULL) { @@ -1500,183 +1221,70 @@ ivas_error acelp_core_dec_ivas_fx( IF(EQ_16(st->bwidth, NB)) { st->hPFstat->on = 1; -#ifdef IVAS_FLOAT_FIXED move16(); - nb_post_filt(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 - nb_post_filt_ivas(st->L_frame, L_SUBFR, st->hPFstat, &st->psf_lp_noise, tmp_noise, syn, Aq, pitch_buf, st->coder_type, st->BER_detect, 0); -#endif + 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; -#ifdef IVAS_FLOAT_FIXED - nb_post_filt(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 - nb_post_filt_ivas(st->L_frame, L_SUBFR, st->hPFstat, &st->psf_lp_noise, tmp_noise, syn, Aq, pitch_buf, AUDIO, st->BER_detect, 0); -#endif + 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 { -#ifdef IVAS_FLOAT_FIXED st->psf_lp_noise_fx = round_fx(L_shl(st->lp_noise, 1)); - -#else - st->psf_lp_noise = st->lp_noise_float; -#endif - } -#else - if (st->last_bwidth == NB && st->hPFstat != NULL) - { - if (st->bwidth == NB) - { - st->hPFstat->on = 1; - nb_post_filt_ivas(st->L_frame, L_SUBFR, st->hPFstat, &st->psf_lp_noise, tmp_noise, syn, Aq, pitch_buf, st->coder_type, st->BER_detect, 0); - } - else - { - st->hPFstat->on = 0; - nb_post_filt_ivas(st->L_frame, L_SUBFR, st->hPFstat, &st->psf_lp_noise, tmp_noise, syn, Aq, pitch_buf, AUDIO, st->BER_detect, 0); - } - } - else - { - st->psf_lp_noise = st->lp_noise_float; } -#endif /*------------------------------------------------------------------* * Perform fixed deemphasis through 1/(1 - g*z^-1) *-----------------------------------------------------------------*/ /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED Copy(psyn_fx + st->L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM); -#else - mvr2r(syn + st->L_frame - L_SYN_MEM, st->mem_syn_r_float, L_SYN_MEM); -#endif - -#ifdef IVAS_FLOAT_FIXED deemph_fx(psyn_fx, st->preemph_fac, st->L_frame, &(st->mem_deemph_fx)); - #else - deemph(syn, st->preemph_fac_float, st->L_frame, &(st->mem_deemph)); -#endif -#ifdef IVAS_FLOAT_FIXED 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); -#else - AGC_dec(syn, st->agc_mem2, st->L_frame); -#endif - -#ifdef IVAS_FLOAT_FIXED - //floatToFixed_arr(syn, psyn_fx, st->Q_syn, L_FRAME16k); - IF(st->hTcxDec != NULL) { Copy_Scale_sig(psyn_fx + st->L_frame / 2, st->hTcxDec->old_syn_Overl, st->L_frame / 2, sub(-1, st->Q_syn)); /*Q-1*/ - //fixedToFloat_arr(st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, st->Q_syn - 1, st->L_frame / 2); } Copy_Scale_sig(psyn_fx + st->L_frame - M - 1, st->syn, M + 1, sub(0, st->Q_syn)); /*Q0*/ - //fixedToFloat_arr(st->syn, st->syn_float, st->Q_syn, M + 1); -#else - if (st->hTcxDec != NULL) - { - mvr2r(syn + st->L_frame / 2, st->hTcxDec->old_syn_Overl_float, st->L_frame / 2); - } - mvr2r(syn + st->L_frame - M - 1, st->syn_float, M + 1); -#endif -#else - mvr2r(syn + st->L_frame - L_SYN_MEM, st->mem_syn_r_float, L_SYN_MEM); - deemph(syn, st->preemph_fac_float, st->L_frame, &(st->mem_deemph)); - - AGC_dec(syn, st->agc_mem2, st->L_frame); - - if (st->hTcxDec != NULL) - { - mvr2r(syn + st->L_frame / 2, st->hTcxDec->old_syn_Overl_float, st->L_frame / 2); - } - mvr2r(syn + st->L_frame - M - 1, st->syn_float, M + 1); -#endif /*------------------------------------------------------------------* * Formant post-filter *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED - //Word16 temp_buf_fx[L_FRAME16k + L_SYN_MEM]; + 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)) { st->hPFstat->on = 1; -#ifdef IVAS_FLOAT_FIXED /*----ftf conversions---*/ - //floatToFixed_arr(syn, psyn_fx, st->Q_syn, st->L_frame); Copy(psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k); set16_fx(st->hPFstat->mem_zero, 0, M); - formant_post_filt_fx(st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0); + 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 - mvr2r(syn, temp_buf + L_SYN_MEM, L_FRAME16k); - formant_post_filt_ivas(st->hPFstat, temp_buf + L_SYN_MEM, Aq, syn, st->L_frame, L_SUBFR, st->lp_noise_float, st->total_brate, 0); -#endif } ELSE IF(st->hPFstat != NULL && GE_16(st->last_bwidth, WB)) { IF(st->hPFstat->on) { -#ifdef IVAS_FLOAT_FIXED 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(psyn_fx, temp_buf_fx, &st->hPFstat->gain_prec, L_SUBFR); + scale_st_fx(psyn_fx, temp_buf_fx, &st->hPFstat->gain_prec, L_SUBFR); Copy(temp_buf_fx, psyn_fx, L_SUBFR / 2); - blend_subfr2(temp_buf_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2); - -#else - mvr2r(st->hPFstat->mem_pf_in_flt + L_SYN_MEM - M, temp_buf, M); - mvr2r(syn, temp_buf + M, L_SUBFR); - residu(Aq, M, temp_buf + M, temp_buf + M + L_SUBFR, L_SUBFR); - syn_filt(Aq, M, temp_buf + M + L_SUBFR, temp_buf, L_SUBFR, st->hPFstat->mem_stp_flt + L_SYN_MEM - M, 0); - scale_st_ivas(syn, temp_buf, &st->hPFstat->gain_prec_flt, L_SUBFR, -1); - mvr2r(temp_buf, syn, L_SUBFR / 2); - blend_subfr2_flt(temp_buf + L_SUBFR / 2, syn + L_SUBFR / 2, syn + L_SUBFR / 2); -#endif - } - st->hPFstat->on = 0; - } -#else - if (st->hPFstat != NULL && st->last_bwidth >= WB && (st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO) && st->core_brate <= ACELP_32k) - { - mvr2r(syn, temp_buf + L_SYN_MEM, L_FRAME16k); - - st->hPFstat->on = 1; - formant_post_filt_ivas(st->hPFstat, temp_buf + L_SYN_MEM, Aq, syn, st->L_frame, L_SUBFR, st->lp_noise_float, st->total_brate, 0); - } - else if (st->hPFstat != NULL && st->last_bwidth >= WB) - { - if (st->hPFstat->on) - { - mvr2r(st->hPFstat->mem_pf_in_flt + L_SYN_MEM - M, temp_buf, M); - mvr2r(syn, temp_buf + M, L_SUBFR); - residu(Aq, M, temp_buf + M, temp_buf + M + L_SUBFR, L_SUBFR); - syn_filt(Aq, M, temp_buf + M + L_SUBFR, temp_buf, L_SUBFR, st->hPFstat->mem_stp_flt + L_SYN_MEM - M, 0); - scale_st_ivas(syn, temp_buf, &st->hPFstat->gain_prec_flt, L_SUBFR, -1); - mvr2r(temp_buf, syn, L_SUBFR / 2); - blend_subfr2_flt(temp_buf + L_SUBFR / 2, syn + L_SUBFR / 2, syn + L_SUBFR / 2); + blend_subfr2_fx(temp_buf_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2); } st->hPFstat->on = 0; } -#endif /*----------------------------------------------------------------* * Comfort noise addition @@ -1692,19 +1300,15 @@ ivas_error acelp_core_dec_ivas_fx( if (st->idchan == 0 && (st->flag_cna || (st->cng_type == FD_CNG && st->total_brate <= ACELP_32k) || (st->cng_type == LP_CNG && st->core_brate <= SID_2k40))) { /*Noisy speech detector*/ - //noisy_speech_detection_flt(st->hFdCngDec, st->VAD, syn); - noisy_speech_detection(st->hFdCngDec, st->VAD, psyn_fx, st->Q_syn); + noisy_speech_detection_fx(st->hFdCngDec, st->VAD, psyn_fx, st->Q_syn); - //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; st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r(st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440/*0.99 Q15*/); 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(); } -#ifdef IVAS_FLOAT_FIXED st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx = L_deposit_h(st->hFdCngDec->hFdCngCom->likelihood_noisy_speech); -#endif } if (st->idchan == 0) @@ -1716,7 +1320,6 @@ ivas_error acelp_core_dec_ivas_fx( if (st->element_mode != IVAS_CPE_TD && !st->cng_ism_flag) { /*Noise estimate*/ -#ifdef IVAS_FLOAT_FIXED Scale_sig32(st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp - Q27); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4 @@ -1725,8 +1328,7 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig32(st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, st->hFdCngDec->hFdCngCom->sidNoiseEstExp - Q27); st->hFdCngDec->hFdCngCom->sidNoiseEstExp = 31 - Q4; // Q4 /*==========================================================*/ - //ApplyFdCng_fx( syn_fx + L_SUBFR, st->Q_syn, NULL, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - ApplyFdCng_fx(psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); + 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); @@ -1737,9 +1339,6 @@ ivas_error acelp_core_dec_ivas_fx( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; } -#else - ApplyFdCng_flt(syn, NULL, realBuffer, imagBuffer, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); -#endif // IVAS_FLOAT_FIXED } if (!st->cna_dirac_flag) @@ -1751,12 +1350,7 @@ ivas_error acelp_core_dec_ivas_fx( { if (hStereoCng->flag_cna_fade) { -#ifndef IVAS_FLOAT_FIXED - generate_stereo_masking_noise(syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out); -#else - //generate_stereo_masking_noise_fx(syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out); - generate_stereo_masking_noise_16fx(psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out); -#endif + 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 @@ -1764,16 +1358,10 @@ ivas_error acelp_core_dec_ivas_fx( if (st->element_mode != last_element_mode && st->idchan == 0) { /* Clear memory for secondary channel CNA */ - //set_f(hStereoCng->olapBufferSynth22, 0.0f, st->hFdCngDec->hFdCngCom->frameSize / 2); set_s(hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->frameSize / 2); } -#ifndef IVAS_FLOAT_FIXED - generate_stereo_masking_noise(syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out); -#else - //generate_stereo_masking_noise_fx(syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out); - generate_stereo_masking_noise_16fx(psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out); -#endif + generate_stereo_masking_noise_fx(psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out); } } else if (st->element_mode != IVAS_CPE_DFT) @@ -1782,11 +1370,9 @@ ivas_error acelp_core_dec_ivas_fx( { if (st->element_mode != last_element_mode) { - //set_f(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 0.0f, st->hFdCngDec->hFdCngCom->fftlen); set_s(st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen); } - //generate_masking_noise_flt(syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out); - generate_masking_noise(psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0/*, 0, 0, st->element_mode, hStereoCng, nchan_out*/); + 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*/); } } } @@ -1794,18 +1380,11 @@ ivas_error acelp_core_dec_ivas_fx( { if (st->element_mode == IVAS_CPE_TD && nchan_out == 2) { -#ifndef IVAS_FLOAT_FIXED - generate_stereo_masking_noise(syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out); -#else - //generate_stereo_masking_noise_fx(syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out); - generate_stereo_masking_noise_16fx(psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out); -#endif + generate_stereo_masking_noise_fx(psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out); hStereoCng->flag_cna_fade = 1; } else { - //v_multc(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt + 5 * st->hFdCngDec->hFdCngCom->frameSize / 4, (float)(st->hFdCngDec->hFdCngCom->fftlen / 2), temp_buf, st->hFdCngDec->hFdCngCom->frameSize / 2); - //v_add(temp_buf, syn, syn, st->hFdCngDec->hFdCngCom->frameSize / 2); FOR(i = 0; i < st->hFdCngDec->hFdCngCom->frameSize / 2; i++) { psyn_fx[i] = add(psyn_fx[i], shr_r(mult_r(st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st->hFdCngDec->hFdCngCom->frameSize / 4], st->hFdCngDec->hFdCngCom->fftlenFac), -st->Q_syn)); @@ -1827,8 +1406,7 @@ ivas_error acelp_core_dec_ivas_fx( /*Noise estimate*/ if (st->idchan == 0 && (nchan_out == 2 || (st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40))) { -#ifdef IVAS_FLOAT_FIXED - ApplyFdCng_fx(psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); + 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; @@ -1841,10 +1419,6 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig32(st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; } - -#else - ApplyFdCng_flt(syn, NULL, realBuffer, imagBuffer, st, 0, (st->coder_type == AUDIO && !st->GSC_noisy_speech)); -#endif // IVAS_FLOAT_FIXED } } } @@ -1854,8 +1428,6 @@ ivas_error acelp_core_dec_ivas_fx( { if (st->flag_cna == 0 && st->L_frame == L_FRAME16k && st->last_flag_cna == 1 && ((st->last_core == ACELP_CORE && !(st->last_coder_type == AUDIO && !(st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag))) || st->last_core == AMR_WB_CORE)) { - //v_multc(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt + 5 * st->L_frame / 4, 256.f, temp_buf, st->L_frame / 2); - //v_add(temp_buf, syn, syn, st->L_frame / 2); FOR(i = 0; i < st->hFdCngDec->hFdCngCom->frameSize / 2; i++) { psyn_fx[i] = add(psyn_fx[i], shr_r(mult_r(st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st->hFdCngDec->hFdCngCom->frameSize / 4], st->hFdCngDec->hFdCngCom->fftlenFac), -st->Q_syn)); @@ -1867,12 +1439,10 @@ ivas_error acelp_core_dec_ivas_fx( { if (st->idchan == 0) { - //set_f(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 0.f, st->hFdCngDec->hFdCngCom->fftlen); set_s(st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen); } if (hStereoCng != NULL && st->idchan == 0) { - //set_f(hStereoCng->olapBufferSynth22, 0.f, st->hFdCngDec->hFdCngCom->fftlen); set_s(hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->fftlen); } } @@ -1887,30 +1457,9 @@ ivas_error acelp_core_dec_ivas_fx( /* check if the CLDFB works on the right sample rate */ if ((st->cldfbAna->no_channels * st->cldfbAna->no_col) != st->L_frame) { -#ifdef IVAS_FLOAT_FIXED - /*Word16 old_len_ana, old_len_bpf; - Word16 new_len;*/ - - // The following lines are to calculate the length of the buffers before and - // after calling the function for fixed pt conversion. The calculations are taken - // based on the logic used in resampleCldfb_ivas_fx - //old_len_ana = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; - //old_len_bpf = st->cldfbBPF->p_filter_length - st->cldfbBPF->no_channels; - //new_len = 9 * (int16_t)(st->L_frame * FRAMES_PER_SEC * INV_CLDFB_BANDWIDTH + 0.5f); - - //floatToFixed_arrL(st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_fx, Q11, old_len_ana); - //floatToFixed_arrL(st->cldfbBPF->cldfb_state, st->cldfbBPF->cldfb_state_fx, Q10, old_len_bpf); - resampleCldfb_ivas_fx(st->cldfbAna, st->L_frame * FRAMES_PER_SEC); resampleCldfb_ivas_fx(st->cldfbBPF, st->L_frame * FRAMES_PER_SEC); - /*fixedToFloat_arrL(st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, Q11, new_len); - fixedToFloat_arrL(st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, Q10, new_len);*/ -#else - resampleCldfb_ivas(st->cldfbAna, st->L_frame * FRAMES_PER_SEC); - resampleCldfb_ivas(st->cldfbBPF, st->L_frame * FRAMES_PER_SEC); -#endif - if (st->ini_frame > 0) { st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->cldfbAna->no_channels; @@ -1919,8 +1468,6 @@ ivas_error acelp_core_dec_ivas_fx( /* analyze pitch coherence for bass post-filter */ -#ifdef IVAS_FLOAT_FIXED - Word32 pitch_buf_fx_q20[12]; Scale_sig32(st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4); @@ -1930,13 +1477,9 @@ ivas_error acelp_core_dec_ivas_fx( pitch_buf_fx_q20[lp] = L_shl(pitch_buf_fx[lp], Q14); } - bpf_pitch_coherence_fx(st, pitch_buf_fx_q20); + bpf_pitch_coherence_ivas_fx(st, pitch_buf_fx_q20); Scale_sig32(st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4); -#else - bpf_pitch_coherence(st, pitch_buf); -#endif - IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) { @@ -1963,23 +1506,7 @@ ivas_error acelp_core_dec_ivas_fx( if (st->element_mode != IVAS_CPE_DFT || use_cldfb_for_dft) { - /*float realBufferSave[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float imagBufferSave[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float *pRealSave[CLDFB_NO_COL_MAX], *pImagSave[CLDFB_NO_COL_MAX]; - for (i = 0; i < CLDFB_NO_COL_MAX; i++) - { - pRealSave[i] = realBufferSave[i]; - pImagSave[i] = imagBufferSave[i]; - } - - if (st->p_bpf_noise_buf_float) - { - mvr2r(bpf_error_signal, st->p_bpf_noise_buf_float, st->L_frame); - }*/ - /* analysis of the synthesis at internal sampling rate */ - -#ifdef IVAS_FLOAT_FIXED 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]; @@ -1988,62 +1515,37 @@ ivas_error acelp_core_dec_ivas_fx( pRealSave_fx[i] = realBufferSave_fx[i]; pImagSave_fx[i] = imagBufferSave_fx[i]; } - //floatToFixed_arrL(bpf_error_signal, bpf_error_signal_fx, st->Q_syn - 1, st->L_frame); Copy_Scale_sig_16_32(bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1); //Q_syn-1 IF(st->p_bpf_noise_buf_32) { 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 ) ) ); } - //floatToFixed_arr(syn, psyn_fx, st->Q_syn, L_FRAME16k); for (i = 0; i < L_FRAME16k; i++) { syn_32_fx[i] = L_shr(L_deposit_h(psyn_fx[i]), 4 + st->Q_syn); //Q12 } Word16 offset = sub(st->cldfbAna->p_filter_length, st->cldfbAna->no_channels); - //floatToFixed_arrL(st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_fx, Q12, offset); Scale_sig32(st->cldfbAna->cldfb_state_fx, offset, 1); //Q12 cldfbAnalysis_ivas_fx(syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna); - - //fixedToFloat_arrL(st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, Q12, offset); Scale_sig32(st->cldfbAna->cldfb_state_fx, offset, -1); //Q11 - /*for (i = 0; i < CLDFB_NO_COL_MAX; i++) - { - fixedToFloat_arrL(realBuffer_fx[i], realBuffer[i], Q12 - 5, CLDFB_NO_CHANNELS_MAX); //Q7 - fixedToFloat_arrL(imagBuffer_fx[i], imagBuffer[i], Q12 - 5, CLDFB_NO_CHANNELS_MAX); //Q7 - }*/ -#else - cldfbAnalysis_ivas(syn, realBuffer, imagBuffer, -1, st->cldfbAna); -#endif - /* analysis and add the BPF error signal */ -#ifdef IVAS_FLOAT_FIXED 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; - // Float to fixed - //floatToFixed_arrL(bpf_error_signal, tmp_bpf_error_signal_fx, q_bpf_error_signal, L_FRAME16k); Copy_Scale_sig_16_32(bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, q_bpf_error_signal - st->Q_syn); // Q6 for (i = 0; i < CLDFB_NO_COL_MAX; i++) { - /*for (j = 0; j < CLDFB_NO_CHANNELS_MAX; j++) - { - realBuffer_fx[i][j] = floatToFixed(realBuffer[i][j], q_bpf_error_signal - 6); - imagBuffer_fx[i][j] = floatToFixed(imagBuffer[i][j], q_bpf_error_signal - 6); - }*/ Scale_sig32(realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7); //Q0 Scale_sig32(imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7); //Q0 } - /*for (i = 0; i < cldfb_state_offset; i++) - { - st->cldfbBPF->cldfb_state_fx[i] = float_to_fix(st->cldfbBPF->cldfb_state[i], q_bpf_error_signal); - }*/ Scale_sig32(st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, q_bpf_error_signal - Q10); //q_bpf_error_signal (Q6) tmp = -1; @@ -2054,28 +1556,10 @@ ivas_error acelp_core_dec_ivas_fx( move16(); } - addBassPostFilter_fx(tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF); - - // Fixed to float - /*for (i = 0; i < CLDFB_NO_COL_MAX; i++) - { - for (j = 0; j < CLDFB_NO_CHANNELS_MAX; j++) - { - realBuffer[i][j] = fixedToFloat(realBuffer_fx[i][j], q_bpf_error_signal - 6); - imagBuffer[i][j] = fixedToFloat(imagBuffer_fx[i][j], q_bpf_error_signal - 6); - } - } - for (i = 0; i < cldfb_state_offset; i++) - { - st->cldfbBPF->cldfb_state[i] = fix_to_float(st->cldfbBPF->cldfb_state_fx[i], q_bpf_error_signal); - }*/ + 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, -(q_bpf_error_signal - Q10)); //Q10 -#else - addBassPostFilter(bpf_error_signal, st->bpf_off ? 0 : -1, realBuffer, imagBuffer, st->cldfbBPF); -#endif /* set output mask for upsampling */ -#ifdef IVAS_FLOAT_FIXED IF(EQ_16(st->bwidth, NB)) { /* set NB mask for upsampling */ @@ -2086,20 +1570,7 @@ ivas_error acelp_core_dec_ivas_fx( /* in case of BW switching, re-init to default */ st->cldfbSyn->bandsToZero = sub(st->cldfbSyn->no_channels, st->cldfbAna->no_channels); } -#else - if (st->bwidth == NB) - { - /* set NB mask for upsampling */ - st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - 10; - } - else if (st->cldfbSyn->bandsToZero != st->cldfbSyn->no_channels - st->cldfbAna->no_channels) - { - /* in case of BW switching, re-init to default */ - st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->cldfbAna->no_channels; - } -#endif -#ifdef IVAS_FLOAT_FIXED IF(!st->cng_sba_flag || EQ_16(st->element_mode, IVAS_CPE_MDCT)) { /*WB/SWB-FD_CNG*/ @@ -2111,11 +1582,6 @@ ivas_error acelp_core_dec_ivas_fx( /* Fixed to float */ FOR(i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++) { - /*FOR( j = st->hFdCngDec->hFdCngCom->numCoreBands; j < st->hFdCngDec->hFdCngCom->regularStopBand; j++ ) - { - realBuffer[i][j] = me2f(realBuffer_fx[i][j], tmpBufferScale + 15); - imagBuffer[i][j] = me2f(imagBuffer_fx[i][j], tmpBufferScale + 15); - }*/ Scale_sig32(realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, st->hFdCngDec->hFdCngCom->regularStopBand - st->hFdCngDec->hFdCngCom->numCoreBands, (tmpBufferScale + 15) - Q31); //Q0 Scale_sig32(imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, st->hFdCngDec->hFdCngCom->regularStopBand - st->hFdCngDec->hFdCngCom->numCoreBands, (tmpBufferScale + 15) - Q31); //Q0 } @@ -2130,61 +1596,30 @@ ivas_error acelp_core_dec_ivas_fx( } } } -#else - if (!st->cng_sba_flag || st->element_mode == IVAS_CPE_MDCT) - { - /*WB/SWB-FD_CNG*/ - if ((st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40) && (st->cng_type == FD_CNG) && (st->hFdCngDec->hFdCngCom->numCoreBands < st->cldfbSyn->no_channels)) - { - generate_comfort_noise_dec_hf_flt(realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom, st->cng_ism_flag); - - if (st->hFdCngDec->hFdCngCom->regularStopBand < st->cldfbSyn->no_channels) - { - st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - st->hFdCngDec->hFdCngCom->regularStopBand; - } - else - { - st->cldfbSyn->bandsToZero = 0; - } - } - } -#endif if (save_hb_synth_fx16 != NULL) { /* save and then zero-out lowband */ -#ifdef IVAS_FLOAT_FIXED - //Word32 save_hb_synth_fx[L_FRAME48k]; - //Word32 synth_fx[L_FRAME48k]; - Word16 Q_real = 0, Q_imag = 0; - //float max_real = 0.f, max_imag = 0.f; Word32 max_real = 0, max_imag = 0; for (i = 0; i < CLDFB_NO_COL_MAX; i++) { for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { - //max_real = (float)max(max_real, fabs(realBuffer[i][j])); max_real = max(max_real, L_abs(realBuffer_fx[i][j])); - //max_imag = (float)max(max_imag, fabs(imagBuffer[i][j])); max_imag = max(max_imag, L_abs(imagBuffer_fx[i][j])); } } - //float max_val = max(max_real, max_imag); Word32 max_val = max(max_real, max_imag); Q_imag = norm_s((Word16)max_val); Q_real = Q_imag; for (i = 0; i < CLDFB_NO_COL_MAX; i++) { - //floatToFixed_arrL(realBuffer[i], realBuffer_fx[i], Q_real, CLDFB_NO_CHANNELS_MAX); Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real); - //floatToFixed_arrL(imagBuffer[i], imagBuffer_fx[i], Q_imag, CLDFB_NO_CHANNELS_MAX); Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_imag); } - //floatToFixed_arrL(st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_fx, Q_real - 1, st->cldfbSynHB->p_filter_length); - Scale_sig32( st->cldfbSynHB->cldfb_state_fx, (Q_real - 1) - Q10, st->cldfbSynHB->p_filter_length); // (Q_real-1) - //floatToFixed_arrL(save_hb_synth, save_hb_synth_fx, Q_real - 1, L_FRAME48k); + Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, ( Q_real - 1 ) - Q10 ); // (Q_real-1) Scale_sig32(save_hb_synth_fx, L_FRAME48k, Q_real - 1); FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) @@ -2203,10 +1638,8 @@ ivas_error acelp_core_dec_ivas_fx( cldfbSynthesis_ivas_fx(realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, st->cldfbSynHB); - //fixedToFloat_arrL(save_hb_synth_fx, save_hb_synth, Q_real - 1, L_FRAME48k); Scale_sig32(save_hb_synth_fx, L_FRAME48k, -(Q_real - 1)); //Q0 - //fixedToFloat_arrL(st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, Q_real - 1, st->cldfbSynHB->p_filter_length); - Scale_sig32(st->cldfbSynHB->cldfb_state_fx, Q10 - (Q_real - 1), st->cldfbSynHB->p_filter_length); // Q10 + Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, Q10 - ( Q_real - 1 ) ); // Q10 /* restore lowband */ FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) @@ -2217,86 +1650,39 @@ ivas_error acelp_core_dec_ivas_fx( imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; } } - //floatToFixed_arrL(st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_fx, Q_real - 1, st->cldfbSyn->p_filter_length); Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, (Q_real - 1) - Q10); //Q_real-1 cldfbSynthesis_ivas_fx(pRealSave_fx, pImagSave_fx, synth_fx, -1, st->cldfbSyn); - //fixedToFloat_arrL(synth_fx, synth, Q_real - 1, L_FRAME48k); Scale_sig32(synth_fx, L_FRAME48k, -(Q_real - 1)); - //fixedToFloat_arrL(st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, Q_real - 1, st->cldfbSynHB->p_filter_length); Scale_sig32(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, Q10 - (Q_real - 1)); //Q10 -#else - for (int16_t j = 0; j < CLDFB_NO_CHANNELS_MAX; j++) - { - for (i = 0; i < CLDFB_NO_COL_MAX; i++) - { - realBufferSave[i][j] = realBuffer[i][j]; - imagBufferSave[i][j] = imagBuffer[i][j]; - if (j < st->hFdCngDec->hFdCngCom->numCoreBands && i < st->hFdCngDec->hFdCngCom->numSlots) - { - realBuffer[i][j] = 0.0f; - imagBuffer[i][j] = 0.0f; - } - } - } - cldfbSynthesis_ivas(realBuffer, imagBuffer, save_hb_synth, -1, st->cldfbSynHB); - - /* restore lowband */ - for (int16_t j = 0; j < CLDFB_NO_CHANNELS_MAX; j++) - { - for (i = 0; i < CLDFB_NO_COL_MAX; i++) - { - realBuffer[i][j] = realBufferSave[i][j]; - imagBuffer[i][j] = imagBufferSave[i][j]; - } - } - - cldfbSynthesis_ivas(pRealSave, pImagSave, synth, -1, st->cldfbSyn); -#endif } else { /* synthesis of the combined signal */ -#ifdef IVAS_FLOAT_FIXED Word16 Q_real = 0, Q_imag = 0; - //float max_real = 0.f, max_imag = 0.f; Word32 max_real = 0, max_imag = 0; for (i = 0; i < CLDFB_NO_COL_MAX; i++) { for (j = 0; j < CLDFB_NO_CHANNELS_MAX; j++) { - //max_real = (float)max(max_real, fabs(realBuffer[i][j])); max_real = max(max_real, L_abs(realBuffer_fx[i][j])); - //max_imag = (float)max(max_imag, fabs(imagBuffer[i][j])); max_imag = max(max_imag, L_abs(imagBuffer_fx[i][j])); } } - //float max_val = max(max_real, max_imag); Word32 max_val = max(max_real, max_imag); Q_imag = norm_s((Word16)max_val); Q_real = Q_imag; for (i = 0; i < CLDFB_NO_COL_MAX; i++) { - //floatToFixed_arrL(realBuffer[i], realBuffer_fx[i], Q_real, CLDFB_NO_CHANNELS_MAX); Scale_sig32(realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real); - //floatToFixed_arrL(imagBuffer[i], imagBuffer_fx[i], Q_real, CLDFB_NO_CHANNELS_MAX); Scale_sig32(imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real); } - //floatToFixed_arrL(st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_fx, Q_real - 1, st->cldfbSyn->p_filter_length); Scale_sig32(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, (Q_real - 1) - Q10); //(Q_real - 1) - //Word32 synth_fx[L_FRAME48k]; - //floatToFixed_arrL(synth, synth_fx, Q_real - 1, L_FRAME48k); Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1); cldfbSynthesis_ivas_fx(realBuffer_fx, imagBuffer_fx, synth_fx, -1, st->cldfbSyn); - - //fixedToFloat_arrL(synth_fx, synth, Q_real - 1, L_FRAME48k); Scale_sig32(synth_fx, L_FRAME48k, -(Q_real - 1)); - //fixedToFloat_arrL(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, Q_real - 1, st->cldfbSyn->p_filter_length); Scale_sig32(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, Q10 - (Q_real - 1)); //Q10 -#else - cldfbSynthesis_ivas(realBuffer, imagBuffer, synth, -1, st->cldfbSyn); -#endif } /* save synthesis - needed in case of core switching */ @@ -2308,33 +1694,19 @@ ivas_error acelp_core_dec_ivas_fx( int16_t 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 */ -#ifdef IVAS_FLOAT_FIXED - //floatToFixed_arr(syn, psyn_fx, st->Q_syn, L_FRAME16k); for (i = 0; i < L_FRAME16k; i++) { syn_32_fx[i] = L_shr(L_deposit_h(psyn_fx[i]), 4 + st->Q_syn); } Word16 offset = sub(st->cldfbAna->p_filter_length, st->cldfbAna->no_channels); - //floatToFixed_arrL(st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_fx, Q12, offset); Scale_sig32(st->cldfbAna->cldfb_state_fx, offset, 1); //Q12 cldfbAnalysis_ivas_fx(syn_32_fx + st->L_frame - nSamples, realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna); - //fixedToFloat_arrL(st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, Q12, offset); Scale_sig32(st->cldfbAna->cldfb_state_fx, offset, -1); //Q11 - /*for (i = 0; i < CLDFB_NO_COL_MAX; i++) - { - fixedToFloat_arrL(realBuffer_fx[i], realBuffer[i], Q12 - 5, CLDFB_NO_CHANNELS_MAX); - fixedToFloat_arrL(imagBuffer_fx[i], imagBuffer[i], Q12 - 5, CLDFB_NO_CHANNELS_MAX); - }*/ -#else - cldfbAnalysis_ivas(syn + st->L_frame - nSamples, realBuffer, imagBuffer, nSamples, st->cldfbAna); -#endif - /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ -#ifdef IVAS_FLOAT_FIXED 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); @@ -2342,23 +1714,12 @@ ivas_error acelp_core_dec_ivas_fx( // Get Q-factor q_bpf_error_signal = Q6; - // Float to fixed - //floatToFixed_arrL(bpf_error_signal, tmp_bpf_error_signal_fx, q_bpf_error_signal, L_FRAME16k); Copy_Scale_sig_16_32(bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, q_bpf_error_signal - st->Q_syn); // Q6 for (i = 0; i < CLDFB_NO_COL_MAX; i++) { - /*for (j = 0; j < CLDFB_NO_CHANNELS_MAX; j++) - { - realBuffer_fx[i][j] = floatToFixed(realBuffer[i][j], q_bpf_error_signal - 6); - imagBuffer_fx[i][j] = floatToFixed(imagBuffer[i][j], q_bpf_error_signal - 6); - }*/ Scale_sig32(realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7); //Q0 Scale_sig32(imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7); //Q0 } - /*for (i = 0; i < cldfb_state_offset; i++) - { - st->cldfbBPF->cldfb_state_fx[i] = float_to_fix(st->cldfbBPF->cldfb_state[i], q_bpf_error_signal); - }*/ Scale_sig32(st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, q_bpf_error_signal - Q10); //q_bpf_error_signal (Q6) tmp = 0; @@ -2368,65 +1729,46 @@ ivas_error acelp_core_dec_ivas_fx( tmp = nSamples; move16(); } - addBassPostFilter_fx(tmp_bpf_error_signal_fx + st->L_frame - nSamples, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF); + addBassPostFilter_ivas_fx(tmp_bpf_error_signal_fx + st->L_frame - nSamples, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF); Scale_sig32(st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, -(q_bpf_error_signal - Q10)); //Q10 -#else - addBassPostFilter(bpf_error_signal + st->L_frame - nSamples, st->bpf_off ? 0 : nSamples, realBuffer, imagBuffer, st->cldfbBPF); -#endif /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ -#ifdef IVAS_FLOAT_FIXED Word16 Q_real = 0, Q_imag = 0; - //float max_real = 0.f, max_imag = 0.f; Word32 max_real = 0, max_imag = 0; for (i = 0; i < CLDFB_NO_COL_MAX; i++) { for (j = 0; j < CLDFB_NO_CHANNELS_MAX; j++) { - //max_real = (float)max(max_real, fabs(realBuffer[i][j])); max_real = max(max_real, L_abs(realBuffer_fx[i][j])); - //max_imag = (float)max(max_imag, fabs(imagBuffer[i][j])); max_imag = max(max_imag, L_abs(imagBuffer_fx[i][j])); } } - //float max_val = max(max_real, max_imag); Word32 max_val = max(max_real, max_imag); Q_imag = norm_s((Word16)max_val); Q_real = Q_imag; for (i = 0; i < CLDFB_NO_COL_MAX; i++) { - //floatToFixed_arrL(realBuffer[i], realBuffer_fx[i], Q_real, CLDFB_NO_CHANNELS_MAX); Scale_sig32(realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real); - //floatToFixed_arrL(imagBuffer[i], imagBuffer_fx[i], Q_real, CLDFB_NO_CHANNELS_MAX); Scale_sig32(imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real); } - //floatToFixed_arrL(st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_fx, Q_real - 1, st->cldfbSyn->p_filter_length); Scale_sig32(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, (Q_real - 1) - Q10); //(Q_real - 1) - //Word32 synth_fx[L_FRAME48k]; - //floatToFixed_arrL(synth, synth_fx, Q_real - 1, L_FRAME48k); Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1); cldfbSynthesis_ivas_fx(realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA(st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/), st->cldfbSyn); - //fixedToFloat_arrL(synth_fx, synth, Q_real - 1, L_FRAME48k); Scale_sig32(synth_fx, L_FRAME48k, -(Q_real - 1)); - //fixedToFloat_arrL(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, Q_real - 1, st->cldfbSyn->p_filter_length); Scale_sig32(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, Q10 - (Q_real - 1)); -#else - cldfbSynthesis_ivas(realBuffer, imagBuffer, synth /*dummy*/, NS2SA(st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/), st->cldfbSyn); -#endif - - if (st->p_bpf_noise_buf_float) + if (st->p_bpf_noise_buf_32) { - //mvr2r(bpf_error_signal, st->p_bpf_noise_buf_float, st->L_frame); 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_f(synth, 0.0f, output_frame); set_l(synth_fx, 0, output_frame); } @@ -2435,7 +1777,6 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig(syn_tmp_fx, L_FRAME16k + L_SUBFR, -st->Q_syn); if (st->element_mode > EVS_MONO) { - //mvr2r(syn, output, st->L_frame); Copy(psyn_fx, output_fx, st->L_frame); } @@ -2444,7 +1785,6 @@ ivas_error acelp_core_dec_ivas_fx( /*-----------------------------------------------------------------* * Bandwidth extension 6kHz-7kHz *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED IF( st->hBWE_zero != NULL ) { test(); @@ -2458,8 +1798,6 @@ ivas_error acelp_core_dec_ivas_fx( ( 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 ) ) ) ) ) { Word16 tmp_exp = 0; - - //Word16 output_subfr = output_frame / NB_SUBFR; Copy_Scale_sig_32_16(synth_fx, synth_fx16, L_FRAME48k, 0); hf_synth_ivas_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc_fx, @@ -2479,24 +1817,8 @@ ivas_error acelp_core_dec_ivas_fx( ELSE { hf_synth_reset_fx( st->hBWE_zero ); - /*to be cleaned up*/ - //hf_synth_reset( st->hBWE_zero ); } } -#else - if (st->hBWE_zero != NULL) - { - if ((st->L_frame == L_FRAME && st->bwidth != NB && output_frame >= L_FRAME16k && - (st->extl == -1 || st->extl == SWB_CNG || (st->extl == WB_BWE && st->extl_brate == 0 && st->coder_type != AUDIO)))) - { - hf_synth(st->hBWE_zero, st->core_brate, output_frame, Aq, exc2, syn, synth); - } - else - { - hf_synth_reset(st->hBWE_zero); - } - } -#endif /*-----------------------------------------------------------------* * Populate parameters for SWB TBE @@ -2506,39 +1828,19 @@ ivas_error acelp_core_dec_ivas_fx( { if ((!st->bfi && st->prev_bfi) || (st->last_vbr_hw_BWE_disable_dec == 1 && st->vbr_hw_BWE_disable_dec == 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; st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; - //set_f(st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET); set_s(st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET); } if (!st->ppp_mode_dec && (st->idchan == 0 || st->element_mode != IVAS_CPE_TD || (st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag))) { -#ifdef IVAS_FLOAT_FIXED - - - ///* update buffer memory */ - //Copy32( tmp_old_bwe_exc_extended_fx, tmp_bwe_exc_extended_fx, NL_BUFF_OFFSET ); - Copy_Scale_sig_16_32(st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, 2 * st->Q_exc); - - //non_linearity_ivas_fx(bwe_exc_fx, tmp_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_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 ); - - ///* update buffer memory */ - //Copy32( tmp_bwe_exc_extended_fx + L_FRAME32k, tmp_old_bwe_exc_extended_fx, NL_BUFF_OFFSET ); - - //// Fixed to float - //me2f_buf( tmp_bwe_exc_extended_fx, 31 - 2 * st->Q_exc, bwe_exc_extended, L_FRAME32k + NL_BUFF_OFFSET ); - //me2f_buf( tmp_old_bwe_exc_extended_fx, 31 - 2 * st->Q_exc, st->hBWE_TD->old_bwe_exc_extended, NL_BUFF_OFFSET ); - 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)); -#else - 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 ); -#endif + 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 ) ) ); } if ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) { - //st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; } } @@ -2546,18 +1848,11 @@ ivas_error acelp_core_dec_ivas_fx( * Updates *----------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED - 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 ); -#else - updt_dec( st, old_exc, pitch_buf, Es_pred, Aq, lsf_new, lsp_new, voice_factors, old_bwe_exc, gain_buf ); -#endif - -#ifdef IVAS_FLOAT_FIXED IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) { - ///* update CNG parameters in active frames */ + /* 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 ); @@ -2572,29 +1867,15 @@ ivas_error acelp_core_dec_ivas_fx( move16(); } } -#else - if (st->core_brate > SID_2k40 && st->hTdCngDec != NULL && st->hFdCngDec != NULL) - { - /* update CNG parameters in active frames */ - cng_params_upd(lsp_new, exc, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ, DEC, st->hTdCngDec->ho_env_circ, 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); - } -#endif pop_wmops(); { - /* Lccal fix2float (To be removed) */ - /*fixedToFloat_arrL(bwe_exc_extended_fx, bwe_exc_extended, 2 * st->Q_exc, L_FRAME32k + NL_BUFF_OFFSET); - fixedToFloat_arr(output_fx, output, 0, st->L_frame);*/ if (save_hb_synth_fx16) { - //fixedToFloat_arrL(save_hb_synth_fx, save_hb_synth, 0, L_FRAME48k); Copy_Scale_sig_32_16(save_hb_synth_fx, save_hb_synth_fx16, L_FRAME48k, 0); } - //fixedToFloat_arrL(synth_fx, synth, 0, L_FRAME48k); Copy_Scale_sig_32_16(synth_fx, synth_fx16, L_FRAME48k, 0); if (st->hFdCngDec) { @@ -2606,11 +1887,8 @@ ivas_error acelp_core_dec_ivas_fx( return error; } -void acelp_decoder_state_float2fix(Decoder_State *st, STEREO_CNG_DEC_HANDLE hStereoCng) { +void acelp_decoder_state_float2fix(Decoder_State *st/*, STEREO_CNG_DEC_HANDLE hStereoCng*/) { - if (hStereoCng) { - floatToFixed_arr(hStereoCng->olapBufferSynth22, hStereoCng->olapBufferSynth22_fx, st->Q_syn, FFTLEN); - } /* CLDFB */ Word16 old_len_ana, old_len_bpf; @@ -2631,56 +1909,15 @@ void acelp_decoder_state_float2fix(Decoder_State *st, STEREO_CNG_DEC_HANDLE hSte //FdCng if ( st->hFdCngDec ) { - floatToFixed_arrL( st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt, st->hFdCngDec->hFdCngCom->sidNoiseEstLp, Q31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp, NPART ); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = Q31 - 4; floatToFixed_arrL(st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, Q31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN); - floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q12, M + 1); - st->hFdCngDec->hFdCngCom->A_cng[0] = 4096; - floatToFixed_arr(st->hFdCngDec->hFdCngCom->exc_cng_flt, st->hFdCngDec->hFdCngCom->exc_cng, st->Q_exc_cng, L_FRAME16k); - - floatToFixed_arr(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->fftlenShift, FFTLEN); - //st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = float_to_fix16(st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_flt, Q15); - floatToFixed_arrL( st->hFdCngDec->bandNoiseShape_float, st->hFdCngDec->bandNoiseShape, Q31 - st->hFdCngDec->bandNoiseShape_exp, FFTLEN2); - /*CNA: ApplyFdCng*/ - if ((st->hFdCngDec != NULL || st->idchan == 1) && st->element_mode != IVAS_CPE_MDCT) - { - if (st->element_mode == IVAS_CPE_TD || st->flag_cna || (st->cng_type == FD_CNG && st->total_brate <= ACELP_32k) || (st->cng_type == LP_CNG && st->core_brate <= SID_2k40)) - { - if (st->element_mode != IVAS_CPE_TD && !st->cng_ism_flag) - { - st->hFdCngDec->hFdCngCom->fftBuffer_exp = st->hFdCngDec->msNoiseEst_exp = Q31 - Q4; //st->hFdCngDec->hFdCngCom->periodog_exp = st->hFdCngDec->msPsd_exp_fft = st->hFdCngDec->msPeriodog_exp = st->hFdCngDec->msPeriodog_ST_exp = 31 - Q4; Q4 - floatToFixed_arrL(st->hFdCngDec->hFdCngCom->fftBuffer_flt, st->hFdCngDec->hFdCngCom->fftBuffer, Q31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); - floatToFixed_arrL(st->hFdCngDec->msNoiseEst_float, st->hFdCngDec->msNoiseEst, Q31 - st->hFdCngDec->msNoiseEst_exp, st->hFdCngDec->npart_shaping); - - if (st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT) - { - floatToFixed_arrL(st->hFdCngDec->smoothed_psd, st->hFdCngDec->smoothed_psd_fx, Q31 - st->hFdCngDec->msNoiseEst_exp, L_FRAME16k - st->hFdCngDec->hFdCngCom->startBand); - } - } - } - } - } - - /*TD_BWE_DEC_HANDLE*/ - if (st->hBWE_TD) { - floatToFixed_arr(st->hBWE_TD->old_bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET); - } - - /*TCX_DEC_HANDLE*/ - if (st->hTcxDec) { - floatToFixed_arr(st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, 0, L_FRAME32k / 2); - floatToFixed_arr(st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, -1, st->L_frame / 2); } } -void acelp_decoder_state_fix2float(Decoder_State *st, STEREO_CNG_DEC_HANDLE hStereoCng) { +void acelp_decoder_state_fix2float(Decoder_State *st) { st->prev_Q_syn = st->Q_syn; - if (hStereoCng) { - fixedToFloat_arr(hStereoCng->olapBufferSynth22_fx, hStereoCng->olapBufferSynth22, st->Q_syn, FFTLEN); - } - /* CLDFB */ Word16 new_len; new_len = 9 * (int16_t)(st->L_frame * FRAMES_PER_SEC * INV_CLDFB_BANDWIDTH + 0.5f); @@ -2690,22 +1927,10 @@ void acelp_decoder_state_fix2float(Decoder_State *st, STEREO_CNG_DEC_HANDLE hSte fixedToFloat_arrL(st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, Q10, st->cldfbSynHB->p_filter_length); fixedToFloat_arrL(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, Q10, st->cldfbSyn->p_filter_length); - IF(st->p_bpf_noise_buf_32) { - fixedToFloat_arrL(st->p_bpf_noise_buf_32, st->p_bpf_noise_buf_float, st->Q_syn-1, st->L_frame); - } - //FdCng if ( st->hFdCngDec ) { - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->sidNoiseEstLp, st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt, Q31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp, NPART); fixedToFloat_arrL( st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, Q31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN ); - fixedToFloat_arr( st->hFdCngDec->hFdCngCom->A_cng, st->hFdCngDec->hFdCngCom->A_cng_flt, Q12, M + 1 ); - fixedToFloat_arr(st->hFdCngDec->hFdCngCom->exc_cng, st->hFdCngDec->hFdCngCom->exc_cng_flt, st->Q_exc_cng, L_FRAME16k); - fixedToFloat_arr(st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->hFdCngDec->hFdCngCom->fftlenShift, FFTLEN); - //st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_flt = fixedToFloat(st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, Q15); - fixedToFloat_arrL(st->hFdCngDec->bandNoiseShape, st->hFdCngDec->bandNoiseShape_float, Q31 - st->hFdCngDec->bandNoiseShape_exp, FFTLEN2); - //fixedToFloat_arrL(st->hFdCngDec->partNoiseShape, st->hFdCngDec->partNoiseShape_float, Q31 - st->hFdCngDec->partNoiseShape_exp, NPART); - /*CNA: ApplyFdCng*/ if ((st->hFdCngDec != NULL || st->idchan == 1) && st->element_mode != IVAS_CPE_MDCT) { if (st->element_mode == IVAS_CPE_TD || st->flag_cna || (st->cng_type == FD_CNG && st->total_brate <= ACELP_32k) || (st->cng_type == LP_CNG && st->core_brate <= SID_2k40)) @@ -2722,44 +1947,16 @@ void acelp_decoder_state_fix2float(Decoder_State *st, STEREO_CNG_DEC_HANDLE hSte (st->m_frame_type == ZERO_FRAME) && (st != NULL && st->cng_type == LP_CNG) ) { - //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->periodog, st->hFdCngDec->hFdCngCom->periodog_flt, Q31 - st->hFdCngDec->hFdCngCom->periodog_exp, PERIODOGLEN); - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->fftBuffer, st->hFdCngDec->hFdCngCom->fftBuffer_flt, Q31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); fixedToFloat_arrL(st->hFdCngDec->msNoiseEst, st->hFdCngDec->msNoiseEst_float, Q31 - st->hFdCngDec->msNoiseEst_exp, st->hFdCngDec->npart_shaping); - // fixedToFloat_arrL(st->hFdCngDec->msPeriodog, st->hFdCngDec->msPeriodog_float, Q31 - st->hFdCngDec->msPeriodog_exp, st->hFdCngDec->npart_shaping); - //fixedToFloat_arrL(st->hFdCngDec->msPeriodog_ST_fx, st->hFdCngDec->msPeriodog_ST, Q31 - st->hFdCngDec->msPeriodog_ST_exp, st->hFdCngDec->npart_shaping); - - if (st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT) - { - fixedToFloat_arrL(st->hFdCngDec->smoothed_psd_fx, st->hFdCngDec->smoothed_psd, Q31 - st->hFdCngDec->msNoiseEst_exp, L_FRAME16k - st->hFdCngDec->hFdCngCom->startBand); - } - if (!((st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT) && (st->hFdCngDec->hFdCngCom->active_frame_counter > 0))) - { - st->hTcxDec->CngLevelBackgroundTrace_bfi = fixedToFloat(st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, (31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp)); - } } } } } } - - /*TD_BWE_DEC_HANDLE*/ - if (st->hBWE_TD) { - fixedToFloat_arr(st->hBWE_TD->old_bwe_exc_extended_fx, st->hBWE_TD->old_bwe_exc_extended, 0, NL_BUFF_OFFSET); - } - - /*TCX_DEC_HANDLE*/ - if (st->hTcxDec) { - fixedToFloat_arr(st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, 0, L_FRAME32k / 2); - fixedToFloat_arr(st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, -1, st->L_frame / 2); - } } static void rescale_fdCngDec(HANDLE_FD_CNG_DEC hFdCngDec, Word16 Exp_diff) { Scale_sig32(hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, Exp_diff); - /*Scale_sig32(hFdCngDec->hFdCngCom->sidNoiseEst, NPART, -Exp_diff); - hFdCngDec->hFdCngCom->sidNoiseEstExp += Exp_diff; - Scale_sig32(hFdCngDec->hFdCngCom->cngNoiseLevel, NPART, -Exp_diff); - hFdCngDec->hFdCngCom->cngNoiseLevelExp += Exp_diff;*/ } -#endif \ No newline at end of file +#endif diff --git a/lib_dec/acelp_core_switch_dec.c b/lib_dec/acelp_core_switch_dec.c index 5161773da54e7883ff11e26e2564f6af24270b86..8e3be60975f6eebe1c5ea8b8c018a539feac8178 100644 --- a/lib_dec/acelp_core_switch_dec.c +++ b/lib_dec/acelp_core_switch_dec.c @@ -53,7 +53,7 @@ static void decod_gen_voic_core_switch( Decoder_State *st, const int16_t L_frame * * ACELP core decoder in the first ACELP->HQ switching frame *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED ivas_error acelp_core_switch_dec( Decoder_State *st, /* i/o: decoder state structure */ float *synth_subfr_out, /* o : synthesized ACELP subframe */ @@ -204,7 +204,7 @@ ivas_error acelp_core_switch_dec( if ( st->flag_cna ) { - generate_masking_noise_flt( synth_intFreq, st->hFdCngDec->hFdCngCom, 2 * L_SUBFR, 0, 0, 0, st->element_mode, NULL, nchan_out ); + generate_masking_noise( synth_intFreq, st->hFdCngDec->hFdCngCom, 2 * L_SUBFR, 0, 0, 0, st->element_mode, NULL, nchan_out ); } /*----------------------------------------------------------------* diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index f30644cc0b8980655da508bbc617b06e4d10105f..c6a5d3123f3e8f614a19806521decb18fc2e95b8 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -9,7 +9,7 @@ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ #include "prot.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * Local function prototypes *---------------------------------------------------------------------*/ @@ -151,7 +151,7 @@ ivas_error acelp_core_switch_dec_fx( pitch_buf_tmp[i] = L_SUBFR; move16(); } - nb_post_filt( 2*L_SUBFR, 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)) @@ -173,9 +173,9 @@ ivas_error acelp_core_switch_dec_fx( Copy( synth_intFreq, bpf_error_signal + M, L_SUBFR ); 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 ( synth_intFreq, bpf_error_signal, &st_fx->hPFstat->gain_prec, L_SUBFR ); + scale_st_fx ( synth_intFreq, bpf_error_signal, &st_fx->hPFstat->gain_prec, L_SUBFR ); Copy( bpf_error_signal, synth_intFreq, L_SUBFR/2 ); - blend_subfr2( bpf_error_signal + L_SUBFR/2, synth_intFreq + L_SUBFR/2, 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; @@ -183,7 +183,7 @@ ivas_error acelp_core_switch_dec_fx( IF ( st_fx->flag_cna != 0 ) { - generate_masking_noise( synth_intFreq, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, 2*L_SUBFR, 0); + generate_masking_noise_fx( synth_intFreq, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, 2*L_SUBFR, 0); } /*----------------------------------------------------------------* @@ -219,7 +219,7 @@ ivas_error acelp_core_switch_dec_fx( i = CLDFB_NO_COL_MAX_SWITCH; move16(); } - addBassPostFilterFx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate(st_fx->Q_syn), + addBassPostFilter_fx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate(st_fx->Q_syn), i, CLDFB_NO_COL_MAX_SWITCH, st_fx->cldfbAna->no_channels, &scaleFactor ); cldfb_restore_memory( st_fx->cldfbBPF ); @@ -989,3 +989,4 @@ static void decod_gen_voic_core_switch_fx( return; } +#endif diff --git a/lib_dec/amr_wb_dec.c b/lib_dec/amr_wb_dec.c index 11d7372f084174eb2c87494734124073500d5c57..90bbfede8c2e70ccf97c850a4de8b0a206e4dbba 100644 --- a/lib_dec/amr_wb_dec.c +++ b/lib_dec/amr_wb_dec.c @@ -46,14 +46,14 @@ #include "prot_fx2.h" #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------* - * amr_wb_dec_flt() + * amr_wb_dec() * * AMR-WB decoder *------------------------------------------------------------------*/ -ivas_error amr_wb_dec_flt( +ivas_error amr_wb_dec( Decoder_State *st, /* i/o: decoder state structure */ float mem_hp20_out[L_HP20_MEM], /* i/o: HP filter memory for synthesis */ float *output /* o : synthesis output */ @@ -624,12 +624,12 @@ ivas_error amr_wb_dec_flt( /*VAD only for non inactive frame*/ st->VAD = ( st->VAD && ( st->coder_type != INACTIVE ) ); - ApplyFdCng_flt( syn, NULL, NULL, NULL, st, 0, 0 ); + ApplyFdCng( syn, NULL, NULL, NULL, st, 0, 0 ); st->hFdCngDec->hFdCngCom->frame_type_previous = st->m_frame_type; /*Noisy speech detector*/ - noisy_speech_detection_flt( st->hFdCngDec, st->VAD, syn ); + noisy_speech_detection( st->hFdCngDec, st->VAD, syn ); 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; @@ -638,16 +638,16 @@ ivas_error amr_wb_dec_flt( if ( st->flag_cna && ( st->psf_lp_noise >= 15.f ) ) { flag_cna = 1; - generate_masking_noise_flt( syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, AMR_WB_CORE, 0, 0, st->element_mode, NULL, -1 ); + generate_masking_noise( syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, AMR_WB_CORE, 0, 0, st->element_mode, NULL, -1 ); } else if ( st->flag_cna ) { - generate_masking_noise_update_seed_flt( st->hFdCngDec->hFdCngCom ); + generate_masking_noise_update_seed( st->hFdCngDec->hFdCngCom ); } } else if ( st->flag_cna ) { - generate_masking_noise_update_seed_flt( st->hFdCngDec->hFdCngCom ); + generate_masking_noise_update_seed( st->hFdCngDec->hFdCngCom ); } if ( flag_cna == 0 ) @@ -819,12 +819,12 @@ ivas_error amr_wb_dec_flt( #endif /*------------------------------------------------------------------* - * amr_wb_dec_init_flt() + * amr_wb_dec_init() * * AMR-WB decoder initialization *------------------------------------------------------------------*/ -void amr_wb_dec_init_flt( +void amr_wb_dec_init( AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ ) { diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index 63d0d75e81d72179768f7efbbcffa2ef50e76ebf..30159c660db1e4d63bce4b1a364e6047ae6b422a 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -9,7 +9,7 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "basop_util.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * amr_wb_dec_fx() * @@ -572,7 +572,7 @@ ivas_error amr_wb_dec_fx( move16(); } /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_core, pitch_buf_fx, hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &Qdct ); + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_core, st_fx->element_mode, pitch_buf_fx, hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &Qdct ); /* LD music post-filter */ LD_music_post_filter_fx( hMusicPF, dct_buffer_fx, dct_buffer_fx, st_fx->core_brate,&hMusicPF->Old_ener_Q, -1, tmp_coder_type, Qdct ); @@ -603,7 +603,7 @@ ivas_error amr_wb_dec_fx( *------------------------------------------------------------*/ FEC_pitch_estim_fx( 1, st_fx->last_core, L_FRAME, st_fx->clas_dec, st_fx->last_good, pitch_buf_fx, st_fx->old_pitch_buf_fx, &st_fx->bfi_pitch_fx, - &st_fx->bfi_pitch_frame, &st_fx->upd_cnt, GENERIC ); + &st_fx->bfi_pitch_frame, &st_fx->upd_cnt, GENERIC, st_fx->element_mode ); /*------------------------------------------------------------* * FEC - Smooth the speech energy evolution when recovering after a BAD frame @@ -720,13 +720,13 @@ ivas_error amr_wb_dec_fx( { st_fx->hPFstat->on = 1; move16(); - nb_post_filt( L_FRAME, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, st_fx->coder_type, st_fx->BER_detect, 0 ); + nb_post_filt_fx( L_FRAME, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, st_fx->coder_type, st_fx->BER_detect, 0 ); } ELSE { st_fx->hPFstat->on = 0; move16(); - nb_post_filt( L_FRAME, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); + nb_post_filt_fx( L_FRAME, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); } } @@ -756,7 +756,7 @@ ivas_error amr_wb_dec_fx( st_fx->hPFstat->on = 1; move16(); test(); - formant_post_filt( 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); + 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); } /*----------------------------------------------------------------* @@ -782,14 +782,14 @@ ivas_error amr_wb_dec_fx( } #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT PMT("Fixed point not done here ") - ApplyFdCng(syn, NULL, NULL, NULL, st, 0, 0); + ApplyFdCng_fx(syn, NULL, NULL, NULL, st, 0, 0); #else - ApplyFdCng( syn_fx, st_fx->Q_syn, NULL, NULL, NULL, st_fx, 0, 0 ); + ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, NULL, NULL, st_fx, 0, 0 ); #endif st_fx->hFdCngDec->hFdCngCom->frame_type_previous = st_fx->m_frame_type; /*Noisy speech detector*/ - noisy_speech_detection(st_fx->hFdCngDec, st_fx->VAD, syn_fx, st_fx->Q_syn); + 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 ( st_fx->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) @@ -805,18 +805,18 @@ ivas_error amr_wb_dec_fx( { flag_cna = 1; move16(); - generate_masking_noise( syn_fx, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, AMR_WB_CORE ); + generate_masking_noise_fx( syn_fx, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, AMR_WB_CORE ); } ELSE IF ( st_fx->flag_cna ) { - generate_masking_noise_update_seed( st_fx->hFdCngDec->hFdCngCom ); + generate_masking_noise_update_seed_fx( st_fx->hFdCngDec->hFdCngCom ); } /*Copy(syn+L_FRAME-M-1, st_fx->syn, M+1);*/ } ELSE IF ( st_fx->flag_cna ) { - generate_masking_noise_update_seed( st_fx->hFdCngDec->hFdCngCom ); + generate_masking_noise_update_seed_fx( st_fx->hFdCngDec->hFdCngCom ); } @@ -873,7 +873,7 @@ ivas_error amr_wb_dec_fx( i = CLDFB_NO_COL_MAX; move16(); } - addBassPostFilterFx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate(st_fx->Q_syn), + addBassPostFilter_fx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate(st_fx->Q_syn), i, st_fx->cldfbAna->no_col, st_fx->cldfbAna->no_channels, &scaleFactor ); st_fx->Q_syn2 = st_fx->Q_syn; move16(); @@ -1090,12 +1090,12 @@ ivas_error amr_wb_dec_fx( return error; } /*------------------------------------------------------------------* - * amr_wb_dec_init() + * amr_wb_dec_init_fx() * * AMR-WB decoder initialization *------------------------------------------------------------------*/ -void amr_wb_dec_init( +void amr_wb_dec_init_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ ) { @@ -1125,3 +1125,5 @@ void amr_wb_dec_init( move16(); return; } + +#endif \ No newline at end of file diff --git a/lib_dec/ari_dec.c b/lib_dec/ari_dec.c index 95103ddf17816725d15714283e357d908759d146..b8604b6e6ac80a6c631b60335e4a3a22538c9371 100644 --- a/lib_dec/ari_dec.c +++ b/lib_dec/ari_dec.c @@ -100,7 +100,7 @@ int16_t ari_start_decoding_14bits_prm_ivas( return bp; } -Word16 ari_start_decoding_14bits_prm_fx_ivas( +Word16 ari_start_decoding_14bits_prm_ivas_fx( const Word16 *ptr, Word16 bp, Tastat *s diff --git a/lib_dec/ari_dec_fx.c b/lib_dec/ari_dec_fx.c index c7b52aa7b25128a73d3b2dab882708e9baa95b73..32e48b5f47d3f9c569e9b8224e06bde4f4c8d0f9 100644 --- a/lib_dec/ari_dec_fx.c +++ b/lib_dec/ari_dec_fx.c @@ -14,7 +14,7 @@ * Ari decode 14 bits routines -------------------------------------------------------------*/ -Word16 ari_decode_overflow(Tastat *s) +Word16 ari_decode_overflow_fx(Tastat *s) { return L_sub(L_sub(s->high, 1), s->low) <= 0; } @@ -25,7 +25,7 @@ Word16 ari_decode_overflow(Tastat *s) * \param[i/o] st * \param[o] s */ -void ari_start_decoding_14bits( +void ari_start_decoding_14bits_fx( Decoder_State *st, Tastat *s ) @@ -41,7 +41,7 @@ void ari_start_decoding_14bits( move32(); } -Word16 ari_start_decoding_14bits_prm( +Word16 ari_start_decoding_14bits_prm_fx( const Word16 *ptr, Word16 bp, Tastat *s @@ -72,7 +72,7 @@ Word16 ari_start_decoding_14bits_prm( return add(bp,i); } -static Word16 ari_lookup_s17( +static Word16 ari_lookup_s17_fx( Word32 cum, Word32 range, UWord16 const *cum_freq @@ -130,7 +130,7 @@ static Word16 ari_lookup_s17( return extract_l(p - cum_freq); } -static Word16 ari_lookup_s27( +static Word16 ari_lookup_s27_fx( Word32 cum, Word32 range, UWord16 const *cum_freq @@ -148,7 +148,7 @@ static Word16 ari_lookup_s27( range_l = extract_l(L_and(range,0x7FFF)); range_h = extract_l(L_shr(range,15)); - /* begin change when compared with ari_decode_14bits_s17_ext, + /* begin change when compared with ari_decode_14bits_s17_ext_fx, starting with line: tmp = L_multi31x16_X2(range_h, range_l, p[8]); */ il = 0; move16(); @@ -229,7 +229,7 @@ static Word16 ari_lookup_s27( return il; } -static Word16 ari_lookup_bit( +static Word16 ari_lookup_bit_fx( Word32 cum, Word32 range, UWord16 const *cum_freq @@ -256,7 +256,7 @@ static Word16 ari_lookup_bit( return symbol; } -static Word16 ari_decode_14bits_ext( +static Word16 ari_decode_14bits_ext_fx( Decoder_State *st, Tastat *s, UWord16 const *cum_freq, @@ -326,30 +326,30 @@ static Word16 ari_decode_14bits_ext( /** * \brief Only for 17 symbols with new extended Tables */ -Word16 ari_decode_14bits_s17_ext(Decoder_State *st, Tastat *s, UWord16 const *cum_freq) +Word16 ari_decode_14bits_s17_ext_fx(Decoder_State *st, Tastat *s, UWord16 const *cum_freq) { - return ari_decode_14bits_ext(st, s, cum_freq, ari_lookup_s17); + return ari_decode_14bits_ext_fx(st, s, cum_freq, ari_lookup_s17_fx); } /** * \brief Only for 27 symbols with new extended Tables */ -Word16 ari_decode_14bits_s27_ext(Decoder_State *st, Tastat *s, UWord16 const *cum_freq) +Word16 ari_decode_14bits_s27_ext_fx(Decoder_State *st, Tastat *s, UWord16 const *cum_freq) { - return ari_decode_14bits_ext(st, s, cum_freq, ari_lookup_s27); + return ari_decode_14bits_ext_fx(st, s, cum_freq, ari_lookup_s27_fx); } /** * \brief Only for decoding one bit with uniform probability: * the equivalent cum_freq table used is {16384, 8192, 0} */ -Word16 ari_decode_14bits_bit_ext(Decoder_State *st, Tastat *s) +Word16 ari_decode_14bits_bit_ext_fx(Decoder_State *st, Tastat *s) { static const UWord16 cum_freq[3] = {16384, 8192, 0}; - return ari_decode_14bits_ext(st, s, cum_freq, ari_lookup_bit); + return ari_decode_14bits_ext_fx(st, s, cum_freq, ari_lookup_bit_fx); } -static Word16 ari_lookup_pow(Tastat *s, Word16 base) +static Word16 ari_lookup_pow_fx(Tastat *s, Word16 base) { Word32 cum, range; Word16 symbol; @@ -427,7 +427,7 @@ static Word16 ari_lookup_pow(Tastat *s, Word16 base) return symbol; } -static Word16 ari_lookup_sign(Tastat *s, Word16 base) +static Word16 ari_lookup_sign_fx(Tastat *s, Word16 base) { Word32 cum, range; Word16 symbol; @@ -456,7 +456,7 @@ static Word16 ari_lookup_sign(Tastat *s, Word16 base) return symbol; } -static Word16 ari_decode_14bits_notbl( +static Word16 ari_decode_14bits_notbl_fx( Word16 *ptr, Word16 bp, Word16 bits, @@ -500,7 +500,7 @@ static Word16 ari_decode_14bits_notbl( test(); test(); test(); - IF ((lookup_fn != ari_lookup_sign) && !(NE_16(bp, bits)||!((EQ_32(s->low,low))&&(EQ_32(s->high,L_sub(high,1)))&&(EQ_32(s->value,value))))) + IF ((lookup_fn != ari_lookup_sign_fx) && !(NE_16(bp, bits)||!((EQ_32(s->low,low))&&(EQ_32(s->high,L_sub(high,1)))&&(EQ_32(s->value,value))))) { /* This should not happen except of bit errors. */ s->high = 0; @@ -526,7 +526,7 @@ static Word16 ari_decode_14bits_notbl( } /*------------------------------------------------------------------------ - * Function: ari_decode_14bits_pow + * Function: ari_decode_14bits_pow_fx * * Decode a symbol which follows the exponential distribution. That is, * symbols are in the following intervals @@ -535,18 +535,18 @@ static Word16 ari_decode_14bits_notbl( * p(x = q>0) = exp(- (q-0.5)*base* 2) - exp(- (q+0.5)*base*2 ) * *-------------------------------------------------------------------------*/ -Word16 ari_decode_14bits_pow(Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s, Word16 base) +Word16 ari_decode_14bits_pow_fx(Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s, Word16 base) { - return ari_decode_14bits_notbl(ptr, bp, bits, res, s, base, ari_lookup_pow); + return ari_decode_14bits_notbl_fx(ptr, bp, bits, res, s, base, ari_lookup_pow_fx); } /*------------------------------------------------------------------------ - * Function: ari_decode_14bits_sign + * Function: ari_decode_14bits_sign_fx * * Decode a sign with equal probabilities. *-------------------------------------------------------------------------*/ -Word16 ari_decode_14bits_sign(Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s) +Word16 ari_decode_14bits_sign_fx(Word16 *ptr, Word16 bp, Word16 bits, Word16 *res, Tastat *s) { - return ari_decode_14bits_notbl(ptr, bp, bits, res, s, 0, ari_lookup_sign); + return ari_decode_14bits_notbl_fx(ptr, bp, bits, res, s, 0, ari_lookup_sign_fx); } diff --git a/lib_dec/ari_hm_dec.c b/lib_dec/ari_hm_dec.c index ebb57567bdce79b4bb97f1e17dba5825bd376e4a..d0069e5c3d31f100403db9df9f57a05af060e7c9 100644 --- a/lib_dec/ari_hm_dec.c +++ b/lib_dec/ari_hm_dec.c @@ -44,7 +44,7 @@ #include "rom_com.h" #include "wmc_auto.h" #include "prot_fx2.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * DecodeIndex() * diff --git a/lib_dec/arith_coder_dec.c b/lib_dec/arith_coder_dec.c index 5c16c17cc96df985c994b94f80c7f381137c9cfb..c1be77e57e06c139c6f0242505197f24f25e8e66 100644 --- a/lib_dec/arith_coder_dec.c +++ b/lib_dec/arith_coder_dec.c @@ -44,15 +44,16 @@ #include "basop_proto_func.h" #include "wmc_auto.h" #include "prot_fx1.h" +#include "prot_fx2.h" /*-------------------------------------------------------* - * tcx_arith_decode_flt() + * tcx_arith_decode() * * *-------------------------------------------------------*/ /*! r: number of bits consumed */ -static int16_t tcx_arith_decode_flt( +static int16_t tcx_arith_decode( const int16_t L_frame, /* i : number of spectral lines */ const Word16 envelope[], /* i : scaled envelope (Q15-e) */ Word16 envelope_e, /* i : scaled envelope exponent (Q0) */ @@ -115,7 +116,7 @@ static int16_t tcx_arith_decode_flt( return bp; } -static Word16 tcx_arith_decode_fx( +static Word16 tcx_arith_decode_ivas_fx( const Word16 L_frame, /* i : number of spectral lines */ const Word16 envelope[], /* i : scaled envelope (Q15-e) */ Word16 envelope_e, /* i : scaled envelope exponent (Q0) */ @@ -132,7 +133,7 @@ static Word16 tcx_arith_decode_fx( Word16 tmp; Word32 L_tmp; - bp = ari_start_decoding_14bits_prm_fx_ivas( prm, 0, &as ); + bp = ari_start_decoding_14bits_prm_ivas_fx( prm, 0, &as ); tmp = sub(envelope_e, 1); @@ -186,12 +187,12 @@ static Word16 tcx_arith_decode_fx( /*-------------------------------------------------------* - * tcx_arith_decode_envelope_flt() + * tcx_arith_decode_envelope() * * *-------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void tcx_arith_decode_envelope_flt( +#ifndef IVAS_FLOAT_FIXED +void tcx_arith_decode_envelope( Decoder_State *st, /* i/o: coder state */ float q_spectrum[], /* o : quantised MDCT coefficients */ const int16_t L_frame, /* i : frame or MDCT length */ @@ -273,7 +274,7 @@ void tcx_arith_decode_envelope_flt( envelope = (Word16 *) env; tcx_arith_scale_envelope_flt( L_spec, L_spec_core, env, target_bits, low_complexity, envelope, &envelope_e ); - *arith_bits = tcx_arith_decode_flt( L_spec, envelope, envelope_e, target_bits, prm, q_spectrum ); + *arith_bits = tcx_arith_decode( L_spec, envelope, envelope_e, target_bits, prm, q_spectrum ); /* safety check in case of bit errors */ if ( *arith_bits < 0 ) @@ -290,7 +291,7 @@ void tcx_arith_decode_envelope_flt( return; } #endif -void tcx_arith_decode_envelope_fx( +void tcx_arith_decode_envelope_ivas_fx( Decoder_State *st, /* i/o: coder state */ Word32 q_spectrum[], /* o : quantised MDCT coefficients */ Word16 *q_spectrum_e, /* o : MDCT exponent */ @@ -385,9 +386,9 @@ void tcx_arith_decode_envelope_fx( } 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( L_spec, L_spec_core, env, target_bits, low_complexity, envelope, &envelope_e ); - *arith_bits = tcx_arith_decode_fx( L_spec, envelope, envelope_e, target_bits, prm, q_spectrum, q_spectrum_e ); + *arith_bits = tcx_arith_decode_ivas_fx( L_spec, envelope, envelope_e, target_bits, prm, q_spectrum, q_spectrum_e ); move16(); /* safety check in case of bit errors */ diff --git a/lib_dec/arith_coder_dec_fx.c b/lib_dec/arith_coder_dec_fx.c index 05696b29858eae7c5e6c836d3ca5fb46d68f1aba..7cc34f46e8ac03240d4cbaf67decaf6c0d0e0980 100644 --- a/lib_dec/arith_coder_dec_fx.c +++ b/lib_dec/arith_coder_dec_fx.c @@ -11,7 +11,7 @@ #include "prot_fx2.h" /* Returns: number of bits consumed */ -static Word16 tcx_arith_decode( +static Word16 tcx_arith_decode_fx( Word16 L_frame, /* i: number of spectral lines Q0 */ const Word16 envelope[], /* i: scaled envelope Q15-e */ Word16 envelope_e, /* i: scaled envelope exponent Q0 */ @@ -33,7 +33,7 @@ static Word16 tcx_arith_decode( #endif - bp = ari_start_decoding_14bits_prm(prm, 0, &as); + bp = ari_start_decoding_14bits_prm_fx(prm, 0, &as); tmp = sub(envelope_e, 1+15); L_tmp = L_deposit_l(0); @@ -49,7 +49,7 @@ static Word16 tcx_arith_decode( exp_k = round_fx(expfp(envelope[k], tmp)); } /* decode line magnitude */ - bp = ari_decode_14bits_pow(prm, bp, target_bits, &q, &as, exp_k); + bp = ari_decode_14bits_pow_fx(prm, bp, target_bits, &q, &as, exp_k); if (q == 0) { @@ -57,7 +57,7 @@ static Word16 tcx_arith_decode( } IF (q != 0) /* line is non-zero, decode sign */ { - bp = ari_decode_14bits_sign(prm, bp, target_bits, &s, &as); + bp = ari_decode_14bits_sign_fx(prm, bp, target_bits, &s, &as); #ifdef BASOP_NOGLOB L_tmp = L_macNs_co(L_tmp, q, k, &Carry, &Overflow); @@ -71,7 +71,7 @@ static Word16 tcx_arith_decode( move32(); } - IF (ari_decode_overflow(&as)) + IF (ari_decode_overflow_fx(&as)) { if( LT_16(bp, target_bits)) /* safety check in case of bit errors */ { @@ -93,7 +93,7 @@ static Word16 tcx_arith_decode( return bp; } -void tcx_arith_decode_envelope( +void tcx_arith_decode_envelope_fx( Word32 q_spectrum[], /* o: quantised MDCT coefficients Q31-e */ Word16 *q_spectrum_e, /* o: MDCT exponent Q0 */ Word16 L_frame, /* i: frame or MDCT length Q0 */ @@ -195,7 +195,7 @@ void tcx_arith_decode_envelope( tcx_arith_scale_envelope(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, q_spectrum_e, nf_seed); + *arith_bits = tcx_arith_decode_fx(L_spec, envelope, envelope_e, target_bits, prm, q_spectrum, q_spectrum_e, nf_seed); move16(); /* safety check in case of bit errors */ diff --git a/lib_dec/bass_psfilter.c b/lib_dec/bass_psfilter.c index fec418241fcc0c351de5191e4f76e6f3c3755a1e..f7c8c7863827b8fd12efd89816178e0a444acf2b 100644 --- a/lib_dec/bass_psfilter.c +++ b/lib_dec/bass_psfilter.c @@ -74,7 +74,7 @@ static int16_t Pit_track( const float syn[], int16_t T ); * * Initialisation of postfiltering variables *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void bass_psfilter_init( BPF_DEC_HANDLE hBPF /* o : BPF data handle */ ) @@ -97,7 +97,7 @@ void bass_psfilter_init( * * Perform low-frequency postfiltering *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void bass_psfilter( BPF_DEC_HANDLE hBPF, /* o : BPF data handle */ const int16_t Opt_AMR_WB, /* i : AMR-WB IO flag */ @@ -517,7 +517,7 @@ void addBassPostFilter( } #ifdef IVAS_FLOAT_FIXED -void addBassPostFilter_fx( +void addBassPostFilter_ivas_fx( const Word32 *harm_timeIn_fx, // Qx const Word16 samplesToProcess, Word32 **rAnalysis_fx, // Qx - 5 @@ -650,14 +650,14 @@ int16_t res_bpf_adapt( #else /*---------------------------------------------------------------------* - * res_bpf_adapt_fx() + * res_bpf_adapt_ivas_fx() * * Analyze BPF output and decide if it should be applied on DFT stereo * residual signal *---------------------------------------------------------------------*/ /*! r: Decision to enable or disable BPF on DFT stereo residual */ -Word16 res_bpf_adapt_fx( +Word16 res_bpf_adapt_ivas_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ const Word32 *bpf_error_signal_8k, /* i : BPF modification signal */ Word32 res_buf[STEREO_DFT_N_8k] /* i : residual buffer Q12 */ @@ -727,7 +727,7 @@ Word16 res_bpf_adapt_fx( return res_bpf_flag; } #endif // IVAS_FLOAT_FIXED -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * bpf_pitch_coherence() * @@ -768,7 +768,7 @@ void bpf_pitch_coherence( return; } #endif -void bpf_pitch_coherence_fx( +void bpf_pitch_coherence_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word32 pitch_buf[] /* i : pitch for every subfr [0,1,2,3] */ ) diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c index 645308b077a849fa6280d8dcebdf514290fc6a47..e843018a8b96e0e0d799814703b83159808e9a22 100644 --- a/lib_dec/bass_psfilter_fx.c +++ b/lib_dec/bass_psfilter_fx.c @@ -882,7 +882,7 @@ static Word16 Pit_track_fx( /* o : Pitch */ * Add BPF component in cldfb domain *---------------------------------------------------------------------*/ -void addBassPostFilterFx ( +void addBassPostFilter_fx( const Word16 *harm_timeIn_Fx, Word32 **rAnalysis_Fx, Word32 **iAnalysis_Fx, diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c index 7548747a85d35d2b60393ce6e8eee7abff13519a..a09cc90fc8784a03e2a7940bb0135971efe0cb94 100644 --- a/lib_dec/cng_dec.c +++ b/lib_dec/cng_dec.c @@ -46,7 +46,7 @@ /*---------------------------------------------------------------------* * Local function prototypes *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED static void shb_CNG_decod( Decoder_State *st, const float *synth, float *shb_synth, const int16_t sid_bw ); @@ -55,7 +55,7 @@ static void shb_CNG_decod( Decoder_State *st, const float *synth, float *shb_syn * * Decoding of CNG parameters *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void CNG_dec( Decoder_State *st, /* i/o: State structure */ const int16_t last_element_mode, /* i : last element mode */ @@ -530,7 +530,7 @@ void CNG_dec( } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * swb_CNG_dec() * @@ -762,12 +762,12 @@ static void shb_CNG_decod( /*-------------------------------------------------------------------* - * td_cng_dec_init_flt() + * td_cng_dec_init() * * *-------------------------------------------------------------------*/ - -void td_cng_dec_init_flt( +#ifdef IVAS_FLOAT_FIXED +void td_cng_dec_init( DEC_CORE_HANDLE st /* i/o: decoder state structure */ ) { @@ -780,7 +780,7 @@ void td_cng_dec_init_flt( hTdCngDec->cng_ener_seed = RANDOM_INITSEED; hTdCngDec->cng_ener_seed1 = RANDOM_INITSEED; hTdCngDec->old_enr_index = -1; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hTdCngDec->Enew = 0.0f; mvr2r(st->lsp_old, st->lspCNG, M); #endif @@ -843,4 +843,80 @@ void td_cng_dec_init_flt( return; } +#else +void td_cng_dec_init( + DEC_CORE_HANDLE st /* i/o: decoder state structure */ +) +{ + int16_t i; + TD_CNG_DEC_HANDLE hTdCngDec; + + hTdCngDec = st->hTdCngDec; + + hTdCngDec->cng_seed = RANDOM_INITSEED; + hTdCngDec->cng_ener_seed = RANDOM_INITSEED; + hTdCngDec->cng_ener_seed1 = RANDOM_INITSEED; + hTdCngDec->old_enr_index = -1; + hTdCngDec->Enew = 0.0f; + mvr2r(st->lsp_old, st->lspCNG, M); + hTdCngDec->last_allow_cn_step = 0; + hTdCngDec->shb_cng_ener = -6.02f; + if (st->element_mode != EVS_MONO) + { + set_f(hTdCngDec->shb_lpcCNG, 0.0f, LPC_SHB_ORDER + 1); + hTdCngDec->shb_lpcCNG[0] = 1.0f; + hTdCngDec->shb_cng_gain = -82.0; /* a dB value approximately corresponding to shb index 0(used as index -15) */ + } + + hTdCngDec->wb_cng_ener = -6.02f; + hTdCngDec->last_wb_cng_ener = -6.02f; + hTdCngDec->last_shb_cng_ener = -6.02f; + hTdCngDec->swb_cng_seed = RANDOM_INITSEED; + hTdCngDec->ho_hist_ptr = -1; + hTdCngDec->ho_sid_bw = 0; + set_f(hTdCngDec->ho_lsp_hist, 0, HO_HIST_SIZE * M); + set_f(hTdCngDec->ho_ener_hist, 0, HO_HIST_SIZE); + set_f(hTdCngDec->ho_env_hist, 0, HO_HIST_SIZE * NUM_ENV_CNG); + hTdCngDec->ho_hist_size = 0; + hTdCngDec->act_cnt = 0; + hTdCngDec->ho_circ_ptr = -1; + set_f(hTdCngDec->ho_lsp_circ, 0, HO_HIST_SIZE * M); + set_f(hTdCngDec->ho_ener_circ, 0, HO_HIST_SIZE); + set_f(hTdCngDec->ho_env_circ, 0, HO_HIST_SIZE * NUM_ENV_CNG); + hTdCngDec->ho_circ_size = 0; + + set_s(hTdCngDec->ho_16k_lsp, 0, HO_HIST_SIZE); + st->CNG_mode = -1; + hTdCngDec->act_cnt2 = 0; + hTdCngDec->num_ho = 0; + set_f(hTdCngDec->lp_env, 0.0f, NUM_ENV_CNG); + set_f(hTdCngDec->exc_mem, 0.0f, 24); + set_f(hTdCngDec->exc_mem1, 0.0f, 30); + set_f(hTdCngDec->old_env, 0.0f, NUM_ENV_CNG); + + for (i = 0; i < LPC_SHB_ORDER; i++) + { + if (st->element_mode != EVS_MONO) + { + hTdCngDec->lsp_shb_prev[i] = 0.5f * ((float)(i + 1)) / ((float)(LPC_SHB_ORDER + 1)); + } + else + { + hTdCngDec->lsp_shb_prev[i] = 0.5f * ((float)i) / ((float)LPC_SHB_ORDER); + } + hTdCngDec->lsp_shb_prev_prev[i] = hTdCngDec->lsp_shb_prev[i]; + } + + hTdCngDec->shb_dtx_count = 0; + hTdCngDec->trans_cnt = 0; + hTdCngDec->burst_cnt = 0; + + hTdCngDec->last_shb_ener = 0.001f; + + + set_f(hTdCngDec->interpol_3_2_cng_dec, 0.0f, INTERP_3_2_MEM_LEN); + + return; +} +#endif #endif \ No newline at end of file diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index 54d7121180d2da44a8a163225676ac9c1447138e..abb6fd16601469eed35fb6bef5d6c475a7dc4184 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -1324,20 +1324,17 @@ static void shb_CNG_decod_ivas_fx( } ResetSHBbuffer_Dec_fx( st ); -#if 1 // TODO: To be removed later - ResetSHBbuffer_Dec( st->hBWE_TD, st->extl ); -#endif return; } #endif /*-------------------------------------------------------------------* - * td_cng_dec_init() + * td_cng_dec_init_fx() * * *-------------------------------------------------------------------*/ -void td_cng_dec_init( +void td_cng_dec_init_fx( DEC_CORE_HANDLE st /* i/o: decoder state structure */ ) { diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index 92fb2b89fba7f27acdbd3c53c4b44eb007de40b2..c5001197f81bc2dd45d7ac35a710ac05e2f04a0d 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -43,12 +43,12 @@ #include "wmc_auto.h" #include "prot_fx2.h" /*-----------------------------------------------------------------------* - * open_decoder_LPD_flt() + * open_decoder_LPD() * * Initialization of state variables *-----------------------------------------------------------------------*/ - -void open_decoder_LPD_flt( +#ifdef IVAS_FLOAT_FIXED +void open_decoder_LPD( Decoder_State *st, /* i/o: decoder state structure */ const int32_t total_brate, /* i : total bitrate */ const int32_t last_total_brate, /* i : last total bitrate */ @@ -58,7 +58,6 @@ void open_decoder_LPD_flt( const int16_t is_init /* i : indicate call during initialization */ ) { - int16_t i; int16_t mem_syn_r_size_old; int16_t mem_syn_r_size_new; int16_t fscaleFB; @@ -102,7 +101,7 @@ void open_decoder_LPD_flt( st->nb_subfr = NB_SUBFR; } st->bits_frame = (int16_t) ( ( (float) st->L_frame / (float) st->fscale ) * (float) FSCALE_DENOM / 128.0f * (float) total_brate / 100.0f + 0.49f ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->TcxBandwidth_float = getTcxBandwidth_flt(bwidth); #endif st->narrowBand = (bwidth == NB) ? 1 : 0; @@ -130,7 +129,7 @@ void open_decoder_LPD_flt( st->pit_res_max_past = st->pit_res_max; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*Preemphasis param*/ if (st->fscale < (16000 * FSCALE_DENOM) / 12800) { @@ -157,7 +156,7 @@ void open_decoder_LPD_flt( { st->gamma_float = GAMMA1_FLT; } -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED /* LPC quantization */ if (st->sr_core <= INT_FS_16k && st->tcxonly == 0) @@ -180,7 +179,7 @@ void open_decoder_LPD_flt( /* Initialize TBE */ st->prev_coder_type = GENERIC; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if (st->hBWE_TD != NULL) { set_f(st->hBWE_TD->prev_lsf_diff, 0.5f, LPC_SHB_ORDER - 2); @@ -201,7 +200,7 @@ void open_decoder_LPD_flt( { if (!is_init || st->element_mode != IVAS_CPE_MDCT) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED init_tcx_cfg(st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac_float, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag); #endif @@ -213,7 +212,7 @@ void open_decoder_LPD_flt( } } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if (st->hTECDec != NULL) { resetTecDec(st->hTECDec); @@ -242,7 +241,7 @@ void open_decoder_LPD_flt( st->last_is_cng = 0; st->rate_switching_reset = 0; - +#ifndef IVAS_FLOAT_FIXED if (st->hTcxDec != NULL) { reset_tcx_overl_buf(st->hTcxDec); @@ -252,12 +251,12 @@ void open_decoder_LPD_flt( set_zero(st->hTcxDec->synth_history, L_PROT48k + L_FRAME_MAX); } +#endif - -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_zero(st->syn_float, M + 1); set_zero(st->mem_syn_r_float, L_SYN_MEM); -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED mem_syn_r_size_old = 0; /* just to avoid MSVC warnings */ mem_syn_r_size_new = 0; /* just to avoid MSVC warnings */ @@ -267,16 +266,17 @@ void open_decoder_LPD_flt( else { /* Reset old_synth in case of core sampling rate switching and Mode 1/2 switching*/ +#ifndef IVAS_FLOAT_FIXED if (st->hTcxDec != NULL && ((st->L_frame != st->last_L_frame) || (st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO))) { set_zero(st->hTcxDec->old_synth_float, OLD_SYNTH_INTERNAL_DEC); } - +#endif /*Compute size of old and new memories*/ mem_syn_r_size_old = (int16_t)(1.25 * st->last_L_frame / 20.f); mem_syn_r_size_new = (int16_t)(1.25 * st->L_frame / 20.f); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*Reset LPC mem*/ if ((st->L_frame != st->last_L_frame) || (st->last_core == AMR_WB_CORE) || (st->last_core == HQ_CORE)) { @@ -294,7 +294,7 @@ void open_decoder_LPD_flt( /*Mode 1/2 switching*/ if (st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED mvr2r(st->lsp_old, st->lspold_uw_float, M); mvr2r(st->lsf_old, st->lsfold_uw_float, M); set_zero(st->syn_float, M); @@ -310,7 +310,9 @@ void open_decoder_LPD_flt( { /* Switching from Mode 1 ACELP */ st->last_core_bfi = ACELP_CORE; +#ifndef IVAS_FLOAT_FIXED acelp_plc_mdct_transition(st); +#endif } if (st->last_codec_mode == MODE2 && @@ -328,23 +330,25 @@ void open_decoder_LPD_flt( /*Reset of ACELP memories*/ st->rate_switching_reset = 1; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->tilt_code = TILT_CODE_FLT; set_zero(st->old_exc, L_EXC_MEM_DEC); set_zero(st->mem_syn2, M); set_zero(st->syn_float, 1 + M); #endif - +#ifndef IVAS_FLOAT_FIXED /*OLA -> zero */ if (st->hTcxDec != NULL) { reset_tcx_overl_buf(st->hTcxDec); } - +#endif if (st->hTcxCfg != NULL) { +#ifndef IVAS_FLOAT_FIXED mvr2r(st->hHQ_core->old_out + NS2SA(st->output_Fs, N_ZERO_MDCT_NS), st->hTcxDec->syn_OverlFB_float, st->hTcxCfg->tcx_mdct_window_lengthFB); +#endif st->hTcxCfg->last_aldo = 1; /*It was previously ALDO*/ st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; } @@ -376,7 +380,7 @@ void open_decoder_LPD_flt( /*Interpolation of ACELP memories*/ /* convert quantized LSP vector */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->rate_switching_reset = lsp_convert_poly(st->lsp_old, st->L_frame, 0); lsp2a_stab(st->lsp_old, st->old_Aq_12_8, M); @@ -398,7 +402,7 @@ void open_decoder_LPD_flt( st->rate_switching_reset = 1; /*reset partly some memories*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->tilt_code = TILT_CODE_FLT; if (!st->last_con_tcx) { @@ -410,7 +414,7 @@ void open_decoder_LPD_flt( /*Size of LPC syn memory*/ lerp_flt(st->mem_syn_r_float + L_SYN_MEM - mem_syn_r_size_old, st->mem_syn_r_float + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old); mvr2r(st->mem_syn_r_float + L_SYN_MEM - M, st->mem_syn2, M); -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED } /* update of lsf_old only needed in BASOP */ /* else if( !st->tcxonly && (st->L_frame == L_FRAME16k) && (st->last_total_brate > ACELP_32k) ) */ @@ -432,7 +436,7 @@ void open_decoder_LPD_flt( /* bass pf reset */ st->bpf_gain_param = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if (st->hBPF != NULL) { set_f(st->hBPF->pst_old_syn, 0, NBPSF_PIT_MAX); @@ -443,7 +447,7 @@ void open_decoder_LPD_flt( { /* do nothing */ } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED else if (st->last_codec_mode == MODE2) { if (!st->tcxonly) @@ -492,7 +496,7 @@ void open_decoder_LPD_flt( { st->hTcxDec->old_synth_float[st->hTcxDec->old_synth_len - 1] = st->syn_float[M]; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if (st->hBPF != NULL) { st->hBPF->pst_old_syn[NBPSF_PIT_MAX - 1] = st->syn_float[M]; @@ -502,7 +506,7 @@ void open_decoder_LPD_flt( } #endif /* lsf and lsp initialization */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if (st->ini_frame == 0) { mvr2r(st->lsp_old, st->lspold_uw_float, M); @@ -515,7 +519,7 @@ void open_decoder_LPD_flt( st->seed_tcx_plc = RANDOM_INITSEED; st->plcBackgroundNoiseUpdated = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->past_gpit_float = 0.0f; st->past_gcode_float = 0.0f; @@ -527,22 +531,22 @@ void open_decoder_LPD_flt( mvr2r(st->lsp_old, st->old_lsp_q_cng_float, M); set_zero(st->mem_syn_unv_back_float, M); st->last_gain_syn_deemph_float = 1.f; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED if (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 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->last_concealed_gain_syn_deemph_float = 1.f; if (hTcxDec != NULL) { hTcxDec->conceal_eof_gain_float = 1.0f; } -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED } /* Post processing */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_zero(st->mem_Aq_float, NB_SUBFR16k * (M + 1)); st->lp_ener_bfi = 60.0f; @@ -562,12 +566,12 @@ void open_decoder_LPD_flt( { st->hTcxDec->noise_filling_index[0] = st->hTcxDec->noise_filling_index[1] = 0; st->hTcxDec->tnsActive[0] = st->hTcxDec->tnsActive[1] = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f(st->hTcxDec->ltpGainMemory, 0.0f, N_LTP_GAIN_MEMS); #endif } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED mvr2r(st->lsf_old, st->lsf_adaptive_mean, M); mvr2r(st->lsf_old, st->lsfoldbfi0, M); mvr2r(st->lsf_old, st->lsfoldbfi1, M); @@ -582,25 +586,25 @@ void open_decoder_LPD_flt( if (st->prev_bfi) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /* calculate energy at the end of the previous frame */ if (st->core == ACELP_CORE && st->last_core == HQ_CORE) { fer_energy(st->hTcxDec->L_frameTCX, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1); } -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED } else { st->last_good = UNVOICED_CLAS; /* last good received frame for concealment */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->enr_old = 0.0f; /* energy at the end of the previous frame */ -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->lp_gainc = 0.0f; st->lp_gainp = 0.0f; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED if (st->hTcxDec != NULL) { @@ -608,10 +612,10 @@ void open_decoder_LPD_flt( if (is_init || MCT_flag || !(st->element_mode == IVAS_CPE_MDCT && st->element_mode == last_element_mode)) { - st->hTcxDec->CngLevelBackgroundTrace_bfi = PLC_MIN_CNG_LEV_FLT; st->hTcxDec->NoiseLevelIndex_bfi = PLC_MIN_STAT_BUFF_SIZE - 1; st->hTcxDec->CurrLevelIndex_bfi = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED + st->hTcxDec->CngLevelBackgroundTrace_bfi = PLC_MIN_CNG_LEV_FLT; st->hTcxDec->LastFrameLevel_bfi = PLC_MIN_CNG_LEV_FLT; set_f(st->hTcxDec->NoiseLevelMemory_bfi, PLC_MIN_CNG_LEV_FLT, PLC_MIN_STAT_BUFF_SIZE); @@ -622,7 +626,7 @@ void open_decoder_LPD_flt( -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED for (i = 0; i < 2 * NB_SUBFR16k + 2; i++) { st->old_pitch_buf[i] = (float)st->pit_min; @@ -633,18 +637,18 @@ void open_decoder_LPD_flt( st->mem_pitch_gain_float[i] = 1.f; } st->old_fpitch_float = (float)st->pit_min; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED st->rate_switching_init = 1; st->reset_mem_AR = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /* For phase dispersion */ set_zero(st->dispMem, 8); st->voice_fac_float = -1; /* purely unvoiced */ -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED /* TCX-LTP */ if (hTcxLtpDec != NULL) @@ -655,9 +659,9 @@ void open_decoder_LPD_flt( /* TCX */ if (hTcxDec != NULL) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->old_fpitchFB_float = (float)hTcxDec->pit_min_TCX; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED if (st->ini_frame == 0 || (st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO)) { @@ -669,12 +673,11 @@ void open_decoder_LPD_flt( hTcxDec->envWeighted = 0; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if (st->hBPF != NULL) { st->hBPF->pst_mem_deemp_err = 0.0f; } -#endif if (st->tcxonly) { st->p_bpf_noise_buf_float = NULL; @@ -685,6 +688,7 @@ void open_decoder_LPD_flt( st->p_bpf_noise_buf_float = st->bpf_noise_buf_float; } +#endif if (bwidth == SWB && (total_brate == ACELP_16k40 || total_brate == ACELP_24k40) && st->element_mode == EVS_MONO) { @@ -725,7 +729,9 @@ void open_decoder_LPD_flt( { st->hTonalMDCTConc->nScaleFactors = 0; st->hTonalMDCTConc->nSamples = 0; +#ifndef IVAS_FLOAT_FIXED st->hTonalMDCTConc->lastPcmOut_float = 0x0; +#endif st->hTonalMDCTConc->lastBlockData.tonalConcealmentActive = 0; st->hTonalMDCTConc->lastBlockData.nSamples = 0; @@ -741,13 +747,13 @@ void open_decoder_LPD_flt( { st->hTcxCfg->fIsTNSAllowed = getTnsAllowed(is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode); } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if (hTcxDec != NULL) { hTcxDec->tcxltp_second_last_pitch_float = st->old_fpitch_float; hTcxDec->tcxltp_third_last_pitch_float = st->old_fpitch_float; } -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED if ( ( total_brate == ACELP_9k60 || total_brate == ACELP_16k40 || total_brate == ACELP_24k40 ) && st->element_mode == EVS_MONO ) { @@ -764,7 +770,7 @@ void open_decoder_LPD_flt( if ( hTcxDec != NULL ) { hTcxDec->enableTcxLpc = 1; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hTcxDec->old_gaintcx_bfi_float = 0.0f; #endif hTcxDec->tcx_hm_LtpPitchLag = -1; @@ -777,13 +783,674 @@ void open_decoder_LPD_flt( return; } +#else +void open_decoder_LPD( + Decoder_State *st, /* i/o: decoder state structure */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t last_total_brate, /* i : last total bitrate */ + const int16_t bwidth, /* i : audio bandwidth */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int16_t last_element_mode, /* i : last element mode */ + const int16_t is_init /* i : indicate call during initialization */ +) +{ + int16_t i; + int16_t mem_syn_r_size_old; + int16_t mem_syn_r_size_new; + int16_t fscaleFB; + int16_t encoderLookahead, encoderLookaheadFB; + TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; + TCX_DEC_HANDLE hTcxDec = st->hTcxDec; + + if (st->codec_mode != MODE1) /*already updated in MODE1*/ + { + st->fscale_old = st->fscale; + } + + st->sr_core = getCoreSamplerateMode2_flt(st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format); + st->fscale = sr2fscale(st->sr_core); + fscaleFB = sr2fscale(st->output_Fs); + + /* initializing variables for frame lengths etc. right in the beginning */ + st->L_frame = (int16_t)(st->sr_core / FRAMES_PER_SEC); + if (st->ini_frame == 0) + { + st->last_L_frame = st->L_frame_past = st->L_frame; + } + if (st->hTcxDec != NULL) + { + st->hTcxDec->L_frameTCX = (int16_t)(st->output_Fs / FRAMES_PER_SEC); + if (st->ini_frame == 0) + { + st->L_frameTCX_past = st->hTcxDec->L_frameTCX; + } + } + + st->tcxonly = getTcxonly_ivas(st->element_mode, total_brate, MCT_flag, st->is_ism_format); + + /* the TD TCX PLC in MODE1 still runs with 80ms subframes */ + if ((st->element_mode == EVS_MONO && st->L_frame == L_FRAME16k && total_brate <= ACELP_32k) || (st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k && total_brate <= MAX_ACELP_BRATE) || (st->tcxonly && (st->sr_core == 32000 || st->sr_core == 16000))) + { + st->nb_subfr = NB_SUBFR16k; + } + else + { + st->nb_subfr = NB_SUBFR; + } + 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_float = getTcxBandwidth_flt(bwidth); + st->narrowBand = (bwidth == NB) ? 1 : 0; + encoderLookahead = (L_LOOK_12k8 * st->fscale) / FSCALE_DENOM; + encoderLookaheadFB = (L_LOOK_12k8 * fscaleFB) / FSCALE_DENOM; + + if (st->element_mode == IVAS_CPE_MDCT) + { + st->pit_res_max = initPitchLagParameters(12800, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max); + hTcxDec->pit_max_TCX = (int16_t)(st->pit_max * st->output_Fs / 12800); + hTcxDec->pit_min_TCX = (int16_t)(st->pit_min * st->output_Fs / 12800); + } + else + { + st->pit_res_max = initPitchLagParameters(st->sr_core, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max); + if (hTcxDec != NULL) + { + hTcxDec->pit_max_TCX = (int16_t)(st->pit_max * st->output_Fs / st->sr_core); + hTcxDec->pit_min_TCX = (int16_t)(st->pit_min * st->output_Fs / st->sr_core); + } + } + + if (st->ini_frame == 0) + { + st->pit_res_max_past = st->pit_res_max; + } + /*Preemphasis param*/ + if (st->fscale < (16000 * FSCALE_DENOM) / 12800) + { + st->preemph_fac_float = PREEMPH_FAC_FLT; /*NB*/ + } + else if (st->fscale < (24000 * FSCALE_DENOM) / 12800) + { + st->preemph_fac_float = PREEMPH_FAC_16k_FLT; /*WB*/ + } + else + { + st->preemph_fac_float = PREEMPH_FAC_SWB_FLT; /*SWB*/ + } + + if (st->sr_core == INT_FS_16k) + { + st->gamma_float = GAMMA16k_FLT; + } + else if (st->sr_core > INT_FS_16k && st->element_mode == IVAS_CPE_MDCT) + { + st->gamma_float = GAMMA16k_FLT; + } + else + { + st->gamma_float = GAMMA1_FLT; + } + + /* LPC quantization */ + if (st->sr_core <= INT_FS_16k && st->tcxonly == 0) + { + st->lpcQuantization = 1; + } + else + { + st->lpcQuantization = 0; + } + + if (st->tcxonly == 0) + { + st->numlpc = 1; + } + else + { + st->numlpc = 2; + } + + /* Initialize TBE */ + st->prev_coder_type = GENERIC; + if (st->hBWE_TD != NULL) + { + set_f(st->hBWE_TD->prev_lsf_diff, 0.5f, LPC_SHB_ORDER - 2); + st->hBWE_TD->prev_tilt_para = 0.0f; + set_zero(st->hBWE_TD->cur_sub_Aq, M + 1); + } + + if (st->hIGFDec != NULL) + { + if (!is_init || st->element_mode != IVAS_CPE_MDCT) + { + init_tcx_cfg(st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac_float, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag); + } + else + { + st->hTcxCfg->tcx_curr_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; + st->hTcxCfg->last_aldo = 1; + } + } + + if (st->hTECDec != NULL) + { + resetTecDec(st->hTECDec); + } + + if (st->element_mode != IVAS_SCE) + { + st->flag_cna = 0; + } + if (st->ini_frame == 0) + { + st->flag_cna = 0; + st->last_flag_cna = 0; + } + + /* Static vectors to zero */ + if (st->ini_frame == 0) + { + st->last_is_cng = 0; + + st->rate_switching_reset = 0; + + if (st->hTcxDec != NULL) + { + reset_tcx_overl_buf(st->hTcxDec); + + set_zero(st->hTcxDec->syn_OverlFB_float, L_FRAME_MAX / 2); + set_zero(st->hTcxDec->old_synth_float, OLD_SYNTH_INTERNAL_DEC); + + set_zero(st->hTcxDec->synth_history, L_PROT48k + L_FRAME_MAX); + } + + set_zero(st->syn_float, M + 1); + + set_zero(st->mem_syn_r_float, L_SYN_MEM); + + mem_syn_r_size_old = 0; /* just to avoid MSVC warnings */ + mem_syn_r_size_new = 0; /* just to avoid MSVC warnings */ + + st->con_tcx = 0; + } + else + { + /* Reset old_synth in case of core sampling rate switching and Mode 1/2 switching*/ + if (st->hTcxDec != NULL && ((st->L_frame != st->last_L_frame) || (st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO))) + { + set_zero(st->hTcxDec->old_synth_float, OLD_SYNTH_INTERNAL_DEC); + } + + /*Compute size of old and new memories*/ + mem_syn_r_size_old = (int16_t)(1.25 * st->last_L_frame / 20.f); + mem_syn_r_size_new = (int16_t)(1.25 * st->L_frame / 20.f); + + /*Reset LPC mem*/ + if ((st->L_frame != st->last_L_frame) || (st->last_core == AMR_WB_CORE) || (st->last_core == HQ_CORE)) + { + set_zero(st->mem_MA, M); + if (st->sr_core == INT_FS_16k) + { + mvr2r(GEWB2_Ave, st->mem_AR, M); + } + else + { + mvr2r(GEWB_Ave, st->mem_AR, M); + } + } + + /*Mode 1/2 switching*/ + if (st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO) + { + mvr2r(st->lsp_old, st->lspold_uw_float, M); + mvr2r(st->lsf_old, st->lsfold_uw_float, M); + set_zero(st->syn_float, M); + } + if (st->last_core == AMR_WB_CORE) + { + st->last_core = ACELP_CORE; + st->last_core_bfi = ACELP_CORE; + } + + if (((st->element_mode != IVAS_CPE_DFT) || (st->element_mode == IVAS_CPE_DFT && st->prev_bfi)) && st->last_codec_mode == MODE1 && st->last_core == ACELP_CORE) + { + /* Switching from Mode 1 ACELP */ + st->last_core_bfi = ACELP_CORE; + acelp_plc_mdct_transition(st); + } + + if (st->last_codec_mode == MODE2 && + st->L_frame != st->last_L_frame && + ((st->m_frame_type == SID_FRAME && st->last_core > ACELP_CORE) || + (st->last_core > ACELP_CORE && st->core > ACELP_CORE) || st->prev_bfi)) + { + lerp_flt(st->hHQ_core->old_outLB, st->hHQ_core->old_outLB, st->L_frame, st->last_L_frame); + } + + /* Rate switching */ + if (st->last_codec_mode == MODE1 && st->last_core == HQ_CORE) + { + /* Switching from MDCT */ + + /*Reset of ACELP memories*/ + st->rate_switching_reset = 1; + st->tilt_code = TILT_CODE_FLT; + set_zero(st->old_exc, L_EXC_MEM_DEC); + set_zero(st->syn_float, 1 + M); + set_zero(st->mem_syn2, M); + + /*OLA -> zero */ + if (st->hTcxDec != NULL) + { + reset_tcx_overl_buf(st->hTcxDec); + } + + if (st->hTcxCfg != NULL) + { + mvr2r(st->hHQ_core->old_out + NS2SA(st->output_Fs, N_ZERO_MDCT_NS), st->hTcxDec->syn_OverlFB_float, st->hTcxCfg->tcx_mdct_window_lengthFB); + st->hTcxCfg->last_aldo = 1; /*It was previously ALDO*/ + st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; + } + + /*OLA for Mode 2 TCX always reset in Mode switching cases*/ + if (st->hHQ_core != NULL) + { + set_f(st->hHQ_core->old_outLB, 0, st->L_frame); + } + + st->last_core_bfi = TCX_20_CORE; + + if (st->hPFstat != NULL) + { + st->hPFstat->on = 0; + } + + /* reset CLDFB memories */ + cldfb_reset_memory_ivas(st->cldfbAna); + cldfb_reset_memory_ivas(st->cldfbBPF); + cldfb_reset_memory_ivas(st->cldfbSyn); + if (st->cldfbSynHB != NULL) + { + cldfb_reset_memory_ivas(st->cldfbSynHB); + } + } + else if ((st->L_frame != st->last_L_frame) && (st->L_frame <= L_FRAME16k) && (st->last_L_frame <= L_FRAME16k)) /* Rate switching between 12.8 and 16 kHz*/ + { + /*Interpolation of ACELP memories*/ + + /* convert quantized LSP vector */ + st->rate_switching_reset = lsp_convert_poly(st->lsp_old, st->L_frame, 0); + lsp2a_stab(st->lsp_old, st->old_Aq_12_8, M); + + lsp2lsf(st->lsp_old, st->lsf_old, M, st->sr_core); + mvr2r(st->lsp_old, st->lspold_uw_float, M); + mvr2r(st->lsf_old, st->lsfold_uw_float, M); + + if (!st->last_con_tcx) + { + synth_mem_updt2_flt(st->L_frame, st->last_L_frame, st->old_exc, st->mem_syn_r_float, st->mem_syn2, NULL, DEC); + } + + /*mem of deemphasis stayed unchanged.*/ + } + else if (st->L_frame != st->last_L_frame) /* Rate switching involving TCX only modes */ + { + /*Partial reset of ACELP memories*/ + st->rate_switching_reset = 1; + + /*reset partly some memories*/ + st->tilt_code = TILT_CODE_FLT; + if (!st->last_con_tcx) + { + set_zero(st->old_exc, L_EXC_MEM_DEC); + } + set_zero(st->old_Aq_12_8, M + 1); + + /*Resamp others memories*/ + /*Size of LPC syn memory*/ + lerp_flt(st->mem_syn_r_float + L_SYN_MEM - mem_syn_r_size_old, st->mem_syn_r_float + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old); + mvr2r(st->mem_syn_r_float + L_SYN_MEM - M, st->mem_syn2, M); + } + /* update of lsf_old only needed in BASOP */ + /* else if( !st->tcxonly && (st->L_frame == L_FRAME16k) && (st->last_total_brate > ACELP_32k) ) */ + /* { */ + /* lsp2lsf( st->lsp_old, st->lsf_old, M, st->sr_core ); */ + /* } */ + } + + if (st->last_bwidth == NB && st->bwidth != NB && st->ini_frame != 0) + { + st->rate_switching_reset = 1; + } + + if (st->hTcxDec != NULL) + { + st->hTcxDec->old_synth_len = 2 * st->L_frame; + st->hTcxDec->old_synth_lenFB = 2 * st->hTcxDec->L_frameTCX; + } + + /* bass pf reset */ + st->bpf_gain_param = 0; + if (st->hBPF != NULL) + { + set_f(st->hBPF->pst_old_syn, 0, NBPSF_PIT_MAX); + } + + /* Formant postfilter */ + if (st->ini_frame == 0) + { + /* do nothing */ + } + else if (st->last_codec_mode == MODE2) + { + if (!st->tcxonly) + { + if (st->hPFstat->on) + { + lerp_flt(st->hPFstat->mem_stp_flt + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp_flt + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old); + lerp_flt(st->hPFstat->mem_pf_in_flt + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in_flt + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old); + } + else + { + set_zero(st->hPFstat->mem_stp_flt, L_SYN_MEM); + set_zero(st->hPFstat->mem_pf_in_flt, L_SYN_MEM); + st->hPFstat->reset = 1; + st->hPFstat->gain_prec_flt = 1.f; + } + } + else if (st->hPFstat->on) + { + lerp_flt(st->hPFstat->mem_stp_flt + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp_flt + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old); + lerp_flt(st->hPFstat->mem_pf_in_flt + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in_flt + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old); + } + } + else + { + /*codec mode switching*/ + + /*reset post-filter except for Narrowband*/ + if (((int16_t)(st->output_Fs / FRAMES_PER_SEC)) != L_FRAME8k) + { + if (st->hPFstat != NULL) + { + st->hPFstat->reset = 1; + if (st->hPFstat->on != 0) + { + st->hPFstat->reset = 0; + lerp_flt(st->hPFstat->mem_stp_flt + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp_flt + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old); + lerp_flt(st->hPFstat->mem_pf_in_flt + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in_flt + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old); + } + } + } + else + { + /*feed last value old_synth as it is used for pre-emphasis mem*/ + if (st->hTcxDec != NULL) + { + st->hTcxDec->old_synth_float[st->hTcxDec->old_synth_len - 1] = st->syn_float[M]; + } + if (st->hBPF != NULL) + { + st->hBPF->pst_old_syn[NBPSF_PIT_MAX - 1] = st->syn_float[M]; + } + } + } + + /* lsf and lsp initialization */ + if (st->ini_frame == 0) + { + mvr2r(st->lsp_old, st->lspold_uw_float, M); + mvr2r(st->lsf_old, st->lsfold_uw_float, M); + + set_zero(st->lsf_cng_float, M); + } + + st->seed_tcx_plc = RANDOM_INITSEED; + st->past_gpit_float = 0.0f; + st->past_gcode_float = 0.0f; + st->gc_threshold = 0.0f; + + lsf2lsp(st->lsf_cng_float, st->lspold_cng_float, M, INT_FS_12k8); + lsp2a_stab(st->lspold_cng_float, st->Aq_cng_float, M); + st->plcBackgroundNoiseUpdated = 0; + mvr2r(st->lsf_old, st->lsf_q_cng_float, M); + mvr2r(st->lsf_old, st->old_lsf_q_cng_float, M); + mvr2r(st->lsp_old, st->lsp_q_cng_float, M); + mvr2r(st->lsp_old, st->old_lsp_q_cng_float, M); + set_zero(st->mem_syn_unv_back_float, M); + st->last_gain_syn_deemph_float = 1.f; + + if (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_float = 1.f; + if (hTcxDec != NULL) + { + hTcxDec->conceal_eof_gain_float = 1.0f; + } + } + /* Post processing */ + set_zero(st->mem_Aq_float, NB_SUBFR16k * (M + 1)); + + st->lp_ener_bfi = 60.0f; + if (st->ini_frame == 0) + { + st->prev_bfi = 0; + st->last_core_bfi = -1; + if (st->hTcxDec != NULL) + { + hTcxDec->tcxConceal_recalc_exc = 0; + } + } + st->prev_old_bfi = 0; + + if (st->hTcxDec != NULL) + { + st->hTcxDec->noise_filling_index[0] = st->hTcxDec->noise_filling_index[1] = 0; + st->hTcxDec->tnsActive[0] = st->hTcxDec->tnsActive[1] = 0; + set_f(st->hTcxDec->ltpGainMemory, 0.0f, N_LTP_GAIN_MEMS); + } + + mvr2r(st->lsf_old, st->lsf_adaptive_mean, M); + mvr2r(st->lsf_old, st->lsfoldbfi0, M); + mvr2r(st->lsf_old, st->lsfoldbfi1, M); + + st->clas_dec = UNVOICED_CLAS; + + if (!st->last_con_tcx) + { + st->old_enr_LP_float = 0.0f; /* LP filter E of last good voiced frame or local LP filter E in TD TCX PLC */ + } + + if (st->prev_bfi) + { + /* calculate energy at the end of the previous frame */ + if (st->core == ACELP_CORE && st->last_core == HQ_CORE) + { + fer_energy(st->hTcxDec->L_frameTCX, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1); + } + } + else + { + st->last_good = UNVOICED_CLAS; /* last good received frame for concealment */ + st->enr_old = 0.0f; /* energy at the end of the previous frame */ + } + st->lp_gainc = 0.0f; + st->lp_gainp = 0.0f; + + if (st->hTcxDec != NULL) + { + st->hTcxDec->prev_widow_left_rect = 0; + + if (is_init || MCT_flag || !(st->element_mode == IVAS_CPE_MDCT && st->element_mode == last_element_mode)) + { + st->hTcxDec->CngLevelBackgroundTrace_bfi = PLC_MIN_CNG_LEV_FLT; + st->hTcxDec->NoiseLevelIndex_bfi = PLC_MIN_STAT_BUFF_SIZE - 1; + st->hTcxDec->CurrLevelIndex_bfi = 0; + st->hTcxDec->LastFrameLevel_bfi = PLC_MIN_CNG_LEV_FLT; + set_f(st->hTcxDec->NoiseLevelMemory_bfi, PLC_MIN_CNG_LEV_FLT, PLC_MIN_STAT_BUFF_SIZE); + + st->hTcxDec->cummulative_damping_tcx_float = 1.0f; + } + } + + st->cummulative_damping_float = 1.0f; + + for (i = 0; i < 2 * NB_SUBFR16k + 2; i++) + { + st->old_pitch_buf[i] = (float)st->pit_min; + } + + for (i = 0; i < 2 * NB_SUBFR16k + 2; i++) + { + st->mem_pitch_gain_float[i] = 1.f; + } + + st->old_fpitch_float = (float)st->pit_min; + + st->rate_switching_init = 1; + + st->reset_mem_AR = 0; + + /* For phase dispersion */ + set_zero(st->dispMem, 8); + + st->voice_fac_float = -1; /* purely unvoiced */ + + /* TCX-LTP */ + if (hTcxLtpDec != NULL) + { + tcxltp_dec_init(hTcxLtpDec, st->ini_frame, st->last_codec_mode, st->element_mode, st->pit_max, st->sr_core); + } + + /* TCX */ + if (hTcxDec != NULL) + { + st->old_fpitchFB_float = (float)hTcxDec->pit_min_TCX; + + if (st->ini_frame == 0 || (st->last_codec_mode == MODE1 && st->element_mode == EVS_MONO)) + { + hTcxDec->tcxltp_last_gain_unmodified_float = 0.f; + } + + /* TCX */ + hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri(total_brate, st->rf_flag, st->element_mode); + + hTcxDec->envWeighted = 0; + } + + if (st->hBPF != NULL) + { + st->hBPF->pst_mem_deemp_err = 0.0f; + } + + if (st->tcxonly) + { + st->p_bpf_noise_buf_float = NULL; + } + else + { + st->p_bpf_noise_buf_float = st->bpf_noise_buf_float; + } + + if (bwidth == SWB && (total_brate == ACELP_16k40 || total_brate == ACELP_24k40) && st->element_mode == EVS_MONO) + { + st->tec_tfa = 1; + } + else + { + st->tec_tfa = 0; + } + + st->tec_flag = 0; + st->tfa_flag = 0; + + /* needed in decoder to read the bitstream */ + st->enableGplc = 0; + + st->flagGuidedAcelp = 0; + st->tonal_mdct_plc_active = 0; + st->T0_4th = L_SUBFR; + st->guidedT0 = st->T0_4th; + + if (st->hPlcInfo != NULL && total_brate >= HQ_48k && st->element_mode == EVS_MONO) + { + st->enablePlcWaveadjust = 1; + + if (st->hTcxDec != NULL && (st->ini_frame == 0 || last_total_brate < HQ_48k || st->last_codec_mode == MODE1 || st->force_lpd_reset)) + { + concealment_init(st->hTcxDec->L_frameTCX, st->hPlcInfo); + } + } + else + { + st->enablePlcWaveadjust = 0; + } + + /* PLC: [TCX: Tonal Concealment] */ + if (st->hTonalMDCTConc != NULL && !(st->element_mode > EVS_MONO && st->ini_frame != 0 && st->hTonalMDCTConc->nSamples == st->hTcxDec->L_frameTCX)) + { + st->hTonalMDCTConc->nScaleFactors = 0; + st->hTonalMDCTConc->nSamples = 0; + st->hTonalMDCTConc->lastPcmOut_float = 0x0; + st->hTonalMDCTConc->lastBlockData.tonalConcealmentActive = 0; + st->hTonalMDCTConc->lastBlockData.nSamples = 0; + + TonalMDCTConceal_Init_ivas(st->hTonalMDCTConc, st->hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg); + } + + st->last_tns_active = 0; + st->second_last_tns_active = 0; + st->second_last_core = -1; + + if (st->hTcxCfg != NULL && + st->element_mode != EVS_MONO) + { + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed(is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode); + } + if (hTcxDec != NULL) + { + hTcxDec->tcxltp_second_last_pitch_float = st->old_fpitch_float; + hTcxDec->tcxltp_third_last_pitch_float = st->old_fpitch_float; + } + + if ((total_brate == ACELP_9k60 || total_brate == ACELP_16k40 || total_brate == ACELP_24k40) && st->element_mode == EVS_MONO) + { + st->dec_glr = 1; + } + else + { + st->dec_glr = 0; + } + + st->dec_glr_idx = 0; + + st->VAD = 0; + if (hTcxDec != NULL) + { + hTcxDec->enableTcxLpc = 1; + + hTcxDec->old_gaintcx_bfi_float = 0.0f; + + hTcxDec->tcx_hm_LtpPitchLag = -1; + } + + if (st->hTcxCfg != NULL) + { + st->hTcxCfg->na_scale_flt = 1.f; + } + + return; +} + +#endif /*-----------------------------------------------------------------------* * tcxltp_dec_init() * * Initialization TCX-LTP handle *-----------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED void tcxltp_dec_init( TCX_LTP_DEC_HANDLE hTcxLtpDec, const int16_t ini_frame, @@ -792,7 +1459,7 @@ void tcxltp_dec_init( const int16_t pit_max, const int32_t sr_core ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hTcxLtpDec->tcxltp_gain_float = 0.0f; #endif hTcxLtpDec->tcxltp = getTcxLtp( sr_core ); @@ -823,13 +1490,45 @@ void tcxltp_dec_init( return; } +#else +void tcxltp_dec_init( + TCX_LTP_DEC_HANDLE hTcxLtpDec, + const int16_t ini_frame, + const int16_t last_codec_mode, + const int16_t element_mode, + const int16_t pit_max, + const int32_t sr_core) +{ + hTcxLtpDec->tcxltp_gain_float = 0.0f; + + hTcxLtpDec->tcxltp = getTcxLtp(sr_core); + + if (ini_frame == 0 || (last_codec_mode == MODE1 && element_mode == EVS_MONO)) + { + hTcxLtpDec->tcxltp_pitch_int = pit_max; + hTcxLtpDec->tcxltp_pitch_fr = 0; + + if (ini_frame == 0) + { + set_f(hTcxLtpDec->tcxltp_mem_in_float, 0.0f, TCXLTP_MAX_DELAY); + set_f(hTcxLtpDec->tcxltp_mem_out_float, 0.0f, L_FRAME48k); + hTcxLtpDec->tcxltp_pitch_int_post_prev = 0; + hTcxLtpDec->tcxltp_pitch_fr_post_prev = 0; + hTcxLtpDec->tcxltp_gain_post_prev_float = 0.f; + hTcxLtpDec->tcxltp_filt_idx_prev = -1; + } + } + + return; +} +#endif /*-----------------------------------------------------------------------* * reset_tcx_overl_buf() * * Reset TCX core overlap buffers *-----------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void reset_tcx_overl_buf( TCX_DEC_HANDLE hTcxDec /* i/o: TCX decoder handle */ ) @@ -841,7 +1540,7 @@ void reset_tcx_overl_buf( return; } - +#endif void reset_tcx_overl_buf_fx( TCX_DEC_HANDLE hTcxDec /* i/o: TCX decoder handle */ ) @@ -862,7 +1561,7 @@ void reset_tcx_overl_buf_fx( * * Prepare MDCT OLA memories in TCX/HQ after ACELP PLC *-----------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void acelp_plc_mdct_transition( Decoder_State *st /* i/o: Decoder state */ ) @@ -879,7 +1578,6 @@ void acelp_plc_mdct_transition( nz = NS2SA( st->output_Fs, N_ZERO_MDCT_NS ); delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); /*CLDFB delay*/ - mvr2r( st->hHQ_core->fer_samples + delay_comp, st->hTcxDec->syn_OverlFB_float, st->hTcxDec->L_frameTCX / 2 ); lerp_flt( st->hHQ_core->fer_samples + delay_comp, st->hTcxDec->syn_Overl_float, st->L_frame / 2, st->hTcxDec->L_frameTCX / 2 ); /*ACELP(bfi)->TCX(rect)*/ /*old_out needed for MODE1 routine and syn_Overl_TDAC for MODE2 routine*/ @@ -901,3 +1599,4 @@ void acelp_plc_mdct_transition( return; } +#endif \ No newline at end of file diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index 8efdf9c406bae318f334348e2a36a892f95e3a79..d720137be3f01b65e29132c2538dc1aa70caed4c 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -14,12 +14,12 @@ #include "cnst.h" /* for MIN_CNG_LEV */ /*-----------------------------------------------------------------------* - * open_decoder_LPD() + * open_decoder_LPD_fx() * * Initialization of state variables *-----------------------------------------------------------------------*/ - -void open_decoder_LPD( +#ifdef IVAS_FLOAT_FIXED +void open_decoder_LPD_fx( Decoder_State *st, const Word32 total_brate, #ifdef NEW_IVAS_OPEN_DEC @@ -1689,8 +1689,8 @@ void open_decoder_LPD_ivas_fx( IF( is_init || MCT_flag || !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( st->element_mode, last_element_mode ) ) ) { - st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = PLC_MIN_CNG_LEV; - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp = 16; + //st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = PLC_MIN_CNG_LEV; + //st->hTcxDec->CngLevelBackgroundTrace_bfi_exp = 16; st->hTcxDec->NoiseLevelIndex_bfi = PLC_MIN_STAT_BUFF_SIZE - 1; st->hTcxDec->CurrLevelIndex_bfi = 0; st->hTcxDec->LastFrameLevel_bfi_fx = PLC_MIN_CNG_LEV; @@ -1771,13 +1771,11 @@ void open_decoder_LPD_ivas_fx( IF( st->tcxonly ) { st->p_bpf_noise_buf = NULL; - st->p_bpf_noise_buf_float = NULL; /*To be removed later:Pointer initializations */ st->p_bpf_noise_buf_32 = NULL; } ELSE { st->p_bpf_noise_buf = st->bpf_noise_buf; - st->p_bpf_noise_buf_float = st->bpf_noise_buf_float; /*To be removed later:Pointer initializations */ st->p_bpf_noise_buf_32 = st->bpf_noise_buf_32; } IF( EQ_16( bwidth, SWB ) && ( EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && EQ_16( st->element_mode, EVS_MONO ) ) @@ -1808,11 +1806,11 @@ void open_decoder_LPD_ivas_fx( { concealment_init_ivas_fx( st->hTcxDec->L_frameTCX, st->hPlcInfo ); //---------------- To be removed later : Only initializations -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->hPlcInfo->outx_new_n1 = 0.0f; st->hPlcInfo->nsapp_gain = 0.0f; #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->hPlcInfo->nsapp_gain_n = 0.0f; st->hPlcInfo->ener_mean = 59.4260f; st->hPlcInfo->ener = 0.0f; @@ -1833,20 +1831,16 @@ void open_decoder_LPD_ivas_fx( st->hTonalMDCTConc->nScaleFactors = 0; st->hTonalMDCTConc->nSamples = 0; st->hTonalMDCTConc->lastPcmOut = 0x0; +#ifndef IVAS_FLOAT_FIXED //----------To be removed later: pointer initializations st->hTonalMDCTConc->lastPcmOut_float = 0x0; //---------- st->hTonalMDCTConc->lastPcmOut_float = 0x0; +#endif st->hTonalMDCTConc->lastBlockData.tonalConcealmentActive = 0; st->hTonalMDCTConc->lastBlockData.nSamples = 0; TonalMDCTConceal_Init_ivas_fx( st->hTonalMDCTConc, st->hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg ); - // To be removed later: Float pointer initiaizations----------------- - st->hTonalMDCTConc->lastBlockData.spectralData_float = st->hTonalMDCTConc->spectralDataBuffers_float[0]; - st->hTonalMDCTConc->secondLastBlockData.spectralData_float = st->hTonalMDCTConc->spectralDataBuffers_float[1]; - st->hTonalMDCTConc->secondLastPowerSpectrum_float = st->hTonalMDCTConc->secondLastBlockData.spectralData_float; - st->hTonalMDCTConc->lastBlockData.scaleFactors_float = st->hTonalMDCTConc->scaleFactorsBuffers_float[0]; - st->hTonalMDCTConc->secondLastBlockData.scaleFactors_float = st->hTonalMDCTConc->scaleFactorsBuffers_float[1]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED //st->hTonalMDCTConc->pTCI = (TonalComponentsInfo *) st->hTonalMDCTConc->timeDataBuffer_float; st->hTonalMDCTConc->pTCI = &st->hTonalMDCTConc->pTCI1; st->hTonalMDCTConc->lastPitchLag_float = 0; @@ -1854,11 +1848,11 @@ void open_decoder_LPD_ivas_fx( st->hTonalMDCTConc->last_block_nrg_flt = 0.0f; st->hTonalMDCTConc->curr_noise_nrg_flt = 0.0f; st->hTonalMDCTConc->faded_signal_nrg_flt = 0.0f; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) st->hTonalMDCTConc->secondLastPcmOut_float = &st->hTonalMDCTConc->timeDataBuffer_float[( 3 * L_FRAME_MAX ) / 2 - imult1616( 3, shr( s_min( L_FRAME_MAX, st->hTcxDec->L_frameTCX ), 1 ) )]; st->hTonalMDCTConc->lastPcmOut_float = &st->hTonalMDCTConc->timeDataBuffer_float[( 3 * L_FRAME_MAX ) / 2 - s_min( L_FRAME_MAX, st->hTcxDec->L_frameTCX )]; //---------------To be removed later assert( sizeof( *st->hTonalMDCTConc->pTCI ) <= ( st->hTonalMDCTConc->lastPcmOut_float - st->hTonalMDCTConc->timeDataBuffer_float ) * sizeof( st->hTonalMDCTConc->timeDataBuffer_float[0] ) ); +#endif // #ifndef IVAS_FLOAT_FIXED } st->last_tns_active = 0; @@ -1906,3 +1900,4 @@ void open_decoder_LPD_ivas_fx( return; } #endif // IVAS_FLOAT_FIXED +#endif \ No newline at end of file diff --git a/lib_dec/core_dec_reconf.c b/lib_dec/core_dec_reconf.c index 6e6b8018fd34fd43c41e0d168f39dee90551c21b..3718a38d8435987444db854516ea64d71872263a 100644 --- a/lib_dec/core_dec_reconf.c +++ b/lib_dec/core_dec_reconf.c @@ -41,7 +41,7 @@ #include "rom_dec.h" #include "wmc_auto.h" #include "prot_fx2.h" - +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * reconfig_decoder_LPD_ivas() * @@ -130,7 +130,7 @@ void reconfig_decoder_LPD_ivas( if ( st->hTcxCfg != NULL && st->fscale != st->fscale_old && !( st->element_mode == EVS_MONO && st->last_codec_mode == MODE1 && st->last_core == ACELP_CORE && st->prev_bfi != 0 ) ) /* no resempling is needed here when recovering from mode 1 ACELP PLC, since the buffers are already sampled with the - correct sampling rate in open_decoder_LPD_flt() */ + correct sampling rate in open_decoder_LPD() */ { newLen = st->hTcxCfg->tcx_mdct_window_length; oldLen = st->hTcxCfg->tcx_mdct_window_length_old; @@ -140,7 +140,7 @@ void reconfig_decoder_LPD_ivas( newLen = st->L_frame / 2; oldLen = L_frame_old / 2; } - +#ifndef IVAS_FLOAT_FIXED if ( st->hTcxDec != NULL ) { lerp_flt( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl_float, newLen, oldLen ); @@ -151,6 +151,7 @@ void reconfig_decoder_LPD_ivas( lerp_flt( st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->syn_Overl_TDAC_float, newLen, oldLen ); } } +#endif } if ( st->L_frame <= L_FRAME16k ) @@ -169,17 +170,17 @@ void reconfig_decoder_LPD_ivas( oldLen = L_SYN_MEM_CLAS_ESTIM; newLen = L_SYN_MEM_CLAS_ESTIM * st->L_frame / st->last_L_frame; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED lerp_flt(&st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - oldLen], &st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - newLen], newLen, oldLen); -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED } } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED else { set_zero(st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM); } -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED } } @@ -199,3 +200,4 @@ void reconfig_decoder_LPD_ivas( return; } +#endif diff --git a/lib_dec/core_dec_reconf_fx.c b/lib_dec/core_dec_reconf_fx.c index f4b09749afaef1f8f58e5663fb44e1305522eb4c..116bd7f238a505793f93a734efa3b93220270324 100644 --- a/lib_dec/core_dec_reconf_fx.c +++ b/lib_dec/core_dec_reconf_fx.c @@ -104,7 +104,7 @@ void reconfig_decoder_LPD_ivas_fx( EQ_16( st->last_core, ACELP_CORE ) && NE_16(st->prev_bfi , 0 ) ) )) /* no resempling is needed here when recovering from mode 1 ACELP PLC, since the buffers are already sampled with the - correct sampling rate in open_decoder_LPD() */ + correct sampling rate in open_decoder_LPD_fx() */ { newLen = st->hTcxCfg->tcx_mdct_window_length; oldLen = st->hTcxCfg->tcx_mdct_window_length_old; @@ -178,7 +178,7 @@ void reconfig_decoder_LPD_ivas_fx( } #endif -void reconfig_decoder_LPD( +void reconfig_decoder_LPD_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 bits_frame, /* i : bit budget */ Word16 bwidth, /* i : audio bandwidth */ @@ -281,7 +281,7 @@ void reconfig_decoder_LPD( EQ_16(st->last_core, ACELP_CORE) && st->prev_bfi != 0))) /* no resempling is needed here when recovering from mode 1 acelp plc, since the buffers are already sampled with the - correct sampling rate in open_decoder_LPD() */ + correct sampling rate in open_decoder_LPD_fx() */ { newLen = st->hTcxCfg->tcx_mdct_window_length; diff --git a/lib_dec/core_dec_switch.c b/lib_dec/core_dec_switch.c index 5f6f16c35124d6c8c256ba9bfd128ade68e0bf61..a6e1ef2588616ea021526e74165892e696375267 100644 --- a/lib_dec/core_dec_switch.c +++ b/lib_dec/core_dec_switch.c @@ -42,7 +42,7 @@ #include "wmc_auto.h" /*-------------------------------------------------------------* - * mode_switch_decoder_LPD_flt() + * mode_switch_decoder_LPD() * * *-------------------------------------------------------------*/ @@ -64,8 +64,8 @@ void open_decoder_LPD_ivas_fx( Word16* Q_old_outLB, Word16* Q_old_Aq_12_8); #endif // IVAS_FLOAT_FIXED -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void mode_switch_decoder_LPD_flt( +#ifndef IVAS_FLOAT_FIXED +void mode_switch_decoder_LPD( Decoder_State *st, /* i/o: decoder state structure */ const int16_t bwidth, /* i : audio bandwidth */ const int32_t total_brate, /* i : total bitrate */ @@ -122,11 +122,11 @@ void mode_switch_decoder_LPD_flt( if ( fscale != st->fscale || switchWB || bSwitchFromAmrwbIO || st->last_codec_mode == MODE1 || st->force_lpd_reset ) { /* Init Decoder */ - Word16 Q_syn_Overl_TDAC = 0, Q_fer_samples = 0, Q_syn_Overl = 0, Q_syn_Overl_TDACFB = 0, Q_syn_OverlFB = 0, Q_old_out = 0, Q_old_outLB = 0, Q_old_Aq_12_8 = 0; #ifdef IVAS_FLOAT_FIXED + Word16 Q_syn_Overl_TDAC = 0, Q_fer_samples = 0, Q_syn_Overl = 0, Q_syn_Overl_TDACFB = 0, Q_syn_OverlFB = 0, Q_old_out = 0, Q_old_outLB = 0, Q_old_Aq_12_8 = 0; open_decoder_LPD_ivas_fx(st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0, &Q_syn_Overl_TDAC, &Q_fer_samples, &Q_syn_Overl, &Q_syn_Overl_TDACFB, &Q_syn_OverlFB, &Q_old_out, &Q_old_outLB, &Q_old_Aq_12_8); #endif - open_decoder_LPD_flt( st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0 ); + open_decoder_LPD( st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0 ); } else { @@ -155,7 +155,7 @@ void mode_switch_decoder_LPD_flt( { st->narrowBand = 0; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->TcxBandwidth_float = getTcxBandwidth_flt( bwidth ); #endif if ( st->hTcxCfg != NULL ) @@ -175,7 +175,7 @@ void mode_switch_decoder_LPD_flt( frame_size = FrameSizeConfig[frame_size_index].frame_net_bits; reconfig_decoder_LPD_ivas( st, frame_size, bwidth, total_brate, st->last_L_frame ); -#if ( defined EVS_FLOAT ) || !( defined IVAS_FLOAT_FIXED ) +#ifndef IVAS_FLOAT_FIXED if ( hTcxDec->envWeighted && !hTcxDec->enableTcxLpc ) { mvr2r( st->lspold_uw_float, st->lsp_old, M ); @@ -187,7 +187,7 @@ void mode_switch_decoder_LPD_flt( lsp2lsf( st->lsp_old, st->lsfoldbfi1, M, st->sr_core ); mvr2r( st->lsfoldbfi1, st->lsfoldbfi0, M ); mvr2r( st->lsfoldbfi1, st->lsf_adaptive_mean, M ); -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED if ( st->igf && st->hBWE_TD != NULL ) { @@ -200,7 +200,7 @@ void mode_switch_decoder_LPD_flt( } else { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( st->hBWE_TD->state_lpc_syn, 0.0f, LPC_SHB_ORDER ); set_f( st->hBWE_TD->state_syn_shbexc, 0.0f, L_SHB_LAHEAD ); set_f( st->hBWE_TD->mem_stp_swb, 0.0f, LPC_SHB_ORDER ); @@ -221,7 +221,7 @@ void mode_switch_decoder_LPD_flt( { if ( st->tec_tfa == 0 && st->hTECDec != NULL ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_zero( st->hTECDec->loBuffer_flt, MAX_TEC_SMOOTHING_DEG ); #endif #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/core_dec_switch_fx.c b/lib_dec/core_dec_switch_fx.c index a8923e07dccbc1236fa98c8df06a5d3155a81fe8..8f7f18de8b361405648f7786b7ca2b1e0ed233d7 100644 --- a/lib_dec/core_dec_switch_fx.c +++ b/lib_dec/core_dec_switch_fx.c @@ -14,7 +14,7 @@ #include "prot.h" -void mode_switch_decoder_LPD( +void mode_switch_decoder_LPD_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 bwidth, /* i : audio bandwidth */ Word32 total_brate, /* i : total bitrate */ @@ -100,12 +100,12 @@ void mode_switch_decoder_LPD( 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(st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0); + open_decoder_LPD_fx(st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0); #else #ifdef IVAS_CODE - open_decoder_LPD(st, total_brate, last_total_brate, bwidth, is_mct, 0); + open_decoder_LPD_fx(st, total_brate, last_total_brate, bwidth, is_mct, 0); #else - open_decoder_LPD(st, total_brate, bwidth); + open_decoder_LPD_fx(st, total_brate, bwidth); #endif #endif @@ -160,7 +160,7 @@ void mode_switch_decoder_LPD( frame_size = FrameSizeConfig[frame_size_index].frame_net_bits; move16(); - reconfig_decoder_LPD( st, frame_size, bwidth, total_brate, st->last_L_frame ); + reconfig_decoder_LPD_fx( st, frame_size, bwidth, total_brate, st->last_L_frame ); test(); IF (hTcxDec->envWeighted != 0 && hTcxDec->enableTcxLpc == 0) diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index ba7a2af099cd2666087e389897e341c15205ab55..ef01cc2bdfe88131d25ef6778cbfd12105c5044f 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -53,7 +53,7 @@ * Local prototypes *---------------------------------------------------------------------*/ -#if !(defined IVAS_FLOAT_FIXED) || (defined EVS_FLOAT) +#ifndef IVAS_FLOAT_FIXED static void core_switch_lb_upsamp( Decoder_State *st, float *output ); static void smoothTransitionDtxToTcx( float synth[], const int16_t output_frame, const int16_t delay_comp ); #endif @@ -175,8 +175,8 @@ ivas_error core_switching_pre_dec_ivas_fx( { st->last_core = HQ_CORE; move16(); - //Copy( st->hTcxDec->FBTCXdelayBuf, st->prev_synth_buffer_fx, NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); - Copy32( st->hTcxDec->FBTCXdelayBuf, st->prev_synth_buffer32_fx, NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); + + Copy32( st->hTcxDec->FBTCXdelayBuf_32, st->prev_synth_buffer32_fx, NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); //Copy_Scale_sig_32_16( st->hTcxDec->FBTCXdelayBuf_32, st->prev_synth_buffer_fx, NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ), -11 ); //Q11 -> Q0 } @@ -422,7 +422,7 @@ ivas_error core_switching_pre_dec_ivas_fx( st->lp_gainc_fx = extract_h( Sqrt32( st->lp_ener_fx, &exp ) ); /*Q=15-exp*/ st->lp_gainc_fx = shr( st->lp_gainc_fx, 12 - exp ); /*Q3*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) /*To be removed later: floating point initializations*/ +#ifndef IVAS_FLOAT_FIXED /*To be removed later: floating point initializations*/ st->last_voice_factor = 0; #endif st->last_voice_factor_fx = 0; @@ -494,7 +494,7 @@ ivas_error core_switching_pre_dec_ivas_fx( st->lp_gainc_fx = extract_h( Sqrt32( st->lp_ener_fx, &exp ) ); /*Q=15-exp*/ st->lp_gainc_fx = shr( st->lp_gainc_fx, 12 - exp ); /*Q3*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->last_voice_factor = 0; #endif // st->last_voice_factor_fx = 0; @@ -653,11 +653,11 @@ ivas_error core_switching_pre_dec_ivas_fx( /* || st->last_core == AMR_WB_CORE || st->last_codec_mode == MODE2)){*/ IF( NE_16(st->core , AMR_WB_CORE) ) { - configureFdCngDec_fx( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec_ivas_fx( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); } ELSE { - configureFdCngDec_fx( st->hFdCngDec, WB, ACELP_8k00, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec_ivas_fx( st->hFdCngDec, WB, ACELP_8k00, st->L_frame, st->last_L_frame, st->element_mode ); IF( st->VAD ) { @@ -682,14 +682,14 @@ ivas_error core_switching_pre_dec_ivas_fx( { FOR( i = 0; i < shl(st->L_frame,1); i++ ) { - st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i] = Mult_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i], (Word16) floatToFixed( 0.6250f, 15 ) ); + st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i] = Mult_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i], (Word16) 20480 /* 0.6250f in Q15 */ ); } } ELSE { FOR( i = 0; i < shl(st->L_frame ,1); i++ ) { - st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i] = Mult_32_16( L_shl( st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i], 1 ), (Word16) floatToFixed( 1.6f, 14 ) ); + st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i] = Mult_32_16( L_shl( st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i], 1 ), (Word16) 26214 /* 1.6f in Q14 */ ); } } } @@ -699,903 +699,869 @@ ivas_error core_switching_pre_dec_ivas_fx( return error; } #endif // IVAS_FLOAT_FIXED -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED ivas_error core_switching_pre_dec( - Decoder_State *st, /* i/o: decoder state structure */ - const int16_t output_frame, /* i : frame length */ - const int32_t last_core_brate_st0, /* i : channel 0 last core bitrate */ - const int16_t nchan_out, /* i : number of output channels */ - const int16_t last_element_mode, /* i : last_element_mode */ - const int32_t last_element_brate /* i : last element bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t output_frame, /* i : frame length */ + const int32_t last_core_brate_st0, /* i : channel 0 last core bitrate */ + const int16_t nchan_out, /* i : number of output channels */ + const int16_t last_element_mode, /* i : last_element_mode */ + const int32_t last_element_brate /* i : last element bitrate */ ) { - int16_t i, oldLenClasBuff, newLenClasBuff; - ivas_error error; - float tmp; + int16_t i, oldLenClasBuff, newLenClasBuff; + ivas_error error; + float tmp; - error = IVAS_ERR_OK; + error = IVAS_ERR_OK; - /* Codec mode switching */ - if ( st->last_codec_mode == MODE2 || ( ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) && st->element_mode > EVS_MONO ) ) + /* Codec mode switching */ + if (st->last_codec_mode == MODE2 || ((st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE) && st->element_mode > EVS_MONO)) + { + mvr2r(st->mem_syn2, st->mem_syn1, M); + set_f(st->agc_mem2, 0, 2); + st->mem_deemph = st->syn_float[M]; + st->bpf_off = 1; + if (st->hBPF != NULL) { - mvr2r( st->mem_syn2, st->mem_syn1, M ); - set_f( st->agc_mem2, 0, 2 ); - st->mem_deemph = st->syn_float[M]; - st->bpf_off = 1; - if ( st->hBPF != NULL ) - { - set_f( st->hBPF->pst_old_syn, 0, NBPSF_PIT_MAX ); - st->hBPF->pst_mem_deemp_err = 0; - } - st->psf_lp_noise = st->lp_noise_float; + set_f(st->hBPF->pst_old_syn, 0, NBPSF_PIT_MAX); + st->hBPF->pst_mem_deemp_err = 0; + } + st->psf_lp_noise = st->lp_noise_float; - /* reset old HB synthesis buffer */ - if ( st->last_L_frame == L_FRAME ) - { - st->old_bwe_delay = NS2SA( st->output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_12k8_NS ); - } - else - { - st->old_bwe_delay = NS2SA( st->output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS ); - } - set_f( st->hb_prev_synth_buffer, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS ) ); + /* reset old HB synthesis buffer */ + if (st->last_L_frame == L_FRAME) + { + st->old_bwe_delay = NS2SA(st->output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_12k8_NS); + } + else + { + st->old_bwe_delay = NS2SA(st->output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS); + } + set_f(st->hb_prev_synth_buffer, 0, NS2SA(48000, DELAY_BWE_TOTAL_NS)); - if ( st->hBWE_TD != NULL && st->last_core != ACELP_CORE ) - { - /* reset BWE memories */ - set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); - st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; - } + if (st->hBWE_TD != NULL && st->last_core != ACELP_CORE) + { + /* reset BWE memories */ + set_f(st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2); + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } - /* reset upd_cnt */ - st->upd_cnt = MAX_UPD_CNT; + /* reset upd_cnt */ + st->upd_cnt = MAX_UPD_CNT; - st->igf = 0; + st->igf = 0; - if ( st->output_Fs >= 16000 && st->hBWE_zero != NULL ) - { - hf_synth_reset( st->hBWE_zero ); - } - - if ( st->hBWE_FD != NULL ) - { - set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); - } - - if ( st->hHQ_core != NULL ) - { - set_f( st->hHQ_core->prev_env, 0, SFM_N_WB ); - set_f( st->hHQ_core->prev_normq, 0, SFM_N_WB ); + if (st->output_Fs >= 16000 && st->hBWE_zero != NULL) + { + hf_synth_reset(st->hBWE_zero); + } - set_f( st->hHQ_core->last_ni_gain, 0, BANDS_MAX ); - set_f( st->hHQ_core->last_env, 0, BANDS_MAX ); - st->hHQ_core->last_max_pos_pulse = 0; + if (st->hBWE_FD != NULL) + { + set_f(st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA(16000, DELAY_FD_BWE_ENC_NS)); + } - if ( st->output_Fs > 16000 ) - { - set_f( st->hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE ); - } + if (st->hHQ_core != NULL) + { + set_f(st->hHQ_core->prev_env, 0, SFM_N_WB); + set_f(st->hHQ_core->prev_normq, 0, SFM_N_WB); - /* pre-echo */ - st->hHQ_core->pastpre = 0; - } + set_f(st->hHQ_core->last_ni_gain, 0, BANDS_MAX); + set_f(st->hHQ_core->last_env, 0, BANDS_MAX); + st->hHQ_core->last_max_pos_pulse = 0; - /* reset the GSC pre echo energy threshold in case of switching */ - if ( st->hGSCDec != NULL ) - { - st->hGSCDec->Last_frame_ener = (float) MAX_32; - } + if (st->output_Fs > 16000) + { + set_f(st->hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE); + } - if ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) - { - if ( st->element_mode == EVS_MONO ) - { - st->last_core = HQ_CORE; - mvr2r( st->hTcxDec->FBTCXdelayBuf_float, st->prev_synth_buffer, NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); - } + /* pre-echo */ + st->hHQ_core->pastpre = 0; + } - if ( st->hHQ_core != NULL ) - { - set_f( st->hHQ_core->last_ni_gain, 0, BANDS_MAX ); - set_f( st->hHQ_core->last_env, 0, BANDS_MAX ); - st->hHQ_core->last_max_pos_pulse = 0; + /* reset the GSC pre echo energy threshold in case of switching */ + if (st->hGSCDec != NULL) + { + st->hGSCDec->Last_frame_ener = (float)MAX_32; + } - set_s( st->hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); - st->hHQ_core->prev_frm_hfe2 = 0; - st->hHQ_core->prev_stab_hfe2 = 0; - } - } + if (st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE) + { + if (st->element_mode == EVS_MONO) + { + st->last_core = HQ_CORE; + mvr2r(st->hTcxDec->FBTCXdelayBuf_float, st->prev_synth_buffer, NS2SA(st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS)); + } - if ( st->prev_bfi != 0 ) - { - int16_t delay_comp; + if (st->hHQ_core != NULL) + { + set_f(st->hHQ_core->last_ni_gain, 0, BANDS_MAX); + set_f(st->hHQ_core->last_env, 0, BANDS_MAX); + st->hHQ_core->last_max_pos_pulse = 0; - /*switch off Hq Voicing as it was not updated in MODE2*/ - if ( st->hHQ_core != NULL ) - { - st->hHQ_core->oldHqVoicing = 0; - st->hHQ_core->HqVoicing = 0; - } + set_s(st->hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM); + st->hHQ_core->prev_frm_hfe2 = 0; + st->hHQ_core->prev_stab_hfe2 = 0; + } + } - delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + if (st->prev_bfi != 0) + { + int16_t delay_comp; - if ( !st->last_con_tcx && st->last_core_bfi == ACELP_CORE && st->core == HQ_CORE ) - { - float *realBuffer[CLDFB_NO_COL_MAX_SWITCH], *imagBuffer[CLDFB_NO_COL_MAX_SWITCH]; - float realBufferTmp[CLDFB_NO_COL_MAX_SWITCH][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX_SWITCH][CLDFB_NO_CHANNELS_MAX]; + /*switch off Hq Voicing as it was not updated in MODE2*/ + if (st->hHQ_core != NULL) + { + st->hHQ_core->oldHqVoicing = 0; + st->hHQ_core->HqVoicing = 0; + } - for ( i = 0; i < CLDFB_NO_COL_MAX_SWITCH; i++ ) - { - set_f( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - set_f( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - realBuffer[i] = realBufferTmp[i]; - imagBuffer[i] = imagBufferTmp[i]; - } + delay_comp = NS2SA(st->output_Fs, DELAY_CLDFB_NS); - /* CLDFB analysis of the synthesis at internal sampling rate */ - if ( ( error = cldfb_save_memory_ivas( st->cldfbAna ) ) != IVAS_ERR_OK ) - { - return error; - } + if (!st->last_con_tcx && st->last_core_bfi == ACELP_CORE && st->core == HQ_CORE) + { + float *realBuffer[CLDFB_NO_COL_MAX_SWITCH], *imagBuffer[CLDFB_NO_COL_MAX_SWITCH]; + float realBufferTmp[CLDFB_NO_COL_MAX_SWITCH][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX_SWITCH][CLDFB_NO_CHANNELS_MAX]; - cldfbAnalysis_ivas( st->hTcxDec->syn_Overl_float, realBuffer, imagBuffer, delay_comp, st->cldfbAna ); - cldfb_restore_memory_ivas( st->cldfbAna ); + for (i = 0; i < CLDFB_NO_COL_MAX_SWITCH; i++) + { + set_f(realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX); + set_f(imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX); + realBuffer[i] = realBufferTmp[i]; + imagBuffer[i] = imagBufferTmp[i]; + } - /* CLDFB synthesis of the combined signal */ - if ( ( error = cldfb_save_memory_ivas( st->cldfbSyn ) ) != IVAS_ERR_OK ) - { - return error; - } + /* CLDFB analysis of the synthesis at internal sampling rate */ + if ((error = cldfb_save_memory_ivas(st->cldfbAna)) != IVAS_ERR_OK) + { + return error; + } - cldfbSynthesis_ivas( realBuffer, imagBuffer, st->hHQ_core->fer_samples, delay_comp, st->cldfbSyn ); - cldfb_restore_memory_ivas( st->cldfbSyn ); - } + cldfbAnalysis_ivas(st->hTcxDec->syn_Overl_float, realBuffer, imagBuffer, delay_comp, st->cldfbAna); + cldfb_restore_memory_ivas(st->cldfbAna); - if ( !st->last_con_tcx && st->last_core_bfi == ACELP_CORE && st->core == HQ_CORE ) - { - lerp_flt( st->hTcxDec->syn_Overl_float, st->hHQ_core->fer_samples + delay_comp, output_frame / 2, st->last_L_frame / 2 ); - /*Set to zero the remaining part*/ - set_f( st->hHQ_core->fer_samples + delay_comp + output_frame / 2, 0, ( output_frame / 2 ) - delay_comp ); - } + /* CLDFB synthesis of the combined signal */ + if ((error = cldfb_save_memory_ivas(st->cldfbSyn)) != IVAS_ERR_OK) + { + return error; } - st->use_acelp_preq = 0; - st->reset_mem_AR = 0; + cldfbSynthesis_ivas(realBuffer, imagBuffer, st->hHQ_core->fer_samples, delay_comp, st->cldfbSyn); + cldfb_restore_memory_ivas(st->cldfbSyn); + } + + if (!st->last_con_tcx && st->last_core_bfi == ACELP_CORE && st->core == HQ_CORE) + { + lerp_flt(st->hTcxDec->syn_Overl_float, st->hHQ_core->fer_samples + delay_comp, output_frame / 2, st->last_L_frame / 2); + /*Set to zero the remaining part*/ + set_f(st->hHQ_core->fer_samples + delay_comp + output_frame / 2, 0, (output_frame / 2) - delay_comp); + } } - /*FEC*/ - if ( st->L_frame <= L_FRAME16k ) + st->use_acelp_preq = 0; + st->reset_mem_AR = 0; + } + + /*FEC*/ + if (st->L_frame <= L_FRAME16k) + { + if (st->last_L_frame <= L_FRAME16k && st->core != HQ_CORE) { - if ( st->last_L_frame <= L_FRAME16k && st->core != HQ_CORE ) + if (st->L_frame != st->last_L_frame) + { + if (st->L_frame > st->last_L_frame) { - if ( st->L_frame != st->last_L_frame ) - { - if ( st->L_frame > st->last_L_frame ) - { - oldLenClasBuff = L_SYN_MEM_CLAS_ESTIM * st->last_L_frame / st->L_frame; - newLenClasBuff = L_SYN_MEM_CLAS_ESTIM; - } - else - { - oldLenClasBuff = L_SYN_MEM_CLAS_ESTIM; - newLenClasBuff = L_SYN_MEM_CLAS_ESTIM * st->L_frame / st->last_L_frame; - } - lerp_flt( &st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - oldLenClasBuff], &st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - newLenClasBuff], newLenClasBuff, oldLenClasBuff ); - } + oldLenClasBuff = L_SYN_MEM_CLAS_ESTIM * st->last_L_frame / st->L_frame; + newLenClasBuff = L_SYN_MEM_CLAS_ESTIM; } else { - set_zero( st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM ); + oldLenClasBuff = L_SYN_MEM_CLAS_ESTIM; + newLenClasBuff = L_SYN_MEM_CLAS_ESTIM * st->L_frame / st->last_L_frame; } + lerp_flt(&st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - oldLenClasBuff], &st->mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM - newLenClasBuff], newLenClasBuff, oldLenClasBuff); + } } - - /* Here we only handle cases where last_ppp and last_nelp not updated when coming from CodecB or other cores - within ACELP_CORE if switching from another bitarate to vbr, last_ppp and last_nelp is always updated in the previous frame */ - if ( st->core == ACELP_CORE && ( st->last_core != ACELP_CORE || st->last_codec_mode == MODE2 ) ) + else { - st->last_ppp_mode_dec = 0; - st->last_nelp_mode_dec = 0; + set_zero(st->mem_syn_clas_estim, L_SYN_MEM_CLAS_ESTIM); } + } - /* Handle state reset of stat_noise_uv_mod memory */ - if ( st->core == ACELP_CORE && ( st->last_core != ACELP_CORE || st->last_codec_mode == MODE2 || st->last_total_brate <= PPP_NELP_2k80 ) ) + /* Here we only handle cases where last_ppp and last_nelp not updated when coming from CodecB or other cores + within ACELP_CORE if switching from another bitarate to vbr, last_ppp and last_nelp is always updated in the previous frame */ + if (st->core == ACELP_CORE && (st->last_core != ACELP_CORE || st->last_codec_mode == MODE2)) + { + st->last_ppp_mode_dec = 0; + st->last_nelp_mode_dec = 0; + } + + /* Handle state reset of stat_noise_uv_mod memory */ + if (st->core == ACELP_CORE && (st->last_core != ACELP_CORE || st->last_codec_mode == MODE2 || st->last_total_brate <= PPP_NELP_2k80)) + { + st->act_count = 3; + st->uv_count = 0; + } + + if (((st->core == ACELP_CORE || st->core == AMR_WB_CORE) && st->last_core == HQ_CORE) || ((st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD || (st->element_mode == IVAS_CPE_MDCT && last_element_mode == IVAS_CPE_DFT)) && nchan_out == 2 && + st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA && (last_core_brate_st0 == FRAME_NO_DATA || last_core_brate_st0 == SID_2k40))) + { + if (st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD) { - st->act_count = 3; - st->uv_count = 0; + st->hPFstat->reset = 1; } - if ( ( ( st->core == ACELP_CORE || st->core == AMR_WB_CORE ) && st->last_core == HQ_CORE ) || ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD || ( st->element_mode == IVAS_CPE_MDCT && last_element_mode == IVAS_CPE_DFT ) ) && nchan_out == 2 && - st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA && ( last_core_brate_st0 == FRAME_NO_DATA || last_core_brate_st0 == SID_2k40 ) ) ) + if (st->L_frame == L_FRAME16k) { - if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) - { - st->hPFstat->reset = 1; - } - - if ( st->L_frame == L_FRAME16k ) - { - mvr2r( TRWB2_Ave, st->lsf_old, M ); /* init of LSP */ - mvr2r( TRWB2_Ave, st->lsfoldbfi1, M ); - mvr2r( TRWB2_Ave, st->lsfoldbfi0, M ); - mvr2r( TRWB2_Ave, st->lsf_adaptive_mean, M ); - lsf2lsp( st->lsf_old, st->lsp_old, M, INT_FS_16k ); - } - else - { - mvr2r( TRWB_Ave, st->lsf_old, M ); /* init of LSP */ - mvr2r( TRWB_Ave, st->lsfoldbfi1, M ); - mvr2r( TRWB_Ave, st->lsfoldbfi0, M ); - mvr2r( TRWB_Ave, st->lsf_adaptive_mean, M ); - lsf2lsp( st->lsf_old, st->lsp_old, M, INT_FS_12k8 ); - } + mvr2r(TRWB2_Ave, st->lsf_old, M); /* init of LSP */ + mvr2r(TRWB2_Ave, st->lsfoldbfi1, M); + mvr2r(TRWB2_Ave, st->lsfoldbfi0, M); + mvr2r(TRWB2_Ave, st->lsf_adaptive_mean, M); + lsf2lsp(st->lsf_old, st->lsp_old, M, INT_FS_16k); + } + else + { + mvr2r(TRWB_Ave, st->lsf_old, M); /* init of LSP */ + mvr2r(TRWB_Ave, st->lsfoldbfi1, M); + mvr2r(TRWB_Ave, st->lsfoldbfi0, M); + mvr2r(TRWB_Ave, st->lsf_adaptive_mean, M); + lsf2lsp(st->lsf_old, st->lsp_old, M, INT_FS_12k8); + } - if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && nchan_out == 2 && st->core_brate > SID_2k40 && ( last_core_brate_st0 == FRAME_NO_DATA || last_core_brate_st0 == SID_2k40 ) && st->hTcxDec != NULL ) - { - /* Last frame was Stereo CNG and the synthesis memory is outdated -- reset */ - set_f( st->hTcxDec->old_syn_Overl_float, 0.0f, L_FRAME32k / 2 ); - set_f( st->hFdCngDec->hFdCngCom->olapBufferAna_flt, 0.0f, FFTLEN ); -#ifdef IVAS_FLOAT_FIXED - set16_fx( st->hFdCngDec->hFdCngCom->olapBufferAna_fx, 0, FFTLEN ); -#endif // IVAS_FLOAT_FIXED - } + if ((st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD) && nchan_out == 2 && st->core_brate > SID_2k40 && (last_core_brate_st0 == FRAME_NO_DATA || last_core_brate_st0 == SID_2k40) && st->hTcxDec != NULL) + { + /* Last frame was Stereo CNG and the synthesis memory is outdated -- reset */ + set_f(st->hTcxDec->old_syn_Overl_float, 0.0f, L_FRAME32k / 2); + set_f(st->hFdCngDec->hFdCngCom->olapBufferAna_flt, 0.0f, FFTLEN); + } - set_f( st->agc_mem2, 0, 2 ); - st->mem_deemph = 0; - if ( !st->last_con_tcx ) - { - set_f( st->mem_syn2, 0.0f, M ); - } - set_f( st->mem_syn1, 0.0f, M ); - if ( st->hBWE_TD != NULL ) - { - st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; - } + set_f(st->agc_mem2, 0, 2); + st->mem_deemph = 0; + if (!st->last_con_tcx) + { + set_f(st->mem_syn2, 0.0f, M); + } + set_f(st->mem_syn1, 0.0f, M); + if (st->hBWE_TD != NULL) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } - /* Reset ACELP parameters */ - set_zero( st->mem_MA, M ); - if ( st->sr_core == INT_FS_16k ) - { - mvr2r( GEWB2_Ave, st->mem_AR, M ); - } - else - { - mvr2r( GEWB_Ave, st->mem_AR, M ); - } - st->tilt_code = 0.0f; - st->gc_threshold = 0.0f; - set_f( st->dispMem, 0, 8 ); + /* Reset ACELP parameters */ + set_zero(st->mem_MA, M); + if (st->sr_core == INT_FS_16k) + { + mvr2r(GEWB2_Ave, st->mem_AR, M); + } + else + { + mvr2r(GEWB_Ave, st->mem_AR, M); + } + st->tilt_code = 0.0f; + st->gc_threshold = 0.0f; + set_f(st->dispMem, 0, 8); - st->last_coder_type = GENERIC; + st->last_coder_type = GENERIC; - fer_energy( output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 ); - st->lp_gainp = 0.0f; - st->lp_gainc = (float) sqrt( st->lp_ener ); + fer_energy(output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1); + st->lp_gainp = 0.0f; + st->lp_gainc = (float)sqrt(st->lp_ener); - st->last_voice_factor = 0; - st->Last_GSC_noisy_speech_flag = 0; + st->last_voice_factor = 0; + st->Last_GSC_noisy_speech_flag = 0; - /* reset CLDFB memories */ - cldfb_reset_memory_ivas( st->cldfbAna ); - cldfb_reset_memory_ivas( st->cldfbBPF ); - cldfb_reset_memory_ivas( st->cldfbSyn ); + /* reset CLDFB memories */ + cldfb_reset_memory_ivas(st->cldfbAna); + cldfb_reset_memory_ivas(st->cldfbBPF); + cldfb_reset_memory_ivas(st->cldfbSyn); - /* reset TBE memories */ - if ( !st->last_con_tcx && !( ( st->last_core == HQ_CORE ) && st->element_mode > EVS_MONO ) ) - { - set_f( st->old_exc, 0, L_EXC_MEM_DEC ); - } - else if ( st->L_frame < L_FRAME16k ) - { - /* resample from 16kHz to 12.8kHZ */ - synth_mem_updt2_flt( st->L_frame, L_FRAME16k, st->old_exc, st->mem_syn_r_float, st->mem_syn2, NULL, DEC ); - } - - if ( st->hBWE_TD != NULL ) - { - set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); - } + /* reset TBE memories */ + if (!st->last_con_tcx && !((st->last_core == HQ_CORE) && st->element_mode > EVS_MONO)) + { + set_f(st->old_exc, 0, L_EXC_MEM_DEC); + } + else if (st->L_frame < L_FRAME16k) + { + /* resample from 16kHz to 12.8kHZ */ + synth_mem_updt2_flt(st->L_frame, L_FRAME16k, st->old_exc, st->mem_syn_r_float, st->mem_syn2, NULL, DEC); + } - if ( st->output_Fs >= 16000 && st->hBWE_zero != NULL ) - { - hf_synth_reset( st->hBWE_zero ); - } + if (st->hBWE_TD != NULL) + { + set_f(st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2); + } - if ( st->hBWE_FD != NULL ) - { - set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); - } + if (st->output_Fs >= 16000 && st->hBWE_zero != NULL) + { + hf_synth_reset(st->hBWE_zero); } - if ( ( st->core == ACELP_CORE || st->core == AMR_WB_CORE ) && ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) ) + if (st->hBWE_FD != NULL) { - if ( st->hBWE_TD != NULL ) - { - st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; - set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); - } + set_f(st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA(16000, DELAY_FD_BWE_ENC_NS)); + } + } - st->tilt_code = 0.0f; - st->gc_threshold = 0.0f; - set_f( st->dispMem, 0, 8 ); + if ((st->core == ACELP_CORE || st->core == AMR_WB_CORE) && (st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE)) + { + if (st->hBWE_TD != NULL) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + set_f(st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2); + } - st->last_coder_type = GENERIC; + st->tilt_code = 0.0f; + st->gc_threshold = 0.0f; + set_f(st->dispMem, 0, 8); - fer_energy( output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 ); - st->lp_gainp = 0.0f; - st->lp_gainc = (float) sqrt( st->lp_ener ); + st->last_coder_type = GENERIC; - st->last_voice_factor = 0; - st->Last_GSC_noisy_speech_flag = 0; + fer_energy(output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1); + st->lp_gainp = 0.0f; + st->lp_gainc = (float)sqrt(st->lp_ener); - if ( st->output_Fs >= 16000 && st->hBWE_zero != NULL ) - { - hf_synth_reset( st->hBWE_zero ); - } + st->last_voice_factor = 0; + st->Last_GSC_noisy_speech_flag = 0; - if ( st->hBWE_FD != NULL ) - { - set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); - } + if (st->output_Fs >= 16000 && st->hBWE_zero != NULL) + { + hf_synth_reset(st->hBWE_zero); + } - if ( nchan_out == 1 && st->element_mode == IVAS_CPE_DFT && st->element_brate <= IVAS_24k4 && last_element_brate > IVAS_24k4 ) - { - /* update cldbf state with previous frame TCX synthesis when going from a bitrate with residual coding to a bitrate without it */ - int16_t offset; - offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; - mvr2r( st->hTcxDec->old_synthFB + st->hTcxDec->old_synth_lenFB - offset, st->cldfbAna->cldfb_state, offset ); - } + if (st->hBWE_FD != NULL) + { + set_f(st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA(16000, DELAY_FD_BWE_ENC_NS)); } - if ( st->core == HQ_CORE && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE || ( ( st->element_mode != EVS_MONO ) && ( st->last_core != HQ_CORE ) ) ) ) + if (nchan_out == 1 && st->element_mode == IVAS_CPE_DFT && st->element_brate <= IVAS_24k4 && last_element_brate > IVAS_24k4) { - set_f( st->hHQ_core->prev_env, 0, SFM_N_WB ); - set_f( st->hHQ_core->prev_normq, 0, SFM_N_WB ); + /* update cldbf state with previous frame TCX synthesis when going from a bitrate with residual coding to a bitrate without it */ + int16_t offset; + offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; + mvr2r(st->hTcxDec->old_synthFB + st->hTcxDec->old_synth_lenFB - offset, st->cldfbAna->cldfb_state, offset); + } + } - set_f( st->hHQ_core->last_ni_gain, 0, BANDS_MAX ); - set_f( st->hHQ_core->last_env, 0, BANDS_MAX ); - st->hHQ_core->last_max_pos_pulse = 0; + if (st->core == HQ_CORE && (st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE || ((st->element_mode != EVS_MONO) && (st->last_core != HQ_CORE)))) + { + set_f(st->hHQ_core->prev_env, 0, SFM_N_WB); + set_f(st->hHQ_core->prev_normq, 0, SFM_N_WB); - set_s( st->hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); - st->hHQ_core->prev_frm_hfe2 = 0; - st->hHQ_core->prev_stab_hfe2 = 0; - if ( st->output_Fs > 16000 ) - { - set_f( st->hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE ); - } + set_f(st->hHQ_core->last_ni_gain, 0, BANDS_MAX); + set_f(st->hHQ_core->last_env, 0, BANDS_MAX); + st->hHQ_core->last_max_pos_pulse = 0; - if ( st->element_mode != EVS_MONO ) - { - /* Estimate mem_env_delta to reinit env_stab */ - tmp = max( 0, ENV_STAB_EST1 + ( ENV_STAB_EST2 * st->stab_fac_smooth_lt ) + ( ENV_STAB_EST3 * st->log_energy_diff_lt ) ); - st->hHQ_core->mem_env_delta = (int16_t) min( MAX16B, (int32_t) ( tmp * ( 1 << 12 ) ) ); /* Convert to Q12 and handle saturation */ + set_s(st->hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM); + st->hHQ_core->prev_frm_hfe2 = 0; + st->hHQ_core->prev_stab_hfe2 = 0; + if (st->output_Fs > 16000) + { + set_f(st->hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE); + } - if ( st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) - { - set_f( st->hHQ_core->old_out, 0, output_frame ); - set_f( st->hHQ_core->old_outLB, 0, L_FRAME16k ); - } + if (st->element_mode != EVS_MONO) + { + /* Estimate mem_env_delta to reinit env_stab */ + tmp = max(0, ENV_STAB_EST1 + (ENV_STAB_EST2 * st->stab_fac_smooth_lt) + (ENV_STAB_EST3 * st->log_energy_diff_lt)); + st->hHQ_core->mem_env_delta = (int16_t)min(MAX16B, (int32_t)(tmp * (1 << 12))); /* Convert to Q12 and handle saturation */ - st->hHQ_core->no_att_hangover = 0; - st->hHQ_core->energy_lt = 300.0f; + if (st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE) + { + set_f(st->hHQ_core->old_out, 0, output_frame); + set_f(st->hHQ_core->old_outLB, 0, L_FRAME16k); + } - set_s( st->hHQ_core->old_is_transient, 0, 3 ); - set_f( st->hHQ_core->prev_noise_level, 0.0f, 2 ); - st->hHQ_core->prev_R = 0; - set_s( st->hHQ_core->mem_norm + 1, 39, SFM_N_ENV_STAB - 1 ); - st->hHQ_core->prev_hqswb_clas = HQ_NORMAL; - st->hHQ_core->prev_ni_ratio = 0.5f; - set_f( st->hHQ_core->prev_En_sb, 0.0f, NB_SWB_SUBBANDS ); - } - else - { - set_f( st->hHQ_core->old_out, 0, output_frame ); - set_f( st->hHQ_core->old_outLB, 0, L_FRAME16k ); - } - } + st->hHQ_core->no_att_hangover = 0; + st->hHQ_core->energy_lt = 300.0f; - /* handle switching cases where preecho_sb was not called in the last frame (memory not up to date) */ - if ( st->hHQ_core != NULL ) + set_s(st->hHQ_core->old_is_transient, 0, 3); + set_f(st->hHQ_core->prev_noise_level, 0.0f, 2); + st->hHQ_core->prev_R = 0; + set_s(st->hHQ_core->mem_norm + 1, 39, SFM_N_ENV_STAB - 1); + st->hHQ_core->prev_hqswb_clas = HQ_NORMAL; + st->hHQ_core->prev_ni_ratio = 0.5f; + set_f(st->hHQ_core->prev_En_sb, 0.0f, NB_SWB_SUBBANDS); + } + else { - st->hHQ_core->pastpre--; - if ( st->hHQ_core->pastpre <= 0 ) - { - reset_preecho_dec( st->hHQ_core ); - } + set_f(st->hHQ_core->old_out, 0, output_frame); + set_f(st->hHQ_core->old_outLB, 0, L_FRAME16k); } + } - if ( st->core_brate == FRAME_NO_DATA ) + /* handle switching cases where preecho_sb was not called in the last frame (memory not up to date) */ + if (st->hHQ_core != NULL) + { + st->hHQ_core->pastpre--; + if (st->hHQ_core->pastpre <= 0) { - st->VAD = 0; - st->m_frame_type = ZERO_FRAME; + reset_preecho_dec(st->hHQ_core); } - else if ( st->core_brate == SID_2k40 || st->core_brate == SID_1k75 ) + } + + if (st->core_brate == FRAME_NO_DATA) + { + st->VAD = 0; + st->m_frame_type = ZERO_FRAME; + } + else if (st->core_brate == SID_2k40 || st->core_brate == SID_1k75) + { + st->VAD = 0; + st->m_frame_type = SID_FRAME; + } + else + { + st->VAD = 1; + st->m_frame_type = ACTIVE_FRAME; + } + + /*switch on CNA on active frames*/ + if (st->element_mode == EVS_MONO) /* for IVAS modes, st->flag_cna is set earlier */ + { + if (st->VAD && ((st->core != AMR_WB_CORE && st->total_brate <= CNA_MAX_BRATE) || (st->core == AMR_WB_CORE && st->total_brate <= ACELP_8k85))) { - st->VAD = 0; - st->m_frame_type = SID_FRAME; + st->flag_cna = 1; } - else + else if (st->VAD || ((st->cng_type == FD_CNG) && (st->L_frame == L_FRAME16k))) { - st->VAD = 1; - st->m_frame_type = ACTIVE_FRAME; + st->flag_cna = 0; } + } - /*switch on CNA on active frames*/ - if ( st->element_mode == EVS_MONO ) /* for IVAS modes, st->flag_cna is set earlier */ - { - if ( st->VAD && ( ( st->core != AMR_WB_CORE && st->total_brate <= CNA_MAX_BRATE ) || ( st->core == AMR_WB_CORE && st->total_brate <= ACELP_8k85 ) ) ) - { - st->flag_cna = 1; - } - else if ( st->VAD || ( ( st->cng_type == FD_CNG ) && ( st->L_frame == L_FRAME16k ) ) ) - { - st->flag_cna = 0; - } - } + if (st->core == AMR_WB_CORE) + { + st->cng_type = LP_CNG; + } - if ( st->core == AMR_WB_CORE ) + /* Reconfigure CNG */ + if (st->hFdCngDec && ((st->last_L_frame != st->L_frame) || (st->hFdCngDec->hFdCngCom->frameSize != st->L_frame) || st->ini_frame == 0 || st->bwidth != st->last_bwidth)) + { + /* || st->last_core == AMR_WB_CORE || st->last_codec_mode == MODE2)){*/ + if (st->core != AMR_WB_CORE) { - st->cng_type = LP_CNG; + configureFdCngDec(st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode); } + else + { + configureFdCngDec(st->hFdCngDec, WB, ACELP_8k00, st->L_frame, st->last_L_frame, st->element_mode); - /* Reconfigure CNG */ - if ( st->hFdCngDec && ( ( st->last_L_frame != st->L_frame ) || ( st->hFdCngDec->hFdCngCom->frameSize != st->L_frame ) || st->ini_frame == 0 || st->bwidth != st->last_bwidth ) ) + if (st->VAD) + { + st->hFdCngDec->hFdCngCom->CngBitrate = st->total_brate; + } + } + if (st->last_L_frame != st->L_frame && st->L_frame <= L_FRAME16k && st->last_L_frame <= L_FRAME16k) { - /* || st->last_core == AMR_WB_CORE || st->last_codec_mode == MODE2)){*/ - if ( st->core != AMR_WB_CORE ) + if (st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD) + { + lerp_flt(st->hFdCngDec->hFdCngCom->olapBufferAna_flt + st->last_L_frame, st->hFdCngDec->hFdCngCom->olapBufferAna_flt + st->L_frame, st->L_frame, st->last_L_frame); + } + + lerp_flt(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->L_frame * 2, st->last_L_frame * 2); + + if (st->total_brate <= SID_2k40 && st->last_total_brate <= SID_2k40) + { + lerp_flt(st->hFdCngDec->hFdCngCom->olapBufferSynth_flt, st->hFdCngDec->hFdCngCom->olapBufferSynth_flt, st->L_frame * 2, st->last_L_frame * 2); + + if (st->L_frame == L_FRAME) { - configureFdCngDec_flt( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); - configureFdCngDec( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + for (i = 0; i < st->L_frame * 2; i++) + { + st->hFdCngDec->hFdCngCom->olapBufferSynth_flt[i] = st->hFdCngDec->hFdCngCom->olapBufferSynth_flt[i] * 0.6250f; + } } else { - configureFdCngDec_flt( st->hFdCngDec, WB, ACELP_8k00, st->L_frame, st->last_L_frame, st->element_mode ); - configureFdCngDec( st->hFdCngDec, WB, ACELP_8k00, st->L_frame, st->last_L_frame, st->element_mode ); - - if ( st->VAD ) - { - st->hFdCngDec->hFdCngCom->CngBitrate = st->total_brate; - } - } - if ( st->last_L_frame != st->L_frame && st->L_frame <= L_FRAME16k && st->last_L_frame <= L_FRAME16k ) - { - if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) - { - lerp_flt( st->hFdCngDec->hFdCngCom->olapBufferAna_flt + st->last_L_frame, st->hFdCngDec->hFdCngCom->olapBufferAna_flt + st->L_frame, st->L_frame, st->last_L_frame ); -#ifdef IVAS_FLOAT_FIXED - lerp( st->hFdCngDec->hFdCngCom->olapBufferAna_fx + st->last_L_frame, st->hFdCngDec->hFdCngCom->olapBufferAna_fx + st->L_frame, st->L_frame, st->last_L_frame ); -#endif // IVAS_FLOAT_FIXED - } - - lerp_flt( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->L_frame * 2, st->last_L_frame * 2 ); - - if ( st->total_brate <= SID_2k40 && st->last_total_brate <= SID_2k40 ) - { - lerp_flt( st->hFdCngDec->hFdCngCom->olapBufferSynth_flt, st->hFdCngDec->hFdCngCom->olapBufferSynth_flt, st->L_frame * 2, st->last_L_frame * 2 ); - - if ( st->L_frame == L_FRAME ) - { - for ( i = 0; i < st->L_frame * 2; i++ ) - { - st->hFdCngDec->hFdCngCom->olapBufferSynth_flt[i] = st->hFdCngDec->hFdCngCom->olapBufferSynth_flt[i] * 0.6250f; - } - } - else - { - for ( i = 0; i < st->L_frame * 2; i++ ) - { - st->hFdCngDec->hFdCngCom->olapBufferSynth_flt[i] = st->hFdCngDec->hFdCngCom->olapBufferSynth_flt[i] * 1.6f; - } - } - } + for (i = 0; i < st->L_frame * 2; i++) + { + st->hFdCngDec->hFdCngCom->olapBufferSynth_flt[i] = st->hFdCngDec->hFdCngCom->olapBufferSynth_flt[i] * 1.6f; + } } } + } + } - return error; + return error; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * core_switching_post_dec() * * Postprocessing for ACELP/HQ core switching *---------------------------------------------------------------------*/ ivas_error core_switching_post_dec( - Decoder_State *st, /* i/o: decoder state structure */ - float *synth, /* i/o: output synthesis */ - float *output, /* i/o: LB synth/upsampled LB synth */ - float output_mem[], /* i : OLA memory from last TCX/HQ frame */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const int16_t output_frame, /* i : frame length */ - const int16_t core_switching_flag, /* i : ACELP->HQ switching flag */ - const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const int16_t nchan_out, /* i : number of output channels */ - const int16_t last_element_mode /* i : element mode of previous frame */ + Decoder_State *st, /* i/o: decoder state structure */ + float *synth, /* i/o: output synthesis */ + float *output, /* i/o: LB synth/upsampled LB synth */ + float output_mem[], /* i : OLA memory from last TCX/HQ frame */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t output_frame, /* i : frame length */ + const int16_t core_switching_flag, /* i : ACELP->HQ switching flag */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const int16_t nchan_out, /* i : number of output channels */ + const int16_t last_element_mode /* i : element mode of previous frame */ ) { - int16_t i, delay_comp, delta; -#ifdef IVAS_FLOAT_FIXED - Word32 synth_fx[960]; - //Word32 output_fx[1500]; -#endif - float tmpF; - float tmpDelta; - float synth_subfr_out[SWITCH_MAX_GAP], synth_subfr_bwe[SWITCH_MAX_GAP]; - float mem_synth[NS2SA( 16000, DELAY_CLDFB_NS ) + 2]; - int16_t nZeros; - int16_t offset; - ivas_error error; - - error = IVAS_ERR_OK; - - if ( st->core == ACELP_CORE && st->bfi && st->hHQ_core != NULL && !st->con_tcx ) - { - if ( ( error = acelp_core_switch_dec_bfi( st ) ) != IVAS_ERR_OK ) - { + int16_t i, delay_comp, delta; + float tmpF; + float tmpDelta; + float synth_subfr_out[SWITCH_MAX_GAP], synth_subfr_bwe[SWITCH_MAX_GAP]; + float mem_synth[NS2SA(16000, DELAY_CLDFB_NS) + 2]; + int16_t nZeros; + int16_t offset; + ivas_error error; + + error = IVAS_ERR_OK; + + if (st->core == ACELP_CORE && st->bfi && st->hHQ_core != NULL && !st->con_tcx) + { + if ((error = acelp_core_switch_dec_bfi(st)) != IVAS_ERR_OK) + { + return error; + } + } + + /* set multiplication factor according to the sampling rate */ + delta = 1; + if (output_frame == L_FRAME16k) + { + delta = 2; + } + else if (output_frame == L_FRAME32k) + { + delta = 4; + } + else if (output_frame == L_FRAME48k) + { + delta = 6; + } + + /* set delay compensation between HQ synthesis and ACELP synthesis */ + delay_comp = delta * HQ_DELAY_COMP; + + /* Core switching done in DFT domain afterward*/ + if ((st->element_mode != IVAS_CPE_DFT || use_cldfb_for_dft) && (!sba_dirac_stereo_flag || (sba_dirac_stereo_flag && st->core_brate == SID_2k40 && st->cng_type == FD_CNG))) + { + if (st->core == HQ_CORE || st->core == TCX_20_CORE || st->core == TCX_10_CORE || (st->core == ACELP_CORE && st->bfi == 1 && st->con_tcx == 1)) + { + st->use_acelp_preq = 0; + if (st->hBWE_FD != NULL) + { + st->hBWE_FD->mem_deemph_old_syn = 0.0f; + } + + if (st->element_mode == EVS_MONO && st->core == HQ_CORE) /* ACELP->HQ-CORE */ + { + if (core_switching_flag && st->last_L_frame == st->last_L_frame_ori && (st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE)) + { + if ((error = acelp_core_switch_dec(st, synth_subfr_out, synth_subfr_bwe, output_frame, core_switching_flag, mem_synth, nchan_out)) != IVAS_ERR_OK) + { return error; + } } - } - - /* set multiplication factor according to the sampling rate */ - delta = 1; - if ( output_frame == L_FRAME16k ) - { - delta = 2; - } - else if ( output_frame == L_FRAME32k ) - { - delta = 4; - } - else if ( output_frame == L_FRAME48k ) - { - delta = 6; - } - - /* set delay compensation between HQ synthesis and ACELP synthesis */ - delay_comp = delta * HQ_DELAY_COMP; - /* Core switching done in DFT domain afterward*/ - if ( ( st->element_mode != IVAS_CPE_DFT || use_cldfb_for_dft ) && ( !sba_dirac_stereo_flag || ( sba_dirac_stereo_flag && st->core_brate == SID_2k40 && st->cng_type == FD_CNG ) ) ) - { - if ( st->core == HQ_CORE || st->core == TCX_20_CORE || st->core == TCX_10_CORE || ( st->core == ACELP_CORE && st->bfi == 1 && st->con_tcx == 1 ) ) + if (core_switching_flag && st->last_core == HQ_CORE && st->prev_bfi) { - st->use_acelp_preq = 0; - if ( st->hBWE_FD != NULL ) - { - st->hBWE_FD->mem_deemph_old_syn = 0.0f; - } - - if ( st->element_mode == EVS_MONO && st->core == HQ_CORE ) /* ACELP->HQ-CORE */ - { - if ( core_switching_flag && st->last_L_frame == st->last_L_frame_ori && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) - { - if ( ( error = acelp_core_switch_dec( st, synth_subfr_out, synth_subfr_bwe, output_frame, core_switching_flag, mem_synth, nchan_out ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - if ( core_switching_flag && st->last_core == HQ_CORE && st->prev_bfi ) - { - mvr2r( st->delay_buf_out, synth_subfr_out, delay_comp ); - } - } + mvr2r(st->delay_buf_out, synth_subfr_out, delay_comp); + } + } - /* delay HQ synthesis to synchronize with ACELP synthesis */ -#ifdef IVAS_FLOAT_FIXED - floatToFixed_arrL(synth, synth_fx, Q11, 960); - floatToFixed_arrL(st->delay_buf_out, st->delay_buf_out32_fx, Q11, 60); + /* delay HQ synthesis to synchronize with ACELP synthesis */ + delay_signal_float(synth, output_frame, st->delay_buf_out, delay_comp); - delay_signal_fx( synth_fx, output_frame, st->delay_buf_out32_fx, delay_comp ); + if (st->element_mode == EVS_MONO && st->core == HQ_CORE) /* ACELP->HQ-CORE */ + { + if (core_switching_flag && st->last_L_frame == st->last_L_frame_ori && (st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE)) + { + core_switching_OLA(mem_synth, st->last_L_frame, st->output_Fs, synth, synth_subfr_out, synth_subfr_bwe, output_frame, st->bwidth); + } + else if (core_switching_flag && st->last_core == HQ_CORE && st->prev_bfi) /* HQ | ACELP | TRANSITION with ACELP frame lost */ + { + /* Overlap between old->out[] (stocked in st->fer_samples[]) and good HQ frame on L/2 */ + nZeros = (int16_t)(NS2SA(st->output_Fs, N_ZERO_MDCT_NS)); + tmpDelta = 1.0f / (float)(output_frame >> 1); + for (i = 0; i < (output_frame >> 1); i++) + { + tmpF = (float)i * tmpDelta; + synth[i + delay_comp] = (1 - tmpF) * st->hHQ_core->fer_samples[i + nZeros] + synth[i + delay_comp] * tmpF; + } + } + else if ((!core_switching_flag && st->core == HQ_CORE && (st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE)) || /* ACELP | TRANSITION | HQ with TRANSITION lost */ + (core_switching_flag && st->prev_bfi && st->last_L_frame != st->last_L_frame_ori)) /* ACELP@12k8 | ACELP@16k | TRANSITION with ACELP@16k lost */ + { + /* Overlap between CELP estimation (BFI) and good HQ frame on L/2 */ + tmpDelta = 1.0f / (float)(output_frame >> 1); + for (i = 0; i < (output_frame >> 1); i++) + { + tmpF = (float)i * tmpDelta; + synth[i] = synth[i] * tmpF + (1 - tmpF) * st->hHQ_core->fer_samples[i]; + } + } + } + else if (((st->last_core == ACELP_CORE || st->last_core_bfi == ACELP_CORE) && !(st->prev_bfi == 1 && st->last_con_tcx == 1)) || st->last_core == AMR_WB_CORE) /*ACELP->TCX/HQ*/ + { + /* if this is first active MDCT-Stereo frame after a CNG frame and output format is mono DMX, this should only be done for the zero-th channel, the other one will simply be copied over after this function */ + if (((st->last_core_brate != SID_2k40 && st->last_core_brate != FRAME_NO_DATA) || (st->element_mode != IVAS_CPE_DFT && st->element_mode != IVAS_CPE_TD) || nchan_out == 1) && !(st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 && (nchan_out == 1 || last_element_mode == IVAS_CPE_DFT))) + { + core_switch_lb_upsamp(st, output); + } - fixedToFloat_arrL(synth_fx, synth, Q11, 960); - fixedToFloat_arrL(st->delay_buf_out32_fx, st->delay_buf_out, Q11, 60); -#else - delay_signal_float( synth, output_frame, st->delay_buf_out, delay_comp ); -#endif + mvr2r(st->previoussynth, synth, delay_comp); - if ( st->element_mode == EVS_MONO && st->core == HQ_CORE ) /* ACELP->HQ-CORE */ - { - if ( core_switching_flag && st->last_L_frame == st->last_L_frame_ori && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) - { - core_switching_OLA( mem_synth, st->last_L_frame, st->output_Fs, synth, synth_subfr_out, synth_subfr_bwe, output_frame, st->bwidth ); - } - else if ( core_switching_flag && st->last_core == HQ_CORE && st->prev_bfi ) /* HQ | ACELP | TRANSITION with ACELP frame lost */ - { - /* Overlap between old->out[] (stocked in st->fer_samples[]) and good HQ frame on L/2 */ - nZeros = (int16_t) ( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); - tmpDelta = 1.0f / (float) ( output_frame >> 1 ); - for ( i = 0; i < ( output_frame >> 1 ); i++ ) - { - tmpF = (float) i * tmpDelta; - synth[i + delay_comp] = ( 1 - tmpF ) * st->hHQ_core->fer_samples[i + nZeros] + synth[i + delay_comp] * tmpF; - } - } - else if ( ( !core_switching_flag && st->core == HQ_CORE && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) || /* ACELP | TRANSITION | HQ with TRANSITION lost */ - ( core_switching_flag && st->prev_bfi && st->last_L_frame != st->last_L_frame_ori ) ) /* ACELP@12k8 | ACELP@16k | TRANSITION with ACELP@16k lost */ - { - /* Overlap between CELP estimation (BFI) and good HQ frame on L/2 */ - tmpDelta = 1.0f / (float) ( output_frame >> 1 ); - for ( i = 0; i < ( output_frame >> 1 ); i++ ) - { - tmpF = (float) i * tmpDelta; - synth[i] = synth[i] * tmpF + ( 1 - tmpF ) * st->hHQ_core->fer_samples[i]; - } - } - } - else if ( ( ( st->last_core == ACELP_CORE || st->last_core_bfi == ACELP_CORE ) && !( st->prev_bfi == 1 && st->last_con_tcx == 1 ) ) || st->last_core == AMR_WB_CORE ) /*ACELP->TCX/HQ*/ - { - /* if this is first active MDCT-Stereo frame after a CNG frame and output format is mono DMX, this should only be done for the zero-th channel, the other one will simply be copied over after this function */ - if ( ( ( st->last_core_brate != SID_2k40 && st->last_core_brate != FRAME_NO_DATA ) || ( st->element_mode != IVAS_CPE_DFT && st->element_mode != IVAS_CPE_TD ) || nchan_out == 1 ) && !( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 && ( nchan_out == 1 || last_element_mode == IVAS_CPE_DFT ) ) ) - { - core_switch_lb_upsamp( st, output ); - } + /* Overlap between TCX-LB and TCX-FB*/ + tmpDelta = NS2SA(st->output_Fs, DELAY_BWE_TOTAL_NS); + for (i = 0; i < tmpDelta; i++) + { + synth[i + delay_comp] = (synth[i + delay_comp] * i + (tmpDelta - i) * st->previoussynth[i + delay_comp]) / tmpDelta; + } - mvr2r( st->previoussynth, synth, delay_comp ); + if ((st->element_mode == IVAS_CPE_MDCT || (ivas_format == ISM_FORMAT && st->core == TCX_20_CORE /* <- means TCX in general, TCX10 is forbidden after ACELP */)) && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40) + { + /* smooth transitions to avoid pops in car noise items */ + smoothTransitionDtxToTcx(synth, output_frame, delay_comp); + } - /* Overlap between TCX-LB and TCX-FB*/ - tmpDelta = NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ); - for ( i = 0; i < tmpDelta; i++ ) - { - synth[i + delay_comp] = ( synth[i + delay_comp] * i + ( tmpDelta - i ) * st->previoussynth[i + delay_comp] ) / tmpDelta; - } + /* Reset memories of CLDFBs */ + if (st->cldfbAna != NULL) + { + if (st->cldfbAna->no_channels * st->cldfbAna->no_col != st->L_frame) + { + configureCldfb_ivas(st->cldfbAna, st->L_frame * FRAMES_PER_SEC); + configureCldfb_ivas(st->cldfbBPF, min(16000, st->L_frame * FRAMES_PER_SEC)); + } - if ( ( st->element_mode == IVAS_CPE_MDCT || ( ivas_format == ISM_FORMAT && st->core == TCX_20_CORE /* <- means TCX in general, TCX10 is forbidden after ACELP */ ) ) && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40 ) - { - /* smooth transitions to avoid pops in car noise items */ -#ifdef IVAS_FLOAT_FIXED + cldfb_reset_memory_ivas(st->cldfbAna); + cldfb_reset_memory_ivas(st->cldfbBPF); + } + cldfb_reset_memory_ivas(st->cldfbSyn); - for ( int lp = 0; lp < 960; lp++ ) - { - synth_fx[lp] = (Word32) ( synth[lp] * ( 1u << 4 ) ); - } - smoothTransitionDtxToTcx_fx( synth_fx, output_frame, delay_comp ); - for ( int lp = 0; lp < 2 * delay_comp; lp++ ) - { - synth[lp] = (float) synth_fx[lp] / ( 1u << 4 ); - } -#else - smoothTransitionDtxToTcx( synth, output_frame, delay_comp ); -#endif - } + /* Update memories for CLDFB ana for eventual next ACELP frame */ + if (st->cldfbAna != NULL) + { + delta = st->cldfbAna->no_channels; + offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; + for (i = 0; i < delta; i++) + { + st->cldfbAna->cldfb_state[offset - delta + i] = + output[st->L_frame - delta + i] * ((float)(i + 1)) / ((float)delta); + } + } + } + else if (st->element_mode != EVS_MONO) + { + /* Reset memories of CLDFBs */ + if (st->cldfbAna != NULL) + { + if (st->cldfbAna->no_channels * st->cldfbAna->no_col != st->L_frame) + { + configureCldfb_ivas(st->cldfbAna, st->L_frame * FRAMES_PER_SEC); + configureCldfb_ivas(st->cldfbBPF, min(16000, st->L_frame * FRAMES_PER_SEC)); + } - /* Reset memories of CLDFBs */ - if ( st->cldfbAna != NULL ) - { - if ( st->cldfbAna->no_channels * st->cldfbAna->no_col != st->L_frame ) - { - configureCldfb_ivas( st->cldfbAna, st->L_frame * FRAMES_PER_SEC ); - configureCldfb_ivas( st->cldfbBPF, min( 16000, st->L_frame * FRAMES_PER_SEC ) ); - } + cldfb_reset_memory_ivas(st->cldfbAna); + cldfb_reset_memory_ivas(st->cldfbBPF); + } - cldfb_reset_memory_ivas( st->cldfbAna ); - cldfb_reset_memory_ivas( st->cldfbBPF ); - } - cldfb_reset_memory_ivas( st->cldfbSyn ); + if (st->cldfbSyn != NULL) + { + cldfb_reset_memory_ivas(st->cldfbSyn); + } - /* Update memories for CLDFB ana for eventual next ACELP frame */ - if ( st->cldfbAna != NULL ) - { - delta = st->cldfbAna->no_channels; - offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; - for ( i = 0; i < delta; i++ ) - { - st->cldfbAna->cldfb_state[offset - delta + i] = - output[st->L_frame - delta + i] * ( (float) ( i + 1 ) ) / ( (float) delta ); - } - } - } - else if ( st->element_mode != EVS_MONO ) - { - /* Reset memories of CLDFBs */ - if ( st->cldfbAna != NULL ) - { - if ( st->cldfbAna->no_channels * st->cldfbAna->no_col != st->L_frame ) - { - configureCldfb_ivas( st->cldfbAna, st->L_frame * FRAMES_PER_SEC ); - configureCldfb_ivas( st->cldfbBPF, min( 16000, st->L_frame * FRAMES_PER_SEC ) ); - } + /* Update memories for CLDFB ana for eventual next ACELP frame */ + /* Analysis CLDF memory is fed with ramped signal for last slot */ + if (st->cldfbAna != NULL) + { + delta = st->cldfbAna->no_channels; + offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; + for (i = 0; i < delta; i++) + { + st->cldfbAna->cldfb_state[offset - delta + i] = + output[st->L_frame - delta + i] * ((float)(i + 1)) / ((float)delta); + } + } + } - cldfb_reset_memory_ivas( st->cldfbAna ); - cldfb_reset_memory_ivas( st->cldfbBPF ); - } + if (st->hBWE_TD != NULL) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; + } - if ( st->cldfbSyn != NULL ) - { - cldfb_reset_memory_ivas( st->cldfbSyn ); - } + if (st->hHQ_core != NULL && !(inner_frame_tbl[st->bwidth] == L_FRAME16k && st->core_brate <= HQ_32k)) + { + set_f(st->hHQ_core->prev_env, 0, SFM_N_WB); + set_f(st->hHQ_core->prev_normq, 0, SFM_N_WB); + } - /* Update memories for CLDFB ana for eventual next ACELP frame */ - /* Analysis CLDF memory is fed with ramped signal for last slot */ - if ( st->cldfbAna != NULL ) - { - delta = st->cldfbAna->no_channels; - offset = st->cldfbAna->p_filter_length - st->cldfbAna->no_channels; - for ( i = 0; i < delta; i++ ) - { - st->cldfbAna->cldfb_state[offset - delta + i] = - output[st->L_frame - delta + i] * ( (float) ( i + 1 ) ) / ( (float) delta ); - } - } - } + mvr2r(synth, st->previoussynth, output_frame); - if ( st->hBWE_TD != NULL ) - { - st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; - } + /*Set post-filtering flag to zero*/ + if (st->hBPF != NULL) + { + st->hPFstat->on = 0; + } +} + else + { + /* MDCT to ACELP transition */ + if (st->last_core == HQ_CORE || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE) + { + nZeros = (int16_t)(NS2SA(st->output_Fs, N_ZERO_MDCT_NS)); + mvr2r(st->delay_buf_out, synth, delay_comp); /* copy the HQ/ACELP delay synchronization buffer at the beginning of ACELP frame */ - if ( st->hHQ_core != NULL && !( inner_frame_tbl[st->bwidth] == L_FRAME16k && st->core_brate <= HQ_32k ) ) - { - set_f( st->hHQ_core->prev_env, 0, SFM_N_WB ); - set_f( st->hHQ_core->prev_normq, 0, SFM_N_WB ); - } + if (st->prev_bfi && st->hHQ_core != NULL && st->hHQ_core->HqVoicing && st->last_core == HQ_CORE) + { + mvr2r(st->hHQ_core->fer_samples, st->hHQ_core->old_out + nZeros, NS2SA(st->output_Fs, 3000000)); + } - mvr2r( synth, st->previoussynth, output_frame ); + tmpF = 1.0f / (float)NS2SA(st->output_Fs, 3000000); - /*Set post-filtering flag to zero*/ - if ( st->hBPF != NULL ) - { - st->hPFstat->on = 0; - } + if (st->element_mode == IVAS_CPE_TD && st->hHQ_core == NULL) + { + for (i = 0; i < NS2SA(st->output_Fs, 3000000); i++) + { + synth[i + delay_comp] = (1 - tmpF * (float)i) * output_mem[i] + tmpF * (float)i * synth[i + delay_comp]; + } + } + else if (st->element_mode == IVAS_CPE_MDCT && st->core_brate <= SID_2k40 && st->prev_bfi) + { + for (i = 0; i < NS2SA(st->output_Fs, 3000000); i++) + { + synth[i + delay_comp] = (1 - tmpF * (float)i) * st->hHQ_core->old_out[i + nZeros] * st->hTcxDec->conceal_eof_gain_float + tmpF * (float)i * synth[i + delay_comp]; + } } else { - /* MDCT to ACELP transition */ - if ( st->last_core == HQ_CORE || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) - { - nZeros = (int16_t) ( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); - mvr2r( st->delay_buf_out, synth, delay_comp ); /* copy the HQ/ACELP delay synchronization buffer at the beginning of ACELP frame */ - - if ( st->prev_bfi && st->hHQ_core != NULL && st->hHQ_core->HqVoicing && st->last_core == HQ_CORE ) - { - mvr2r( st->hHQ_core->fer_samples, st->hHQ_core->old_out + nZeros, NS2SA( st->output_Fs, 3000000 ) ); - } - - tmpF = 1.0f / (float) NS2SA( st->output_Fs, 3000000 ); - - if ( st->element_mode == IVAS_CPE_TD && st->hHQ_core == NULL ) - { - for ( i = 0; i < NS2SA( st->output_Fs, 3000000 ); i++ ) - { - synth[i + delay_comp] = ( 1 - tmpF * (float) i ) * output_mem[i] + tmpF * (float) i * synth[i + delay_comp]; - } - } - else if ( st->element_mode == IVAS_CPE_MDCT && st->core_brate <= SID_2k40 && st->prev_bfi ) - { - for ( i = 0; i < NS2SA( st->output_Fs, 3000000 ); i++ ) - { - synth[i + delay_comp] = ( 1 - tmpF * (float) i ) * st->hHQ_core->old_out[i + nZeros] * st->hTcxDec->conceal_eof_gain_float + tmpF * (float) i * synth[i + delay_comp]; - } - } - else - { - for ( i = 0; i < NS2SA( st->output_Fs, 3000000 ); i++ ) - { - synth[i + delay_comp] = ( 1 - tmpF * (float) i ) * st->hHQ_core->old_out[i + nZeros] + tmpF * (float) i * synth[i + delay_comp]; - } - } - } - - set_f( st->delay_buf_out, 0, HQ_DELTA_MAX * HQ_DELAY_COMP ); - if ( st->hHQ_core != NULL ) - { - st->hHQ_core->oldHqVoicing = 0; - } + for (i = 0; i < NS2SA(st->output_Fs, 3000000); i++) + { + synth[i + delay_comp] = (1 - tmpF * (float)i) * st->hHQ_core->old_out[i + nZeros] + tmpF * (float)i * synth[i + delay_comp]; + } } - } - else - { - /* memory update needed for DFT stereo -> TD stereo switching */ - mvr2r( synth + output_frame - delay_comp, st->delay_buf_out, delay_comp ); - } + } - /* reset SWB BWE buffers */ - if ( st->bws_cnt == 0 || ( st->bws_cnt > 0 && st->coder_type != INACTIVE && st->coder_type != AUDIO ) ) - { - st->attenu1 = 0.1f; + set_f(st->delay_buf_out, 0, HQ_DELTA_MAX * HQ_DELAY_COMP); + if (st->hHQ_core != NULL) + { + st->hHQ_core->oldHqVoicing = 0; + } } + } + else + { + /* memory update needed for DFT stereo -> TD stereo switching */ + mvr2r(synth + output_frame - delay_comp, st->delay_buf_out, delay_comp); + } - if ( st->hBWE_FD != NULL && - ( ( st->last_extl != SWB_BWE && st->extl == SWB_BWE ) || ( st->last_extl != FB_BWE && st->extl == FB_BWE ) || - ( ( st->last_core == HQ_CORE || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE || st->last_extl == SWB_TBE ) && st->extl < 0 && st->core == ACELP_CORE ) || ( st->last_core == ACELP_CORE && st->core == ACELP_CORE && ( ( st->prev_coder_type != INACTIVE && st->coder_type != INACTIVE ) || ( st->prev_coder_type != AUDIO && st->coder_type == AUDIO ) ) && st->bws_cnt > 0 ) ) ) - { - set_f( st->hBWE_FD->old_wtda_swb, 0, output_frame ); + /* reset SWB BWE buffers */ + if (st->bws_cnt == 0 || (st->bws_cnt > 0 && st->coder_type != INACTIVE && st->coder_type != AUDIO)) + { + st->attenu1 = 0.1f; + } - if ( st->last_extl != WB_BWE ) - { - st->hBWE_FD->prev_mode = NORMAL; - } + if (st->hBWE_FD != NULL && + ((st->last_extl != SWB_BWE && st->extl == SWB_BWE) || (st->last_extl != FB_BWE && st->extl == FB_BWE) || + ((st->last_core == HQ_CORE || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE || st->last_extl == SWB_TBE) && st->extl < 0 && st->core == ACELP_CORE) || (st->last_core == ACELP_CORE && st->core == ACELP_CORE && ((st->prev_coder_type != INACTIVE && st->coder_type != INACTIVE) || (st->prev_coder_type != AUDIO && st->coder_type == AUDIO)) && st->bws_cnt > 0))) + { + set_f(st->hBWE_FD->old_wtda_swb, 0, output_frame); - st->hBWE_FD->prev_Energy = 0.0f; - st->hBWE_FD->prev_L_swb_norm = 8; - st->hBWE_FD->prev_frica_flag = 0; - set_f( st->hBWE_FD->mem_imdct, 0, L_FRAME48k ); - st->hBWE_FD->prev_td_energy = 0.0f; - st->hBWE_FD->prev_weight = 0.2f; - st->hBWE_FD->prev_fb_ener_adjust = 0.0f; - } - - /* reset WB BWE buffers */ - if ( st->last_extl != WB_BWE && st->extl == WB_BWE && st->hBWE_FD != NULL ) + if (st->last_extl != WB_BWE) { - set_f( st->hBWE_FD->old_wtda_swb, 0, output_frame ); + st->hBWE_FD->prev_mode = NORMAL; + } - if ( st->last_extl != SWB_BWE && st->last_extl != FB_BWE ) - { - st->hBWE_FD->prev_mode = NORMAL; - } + st->hBWE_FD->prev_Energy = 0.0f; + st->hBWE_FD->prev_L_swb_norm = 8; + st->hBWE_FD->prev_frica_flag = 0; + set_f(st->hBWE_FD->mem_imdct, 0, L_FRAME48k); + st->hBWE_FD->prev_td_energy = 0.0f; + st->hBWE_FD->prev_weight = 0.2f; + st->hBWE_FD->prev_fb_ener_adjust = 0.0f; + } - st->hBWE_FD->prev_Energy_wb = 0.0f; - st->hBWE_FD->prev_L_swb_norm = 8; - set_f( st->hBWE_FD->mem_imdct, 0, L_FRAME48k ); - st->hBWE_FD->prev_flag = 0; - } + /* reset WB BWE buffers */ + if (st->last_extl != WB_BWE && st->extl == WB_BWE && st->hBWE_FD != NULL) + { + set_f(st->hBWE_FD->old_wtda_swb, 0, output_frame); - /* reset TBE buffers */ - if ( st->hBWE_TD != NULL ) + if (st->last_extl != SWB_BWE && st->last_extl != FB_BWE) { - /* reset SWB TBE buffers */ - if ( ( ( st->extl == SWB_TBE || st->extl == FB_TBE || st->extl == SWB_CNG ) && - ( st->L_frame != st->last_L_frame || ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) || st->last_core == HQ_CORE ) ) || - ( st->bwidth < st->last_bwidth && st->last_extl != SWB_TBE ) || st->old_ppp_mode || ( ( st->prev_coder_type == AUDIO || st->prev_coder_type == INACTIVE ) && st->bws_cnt > 0 ) || ( st->bws_cnt == 0 && st->prev_bws_cnt == N_WS2N_FRAMES ) ) - { - swb_tbe_reset( st->hBWE_TD->mem_csfilt, st->hBWE_TD->mem_genSHBexc_filt_down_shb, st->hBWE_TD->state_lpc_syn, st->hBWE_TD->syn_overlap, st->hBWE_TD->state_syn_shbexc, &( st->hBWE_TD->tbe_demph ), &( st->hBWE_TD->tbe_premph ), st->hBWE_TD->mem_stp_swb, &( st->hBWE_TD->gain_prec_swb ) ); + st->hBWE_FD->prev_mode = NORMAL; + } - /* reset GainShape delay for SWB TBE FEC */ - set_f( st->hBWE_TD->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 ); + st->hBWE_FD->prev_Energy_wb = 0.0f; + st->hBWE_FD->prev_L_swb_norm = 8; + set_f(st->hBWE_FD->mem_imdct, 0, L_FRAME48k); + st->hBWE_FD->prev_flag = 0; + } - swb_tbe_reset_synth( st->hBWE_TD->genSHBsynth_Hilbert_Mem, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local ); + /* reset TBE buffers */ + if (st->hBWE_TD != NULL) + { + /* reset SWB TBE buffers */ + if (((st->extl == SWB_TBE || st->extl == FB_TBE || st->extl == SWB_CNG) && + (st->L_frame != st->last_L_frame || (st->last_extl != SWB_TBE && st->last_extl != FB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE) || st->last_core == HQ_CORE)) || + (st->bwidth < st->last_bwidth && st->last_extl != SWB_TBE) || st->old_ppp_mode || ((st->prev_coder_type == AUDIO || st->prev_coder_type == INACTIVE) && st->bws_cnt > 0) || (st->bws_cnt == 0 && st->prev_bws_cnt == N_WS2N_FRAMES)) + { + swb_tbe_reset(st->hBWE_TD->mem_csfilt, st->hBWE_TD->mem_genSHBexc_filt_down_shb, st->hBWE_TD->state_lpc_syn, st->hBWE_TD->syn_overlap, st->hBWE_TD->state_syn_shbexc, &(st->hBWE_TD->tbe_demph), &(st->hBWE_TD->tbe_premph), st->hBWE_TD->mem_stp_swb, &(st->hBWE_TD->gain_prec_swb)); - if ( output_frame == L_FRAME16k ) - { - set_f( st->hBWE_TD->mem_resamp_HB_32k, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); /* reset in case that SWB TBE layer is transmitted, but the output is 16kHz sampled */ - } + /* reset GainShape delay for SWB TBE FEC */ + set_f(st->hBWE_TD->GainShape_Delay, 0, NUM_SHB_SUBFR / 2); - set_f( st->hBWE_TD->int_3_over_2_tbemem_dec, 0.0f, INTERP_3_2_MEM_LEN ); - st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; - st->hBWE_TD->prev_mix_factor = 1.0f; - } - else if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && ( ( st->element_mode == IVAS_CPE_TD && st->last_extl != SWB_TBE && st->last_extl != FB_TBE ) || ( st->element_mode != IVAS_CPE_TD && st->last_total_brate != st->total_brate ) || ( st->last_bwidth != st->bwidth ) || ( st->last_codec_mode != MODE1 ) || ( st->rf_flag != st->rf_flag_last ) ) ) - { - set_f( st->hBWE_TD->state_lpc_syn, 0.0f, LPC_SHB_ORDER ); - set_f( st->hBWE_TD->state_syn_shbexc, 0.0f, L_SHB_LAHEAD ); - set_f( st->hBWE_TD->mem_stp_swb, 0.0f, LPC_SHB_ORDER ); - set_f( st->hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); - st->hBWE_TD->gain_prec_swb = 1.0f; - } - else if ( st->hBWE_TD != NULL && ( st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) ) - { - TBEreset_dec( st ); - } + swb_tbe_reset_synth(st->hBWE_TD->genSHBsynth_Hilbert_Mem, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local); - /* reset FB TBE buffers */ - if ( ( st->L_frame != st->last_L_frame || st->last_extl != FB_TBE ) && st->extl == FB_TBE ) - { - set_f( st->hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); - st->hBWE_TD->fb_tbe_demph = 0; - fb_tbe_reset_synth( st->hBWE_TD->fbbwe_hpf_mem, &st->hBWE_TD->prev_fbbwe_ratio ); - } + if (output_frame == L_FRAME16k) + { + set_f(st->hBWE_TD->mem_resamp_HB_32k, 0, 2 * ALLPASSSECTIONS_STEEP + 1); /* reset in case that SWB TBE layer is transmitted, but the output is 16kHz sampled */ + } - /* reset WB TBE buffers */ - if ( st->last_extl != WB_TBE && st->extl == WB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) - { - wb_tbe_extras_reset( st->hBWE_TD->mem_genSHBexc_filt_down_wb2, st->hBWE_TD->mem_genSHBexc_filt_down_wb3 ); - wb_tbe_extras_reset_synth( st->hBWE_TD->state_lsyn_filt_shb, st->hBWE_TD->state_lsyn_filt_dwn_shb, st->hBWE_TD->mem_resamp_HB ); + set_f(st->hBWE_TD->int_3_over_2_tbemem_dec, 0.0f, INTERP_3_2_MEM_LEN); + st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; + st->hBWE_TD->prev_mix_factor = 1.0f; + } + else if ((st->extl == SWB_TBE || st->extl == FB_TBE) && ((st->element_mode == IVAS_CPE_TD && st->last_extl != SWB_TBE && st->last_extl != FB_TBE) || (st->element_mode != IVAS_CPE_TD && st->last_total_brate != st->total_brate) || (st->last_bwidth != st->bwidth) || (st->last_codec_mode != MODE1) || (st->rf_flag != st->rf_flag_last))) + { + set_f(st->hBWE_TD->state_lpc_syn, 0.0f, LPC_SHB_ORDER); + set_f(st->hBWE_TD->state_syn_shbexc, 0.0f, L_SHB_LAHEAD); + set_f(st->hBWE_TD->mem_stp_swb, 0.0f, LPC_SHB_ORDER); + set_f(st->hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER); + st->hBWE_TD->gain_prec_swb = 1.0f; + } + else if (st->hBWE_TD != NULL && (st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE)) + { + TBEreset_dec(st); + } - set_f( st->hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD / 4 ); - set_f( st->hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); - set_f( st->hBWE_TD->mem_csfilt, 0, 2 ); - } + /* reset FB TBE buffers */ + if ((st->L_frame != st->last_L_frame || st->last_extl != FB_TBE) && st->extl == FB_TBE) + { + set_f(st->hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER); + st->hBWE_TD->fb_tbe_demph = 0; + fb_tbe_reset_synth(st->hBWE_TD->fbbwe_hpf_mem, &st->hBWE_TD->prev_fbbwe_ratio); } - /* Interp_3_2 CNG buffers reset */ - if ( st->hTdCngDec != NULL && st->output_Fs == 48000 && ( st->last_core_brate > SID_2k40 ) && ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->hTdCngDec != NULL ) + /* reset WB TBE buffers */ + if (st->last_extl != WB_TBE && st->extl == WB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE) { - set_f( st->hTdCngDec->interpol_3_2_cng_dec, 0.0f, INTERP_3_2_MEM_LEN ); + wb_tbe_extras_reset(st->hBWE_TD->mem_genSHBexc_filt_down_wb2, st->hBWE_TD->mem_genSHBexc_filt_down_wb3); + wb_tbe_extras_reset_synth(st->hBWE_TD->state_lsyn_filt_shb, st->hBWE_TD->state_lsyn_filt_dwn_shb, st->hBWE_TD->mem_resamp_HB); + + set_f(st->hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD / 4); + set_f(st->hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD); + set_f(st->hBWE_TD->mem_csfilt, 0, 2); } + } - return error; + /* Interp_3_2 CNG buffers reset */ + if (st->hTdCngDec != NULL && st->output_Fs == 48000 && (st->last_core_brate > SID_2k40) && (st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40) && st->hTdCngDec != NULL) + { + set_f(st->hTdCngDec->interpol_3_2_cng_dec, 0.0f, INTERP_3_2_MEM_LEN); + } + + return error; } + #endif /*---------------------------------------------------------------------* * core_switching_hq_prepare_dec() @@ -1603,7 +1569,7 @@ ivas_error core_switching_post_dec( * Preprocessing in the first HQ frame after ACELP frame * Modify bit allocation for HQ core by removing ACELP subframe budget *---------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void core_switching_hq_prepare_dec( Decoder_State *st, /* i/o: decoder state structure */ int16_t *num_bits, /* i/o: bit budget update */ @@ -1676,7 +1642,7 @@ void core_switching_hq_prepare_dec( return; } - +#endif /*---------------------------------------------------------------------* * bandwidth_switching_detect() @@ -1851,7 +1817,7 @@ void bandwidth_switching_detect_ivas_fx( * * Band-width switching pre-processing *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void bw_switching_pre_proc( Decoder_State *st, /* i/o: decoder state structure */ const float *old_syn_12k8_16k, /* i : ACELP core synthesis at 12.8kHz or 16kHz */ @@ -2107,8 +2073,7 @@ void ivas_bw_switching_pre_proc_fx( * Resample HQ/TCX-LB to the output sampling rate (8/16/32/48 kHz) *---------------------------------------------------------------------*/ -//#ifdef EVS_FLOAT -#if !(defined IVAS_FLOAT_FIXED) || (defined EVS_FLOAT) +#ifndef IVAS_FLOAT_FIXED static void core_switch_lb_upsamp( Decoder_State *st, /* i/o: Decoder state */ float *output /* i/o: LB synth/upsampled LB synth */ @@ -2219,7 +2184,7 @@ static void core_switch_lb_upsamp_fx( /* analysis and add the BPF error signal */ IF( st->p_bpf_noise_buf_32 ) { - addBassPostFilter_fx( st->p_bpf_noise_buf_32, st->bpf_off ? 0 : i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbBPF->no_channels ), realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + addBassPostFilter_ivas_fx( st->p_bpf_noise_buf_32, st->bpf_off ? 0 : i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbBPF->no_channels ), realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); } /* set output mask for upsampling */ @@ -2259,7 +2224,7 @@ static void core_switch_lb_upsamp_fx( #define TRANSITION_SMOOTHING_LEN_32k 31 #define TRANSITION_SMOOTHING_LEN_48k 47 -#if !(defined IVAS_FLOAT_FIXED) || (defined EVS_FLOAT) +#ifndef IVAS_FLOAT_FIXED static void smoothTransitionDtxToTcx( float synth[], /* i/o: synthesis */ const int16_t output_frame, /* i : output frame length */ diff --git a/lib_dec/core_switching_dec_fx.c b/lib_dec/core_switching_dec_fx.c index 3bfc1a4f0a622b3a509cce0d91d580f92665d0bd..d82aaea622b8c3e392cce52601d83363ef743ed3 100644 --- a/lib_dec/core_switching_dec_fx.c +++ b/lib_dec/core_switching_dec_fx.c @@ -143,12 +143,12 @@ void bandwidth_switching_detect_fx( } /*---------------------------------------------------------------------* - * Calc_freq_ener() + * Calc_freq_ener_fx() * * *---------------------------------------------------------------------*/ -static Word32 Calc_freq_ener(Word32 L_tmp, const Word16 Q_syn2) +static Word32 Calc_freq_ener_fx(Word32 L_tmp, const Word16 Q_syn2) { Word32 enerLL_fx; Word16 exp, tmp; @@ -231,7 +231,7 @@ void bw_switching_pre_proc_fx( #endif } L_tmp = L_shr(L_tmp, 7); /*2*(st_fx->Q_syn2-1)*/ - st_fx->enerLL_fx = Calc_freq_ener(L_tmp, shl(st_fx->Q_syn2,1)); + st_fx->enerLL_fx = Calc_freq_ener_fx(L_tmp, shl(st_fx->Q_syn2,1)); L_tmp = L_deposit_l(0); FOR (; iQ_syn2-1)*/ - st_fx->enerLH_fx = Calc_freq_ener(L_tmp, shl(st_fx->Q_syn2,1)); + st_fx->enerLH_fx = Calc_freq_ener_fx(L_tmp, shl(st_fx->Q_syn2,1)); } ELSE { @@ -258,7 +258,7 @@ void bw_switching_pre_proc_fx( #endif } L_tmp = L_shr(L_tmp, 5); /*st_fx->Q_syn2-1*/ - st_fx->enerLL_fx = Calc_freq_ener(L_tmp, shl(st_fx->Q_syn2,1)); + st_fx->enerLL_fx = Calc_freq_ener_fx(L_tmp, shl(st_fx->Q_syn2,1)); L_tmp = L_deposit_l(0); FOR (; i<64; i++ ) { @@ -269,7 +269,7 @@ void bw_switching_pre_proc_fx( #endif } L_tmp = L_shr(L_tmp, 5); /*st_fx->Q_syn2-1*/ - st_fx->enerLH_fx = Calc_freq_ener(L_tmp, shl(st_fx->Q_syn2,1)); + st_fx->enerLH_fx = Calc_freq_ener_fx(L_tmp, shl(st_fx->Q_syn2,1)); } ELSE { @@ -283,7 +283,7 @@ void bw_switching_pre_proc_fx( #endif } L_tmp = L_shr(L_tmp, 7); /*st_fx->Q_syn2-1*/ - st_fx->enerLL_fx = Calc_freq_ener(L_tmp, shl(st_fx->Q_syn2,1)); + st_fx->enerLL_fx = Calc_freq_ener_fx(L_tmp, shl(st_fx->Q_syn2,1)); L_tmp = L_deposit_l(0); FOR (; iQ_syn2-1*/ - st_fx->enerLH_fx = Calc_freq_ener(L_tmp, shl(st_fx->Q_syn2,1)); + st_fx->enerLH_fx = Calc_freq_ener_fx(L_tmp, shl(st_fx->Q_syn2,1)); } } @@ -1044,11 +1044,11 @@ ivas_error core_switching_pre_dec_fx( tmp = ACELP_9k60; move32(); } - configureFdCngDec(st_fx->hFdCngDec, st_fx->bwidth, tmp, st_fx->L_frame, st_fx->last_L_frame, st_fx->element_mode ); + configureFdCngDec_fx(st_fx->hFdCngDec, st_fx->bwidth, tmp, st_fx->L_frame, st_fx->last_L_frame, st_fx->element_mode ); } ELSE { - configureFdCngDec(st_fx->hFdCngDec, 1, ACELP_8k00, st_fx->L_frame, st_fx->last_L_frame, st_fx->element_mode); + configureFdCngDec_fx(st_fx->hFdCngDec, 1, ACELP_8k00, st_fx->L_frame, st_fx->last_L_frame, st_fx->element_mode); if( st_fx->VAD ) { @@ -1492,9 +1492,9 @@ ivas_error core_switching_post_dec_fx( wb_tbe_extras_reset_fx(hBWE_TD->mem_genSHBexc_filt_down_wb2_fx, hBWE_TD->mem_genSHBexc_filt_down_wb3_fx ); wb_tbe_extras_reset_synth_fx(hBWE_TD->state_lsyn_filt_shb_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx, hBWE_TD->state_32and48k_WB_upsample_fx, hBWE_TD->mem_resamp_HB_fx ); - set16_fx(hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD / 4 ); - set16_fx(hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD ); - set32_fx(hBWE_TD->mem_csfilt_fx, 0, 2 ); + set16_fx( hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD / 4 ); + set16_fx( hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD ); + set32_fx( hBWE_TD->mem_csfilt_fx, 0, 2 ); } return error; @@ -2070,6 +2070,7 @@ ivas_error core_switching_post_dec_ivas_fx( set16_fx( hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD / 4 ); set16_fx( hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD ); + set32_fx( hBWE_TD->syn_overlap_fx_32, 0, L_SHB_LAHEAD ); set32_fx( hBWE_TD->mem_csfilt_fx, 0, 2 ); } } @@ -2207,7 +2208,7 @@ static void core_switch_lb_upsamp_fx( /* analysis and add the BPF error signal */ IF( st->p_bpf_noise_buf_32 ) { - addBassPostFilter_fx( st->p_bpf_noise_buf_32, st->bpf_off ? 0 : i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbBPF->no_channels ), realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + addBassPostFilter_ivas_fx( st->p_bpf_noise_buf_32, st->bpf_off ? 0 : i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbBPF->no_channels ), realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); } /* set output mask for upsampling */ diff --git a/lib_dec/d_gain2p.c b/lib_dec/d_gain2p.c index 49c164b6e6450ca32d376a0c5074c57425a27451..8d675a4d9d05639d1530c379b20f51310862b0af 100644 --- a/lib_dec/d_gain2p.c +++ b/lib_dec/d_gain2p.c @@ -135,12 +135,12 @@ static void Mode2_gain_dec_mless_flt( /*---------------------------------------------------------------------* - * gain_dec_uv_flt + * gain_dec_uv * * Decoding of pitch and codebook gains for Unvoiced mode *---------------------------------------------------------------------*/ -static void gain_dec_uv_flt( +static void gain_dec_uv( const int16_t index, /* i/o: Quantization index vector */ const float *code, /* i : algebraic code excitation */ const int16_t lcode, /* i : Subframe size */ @@ -181,12 +181,12 @@ static void gain_dec_uv_flt( /*---------------------------------------------------------------------* - * gain_dec_gacelp_uv_flt + * gain_dec_gacelp_uv * * Decoding of pitch and codebook gains for Unvoiced mode *---------------------------------------------------------------------*/ -void gain_dec_gacelp_uv_flt( +void gain_dec_gacelp_uv( int16_t index, /* i/o: Quantization index vector */ const float *code, /* i : algebraic code excitation */ const float *code2, /* i : algebraic code excitation */ @@ -240,12 +240,12 @@ void gain_dec_gacelp_uv_flt( /*---------------------------------------------------------------------* - * decode_acelp_gains_flt + * decode_acelp_gains * * *---------------------------------------------------------------------*/ -void decode_acelp_gains_flt( +void decode_acelp_gains( const float *code, const int16_t gains_mode, const float mean_ener_code, @@ -272,12 +272,12 @@ void decode_acelp_gains_flt( else if ( gains_mode == 6 ) { /* UV gains quantizer (6bits/subfr) */ - gain_dec_uv_flt( index, code, L_subfr, gain_pit, gain_code, past_gpit, past_gcode, gain_inov ); + gain_dec_uv( index, code, L_subfr, gain_pit, gain_code, past_gpit, past_gcode, gain_inov ); } else if ( gains_mode == 7 ) { /* GACELP_UV gains quantizer (7=5-2bits/subfr) */ - gain_dec_gacelp_uv_flt( index, code, code2, mean_ener_code, L_subfr, gain_pit, gain_code, gain_code2, past_gpit, past_gcode, gain_inov ); + gain_dec_gacelp_uv( index, code, code2, mean_ener_code, L_subfr, gain_pit, gain_code, gain_code2, past_gpit, past_gcode, gain_inov ); } else { diff --git a/lib_dec/d_gain2p_fx.c b/lib_dec/d_gain2p_fx.c index 48e2df97f7fba23471eeeded83464e6247bde190..335f964d16fdeea81abc837d79c082db121ff7ed 100644 --- a/lib_dec/d_gain2p_fx.c +++ b/lib_dec/d_gain2p_fx.c @@ -9,7 +9,7 @@ #include "basop_util.h" #include "stl.h" #include "rom_com.h" - +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * Decoding of pitch and codebook gains (see q_gain2_plus.c) * *-------------------------------------------------------------------*/ @@ -17,7 +17,7 @@ /********************* * private functions * *********************/ -static Word32 calc_gcode0( +static Word32 calc_gcode0_fx( Word16 *gcode0, Word16 *exp_gcode0 ) @@ -37,7 +37,7 @@ static Word32 calc_gcode0( return L_tmp; } -static Word32 calc_gain_code(Word16 g_code, Word16 gcode0, Word16 exp_gcode0) +static Word32 calc_gain_code_fx(Word16 g_code, Word16 gcode0, Word16 exp_gcode0) { Word32 L_tmp; @@ -53,12 +53,12 @@ static Word32 calc_gain_code(Word16 g_code, Word16 gcode0, Word16 exp_gcode0) } /*--------------------------------------------------------------------------* -* Mode2_gain_dec_mless +* Mode2_gain_dec_mless_fx * * Decoding of pitch and codebook gains without updating long term energies *-------------------------------------------------------------------------*/ -static void Mode2_gain_dec_mless( +static void Mode2_gain_dec_mless_fx( Word16 index, /* i : Quantization index vector Q0 */ Word16 *code, /* i : algebraic code excitation Q9 */ Word16 lcode, /* i : Subframe size Q0 */ @@ -124,14 +124,14 @@ static void Mode2_gain_dec_mless( /*gcode0 = (float)pow(10.0,(gcode0)*0.05);*/ /* predicted gain */ - calc_gcode0(&gcode0, &exp_gcode0); + calc_gcode0_fx(&gcode0, &exp_gcode0); /*-----------------------------------------------------------------* * decode normalized codebook gain *-----------------------------------------------------------------*/ /* *gain_code = t_qua_gain[index*2+1] * gcode0;*/ - L_tmp = calc_gain_code(t_qua_gain[index*2+1], gcode0, exp_gcode0); + L_tmp = calc_gain_code_fx(t_qua_gain[index*2+1], gcode0, exp_gcode0); *gain_code = L_tmp; *past_gpit = *gain_pit; @@ -146,12 +146,12 @@ static void Mode2_gain_dec_mless( } /*---------------------------------------------------------------------* - * gain_dec_uv + * gain_dec_uv_fx * * Decoding of pitch and codebook gains for Unvoiced mode *---------------------------------------------------------------------*/ -static void gain_dec_uv( +static void gain_dec_uv_fx( Word16 index, /* i : Quantization index vector Q0 */ Word16 *code, /* i : algebraic code excitation Q9 */ Word16 lcode, /* i : Subframe size Q0 */ @@ -211,12 +211,12 @@ static void gain_dec_uv( } /*---------------------------------------------------------------------* - * gain_dec_gacelp_uv + * gain_dec_gacelp_uv_fx * * Decoding of pitch and codebook gains for Unvoiced mode *---------------------------------------------------------------------*/ -static void gain_dec_gacelp_uv( +static void gain_dec_gacelp_uv_fx( Word16 index, /* i : Quantization index vector Q0 */ Word16 *code, /* i : algebraic code excitation Q9 */ Word16 *code2, /* i : algebraic code excitation Q9 */ @@ -333,7 +333,7 @@ static void gain_dec_gacelp_uv( * public functions * *********************/ -void decode_acelp_gains( +void decode_acelp_gains_fx( Word16 *code, /* i : algebraic code excitation Q9 */ Word16 gains_mode, Word16 mean_ener_code, /* i : mean_ener defined in open-loop Q8 */ @@ -357,7 +357,7 @@ void decode_acelp_gains( IF ( s_and(gains_mode > 0,(Word16) LT_16(gains_mode, 4))) { /* ACELP gains quantizer (5bits/subfr) */ - Mode2_gain_dec_mless(index, code, L_subfr, gain_pit, gain_code, mean_ener_code, past_gpit, past_gcode, gain_inov, gains_mode-1 ); + Mode2_gain_dec_mless_fx(index, code, L_subfr, gain_pit, gain_code, mean_ener_code, past_gpit, past_gcode, gain_inov, gains_mode-1 ); } ELSE IF (s_or((Word16)EQ_16(gains_mode,4),(Word16)EQ_16(gains_mode,5))) { @@ -367,12 +367,12 @@ void decode_acelp_gains( ELSE IF ( EQ_16(gains_mode,6)) { /* UV gains quantizer (6bits/subfr) */ - gain_dec_uv( index, code, L_subfr, gain_pit, gain_code, past_gpit, past_gcode, gain_inov ); + gain_dec_uv_fx( index, code, L_subfr, gain_pit, gain_code, past_gpit, past_gcode, gain_inov ); } ELSE IF (EQ_16(gains_mode,7)) { /* GACELP_UV gains quantizer (7=5-2bits/subfr) */ - gain_dec_gacelp_uv( index, code, code2, mean_ener_code, L_subfr, gain_pit, gain_code, gain_code2, past_gpit, past_gcode, gain_inov ); + gain_dec_gacelp_uv_fx( index, code, code2, mean_ener_code, L_subfr, gain_pit, gain_code, gain_code2, past_gpit, past_gcode, gain_inov ); } ELSE { @@ -383,12 +383,12 @@ void decode_acelp_gains( /*---------------------------------------------------------------------* - * d_gain_pred : + * d_gain_pred_fx : * * decode the predicted value for the scaled * innovation energy in all subframes *---------------------------------------------------------------------*/ -void d_gain_pred( +void d_gain_pred_fx( Word16 nrg_mode, /* i : NRG moe */ Word16 *Es_pred, /* o : predicted scaled innovation energy Q8 */ Word16 **pt_indice /* i/o: pointer to the buffer of indices */ @@ -422,3 +422,4 @@ void d_gain_pred( return; } +#endif diff --git a/lib_dec/dec4t64.c b/lib_dec/dec4t64.c index 3e6543bfdfc294b9703c5320e3339c8b65cc4c00..be4ab425dc4319e615e2dc525de2a6b981530fb4 100644 --- a/lib_dec/dec4t64.c +++ b/lib_dec/dec4t64.c @@ -740,7 +740,7 @@ static void fcb_decode_PI( * Read FCB index * *---------------------------------------------------------------------*/ -void D_ACELP_decode_43bit_flt( +void D_ACELP_decode_43bit( uint16_t idxs[], float code[], int16_t *pulsestrack ) diff --git a/lib_dec/dec4t64_fx.c b/lib_dec/dec4t64_fx.c index 85c6b315741b4414e2a236cad1e26d9cf0d232fc..ec9dc300ca5de3b63fc98c043aa50f4dca21c20e 100644 --- a/lib_dec/dec4t64_fx.c +++ b/lib_dec/dec4t64_fx.c @@ -8,7 +8,7 @@ #include "prot_fx2.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "assert.h" /* Static table prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ @@ -123,7 +123,7 @@ void dec_acelp_4t64_fx( move16(); } - D_ACELP_indexing( code, config, NB_TRACK_FCB_4T, indexing_indices, &st_fx->BER_detect ); + D_ACELP_indexing_fx( code, config, NB_TRACK_FCB_4T, indexing_indices, &st_fx->BER_detect ); } ELSE { @@ -766,7 +766,7 @@ static void fcb_decode_PI_fx( /* o: return pulse position number */ * Read FCB index * *---------------------------------------------------------------------*/ -void D_ACELP_decode_43bit(UWord16 idxs[], Word16 code[], Word16 *pulsestrack) +void D_ACELP_decode_43bit_fx(UWord16 idxs[], Word16 code[], Word16 *pulsestrack) { Word32 ps[8]; Word16 pos[7]; @@ -1260,4 +1260,5 @@ void dec_acelp_fast_fx( } return; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/lib_dec/dec_LPD.c b/lib_dec/dec_LPD.c index a307cba3a0b4b0ec27d05d40383bddc21de97a28..a58fb94a926124eb1701c1236c09aa102e0d71e5 100644 --- a/lib_dec/dec_LPD.c +++ b/lib_dec/dec_LPD.c @@ -48,12 +48,12 @@ /*-------------------------------------------------------------------* - * decoder_LPD_flt() + * decoder_LPD() * * Core decoder MODE2 *--------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void decoder_LPD_flt( +#ifndef IVAS_FLOAT_FIXED +void decoder_LPD( Decoder_State *st, /* i/o: decoder memory state pointer */ float signal_out[], /* o : signal with LPD delay (7 subfrs) */ float signal_outFB[], /* o : synthesis @output_FS */ @@ -164,7 +164,7 @@ void decoder_LPD_flt( st->flagGuidedAcelp = 0; st->nbLostCmpt++; st->core_brate = st->last_core_brate; - st->core = GetPLCModeDecision_flt( st ); + st->core = GetPLCModeDecision( st ); } } else @@ -180,7 +180,7 @@ void decoder_LPD_flt( } /* PLC: [Common: mode decision] * PLC: Decide which Concealment to use. Update pitch lags if needed */ - st->core = GetPLCModeDecision_flt( st ); + st->core = GetPLCModeDecision( st ); } /* PLC: [Common: Memory update] @@ -293,11 +293,11 @@ void decoder_LPD_flt( /* Unquantize LPC */ if ( st->core == TCX_20_CORE ) { - lpc_unquantize_flt( st, lsf, lsp, param_lpc, lspmid, lsfmid, AUDIO, &LSF_Q_prediction ); + lpc_unquantize( st, lsf, lsp, param_lpc, lspmid, lsfmid, AUDIO, &LSF_Q_prediction ); } else { - lpc_unquantize_flt( st, lsf, lsp, param_lpc, lspmid, lsfmid, st->coder_type, &LSF_Q_prediction ); + lpc_unquantize( st, lsf, lsp, param_lpc, lspmid, lsfmid, st->coder_type, &LSF_Q_prediction ); if ( st->prev_use_partial_copy && st->last_core == ACELP_CORE && st->core == ACELP_CORE && st->prev_rf_frame_type >= RF_GENPRED && st->coder_type == UNVOICED ) { @@ -476,7 +476,7 @@ void decoder_LPD_flt( if ( bfi && st->last_core != ACELP_CORE ) { /* PLC: [TCX: TD PLC] */ - con_tcx_flt( st, &synthFB[0], -1.f, NULL, 0, NULL ); + con_tcx( st, &synthFB[0], -1.f, NULL, 0, NULL ); lerp_flt( synthFB, synth, st->L_frame, st->hTcxDec->L_frameTCX ); st->con_tcx = 1; set_f( &st->mem_pitch_gain_float[2], st->lp_gainp, st->nb_subfr ); @@ -500,13 +500,13 @@ void decoder_LPD_flt( { /* PLC: [ACELP: general] * PLC: Use the ACELP like concealment */ - con_acelp_flt( Aq, st->core_ext_mode, &synth[0], pitch, pit_gain, st->stab_fac, st, pitch_buf, voice_factors, ptr_bwe_exc ); + con_acelp( Aq, st->core_ext_mode, &synth[0], pitch, pit_gain, st->stab_fac, st, pitch_buf, voice_factors, ptr_bwe_exc ); mvr2r( &st->mem_pitch_gain_float[2], &st->mem_pitch_gain_float[st->nb_subfr + 2], st->nb_subfr ); set_zero( &st->mem_pitch_gain_float[2], st->nb_subfr ); } else { - decoder_acelp_flt( st, prm, Aq, st->acelp_cfg, &synth[0], pitch, pit_gain, st->stab_fac, pitch_buf, voice_factors, LSF_Q_prediction, ptr_bwe_exc ); + decoder_acelp( st, prm, Aq, st->acelp_cfg, &synth[0], pitch, pit_gain, st->stab_fac, pitch_buf, voice_factors, LSF_Q_prediction, ptr_bwe_exc ); if ( st->flagGuidedAcelp > 0 ) { @@ -589,7 +589,7 @@ void decoder_LPD_flt( } /* TCX decoder */ - decoder_tcx_flt( st, prm, Aq, Aind, &synth[0], &synthFB[0], bfi, 0, 0 ); + decoder_tcx( st, prm, Aq, Aind, &synth[0], &synthFB[0], bfi, 0, 0 ); } /*--------------------------------------------------------------------------------* @@ -615,7 +615,7 @@ void decoder_LPD_flt( IGFDecRestoreTCX10SubFrameData_flt( st->hIGFDec, k ); /* TCX decoder */ - decoder_tcx_flt( st, prm, Aq, Aind, &synth[k * L_frame / 2], &synthFB[k * L_frameTCX / 2], bfi, k, 0 ); + decoder_tcx( st, prm, Aq, Aind, &synth[k * L_frame / 2], &synthFB[k * L_frameTCX / 2], bfi, k, 0 ); } } @@ -644,7 +644,7 @@ void decoder_LPD_flt( TonalMDCTConceal_SaveTimeSignal_ivas( st->hTonalMDCTConc, synthFB, L_frameTCX ); } - decoder_tcx_post_flt( st, synth, synthFB, Aq, bfi, 0 ); + decoder_tcx_post( st, synth, synthFB, Aq, bfi, 0 ); if ( st->core == TCX_20_CORE ) { diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index 158d162e120a4e0f1d249950d7e65a16b5401280..a79ab4358580b5dbc79fbbfa92c1e4de6675a94d 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -10,6 +10,7 @@ #include "prot_fx2.h" #include "basop_util.h" #include "rom_com.h" +#ifdef IVAS_FLOAT_FIXED /* #if defined(_WIN32) && (_MSC_VER <= 1200) /\* disable global optimizations to overcome an internal compiler error *\/ */ #if defined(_MSC_VER) && (_MSC_VER <= 1200) /* disable global optimizations to overcome an internal compiler error */ @@ -17,12 +18,12 @@ #endif /*-------------------------------------------------------------------* -* decoder_LPD() +* decoder_LPD_fx() * * Core decoder MODE2 *--------------------------------------------------------------------*/ -void decoder_LPD( +void decoder_LPD_fx( Word16 signal_out[], /* output: signal with LPD delay (7 subfrs) */ Word16 signal_outFB[], /* o : synthesis @output_FS */ Word16 *total_nbbits, /* i/o: number of bits / decoded bits */ @@ -150,7 +151,7 @@ void decoder_LPD( move16(); tcx_current_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; move16(); - dec_prm(&st->coder_type, param, param_lpc, total_nbbits, st, L_frame, bitsRead); + dec_prm_fx(&st->coder_type, param, param_lpc, total_nbbits, st, L_frame, bitsRead); IF(!st->rate_switching_init && EQ_16((st->last_codec_mode), MODE2)&&st->BER_detect) { st->coder_type = st->last_coder_type; @@ -171,7 +172,7 @@ void decoder_LPD( move16(); st->core_brate = st->last_core_brate; move16(); - st->core = GetPLCModeDecision( st ); + st->core = GetPLCModeDecision_fx( st ); } } @@ -182,7 +183,7 @@ void decoder_LPD( test(); IF( st->use_partial_copy && GE_16(st->rf_frame_type, RF_TCXFD)&&LE_16(st->rf_frame_type,RF_TCXTD2)) { - dec_prm( &st->coder_type, param, param_lpc, total_nbbits, st, L_frame, bitsRead ); + dec_prm_fx( &st->coder_type, param, param_lpc, total_nbbits, st, L_frame, bitsRead ); } if (GT_16(st->nbLostCmpt, 1)) @@ -196,7 +197,7 @@ void decoder_LPD( * PLC: Decide which Concealment to use. Update pitch lags if needed */ IF ( bfi!=0 ) { - st->core = GetPLCModeDecision(st); + st->core = GetPLCModeDecision_fx(st); } IF ( bfi == 0 ) @@ -328,11 +329,11 @@ void decoder_LPD( } IF (EQ_16(st->core, TCX_20_CORE)) { - lpc_unquantize( st, lsf, lsp, M, param_lpc, lspmid, lsfmid, AUDIO, &LSF_Q_prediction); + lpc_unquantize_fx( st, lsf, lsp, M, param_lpc, lspmid, lsfmid, AUDIO, &LSF_Q_prediction); } ELSE { - lpc_unquantize( st, lsf, lsp, M, param_lpc, lspmid, lsfmid, st->coder_type, &LSF_Q_prediction); + lpc_unquantize_fx( st, lsf, lsp, M, param_lpc, lspmid, lsfmid, st->coder_type, &LSF_Q_prediction); IF(EQ_16(st->prev_use_partial_copy,1)&&EQ_16(st->last_core,ACELP_CORE)&&EQ_16(st->core,ACELP_CORE) && GE_16(st->prev_rf_frame_type, RF_GENPRED) && EQ_16(st->coder_type, UNVOICED)) @@ -552,9 +553,9 @@ void decoder_LPD( { /* PLC: [TCX: TD PLC] */ #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - con_tcx(st, &synthFB[0], -1.f, NULL, 0, NULL); + con_tcx_fx(st, &synthFB[0], -1.f, NULL, 0, NULL); #else - con_tcx( st, &synthFB[0] ); + con_tcx_fx( st, &synthFB[0] ); #endif lerp( synthFB, synth, st->L_frame, hTcxDec->L_frameTCX ); st->con_tcx = 1; @@ -579,7 +580,7 @@ void decoder_LPD( { /* PLC: [ACELP: general] * PLC: Use the ACELP like concealment */ - con_acelp(Aq,st->core_ext_mode,&synth[0],pitch,pit_gain,st->stab_fac_fx,st, + con_acelp_fx(Aq,st->core_ext_mode,&synth[0],pitch,pit_gain,st->stab_fac_fx,st, &st->Q_exc, &st->Q_syn, /*Q format of st->mem_syn*/ pitch_buf, voice_factors, ptr_bwe_exc); Copy(&st->mem_pitch_gain[2], &st->mem_pitch_gain[st->nb_subfr+2], st->nb_subfr); @@ -587,7 +588,7 @@ void decoder_LPD( } ELSE { - decoder_acelp(st, prm, Aq, st->acelp_cfg, &synth[0], pitch, pit_gain, st->stab_fac_fx, pitch_buf, voice_factors, LSF_Q_prediction, ptr_bwe_exc); + decoder_acelp_fx(st, prm, Aq, st->acelp_cfg, &synth[0], pitch, pit_gain, st->stab_fac_fx, pitch_buf, voice_factors, LSF_Q_prediction, ptr_bwe_exc); IF(st->flagGuidedAcelp > 0) { @@ -688,7 +689,7 @@ void decoder_LPD( E_LPC_f_lsp_a_conversion(lspind, Aind, M); } /* TCX decoder */ - decoder_tcx(st->hTcxCfg,prm,Aq,Aind,L_frame,L_frameTCX,st->hTcxCfg->tcx_coded_lines,&synth[0],&synthFB[0],st, st->coder_type, bfi,0,st->stab_fac_fx); + decoder_tcx_fx(st->hTcxCfg,prm,Aq,Aind,L_frame,L_frameTCX,st->hTcxCfg->tcx_coded_lines,&synth[0],&synthFB[0],st, st->coder_type, bfi,0,st->stab_fac_fx); } @@ -715,7 +716,7 @@ void decoder_LPD( /* TCX decoder */ IGFDecRestoreTCX10SubFrameData( st->hIGFDec, k ); - decoder_tcx(st->hTcxCfg,prm,Aq,Aind,shr(L_frame, 1),shr(L_frameTCX, 1), + decoder_tcx_fx(st->hTcxCfg,prm,Aq,Aind,shr(L_frame, 1),shr(L_frameTCX, 1), shr(st->hTcxCfg->tcx_coded_lines, 1),&synth[k*L_frame/2],&synthFB[k*L_frameTCX/2],st, st->coder_type, bfi, k, st->stab_fac_fx ); } @@ -757,9 +758,9 @@ void decoder_LPD( TonalMDCTConceal_SaveTimeSignal( &st->tonalMDCTconceal, synthFB, L_frameTCX ); } #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - decoder_tcx_post(st, synth, synthFB, Aq, bfi, 0); + decoder_tcx_post_fx(st, synth, synthFB, Aq, bfi, 0); #else - decoder_tcx_post( st, synth, synthFB, Aq, bfi ); + decoder_tcx_post_fx( st, synth, synthFB, Aq, bfi ); #endif IF (EQ_16(st->core, TCX_20_CORE)) { @@ -966,5 +967,5 @@ void decoder_LPD( return; } - +#endif diff --git a/lib_dec/dec_ace.c b/lib_dec/dec_ace.c index a643e05c23848349b5f9a68387ef67e0d250f4c2..4cdbb8b1208e891823e6f23bf6c3b9535553a60e 100644 --- a/lib_dec/dec_ace.c +++ b/lib_dec/dec_ace.c @@ -40,14 +40,14 @@ #include #include "rom_com.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* - * decoder_acelp_flt() + * decoder_acelp() * * Decode ACELP frame MODE2 *-------------------------------------------------------------------*/ -void decoder_acelp_flt( +void decoder_acelp( Decoder_State *st, /* i/o: coder memory state */ int16_t prm[], /* i : parameters */ const float A[], /* i : coefficients NxAz[M+1] */ @@ -350,7 +350,7 @@ void decoder_acelp_flt( if ( st->acelp_cfg.gains_mode[i_subfr / L_SUBFR] != 0 ) { - decode_acelp_gains_flt( code, acelp_cfg.gains_mode[i_subfr / L_SUBFR], Es_pred, &gain_pit, &gain_code, &prm, &( st->past_gpit_float), &( st->past_gcode_float), &gain_inov, L_SUBFR, code2, &gain_code2 ); + decode_acelp_gains( code, acelp_cfg.gains_mode[i_subfr / L_SUBFR], Es_pred, &gain_pit, &gain_code, &prm, &( st->past_gpit_float), &( st->past_gcode_float), &gain_inov, L_SUBFR, code2, &gain_code2 ); } if ( st->use_partial_copy && st->rf_frame_type == RF_ALLPRED ) diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index d613763cc45a8db83ca0f69086b6e3d74c763bfa..f0bdb1eb7afa09efed79b3afd39c51675abd3ae6 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -14,12 +14,12 @@ #include "stl.h" #include "rom_com.h" /*-------------------------------------------------------------------* - * decoder_acelp() + * decoder_acelp_fx() * * Decode ACELP frame MODE2 *-------------------------------------------------------------------*/ - -void decoder_acelp( +#ifdef IVAS_FLOAT_FIXED +void decoder_acelp_fx( Decoder_State *st, Word16 prm[], /* i : parameters */ Word16 A[], /* i : coefficients NxAz[M+1] */ @@ -225,7 +225,7 @@ void decoder_acelp( move16(); IF ( acelp_cfg.nrg_mode>0 ) { - d_gain_pred(acelp_cfg.nrg_mode, &Es_pred, &prm ); + d_gain_pred_fx(acelp_cfg.nrg_mode, &Es_pred, &prm ); } /*------------------------------------------------------------------------* @@ -354,7 +354,7 @@ void decoder_acelp( ELSE { config = PulseConfTable[acelp_cfg.fixed_cdk_index[i_subfr/L_SUBFR]]; - D_ACELP_indexing( code, config, NB_TRACK_FCB_4T, prm, &st->BER_detect ); + D_ACELP_indexing_fx( code, config, NB_TRACK_FCB_4T, prm, &st->BER_detect ); (prm) += 8; /*-------------------------------------------------------* * - Add the fixed-gain pitch contribution to code[]. * @@ -382,7 +382,7 @@ void decoder_acelp( *-------------------------------------------------*/ IF( st->acelp_cfg.gains_mode[i_subfr/L_SUBFR] != 0 ) { - decode_acelp_gains( code, acelp_cfg.gains_mode[i_subfr/L_SUBFR], Es_pred, &gain_pit, &gain_code, &prm, &(st->past_gpit), + decode_acelp_gains_fx( code, acelp_cfg.gains_mode[i_subfr/L_SUBFR], Es_pred, &gain_pit, &gain_code, &prm, &(st->past_gpit), &(st->past_gcode), &gain_inov, L_SUBFR, code2, &gain_code2 ); } IF(st->use_partial_copy&& st->rf_frame_type == RF_ALLPRED) @@ -684,3 +684,4 @@ void decoder_acelp( return; } +#endif \ No newline at end of file diff --git a/lib_dec/dec_acelp.c b/lib_dec/dec_acelp.c index d9b4d42fd50a82181eb6a2e4b4e7fefe0704f737..2a4c44b7d731d35a17158bf9d5f99b37a1021986 100644 --- a/lib_dec/dec_acelp.c +++ b/lib_dec/dec_acelp.c @@ -142,7 +142,7 @@ void D_ACELP_indexing_ivas( if ( config.bits == 43 ) { - D_ACELP_decode_43bit_flt( idxs, code, pulsestrack ); + D_ACELP_decode_43bit( idxs, code, pulsestrack ); } else { diff --git a/lib_dec/dec_acelp_fx.c b/lib_dec/dec_acelp_fx.c index 392adb1dffae439cf6890ef1b38f8516c1b1c51b..7766a32ca300087b9794c77c59c91b8f0fa30895 100644 --- a/lib_dec/dec_acelp_fx.c +++ b/lib_dec/dec_acelp_fx.c @@ -11,20 +11,20 @@ #include "prot_fx2.h" #include "rom_com.h" #include "rom_basop_util.h" - +#ifdef IVAS_FLOAT_FIXED #define _1_CODE 0x200 /*codebook excitation Q9 */ /*---------------------------------------------------------------------* * Local function prototypes *---------------------------------------------------------------------*/ -static void D_ACELP_decode_arithtrack(Word16 v[], Word32 s, Word16 p, Word16 trackstep, Word16 tracklen); +static void D_ACELP_decode_arithtrack_fx(Word16 v[], Word32 s, Word16 p, Word16 trackstep, Word16 tracklen); /*---------------------------------------------------------------------* -* Function D_ACELP_indexing() +* Function D_ACELP_indexing_fx() * *---------------------------------------------------------------------*/ -void D_ACELP_indexing( +void D_ACELP_indexing_fx( Word16 code[], PulseConfig config, Word16 num_tracks, @@ -137,11 +137,11 @@ void D_ACELP_indexing( IF (EQ_16(config.bits, 43)) { - D_ACELP_decode_43bit(idxs, code, pulsestrack); + D_ACELP_decode_43bit_fx(idxs, code, pulsestrack); } ELSE { - fcb_pulse_track_joint_decode(idxs, wordcnt, index_n, pulsestrack, num_tracks); + fcb_pulse_track_joint_decode_fx(idxs, wordcnt, index_n, pulsestrack, num_tracks); FOR (track = num_tracks - 1; track >=1; track--) { pulses = pulsestrack[track]; @@ -153,7 +153,7 @@ void D_ACELP_indexing( * the integer part goes to next track */ s = index_n[track]; /* decode state to actual pulse positions on track */ - D_ACELP_decode_arithtrack(code+track, s, pulses, num_tracks, 16); + D_ACELP_decode_arithtrack_fx(code+track, s, pulses, num_tracks, 16); } ELSE /* track is empty */ { @@ -180,7 +180,7 @@ void D_ACELP_indexing( IF (pulses) { - D_ACELP_decode_arithtrack(code, s, pulses, num_tracks, 16); + D_ACELP_decode_arithtrack_fx(code, s, pulses, num_tracks, 16); } ELSE {/* track is empty */ FOR (k=0; k < 16*num_tracks; k+=num_tracks) @@ -192,7 +192,7 @@ void D_ACELP_indexing( } } -static void D_ACELP_decode_arithtrack(Word16 v[], Word32 s, Word16 p, Word16 trackstep, Word16 tracklen) +static void D_ACELP_decode_arithtrack_fx(Word16 v[], Word32 s, Word16 p, Word16 trackstep, Word16 tracklen) { Word16 k, idx; @@ -238,7 +238,7 @@ static void D_ACELP_decode_arithtrack(Word16 v[], Word32 s, Word16 p, Word16 tra } } -void fcb_pulse_track_joint_decode(UWord16 *idxs, Word16 wordcnt, UWord32 *index_n, Word16 *pulse_num, Word16 track_num) +void fcb_pulse_track_joint_decode_fx(UWord16 *idxs, Word16 wordcnt, UWord32 *index_n, Word16 *pulse_num, Word16 track_num) { Word16 hi_to_low[10] = { 0, 0, 0, 3, 9, 5, 3, 1, 8, 8}; @@ -374,3 +374,4 @@ void fcb_pulse_track_joint_decode(UWord16 *idxs, Word16 wordcnt, UWord32 *index_ return; } +#endif diff --git a/lib_dec/dec_acelp_tcx_main.c b/lib_dec/dec_acelp_tcx_main.c index 149c1206eb4266972f205e51c743660c394bbaaf..ab9447b9a6300ad2773156f41e3e28cc4a252256 100644 --- a/lib_dec/dec_acelp_tcx_main.c +++ b/lib_dec/dec_acelp_tcx_main.c @@ -41,7 +41,7 @@ #include "options.h" #include "stat_dec.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * decode_frame_type_flt() * @@ -195,7 +195,7 @@ static void decode_frame_type_flt( st->rate_switching_init = 1; /* Reconf Core */ - mode_switch_decoder_LPD_flt( st, st->bwidth, st->total_brate, st->last_total_brate, frame_size_index, 0, st->element_mode ); + mode_switch_decoder_LPD( st, st->bwidth, st->total_brate, st->last_total_brate, frame_size_index, 0, st->element_mode ); /* Reconf. CLDFB: check if the CLDFB works on the right sample rate */ if ( ( st->cldfbAna->no_channels * st->cldfbAna->no_col ) != st->L_frame ) @@ -217,7 +217,7 @@ static void decode_frame_type_flt( } /*Reconf Frequency-domain based CNG*/ - configureFdCngDec_flt( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); if ( st->last_L_frame != st->L_frame && st->L_frame <= L_FRAME16k && st->last_L_frame <= L_FRAME16k ) { lerp_flt( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->L_frame * 2, st->last_L_frame * 2 ); @@ -275,12 +275,12 @@ static void decode_frame_type_flt( /*-------------------------------------------------------------------* - * dec_acelp_tcx_frame_flt() + * dec_acelp_tcx_frame() * * Main decoding function *--------------------------------------------------------------------*/ -void dec_acelp_tcx_frame_flt( +void dec_acelp_tcx_frame( Decoder_State *st, /* i/o: decoder state structure */ int16_t *concealWholeFrame, /* i/o: concealment flag */ float *output, /* o : synthesis */ @@ -300,7 +300,7 @@ void dec_acelp_tcx_frame_flt( float old_bwe_exc[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer */ float *ptr_bwe_exc; /* pointer to BWE excitation signal in the current frame */ - push_wmops( "dec_acelp_tcx_frame_flt" ); + push_wmops( "dec_acelp_tcx_frame" ); start_bit_pos = st->next_bit_pos; if ( st->rf_flag == 1 ) @@ -405,7 +405,7 @@ void dec_acelp_tcx_frame_flt( /* Decode the LPD data */ if ( st->m_decodeMode == DEC_NO_FRAM_LOSS ) { - decoder_LPD_flt( st, output, pcmbufFB, &tmp, bpf_noise_buf, 0, &bitsRead, param, pitch_buf, voice_factors, ptr_bwe_exc ); + decoder_LPD( st, output, pcmbufFB, &tmp, bpf_noise_buf, 0, &bitsRead, param, pitch_buf, voice_factors, ptr_bwe_exc ); if ( !st->rate_switching_init && ( st->last_codec_mode ) == MODE2 && !( st->use_partial_copy && st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 ) && st->bfi ) { @@ -416,7 +416,7 @@ void dec_acelp_tcx_frame_flt( } else if ( st->m_decodeMode == DEC_CONCEALMENT_EXT ) { - decoder_LPD_flt( st, output, pcmbufFB, NULL, bpf_noise_buf, 1, /* bfi - st->bfi can be 0 here - MODE2 stays in PLC when DTX appears after a loss */ + decoder_LPD( st, output, pcmbufFB, NULL, bpf_noise_buf, 1, /* bfi - st->bfi can be 0 here - MODE2 stays in PLC when DTX appears after a loss */ &bitsRead, NULL, pitch_buf, voice_factors, ptr_bwe_exc ); } @@ -476,7 +476,7 @@ void dec_acelp_tcx_frame_flt( if ( st->m_frame_type == SID_FRAME ) { /* Decode the FD-CNG bitstream */ - FdCng_decodeSID_flt( st ); + FdCng_decodeSID( st ); } /* updates */ diff --git a/lib_dec/dec_acelp_tcx_main_fx.c b/lib_dec/dec_acelp_tcx_main_fx.c index 80176e309c9c136294284a351f2fe77a5475f917..c4a0df61913528058d8bc1e402d36f35d460fac5 100644 --- a/lib_dec/dec_acelp_tcx_main_fx.c +++ b/lib_dec/dec_acelp_tcx_main_fx.c @@ -11,9 +11,9 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "basop_util.h" - +#ifdef IVAS_FLOAT_FIXED static -void decode_frame_type(Decoder_State *st +void decode_frame_type_fx(Decoder_State *st #ifdef IVAS_CODE_CNG , STEREO_CNG_DEC_HANDLE hStereoCng #endif @@ -205,9 +205,9 @@ void decode_frame_type(Decoder_State *st /* Reconf Core */ #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - mode_switch_decoder_LPD(st, st->bwidth, st->total_brate, st->last_total_brate, frame_size_index, 0, st->element_mode); + mode_switch_decoder_LPD_fx(st, st->bwidth, st->total_brate, st->last_total_brate, frame_size_index, 0, st->element_mode); #else - mode_switch_decoder_LPD( st, st->bwidth, st->total_brate, frame_size_index ); + mode_switch_decoder_LPD_fx( st, st->bwidth, st->total_brate, frame_size_index ); #endif /* Reconf CLDFB */ IF( NE_16 (i_mult(st->cldfbAna->no_channels,st->cldfbAna->no_col), st->L_frame) ) @@ -238,7 +238,7 @@ void decode_frame_type(Decoder_State *st L_tmp = ACELP_9k60; move32(); } - configureFdCngDec( st->hFdCngDec, st->bwidth, L_tmp, st->L_frame, st->last_L_frame, st->element_mode); + configureFdCngDec_fx( st->hFdCngDec, st->bwidth, L_tmp, st->L_frame, st->last_L_frame, st->element_mode); test(); test(); IF ( (NE_16(st->last_L_frame,st->L_frame))&&(LE_16(st->L_frame, L_FRAME16k))&&(LE_16(st->last_L_frame, L_FRAME16k))) @@ -287,7 +287,7 @@ void decode_frame_type(Decoder_State *st } -Word16 dec_acelp_tcx_frame( +Word16 dec_acelp_tcx_frame_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16* concealWholeFrame, /* i/o: concealment flag */ Word16* pcmBuf, /* o : synthesis */ @@ -345,7 +345,7 @@ Word16 dec_acelp_tcx_frame( Word16 L_frame = st->L_frame; Word32 total_brate = st->last_total_brate; - decode_frame_type( st + decode_frame_type_fx( st #ifdef IVAS_CODE_CNG , hStereoCng #endif @@ -435,7 +435,7 @@ Word16 dec_acelp_tcx_frame( IF ( EQ_16(st->m_decodeMode, DEC_NO_FRAM_LOSS)) { - decoder_LPD(pcmBuf, pcmbufFB, &tmp, st, bpf_noise_buf, 0, &bitsRead, param, pitch_buf, voice_factors, ptr_bwe_exc ); + decoder_LPD_fx(pcmBuf, pcmbufFB, &tmp, st, bpf_noise_buf, 0, &bitsRead, param, pitch_buf, voice_factors, ptr_bwe_exc ); test(); test(); @@ -456,7 +456,7 @@ Word16 dec_acelp_tcx_frame( ELSE IF (EQ_16(st->m_decodeMode, DEC_CONCEALMENT_EXT)) { /* Decode the LPD data */ - decoder_LPD( pcmBuf, pcmbufFB, NULL, st, bpf_noise_buf, 1, &bitsRead, NULL, pitch_buf, voice_factors, ptr_bwe_exc ); + decoder_LPD_fx( pcmBuf, pcmbufFB, NULL, st, bpf_noise_buf, 1, &bitsRead, NULL, pitch_buf, voice_factors, ptr_bwe_exc ); } test(); @@ -516,7 +516,7 @@ Word16 dec_acelp_tcx_frame( IF ( EQ_16(st->m_frame_type,SID_FRAME)) { - FdCng_decodeSID(st->hFdCngDec->hFdCngCom, st); + FdCng_decodeSID_fx(st->hFdCngDec->hFdCngCom, st); } /* updates */ @@ -528,3 +528,4 @@ Word16 dec_acelp_tcx_frame( return 0; } +#endif diff --git a/lib_dec/dec_amr_wb.c b/lib_dec/dec_amr_wb.c index 7ddb784cc923faa357fc33f9264840b211f3c525..495af31628ea8b02ba77950ab3551d1f7b8be058 100644 --- a/lib_dec/dec_amr_wb.c +++ b/lib_dec/dec_amr_wb.c @@ -46,7 +46,7 @@ * * Decode excitation signal in AMR-WB IO mode *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void decod_amr_wb( Decoder_State *st, /* i/o: decoder static memory */ const float *Aq, /* i : LP filter coefficients */ diff --git a/lib_dec/dec_amr_wb_fx.c b/lib_dec/dec_amr_wb_fx.c index 1d609cd6ad3f0d505376adc780713465a367b56d..dfa79cae1a5b88e547a4ae874eac756a49066147 100644 --- a/lib_dec/dec_amr_wb_fx.c +++ b/lib_dec/dec_amr_wb_fx.c @@ -8,10 +8,10 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* - * decod_amr_wb() + * decod_amr_wb_fx() * * Decode excitation signal in AMR-WB IO mode *---------------------------------------------------------------------*/ @@ -153,3 +153,4 @@ void decod_amr_wb_fx( return; } +#endif diff --git a/lib_dec/dec_gen_voic.c b/lib_dec/dec_gen_voic.c index a62b3f40864fa814d0b8fb3aff70e1922c252adc..eb2ff8f988f2360091788f08611406f7b8d7535e 100644 --- a/lib_dec/dec_gen_voic.c +++ b/lib_dec/dec_gen_voic.c @@ -40,7 +40,7 @@ #include "rom_com.h" #include "prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * decod_gen_voic() * diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index f27403cdba3f041e545fa4d101167adf69864cbe..fe160005088af67848f306499e661b47cbb0d2cc 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -10,7 +10,7 @@ #include "prot_fx2.h" /* Function prototypes */ #include "stl.h" #include "basop_util.h" - +#ifdef IVAS_FLOAT_FIXED /*======================================================================*/ /* FUNCTION : decod_gen_voic_fx() */ @@ -964,3 +964,4 @@ ivas_error decod_gen_voic_ivas_fx( return error; } +#endif \ No newline at end of file diff --git a/lib_dec/dec_higher_acelp.c b/lib_dec/dec_higher_acelp.c index 0d6856b84f4bb3a7b4ec6c4ffb7431d84495384d..304884e714e1f54d084e74f97bbbfe7fbdfc1227 100644 --- a/lib_dec/dec_higher_acelp.c +++ b/lib_dec/dec_higher_acelp.c @@ -50,7 +50,7 @@ * * Transform domain contribution decoding *-----------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void transf_cdbk_dec( Decoder_State *st, /* i/o: decoder state structure */ const int16_t harm_flag_acelp, /* i : harmonic flag for higher rates ACELP */ @@ -140,11 +140,7 @@ void transf_cdbk_dec( * Encode and multiplex subvectors into bitstream *--------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED - AVQ_demuxdec_fx( st, x_norm, &nBits, Nsv, nq, avq_bit_sFlag, trgtSvPos ); -#else AVQ_demuxdec( st, x_norm, &nBits, Nsv, nq, avq_bit_sFlag, trgtSvPos ); -#endif // IVAS_FLOAT_FIXED /* save # of AVQ unused bits for next subframe */ *unbits = nBits; diff --git a/lib_dec/dec_nelp.c b/lib_dec/dec_nelp.c index 80e86881f8c2ec5bc31929e2393e63dcbafb8625..a9cddbf159bb4b2003554bba09c43e78d7f3a76f 100644 --- a/lib_dec/dec_nelp.c +++ b/lib_dec/dec_nelp.c @@ -39,7 +39,7 @@ #include "cnst.h" #include "prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * decod_nelp() * diff --git a/lib_dec/dec_nelp_fx.c b/lib_dec/dec_nelp_fx.c index 7df109adce5c7ac908d491832fe9d42f0b34f6a3..6ab48efb44ff818e25ea6c2a47a036f8dc07b777 100644 --- a/lib_dec/dec_nelp_fx.c +++ b/lib_dec/dec_nelp_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*======================================================================*/ /* FUNCTION : decod_nelp_fx() */ /*-----------------------------------------------------------------------*/ @@ -101,3 +101,4 @@ void decod_nelp_fx( } return; } +#endif \ No newline at end of file diff --git a/lib_dec/dec_pit_exc.c b/lib_dec/dec_pit_exc.c index 431bdf9b41e16051d470cc4721321ad75beb9a60..7c95ecde165a339906e2cbcf24a7c0de36d0c466 100644 --- a/lib_dec/dec_pit_exc.c +++ b/lib_dec/dec_pit_exc.c @@ -46,7 +46,7 @@ * * Decode pitch-only contribution (used by the GSC technology) *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void dec_pit_exc( Decoder_State *st, /* i/o: decoder static memory */ const int16_t L_frame, /* i : length of the frame */ diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index 42940687d918b5d5222ba82e1c9de8fccd0c5ad6..05eef0de03f90eea9148faa4865db9c7a6a1ec3c 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -7,7 +7,7 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*==========================================================================*/ /* FUNCTION : void dec_pit_exc_fx() */ @@ -807,4 +807,5 @@ void dec_pit_exc_ivas_fx( } return; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/lib_dec/dec_post.c b/lib_dec/dec_post.c index a8ea1fa10472c66514c722c2d3dbac314450667d..a38a4155c3a3c1d9f91ee2a394555ceecfaf27ce 100644 --- a/lib_dec/dec_post.c +++ b/lib_dec/dec_post.c @@ -75,7 +75,7 @@ static void Dec_formant_postfilt( PFSTAT *pfstat, const float *signal_ptr, const * * Post-filter initialization *--------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void Init_post_filter_ivas( PFSTAT_HANDLE hPFstat /* i/o: post-filter state memories handle */ ) @@ -110,7 +110,7 @@ void Init_post_filter_ivas( * * Main routine to perform post filtering of NB signals *--------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void nb_post_filt_ivas( const int16_t L_frame, /* i : frame length */ const int16_t L_subfr, /* i : sub-frame length */ @@ -181,11 +181,11 @@ void nb_post_filt_ivas( #endif /*-------------------------------------------------------------------------- - * formant_post_filt: + * formant_post_filt_ivas: * * WB and SWB formant post-filtering *--------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void formant_post_filt_ivas( PFSTAT_HANDLE hPFstat, /* i/o: Post filter related memories */ float *synth_in, /* i : 12k8 synthesis */ @@ -316,7 +316,7 @@ void formant_post_filt_ivas( * 1. search around 1st subframe delay (3 integer values) * 2. search around best integer with fract. delays (1/8) *----------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED static void Dec_postfilt( const int16_t L_subfr, /* i : sub-frame length */ PFSTAT *pfstat, /* i/o: Post filter related memories */ @@ -402,7 +402,7 @@ static void Dec_postfilt( * k1 = 1st parcor calculated on {hi} * gamma3 = gamma3_minus if k1<0, gamma3_plus if k1>0 *----------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED static void Dec_formant_postfilt( PFSTAT_HANDLE hPFstat, /* i/o: states strucure */ const float *signal_ptr, /* i : input signal (pointer to current subframe */ diff --git a/lib_dec/dec_post_fx.c b/lib_dec/dec_post_fx.c index 3a8f3bd33063bea53f37dabb2f63f1eb91188a56..17ef599cc8240cb9ebffe218b54a54911f896bd6 100644 --- a/lib_dec/dec_post_fx.c +++ b/lib_dec/dec_post_fx.c @@ -9,7 +9,7 @@ #include "rom_dec.h" #include "rom_com.h" #include "cnst.h" - +#ifdef IVAS_FLOAT_FIXED #define FORMAT_POST_FILT_G1 24576/*0.75f Q15*/ /*0.75f*/ /*denominator 0.9,0.75,0.15,0.9*/ #define FORMAT_POST_FILT_G2 22938/*0.7f Q15*/ /*0.7f*/ /*numerator 0.75,0.7,0.1,0.7*/ #define FORMAT_POST_FILT_G1_MAX 26214/*0.8f Q15*/ /*for low bit-rates on clean speech*/ @@ -19,39 +19,39 @@ * Local function prototypes *--------------------------------------------------------------------------*/ -static void Dec_postfilt( PFSTAT_HANDLE hPFstat, const Word16 t0, const Word16 *signal_ptr, const Word16 *coeff, +static void Dec_postfilt_fx( PFSTAT_HANDLE hPFstat, const Word16 t0, const Word16 *signal_ptr, const Word16 *coeff, Word16 *sig_out, const Word16 gamma1, const Word16 gamma2, const Word16 Gain_factor, const Word16 disable_hpf ); -static void pst_ltp( Word16 t0, Word16 * ptr_sig_in, Word16 * ptr_sig_pst0, Word16 gain_factor ); +static void pst_ltp_fx( Word16 t0, Word16 * ptr_sig_in, Word16 * ptr_sig_pst0, Word16 gain_factor ); -static void search_del( Word16 t0, Word16 * ptr_sig_in, Word16 * ltpdel, Word16 * phase, Word16 * num_gltp, Word16 * den_gltp, +static void search_del_fx( Word16 t0, Word16 * ptr_sig_in, Word16 * ltpdel, Word16 * phase, Word16 * num_gltp, Word16 * den_gltp, Word16 * sh_num_gltp, Word16 * sh_den_gltp, Word16 * y_up, Word16 * off_yup ); -static void filt_plt( Word16 * s_in, Word16 * s_ltp, Word16 * s_out, Word16 gain_plt ); +static void filt_plt_fx( Word16 * s_in, Word16 * s_ltp, Word16 * s_out, Word16 gain_plt ); -static void compute_ltp_l( Word16 * s_in, Word16 ltpdel, Word16 phase, Word16 * y_up, Word16 * num, Word16 * den, Word16 * sh_num, Word16 * sh_den ); +static void compute_ltp_l_fx( Word16 * s_in, Word16 ltpdel, Word16 phase, Word16 * y_up, Word16 * num, Word16 * den, Word16 * sh_num, Word16 * sh_den ); -static Word16 select_ltp( Word16 num1, Word16 den1, Word16 sh_num1, Word16 sh_den1, Word16 num2, Word16 den2, Word16 sh_num2, Word16 sh_den2 ); +static Word16 select_ltp_fx( Word16 num1, Word16 den1, Word16 sh_num1, Word16 sh_den1, Word16 num2, Word16 den2, Word16 sh_num2, Word16 sh_den2 ); -static void calc_st_filt( Word16 * apond2, Word16 * apond1, Word16 * parcor0, Word16 * sig_ltp_ptr, Word16 * mem_zero ); +static void calc_st_filt_local_fx( Word16 * apond2, Word16 * apond1, Word16 * parcor0, Word16 * sig_ltp_ptr, Word16 * mem_zero ); -static void modify_pst_param( const Word16 lp_noise, Word16 *g1, Word16 *g2, const Word16 coder_type, Word16 *gain_factor ); +static void modify_pst_param_fx( const Word16 lp_noise, Word16 *g1, Word16 *g2, const Word16 coder_type, Word16 *gain_factor ); -static void Dec_formant_postfilt( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); +static void Dec_formant_postfilt_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); #ifdef IVAS_FLOAT_FIXED -static void Dec_formant_postfilt_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); +static void Dec_formant_postfilt_ivas_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); -static void calc_st_filt_fx( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero, const Word16 extl ); +static void calc_st_filt_ivas_fx( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero, const Word16 extl ); #endif /*-------------------------------------------------------------------------- - * Init_post_filter + * Init_post_filter_fx * * post filter initialization *--------------------------------------------------------------------------*/ -void Init_post_filter( +void Init_post_filter_fx( PFSTAT_HANDLE hPFstat /* i : core decoder parameters */ ) { @@ -84,7 +84,7 @@ void Init_post_filter( * * Main routine to perform post filtering on NB synthesis *--------------------------------------------------------------------------*/ -void nb_post_filt( +void nb_post_filt_fx( const Word16 L_frame, /* i : frame length */ PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *psf_lp_noise, /* i : Long term noise Q8 */ @@ -111,7 +111,7 @@ void nb_post_filt( } } - modify_pst_param( *psf_lp_noise, &Post_G1, &Post_G2, coder_type, &Gain_factor ); + modify_pst_param_fx( *psf_lp_noise, &Post_G1, &Post_G2, coder_type, &Gain_factor ); if(hPFstat->reset) { @@ -149,7 +149,7 @@ void nb_post_filt( { T0_first = Pitch_buf[j]; - Dec_postfilt( hPFstat, T0_first, &Pf_in[i], p_Aq, &Synth[i], Post_G1, Post_G2, Gain_factor, disable_hpf ); + Dec_postfilt_fx( hPFstat, T0_first, &Pf_in[i], p_Aq, &Synth[i], Post_G1, Post_G2, Gain_factor, disable_hpf ); p_Aq += (M+1); j = add(j,1); @@ -182,7 +182,7 @@ void nb_post_filt( * 1. search around 1st subframe delay (3 integer values) * 2. search around best integer with fract. delays (1/8) *----------------------------------------------------------------------------*/ -static void Dec_postfilt( +static void Dec_postfilt_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ const Word16 t0, /* i : pitch delay given by coder */ const Word16 * signal_ptr, /* i : input signal (pointer to current subframe */ @@ -225,7 +225,7 @@ static void Dec_postfilt( IF (disable_hpf == 0) { - pst_ltp( t0, res2_ptr, sig_ltp_ptr, Gain_factor ); + pst_ltp_fx( t0, res2_ptr, sig_ltp_ptr, Gain_factor ); } ELSE { @@ -238,16 +238,16 @@ static void Dec_postfilt( move16(); /* Controls short term pst filter gain and compute parcor0 */ - calc_st_filt(apond2, apond1, &parcor0, sig_ltp_ptr, hPFstat->mem_zero ); + calc_st_filt_local_fx(apond2, apond1, &parcor0, sig_ltp_ptr, hPFstat->mem_zero ); E_UTIL_synthesis(1, apond1, sig_ltp_ptr, sig_ltp_ptr, L_SUBFR, hPFstat->mem_stp+L_SYN_MEM-M, 0, M); Copy( sig_ltp_ptr+L_SUBFR-L_SYN_MEM, hPFstat->mem_stp, L_SYN_MEM ); /* Tilt filtering */ - Filt_mu(sig_ltp, sig_out, parcor0, L_SUBFR); + Filt_mu_fx(sig_ltp, sig_out, parcor0, L_SUBFR); /* Gain control */ - scale_st(signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR); + scale_st_fx(signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR); /* Update for next subframe */ Copy(&res2[L_SUBFR], hPFstat->mem_res2, DECMEM_RES2); @@ -257,11 +257,11 @@ static void Dec_postfilt( } /*-------------------------------------------------------------------------- - * formant_post_filt: + * formant_post_filt_fx: * * Main routine to perform formant post filtering *--------------------------------------------------------------------------*/ -void formant_post_filt( +void formant_post_filt_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ Word16 *Aq, /* i : LP filter coefficient */ @@ -381,14 +381,14 @@ void formant_post_filt( p_Aq = Aq; FOR (i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) { - Dec_formant_postfilt(hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); + Dec_formant_postfilt_fx(hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); p_Aq += (M+1); } } #ifdef IVAS_FLOAT_FIXED -void formant_post_filt_fx( +void formant_post_filt_ivas_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ Word16 *Aq, /* i : LP filter coefficient */ @@ -508,13 +508,13 @@ void formant_post_filt_fx( p_Aq = Aq; FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) { - Dec_formant_postfilt_fx( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); + Dec_formant_postfilt_ivas_fx( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); p_Aq += ( M + 1 ); } } #endif /*---------------------------------------------------------------------------- - * Dec_postfilt + * Dec_formant_postfilt_fx * * Post - adaptive postfilter main function * Short term postfilter : @@ -528,7 +528,7 @@ void formant_post_filt_fx( * k1 = 1st parcor calculated on {hi} * gamma3 = gamma3_minus if k1<0, gamma3_plus if k1>0 *----------------------------------------------------------------------------*/ -static void Dec_formant_postfilt( +static void Dec_formant_postfilt_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *signal_ptr, /* i : input signal (pointer to current subframe */ Word16 *coeff, /* i : LPC coefficients for current subframe */ @@ -576,7 +576,7 @@ static void Dec_formant_postfilt( } /* Controls short term pst filter gain and compute parcor0 */ - calc_st_filt(apond2, apond1, &parcor0, res2, hPFstat->mem_zero ); + calc_st_filt_local_fx(apond2, apond1, &parcor0, res2, hPFstat->mem_zero ); /* 1/A(gamma1) filtering, mem_stp is updated */ resynth[0] = *(hPFstat->mem_stp + sub(L_SYN_MEM, 1)); @@ -594,21 +594,21 @@ static void Dec_formant_postfilt( } /* Tilt filtering */ - Filt_mu(resynth, sig_out, parcor0, L_SUBFR); + Filt_mu_fx(resynth, sig_out, parcor0, L_SUBFR); IF (scale_down) { Scale_sig(sig_out, L_SUBFR, 1); } /* Gain control */ - scale_st(signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR); + scale_st_fx(signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR); return; } #ifdef IVAS_FLOAT_FIXED -static void Dec_formant_postfilt_fx( +static void Dec_formant_postfilt_ivas_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *signal_ptr, /* i : input signal (pointer to current subframe */ Word16 *coeff, /* i : LPC coefficients for current subframe */ @@ -656,7 +656,7 @@ static void Dec_formant_postfilt_fx( } /* Controls short term pst filter gain and compute parcor0 */ - calc_st_filt_fx(apond2, apond1, &parcor0, res2, hPFstat->mem_zero , -1 ); + calc_st_filt_ivas_fx(apond2, apond1, &parcor0, res2, hPFstat->mem_zero , -1 ); /* 1/A(gamma1) filtering, mem_stp is updated */ resynth[0] = *(hPFstat->mem_stp + sub(L_SYN_MEM, 1)); @@ -674,14 +674,14 @@ static void Dec_formant_postfilt_fx( } /* Tilt filtering */ - Filt_mu_fx(resynth, sig_out, parcor0, L_SUBFR , -1); + Filt_mu_ivas_fx(resynth, sig_out, parcor0, L_SUBFR , -1); IF(scale_down) { Scale_sig(sig_out, L_SUBFR, 1); } /* Gain control */ - scale_st(signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR); + scale_st_fx(signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR); return; @@ -694,7 +694,7 @@ static void Dec_formant_postfilt_fx( * Modify gamma1 and gamma2 values in function of the long term noise level *-----------------------------------------------------------------------------------*/ -static void modify_pst_param( +static void modify_pst_param_fx( const Word16 lp_noise, /* i : Long term noise energy Q8 */ Word16 *g1, /* o : Gamma1 used in post filter Q15 */ Word16 *g2, /* o : Gamma1 used in post filter Q15 */ @@ -758,11 +758,11 @@ static void modify_pst_param( } /*---------------------------------------------------------------------------- - * pst_ltp + * pst_ltp_fx * * Perform harmonic postfilter *----------------------------------------------------------------------------*/ -static void pst_ltp( +static void pst_ltp_fx( Word16 t0, /* i : pitch delay given by coder */ Word16 * ptr_sig_in, /* i : postfilter i filter (residu2) */ Word16 * ptr_sig_pst0, /* o : harmonic postfilter o */ @@ -808,7 +808,7 @@ static void pst_ltp( ptr_sig_cadr = sig_cadr + DECMEM_RES2; /* Sub optimal delay search */ - search_del(t0, ptr_sig_cadr, <pdel, &phase, &num_gltp, &den_gltp, &sh_num, &sh_den, y_up, &off_yup); + search_del_fx(t0, ptr_sig_cadr, <pdel, &phase, &num_gltp, &den_gltp, &sh_num, &sh_den, y_up, &off_yup); IF (num_gltp == 0) @@ -824,10 +824,10 @@ static void pst_ltp( ELSE { /* Filtering with long filter */ - compute_ltp_l(ptr_sig_cadr, ltpdel, phase, ptr_sig_pst0, &num2_gltp, &den2_gltp, &sh_num2, &sh_den2); + compute_ltp_l_fx(ptr_sig_cadr, ltpdel, phase, ptr_sig_pst0, &num2_gltp, &den2_gltp, &sh_num2, &sh_den2); - IF (EQ_16(select_ltp(num_gltp, den_gltp, sh_num, sh_den, num2_gltp, den2_gltp, sh_num2, sh_den2), 1)) + IF (EQ_16(select_ltp_fx(num_gltp, den_gltp, sh_num, sh_den, num2_gltp, den2_gltp, sh_num2, sh_den2), 1)) { /* select short filter */ temp = sub(phase, 1); @@ -901,17 +901,17 @@ static void pst_ltp( #endif /** filtering by H0(z) = harmonic filter **/ - filt_plt(ptr_sig_in, ptr_y_up, ptr_sig_pst0, gain_plt); + filt_plt_fx(ptr_sig_in, ptr_y_up, ptr_sig_pst0, gain_plt); } } /*---------------------------------------------------------------------------- - * search_del: + * search_del_fx: * * Computes best (shortest) integer LTP delay + fine search *---------------------------------------------------------------------------*/ -static void search_del( +static void search_del_fx( Word16 t0, /* i : pitch delay given by coder */ Word16 * ptr_sig_in, /* i : i signal (with delay line) */ Word16 * ltpdel, /* o : delay = *ltpdel - *phase / f_up */ @@ -1366,11 +1366,11 @@ static void search_del( } /*---------------------------------------------------------------------------- - * filt_plt: + * filt_plt_fx: * * Perform long term postfilter *----------------------------------------------------------------------------*/ -static void filt_plt( +static void filt_plt_fx( Word16 * s_in, /* i : i signal with past */ Word16 * s_ltp, /* i : filtered signal with gain 1 */ Word16 * s_out, /* o : signal */ @@ -1402,12 +1402,12 @@ static void filt_plt( /*---------------------------------------------------------------------------- - * compute_ltp_l : + * compute_ltp_l_fx : * * compute delayed signal, num & den of gain for fractional delay * with long interpolation filter *----------------------------------------------------------------------------*/ -static void compute_ltp_l( +static void compute_ltp_l_fx( Word16 * s_in, /* i/o: signal with past */ Word16 ltpdel, /* i : delay factor */ Word16 phase, /* i : phase factor */ @@ -1489,13 +1489,13 @@ static void compute_ltp_l( } /*---------------------------------------------------------------------------- - * select_ltp: + * select_ltp_fx: * * selects best of (gain1, gain2) * with gain1 = num1 * 2** sh_num1 / den1 * 2** sh_den1 * and gain2 = num2 * 2** sh_num2 / den2 * 2** sh_den2 *----------------------------------------------------------------------------*/ -static Word16 select_ltp( /* o : 1 = 1st gain, 2 = 2nd gain */ +static Word16 select_ltp_fx( /* o : 1 = 1st gain, 2 = 2nd gain */ Word16 num1, /* i : numerator of gain1 */ Word16 den1, /* i : denominator of gain1 */ Word16 sh_num1, /* i : just. factor for num1 */ @@ -1554,13 +1554,13 @@ static Word16 select_ltp( /* o : 1 = 1st gain, 2 = 2nd gain */ } /*---------------------------------------------------------------------------- - * calc_st_filt + * calc_st_filt_local_fx * * computes impulse response of A(gamma2) / A(gamma1) * controls gain : computation of energy impulse response as * SUMn (abs (h[n])) and computes parcor0 *---------------------------------------------------------------------------- */ -static void calc_st_filt( +static void calc_st_filt_local_fx( Word16 * apond2, /* i : coefficients of numerator */ Word16 * apond1, /* i : coefficients of denominator */ Word16 * parcor0, /* o : 1st parcor calcul. on composed filter */ @@ -1608,7 +1608,7 @@ static void calc_st_filt( } #ifdef IVAS_FLOAT_FIXED -static void calc_st_filt_fx( +static void calc_st_filt_ivas_fx( Word16 * apond2, /* i : coefficients of numerator */ Word16 * apond1, /* i : coefficients of denominator */ Word16 * parcor0, /* o : 1st parcor calcul. on composed filter */ @@ -1668,7 +1668,7 @@ static void calc_st_filt_fx( * tilt filtering with : (1 + mu z-1) * (1/1-|mu|) * computes y[n] = (1/1-|mu|) (x[n]+mu*x[n-1]) *---------------------------------------------------------------------------*/ -void Filt_mu( +void Filt_mu_fx( Word16 * sig_in, /* i : signal (beginning at sample -1) */ Word16 * sig_out, /* o : signal with tilt */ Word16 parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ @@ -1748,7 +1748,7 @@ void Filt_mu( } #ifdef IVAS_FLOAT_FIXED -void Filt_mu_fx( +void Filt_mu_ivas_fx( Word16 * sig_in, /* i : signal (beginning at sample -1) */ Word16 * sig_out, /* o : signal with tilt */ Word16 parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ @@ -1851,12 +1851,12 @@ void Filt_mu_fx( } #endif /*---------------------------------------------------------------------------- - * scale_st() + * scale_st_fx() * * control of the subframe gain * gain[n] = AGC_FAC_FX * gain[n-1] + (1 - AGC_FAC_FX) g_in/g_out *---------------------------------------------------------------------------*/ -void scale_st( +void scale_st_fx( const Word16 * sig_in, /* i : postfilter i signal */ Word16 * sig_out, /* i/o: postfilter o signal */ Word16 * gain_prec, /* i/o: last value of gain for subframe */ @@ -1961,12 +1961,12 @@ void scale_st( } /*---------------------------------------------------------------------------- - * blend_subfr2() + * blend_subfr2_fx() * * *---------------------------------------------------------------------------*/ -void blend_subfr2( +void blend_subfr2_fx( Word16 *sigIn1, Word16 *sigIn2, Word16 *sigOut @@ -1994,4 +1994,4 @@ void blend_subfr2( return; } - +#endif diff --git a/lib_dec/dec_ppp.c b/lib_dec/dec_ppp.c index 5e2d86a69cfc47b43fd048429f88ec4542475558..12237849a6f31408c6e94213d8849edee3aa81b4 100644 --- a/lib_dec/dec_ppp.c +++ b/lib_dec/dec_ppp.c @@ -39,7 +39,7 @@ #include "cnst.h" #include "prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- * decod_ppp() * diff --git a/lib_dec/dec_ppp_fx.c b/lib_dec/dec_ppp_fx.c index 575c53508d40ab52d22160b8ee713d1bea753547..88ef2dc670ae1e23613e0b36f8f7a268ed29b98d 100644 --- a/lib_dec/dec_ppp_fx.c +++ b/lib_dec/dec_ppp_fx.c @@ -7,7 +7,7 @@ #include "options.h" /* Compilation switches */ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*===================================================================*/ /* FUNCTION : void decod_ppp_fx () */ /*-------------------------------------------------------------------*/ @@ -113,3 +113,4 @@ ivas_error decod_ppp_fx( set16_fx(gain_buf,0,NB_SUBFR16k); return error; } +#endif diff --git a/lib_dec/dec_prm.c b/lib_dec/dec_prm.c index 296a15cf98d63cc28acd85d861452e733cd5e08a..cf84280904bccbd895b98b5ed4a9c858db903fcd 100644 --- a/lib_dec/dec_prm.c +++ b/lib_dec/dec_prm.c @@ -360,7 +360,7 @@ void getLPCparam_ivas( { if ( st->lpcQuantization == 0 ) { - decode_lpc_avq_flt( st0, st->numlpc, param_lpc, ch, st->element_mode, sns_low_br_mode ); + decode_lpc_avq( st0, st->numlpc, param_lpc, ch, st->element_mode, sns_low_br_mode ); } else if ( st->lpcQuantization == 1 ) { @@ -402,7 +402,7 @@ void getLPCparam_ivas( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * getTCXparam_ivas() * @@ -700,11 +700,7 @@ void getTCXparam_ivas( { ConfigureContextHm_ivas( lgFB, nbits_tcx, PeriodicityIndex, hTcxDec->tcx_hm_LtpPitchLag, &hm_cfg ); } -#ifdef IVAS_FLOAT_FIXED - hTcxDec->resQBits[k] = RCcontextMapping_decode2_no_mem_s17_LCS_fx( st0, prm + j, lgFB, nbits_tcx, NPRM_RESQ * st->hTcxCfg->resq, flag_ctx_hm ? &hm_cfg : NULL ); -#else hTcxDec->resQBits[k] = RCcontextMapping_decode2_no_mem_s17_LCS( st0, prm + j, lgFB, nbits_tcx, NPRM_RESQ * st->hTcxCfg->resq, flag_ctx_hm ? &hm_cfg : NULL ); -#endif } else { @@ -767,7 +763,7 @@ void dec_prm_hm_ivas( * * decode parameters according to selected mode * *-----------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void dec_prm_ivas( Decoder_State *st, /* i/o: decoder memory state */ int16_t param[], /* o : decoded parameters */ diff --git a/lib_dec/dec_prm_fx.c b/lib_dec/dec_prm_fx.c index 75fbef2927725147a558ac33547c8fff68fd5cd0..f1195d5c6b8379ba92310884fb4e4a0afb5050fe 100644 --- a/lib_dec/dec_prm_fx.c +++ b/lib_dec/dec_prm_fx.c @@ -13,14 +13,14 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "basop_util.h" - +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * getLPCparam_ivas() * * get LPC parameters *--------------------------------------------------------------------*/ -void getLPCparam( +void getLPCparam_fx( Decoder_State *st, /* i/o: decoder memory state */ Word16 param_lpc[], /* o : LTP parameters */ Decoder_State *st0, /* i : bitstream */ @@ -51,7 +51,7 @@ void getLPCparam( { IF( EQ_16( st->lpcQuantization, 0 ) ) { - decode_lpc_avq_ivas( st0, st->numlpc, param_lpc, ch, st->element_mode, sns_low_br_mode ); + decode_lpc_avq_ivas_fx( st0, st->numlpc, param_lpc, ch, st->element_mode, sns_low_br_mode ); } ELSE IF( EQ_16( st->lpcQuantization, 1 ) ) { @@ -93,7 +93,7 @@ void getLPCparam( return; } -void dec_prm_hm( +void dec_prm_hm_fx( Decoder_State *st, Word16 *prm_hm, const Word16 L_frame @@ -142,12 +142,12 @@ void dec_prm_hm( } /*-------------------------------------------------------------------* - * getTCXparam() + * getTCXparam_fx() * * get TCX core parameters *-------------------------------------------------------------------*/ -void getTCXparam( +void getTCXparam_fx( Decoder_State *st, /* i/o: Decoder State handle */ Decoder_State *st0, /* i : bitstream */ CONTEXT_HM_CONFIG hm_cfg, /* i/o: HM config */ @@ -351,7 +351,7 @@ void getTCXparam( IF( hTcxDec->tcx_lpc_shaped_ari && NE_16( st->last_core_from_bs, ACELP_CORE ) ) { - dec_prm_hm( st0, &prm[j], hm_size ); + dec_prm_hm_fx( st0, &prm[j], hm_size ); } nbits_tcx = sub( st->bits_frame_core, sub( st0->next_bit_pos, start_bit_pos ) ); @@ -451,14 +451,14 @@ void getTCXparam( return; } /*-----------------------------------------------------------------* - * Funtion dec_prm() * + * Funtion dec_prm_fx() * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * * SQ is used for TCX modes * * decode parameters according to selected mode * *-----------------------------------------------------------------*/ -void dec_prm( +void dec_prm_fx( Word16 *coder_type, Word16 param[], /* (o) : decoded parameters */ Word16 param_lpc[], /* (o) : LPC parameters */ @@ -606,7 +606,7 @@ void dec_prm( IF (get_next_indice_1(st) != 0) /* TCX */ { tmp = get_next_indice(st, 3); - assert(!(tmp & 4) || !"HQ_CORE encountered in dec_prm"); + assert(!(tmp & 4) || !"HQ_CORE encountered in dec_prm_fx"); st->core = TCX_20_CORE; move16(); st->hTcxCfg->coder_type = tmp; @@ -876,7 +876,7 @@ void dec_prm( { IF (st->lpcQuantization==0) { - decode_lpc_avq( st, st->numlpc, param_lpc + decode_lpc_avq_fx( st, st->numlpc, param_lpc #ifdef IVAS_CODE_AVQ_LPC , , , #endif @@ -1210,7 +1210,7 @@ void dec_prm( test(); IF (hTcxDec->tcx_lpc_shaped_ari != 0 && NE_16(st->last_core_from_bs, ACELP_CORE)) { - dec_prm_hm(st, &prm[j], hm_size); + dec_prm_hm_fx(st, &prm[j], hm_size); } nbits_tcx = sub(st->bits_frame_core, sub(st->next_bit_pos, start_bit_pos)); @@ -1574,4 +1574,4 @@ void dec_prm( return; } - +#endif diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c index f38d285a7d546f818624e2200be2dd8e5f5888ea..92c25ad45a089718e6e62bb90e16004875aa5ed5 100644 --- a/lib_dec/dec_tcx.c +++ b/lib_dec/dec_tcx.c @@ -51,14 +51,14 @@ #include "debug.h" #endif // !IVAS_FLOAT_FIXED_UNIT_TESTING -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------* - * decoder_tcx_flt() + * decoder_tcx() * * *-----------------------------------------------------------------*/ -void decoder_tcx_flt( +void decoder_tcx( Decoder_State *st, /* i/o: coder memory state */ int16_t prm[], /* i : parameters */ float A[], /* i : coefficients NxAz[M+1] */ @@ -114,12 +114,12 @@ void decoder_tcx_flt( #endif /*-------------------------------------------------------------------* - * decoder_tcx_post_flt() + * decoder_tcx_post() * * *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void decoder_tcx_post_flt( +#ifndef IVAS_FLOAT_FIXED +void decoder_tcx_post( Decoder_State *st, /* i/o: decoder memory state */ float *synth, /* i/o: synthesis */ float *synthFB, /* i/o: FB synthesis */ @@ -179,7 +179,7 @@ void decoder_tcx_post_flt( * PLC: update or retrieve the background level */ if ( bfi == 0 && st->tcxonly && ( st->element_mode != IVAS_CPE_MDCT || MCT_flag ) && st->clas_dec == UNVOICED_CLAS ) { - minimumStatistics_flt( hTcxDec->NoiseLevelMemory_bfi, &hTcxDec->NoiseLevelIndex_bfi, &hTcxDec->CurrLevelIndex_bfi, &hTcxDec->CngLevelBackgroundTrace_bfi, &hTcxDec->LastFrameLevel_bfi, level_syn, PLC_MIN_CNG_LEV_FLT, PLC_MIN_STAT_BUFF_SIZE ); + minimumStatistics( hTcxDec->NoiseLevelMemory_bfi, &hTcxDec->NoiseLevelIndex_bfi, &hTcxDec->CurrLevelIndex_bfi, &hTcxDec->CngLevelBackgroundTrace_bfi, &hTcxDec->LastFrameLevel_bfi, level_syn, PLC_MIN_CNG_LEV_FLT, PLC_MIN_STAT_BUFF_SIZE ); } /* PLC: [TCX: Fade-out] @@ -260,9 +260,7 @@ void decoder_tcx_post_flt( st->old_pitch_buf[1] = st->old_pitch_buf[st->nb_subfr + 1]; mvr2r( &st->old_pitch_buf[st->nb_subfr + 2], &st->old_pitch_buf[2], st->nb_subfr ); set_f( &st->old_pitch_buf[st->nb_subfr + 2], st->old_fpitch_float, st->nb_subfr ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) st->bfi_pitch = st->old_fpitch_float; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) st->bfi_pitch_frame = st->L_frame; st->mem_pitch_gain_float[2 * st->nb_subfr + 1] = st->mem_pitch_gain_float[st->nb_subfr + 1]; @@ -279,11 +277,11 @@ void decoder_tcx_post_flt( /*-------------------------------------------------------------------* - * IMDCT_flt() + * IMDCT() * * *-------------------------------------------------------------------*/ -void IMDCT_flt( +void IMDCT( float *x, float *old_syn_overl, float *syn_Overl_TDAC, @@ -357,48 +355,12 @@ void IMDCT_flt( { if ( kernel_type == MDST_IV || ( kernel_type & w ) ) { -#ifdef IVAS_FLOAT_FIXED - Word32 x_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; - Word16 win_fx[810] = { 0 }; - Word16 q_x = Q15, q_win, x_e_hdrm; - x_e_hdrm = sub(q_x, 15); - q_win = q_x + x_e_hdrm - 16; - for ( int k = 0; k < L_ola + L_win; k++ ) - { - x_fx[w * L_spec_TCX5 + k] = (Word32) ( x[w * L_spec_TCX5 + k] * ( 1u << q_x ) ); - } - - TCX_MDST_Inverse_fx( x_fx + w * L_spec_TCX5, x_e_hdrm, win_fx, L_ola, L_win - L_ola, L_ola); - - for ( int k = 0; k < L_ola + L_win; k++ ) - { - win[k] = (float) win_fx[k] / ( 1u << (q_win) ); - } -#else TCX_MDST_Inverse_flt( x + w * L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, st->element_mode ); -#endif // IVAS_FLOAT_FIXED } else if ( kernel_type != 0 && w == 0 ) /* type 1 or 2 */ { -#ifdef IVAS_FLOAT_FIXED - Word32 x_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; - Word16 win_fx[810] = { 0 }; - Word16 q_x = Q13, q_win, x_e_hdrm; - x_e_hdrm = sub( q_x, 10 ); - q_win = q_x + x_e_hdrm - 16; - for ( int k = 0; k < L_ola + L_win; k++ ) - { - x_fx[w * L_spec_TCX5 + k] = (Word32) ( x[w * L_spec_TCX5 + k] * ( 1u << q_x ) ); - } - TCX_MDXT_Inverse_fx( x_fx + w * L_spec_TCX5, x_e_hdrm, win_fx, L_ola, L_win - L_ola, L_ola, kernel_type ); - for ( int k = 0; k < L_ola + L_win; k++ ) - { - win[k] = (float) win_fx[k] / ( 1u << ( q_win ) ); - } -#else TCX_MDXT_Inverse_flt( x + w * L_spec_TCX5, win, L_ola, L_win - L_ola, L_ola, kernel_type ); -#endif // IVAS_FLOAT_FIXED } else { @@ -598,26 +560,6 @@ void IMDCT_flt( mvr2r( xn_buf + overlap / 2 + 2 * acelp_mem_len, &buf[0], analysis_len ); /* get LPC from that signal part to use for acelp zir smoothing */ -#ifdef IVAS_FLOAT_FIXED - Word16 buf_fx[L_FRAME_MAX / 4]; - Word16 window_buf_fx[L_FRAME_MAX / 4]; - Word32 r_fx[M + 1]; - Word16 q_r, q_old_Aq_12_8, q_buf; - f2me_buf_16(buf, buf_fx, &q_buf, analysis_len); - q_buf = sub(15, q_buf); - q_old_Aq_12_8 = 28; - Word32 old_Aq_12_8_fx[17]; - FOR(Word16 ind = 0; ind < 17; ind++) { - old_Aq_12_8_fx[ind] = float_to_fix(st->old_Aq_12_8[ind], q_old_Aq_12_8); - } - ham_cos_window_ivas( &window_buf_fx[0], analysis_len / 2, analysis_len / 2 ); - autocorr_fx_32( &buf_fx[0], M, &r_fx[0], &q_r, analysis_len, &window_buf_fx[0], 0, 0 ); - lag_wind_32( r_fx, M, L_frame_glob * FRAMES_PER_SEC, LAGW_STRONG ); - lev_dur_fx( &old_Aq_12_8_fx[0], &r_fx[0], M, NULL, q_old_Aq_12_8, q_buf * 2 + q_r + 1 ); - FOR(Word16 ind = 0; ind < 17; ind++) { - st->old_Aq_12_8[ind] = fix_to_float(old_Aq_12_8_fx[ind], q_old_Aq_12_8); - } -#else float window_buf[L_FRAME_MAX / 4]; float r[M + 1]; @@ -625,7 +567,6 @@ void IMDCT_flt( autocorr( &buf[0], &r[0], M, analysis_len, &window_buf[0], 0, 0, 0 ); lag_wind_flt( r, M, L_frame_glob * FRAMES_PER_SEC, LAGW_STRONG ); lev_dur( &st->old_Aq_12_8[0], &r[0], M, NULL ); -#endif } /* Window current frame */ @@ -882,19 +823,7 @@ void decoder_tcx_invQ( prm_target = prm_sqQ; prm_sqQ = prm_target + 1; -#ifdef IVAS_FLOAT_FIXED - Word32 x_fx[N_MAX]; - Word16 x_e; - //st->hTcxCfg->preemph_fac = FL2WORD16(st->hTcxCfg->preemph_fac_flt); - //st->inv_gamma = FL2WORD16_SCALE(1 / st->gamma_float, 1); - tcx_arith_decode_envelope_fx( st, x_fx, &x_e, L_frame, L_spec, Aind, *prm_target, prm_sqQ, st->last_core_from_bs != ACELP_CORE, prm_hm, /* HM parameter area */ hTcxDec->tcx_hm_LtpPitchLag, &arith_bits, &signaling_bits, ( st->bwidth > WB ) ? 1 : 0 ); - for (int k = 0; k < N_MAX; ++k) - { - x[k] = ((float)x_fx[k] / ((unsigned)1 << (31 - x_e))); - } -#else - tcx_arith_decode_envelope_flt( st, x, L_frame, L_spec, Aind, *prm_target, prm_sqQ, st->last_core_from_bs != ACELP_CORE, prm_hm, /* HM parameter area */ hTcxDec->tcx_hm_LtpPitchLag, &arith_bits, &signaling_bits, ( st->bwidth > WB ) ? 1 : 0 ); -#endif + tcx_arith_decode_envelope( st, x, L_frame, L_spec, Aind, *prm_target, prm_sqQ, st->last_core_from_bs != ACELP_CORE, prm_hm, /* HM parameter area */ hTcxDec->tcx_hm_LtpPitchLag, &arith_bits, &signaling_bits, ( st->bwidth > WB ) ? 1 : 0 ); hTcxDec->resQBits[frame_cnt] = *prm_target - arith_bits; @@ -1456,7 +1385,7 @@ void decoder_tcx_noisefilling( #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * decoder_tcx_noiseshaping_igf() * @@ -1749,7 +1678,7 @@ void decoder_tcx_tns_fx( } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * decoder_tcx_imdct() * @@ -1900,7 +1829,7 @@ void decoder_tcx_imdct( if ( st->element_mode != IVAS_CPE_DFT && !sba_dirac_stereo_flag ) { - IMDCT_flt( xn_bufFB, hTcxDec->syn_Overl_float, hTcxDec->syn_Overl_TDAC_float, xn_buf, hTcxCfg->tcx_aldo_window_1_trunc_flt, hTcxCfg->tcx_aldo_window_2_flt, + IMDCT( xn_bufFB, hTcxDec->syn_Overl_float, hTcxDec->syn_Overl_TDAC_float, xn_buf, hTcxCfg->tcx_aldo_window_1_trunc_flt, hTcxCfg->tcx_aldo_window_2_flt, hTcxCfg->tcx_mdct_window_half_flt, hTcxCfg->tcx_mdct_window_minimum_flt, hTcxCfg->tcx_mdct_window_trans_flt, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_outLB, 0, st, 0, acelp_zir ); } @@ -1908,7 +1837,7 @@ void decoder_tcx_imdct( /* Generate additional comfort noise to mask potential coding artefacts */ if ( st->flag_cna && st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && !st->cna_dirac_flag ) { - generate_masking_noise_mdct_flt( x, st->hFdCngDec->hFdCngCom ); + generate_masking_noise_mdct( x, st->hFdCngDec->hFdCngCom ); } if ( st->element_mode == IVAS_CPE_DFT || sba_dirac_stereo_flag ) @@ -1916,19 +1845,19 @@ void decoder_tcx_imdct( mvr2r( x, xn_bufFB, max( L_spec, max( L_frame, L_frameTCX ) ) ); - IMDCT_flt( xn_bufFB, hTcxDec->syn_Overl_float, hTcxDec->syn_Overl_TDAC_float, xn_buf, hTcxCfg->tcx_aldo_window_1_trunc_flt, hTcxCfg->tcx_aldo_window_2_flt, hTcxCfg->tcx_mdct_window_half_flt, hTcxCfg->tcx_mdct_window_minimum_flt, hTcxCfg->tcx_mdct_window_trans_flt, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, + IMDCT( xn_bufFB, hTcxDec->syn_Overl_float, hTcxDec->syn_Overl_TDAC_float, xn_buf, hTcxCfg->tcx_aldo_window_1_trunc_flt, hTcxCfg->tcx_aldo_window_2_flt, hTcxCfg->tcx_mdct_window_half_flt, hTcxCfg->tcx_mdct_window_minimum_flt, hTcxCfg->tcx_mdct_window_trans_flt, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_outLB, 0, st, 0, acelp_zir ); } if ( st->element_mode != EVS_MONO ) { - IMDCT_flt( x_tmp, hTcxDec->syn_OverlFB_float, hTcxDec->syn_Overl_TDACFB_float, xn_bufFB, hTcxCfg->tcx_aldo_window_1_FB_trunc_flt, hTcxCfg->tcx_aldo_window_2_FB_flt, + IMDCT( x_tmp, hTcxDec->syn_OverlFB_float, hTcxDec->syn_Overl_TDACFB_float, xn_bufFB, hTcxCfg->tcx_aldo_window_1_FB_trunc_flt, hTcxCfg->tcx_aldo_window_2_FB_flt, hTcxCfg->tcx_mdct_window_halfFB_flt, hTcxCfg->tcx_mdct_window_minimumFB_flt, hTcxCfg->tcx_mdct_window_transFB_flt, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); } else { - IMDCT_flt( x, hTcxDec->syn_OverlFB_float, hTcxDec->syn_Overl_TDACFB_float, xn_bufFB, hTcxCfg->tcx_aldo_window_1_FB_trunc_flt, hTcxCfg->tcx_aldo_window_2_FB_flt, hTcxCfg->tcx_mdct_window_halfFB_flt, hTcxCfg->tcx_mdct_window_minimumFB_flt, hTcxCfg->tcx_mdct_window_transFB_flt, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, + IMDCT( x, hTcxDec->syn_OverlFB_float, hTcxDec->syn_Overl_TDACFB_float, xn_bufFB, hTcxCfg->tcx_aldo_window_1_FB_trunc_flt, hTcxCfg->tcx_aldo_window_2_FB_flt, hTcxCfg->tcx_mdct_window_halfFB_flt, hTcxCfg->tcx_mdct_window_minimumFB_flt, hTcxCfg->tcx_mdct_window_transFB_flt, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); } @@ -2148,7 +2077,7 @@ void decoder_tcx_imdct_fx( /* Generate additional comfort noise to mask potential coding artefacts */ IF ( NE_16(st->flag_cna, 0) && NE_16(st->element_mode, IVAS_CPE_TD) && NE_16(st->element_mode, IVAS_CPE_DFT) && EQ_16(st->cna_dirac_flag, 0) ) { - generate_masking_noise_mdct( x_fx, &x_e, st->hFdCngDec->hFdCngCom, L_frame ); + generate_masking_noise_mdct_fx( x_fx, &x_e, st->hFdCngDec->hFdCngCom, L_frame ); FOR(Word16 ind = 0; ind < L_frame; ind++) { x_fx[ind] = L_shr(x_fx[ind], sub(31, add(x_e, q_x))); } diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 1e729c7d907f67d4402001ea5b5a89e484dce468..45e907d8d8058284151e6c6778cc3119e0721b8f 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -16,17 +16,17 @@ #include "ivas_prot_fx.h" #include "ivas_rom_com.h" #include "ivas_rom_com_fx.h" - +#ifdef IVAS_FLOAT_FIXED extern const Word16 T_DIV_L_Frame[];/*0Q15 * 2^-7 */ -static Word32 CalculateAbsEnergy( /* o : normalized result Q31 */ +static Word32 CalculateAbsEnergy_fx( /* o : normalized result Q31 */ const Word32 L_off, /* i : initial sum value Qn */ const Word16 x[], /* i : x vector Qn */ const Word16 lg, /* i : vector length, range [0..7FFF] Q0 */ Word16 * exp /* o : exponent of result in [-32,31] Q0 */ ); -void decoder_tcx( +void decoder_tcx_fx( TCX_CONFIG_HANDLE hTcxCfg, Word16 prm[], /* input: parameters */ Word16 A[], /* input: coefficients NxAz[M+1] */ @@ -363,7 +363,7 @@ void decoder_tcx( move16(); } - tcx_arith_decode_envelope( + tcx_arith_decode_envelope_fx( x, &x_e, L_frame, L_spec, @@ -500,7 +500,7 @@ void decoder_tcx( } ELSE { - hTcxDec->damping = Damping_fact(coder_type, st->nbLostCmpt, st->last_good, stab_fac, &(st->Mode2_lp_gainp), st->last_core); + hTcxDec->damping = Damping_fact_fx(coder_type, st->nbLostCmpt, st->last_good, stab_fac, &(st->Mode2_lp_gainp), st->last_core); gain_tcx = hTcxDec->old_gaintcx_bfi; move16(); gain_tcx_e = hTcxDec->old_gaintcx_bfi_e; @@ -872,8 +872,8 @@ void decoder_tcx( Word16 exp1, exp2; Word32 E_2ndlast, E_last; - E_2ndlast = CalculateAbsEnergy(1, &(st->tonalMDCTconceal.lastBlockData.spectralData[0]), infoIGFStartLine, &exp2); - E_last = CalculateAbsEnergy(1, &(st->tonalMDCTconceal.lastBlockData.spectralData[1]), infoIGFStartLine, &exp1); + E_2ndlast = CalculateAbsEnergy_fx(1, &(st->tonalMDCTconceal.lastBlockData.spectralData[0]), infoIGFStartLine, &exp2); + E_last = CalculateAbsEnergy_fx(1, &(st->tonalMDCTconceal.lastBlockData.spectralData[1]), infoIGFStartLine, &exp1); BASOP_Util_Divide_MantExp(extract_h(E_2ndlast), exp2, extract_h(E_last), exp1, &tmp1, &tmp2); @@ -1080,7 +1080,7 @@ void decoder_tcx( index = hTcxCfg->tcx_last_overlap_mode; /* backup last TCX overlap mode */ move16(); - /* normalize spectrum to minimize IMDCT noise */ + /* normalize spectrum to minimize IMDCT_fx noise */ tmp1 = s_max(s_max(L_frame,L_frameTCX), L_spec); s = s_max(0, sub(getScaleFactor32(x, tmp1), 4)); /* Keep 4 bits headroom for TNS */ Scale_sig32(x, tmp1, s); @@ -1235,17 +1235,17 @@ void decoder_tcx( { set32_fx( xn_buf32+st->hIGFDec->infoIGFStartLine, 0, sub(L_frameTCX, st->hIGFDec->infoIGFStartLine) ); } - IMDCT(xn_buf32, x_e, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, + IMDCT_fx(xn_buf32, x_e, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, st->hTcxCfg->tcx_mdct_window_trans, st->hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr(s_max(L_frameTCX, L_spec), 1), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB,st, 0, acelp_zir); /* Generate additional comfort noise to mask potential coding artefacts */ IF ( st->flag_cna != 0 ) { - generate_masking_noise_mdct (x, &x_e, st->hFdCngDec->hFdCngCom, s_max(s_max(L_frame,L_frameTCX), L_spec) ); + generate_masking_noise_mdct_fx (x, &x_e, st->hFdCngDec->hFdCngCom, s_max(s_max(L_frame,L_frameTCX), L_spec) ); } - IMDCT(x, x_e, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, + IMDCT_fx(x, x_e, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr(s_max(L_frameTCX, L_spec), 1), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, st, div_l(L_mult(FSCALE_DENOM, L_frameTCX_glob), L_frame_glob), acelp_zir); @@ -1289,7 +1289,7 @@ void decoder_tcx( -void decoder_tcx_post(Decoder_State *st_fx, +void decoder_tcx_post_fx(Decoder_State *st_fx, Word16 *synth, Word16 *synthFB, Word16 *A, @@ -1404,7 +1404,7 @@ void decoder_tcx_post(Decoder_State *st_fx, Word16 Qnew_levelBackgroundTrace; Qnew_levelBackgroundTrace = 0; move16(); - minimumStatistics(hTcxDec->conNoiseLevelMemory, /*Q15*/ + minimumStatistics_fx(hTcxDec->conNoiseLevelMemory, /*Q15*/ &hTcxDec->conNoiseLevelIndex, /*Q0 */ &hTcxDec->conCurrLevelIndex, /*Q0 */ &hTcxDec->conCngLevelBackgroundTrace, /*Q15*/ @@ -1728,7 +1728,7 @@ void decoder_tcx_post_ivas_fx(Decoder_State *st_fx, Word16 Qnew_levelBackgroundTrace; Qnew_levelBackgroundTrace = 0; move16(); - minimumStatistics(hTcxDec->conNoiseLevelMemory, /*Q15*/ + minimumStatistics_fx(hTcxDec->conNoiseLevelMemory, /*Q15*/ &hTcxDec->NoiseLevelIndex_bfi, /*Q0 */ &hTcxDec->CurrLevelIndex_bfi, /*Q0 */ &hTcxDec->conCngLevelBackgroundTrace, /*Q15*/ @@ -1932,7 +1932,7 @@ void decoder_tcx_post_ivas_fx(Decoder_State *st_fx, } #endif -static Word32 CalculateAbsEnergy( /* o : normalized result Q31 */ +static Word32 CalculateAbsEnergy_fx( /* o : normalized result Q31 */ const Word32 L_off, /* i : initial sum value Qn */ const Word16 x[], /* i : x vector Qn */ const Word16 lg, /* i : vector length, range [0..7FFF] Q0 */ @@ -1988,7 +1988,7 @@ static Word32 CalculateAbsEnergy( /* o : normalized result Q31 */ } -void IMDCT(Word32 *x, Word16 x_e, +void IMDCT_fx(Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_TDAC, Word16 *xn_buf, @@ -3577,7 +3577,7 @@ void decoder_tcx_IGF_stereo_fx( #ifdef IVAS_FLOAT_FIXED -void decoder_tcx_fx( +void decoder_tcx_ivas_fx( Decoder_State *st, Word16 prm[], Word16 A_fx[], @@ -3661,7 +3661,7 @@ void decoder_tcx_fx( Scale_sig( st->hTcxDec->syn_Overl_TDAC, 320, -( st->Q_syn + 2 ) ); // Scaling to Q-2 Scale_sig( st->hTcxDec->syn_Overl_TDACFB, 480, -( st->Q_syn + 2 ) ); // Scaling to Q-2 Scale_sig( st->hTcxDec->syn_OverlFB, 480, -( st->Q_syn + 2 ) ); // Scaling to Q-2 - Scale_sig( st->hTcxDec->old_syn_Overl, 320, -( st->Q_syn + 1 + 2 ) ); // Scaling to Q-2 + Scale_sig( st->hTcxDec->old_syn_Overl, 320, -( st->Q_syn + 1 + 0 ) ); // Scaling to Q-2 Scale_sig( st->hHQ_core->old_out_LB_fx, 640, -( st->hHQ_core->Q_old_wtda + 2 ) ); // Scaling to Q-2 Scale_sig( st->hHQ_core->old_out_fx, 960, -( st->hHQ_core->Q_old_wtda + 2 ) ); // Scaling to Q-2 @@ -3680,6 +3680,7 @@ void decoder_tcx_fx( Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, ( st->Q_syn + 1 + 2 ) ); Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, ( st->hHQ_core->Q_old_wtda + 2 ) ); Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, ( st->hHQ_core->Q_old_wtda + 2 ) ); + //Scale_sig( st->hTcxDec->old_syn_Overl, 320, ( st->Q_syn + 1 + 2 ) ); // Scaling to Q-2 } #endif @@ -3841,7 +3842,7 @@ void decoder_tcx_invQ_fx( prm_sqQ = prm_target + 1; move16(); - tcx_arith_decode_envelope_fx( st, x, x_e, L_frame, L_spec, Aind, *prm_target, prm_sqQ, st->last_core_from_bs != ACELP_CORE, prm_hm, /* HM parameter area */ hTcxDec->tcx_hm_LtpPitchLag, &arith_bits, &signaling_bits, ( st->bwidth > WB ) ? 1 : 0 ); + tcx_arith_decode_envelope_ivas_fx( st, x, x_e, L_frame, L_spec, Aind, *prm_target, prm_sqQ, st->last_core_from_bs != ACELP_CORE, prm_hm, /* HM parameter area */ hTcxDec->tcx_hm_LtpPitchLag, &arith_bits, &signaling_bits, ( st->bwidth > WB ) ? 1 : 0 ); hTcxDec->resQBits[frame_cnt] = *prm_target - arith_bits; move16(); @@ -3993,7 +3994,7 @@ void decoder_tcx_invQ_fx( *gain_tcx_e = hTcxDec->old_gaintcx_bfi_e; move16(); - hTcxDec->damping = Damping_fact( st->coder_type, st->nbLostCmpt, st->last_good, + hTcxDec->damping = Damping_fact_fx( st->coder_type, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &st->Mode2_lp_gainp, st->last_core ); @@ -4352,7 +4353,6 @@ void decoder_tcx_noisefilling_fx( } nf_seed = extract_l( tmp32 ); } - pInfoTCXNoise = NULL; #ifndef FIX_ISSUE_723_INFO_TCX_NOISE Word16 tmp_infoTCXNoiseBuf[IGF_START_MX]; @@ -4494,8 +4494,8 @@ void decoder_tcx_noisefilling_fx( move16(); } - E_2ndlast = CalculateAbsEnergy( 1, &( st->hTonalMDCTConc->lastBlockData.spectralData[0] ), tmp_len, &exp2 ); - E_last = CalculateAbsEnergy( 1, &( st->hTonalMDCTConc->lastBlockData.spectralData[1] ), tmp_len, &exp1 ); + E_2ndlast = CalculateAbsEnergy_fx( 1, &( st->hTonalMDCTConc->lastBlockData.spectralData[0] ), tmp_len, &exp2 ); + E_last = CalculateAbsEnergy_fx( 1, &( st->hTonalMDCTConc->lastBlockData.spectralData[1] ), tmp_len, &exp1 ); BASOP_Util_Divide_MantExp( extract_h( E_2ndlast ), exp2, extract_h( E_last ), exp1, &tmp1, &tmp2 ); @@ -4524,7 +4524,6 @@ void decoder_tcx_noisefilling_fx( { move16(); st->hTonalMDCTConc->lastBlockData.spectralData[i] = st->hTonalMDCTConc->lastBlockData.spectralData[i + 1]; - st->hTonalMDCTConc->lastBlockData.spectralData_float[i] = st->hTonalMDCTConc->lastBlockData.spectralData_float[i + 1]; } } ELSE IF( LT_16( tmp1, ONE_IN_Q12 ) ) /*0.5 in Q13 = 1 in Q12*/ @@ -4533,7 +4532,6 @@ void decoder_tcx_noisefilling_fx( { move16(); st->hTonalMDCTConc->lastBlockData.spectralData[i + 1] = st->hTonalMDCTConc->lastBlockData.spectralData[i]; - st->hTonalMDCTConc->lastBlockData.spectralData_float[i + 1] = st->hTonalMDCTConc->lastBlockData.spectralData_float[i]; } } } @@ -4552,20 +4550,16 @@ void decoder_tcx_noisefilling_fx( tcxGetNoiseFillingTilt( A, M, L_frame, tmp, &noiseTiltFactor ); - f2me( hTcxDec->CngLevelBackgroundTrace_bfi, &hTcxDec->CngLevelBackgroundTrace_bfi_fx, &hTcxDec->CngLevelBackgroundTrace_bfi_exp ); - //f2me( st->hTonalMDCTConc->curr_noise_nrg_flt, &st->hTonalMDCTConc->curr_noise_nrg, &st->hTonalMDCTConc->curr_noise_nrg_exp ); - + Word32 CngLevelBackgroundTrace_bfi_fx = L_deposit_l(hTcxDec->conCngLevelBackgroundTrace); + Word16 CngLevelBackgroundTrace_bfi_exp = hTcxDec->conCngLevelBackgroundTrace_e + 16; IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && MCT_flag == 0 ) { - TonalMDCTConceal_InsertNoise_ivas_fx( st->hTonalMDCTConc, x, x_e, st->tonal_mdct_plc_active, &st->seed_tcx_plc, noiseTiltFactor, f, concealment_noise, concealment_noise_exp, hTcxDec->CngLevelBackgroundTrace_bfi_fx, hTcxDec->CngLevelBackgroundTrace_bfi_exp, infoIGFStartLine ); + TonalMDCTConceal_InsertNoise_ivas_fx( st->hTonalMDCTConc, x, x_e, st->tonal_mdct_plc_active, &st->seed_tcx_plc, noiseTiltFactor, f, concealment_noise, concealment_noise_exp, CngLevelBackgroundTrace_bfi_fx, CngLevelBackgroundTrace_bfi_exp, infoIGFStartLine ); } ELSE { - TonalMDCTConceal_InsertNoise_ivas_fx( st->hTonalMDCTConc, x, x_e, st->tonal_mdct_plc_active, &st->seed_tcx_plc, noiseTiltFactor, f, NULL, 0, hTcxDec->CngLevelBackgroundTrace_bfi_fx, hTcxDec->CngLevelBackgroundTrace_bfi_exp, infoIGFStartLine ); + TonalMDCTConceal_InsertNoise_ivas_fx( st->hTonalMDCTConc, x, x_e, st->tonal_mdct_plc_active, &st->seed_tcx_plc, noiseTiltFactor, f, NULL, 0, CngLevelBackgroundTrace_bfi_fx, CngLevelBackgroundTrace_bfi_exp, infoIGFStartLine ); } - - //st->hTonalMDCTConc->faded_signal_nrg_flt = me2f( st->hTonalMDCTConc->faded_signal_nrg, st->hTonalMDCTConc->faded_signal_nrg_exp ); - //st->hTonalMDCTConc->curr_noise_nrg_flt = me2f( st->hTonalMDCTConc->curr_noise_nrg, st->hTonalMDCTConc->curr_noise_nrg_exp ); } } } @@ -4857,4 +4851,5 @@ void decoder_tcx_noiseshaping_igf_fx( } return; -} \ No newline at end of file +} +#endif diff --git a/lib_dec/dec_tran.c b/lib_dec/dec_tran.c index 65878183e15280237484c10c9e54ac484836be92..ed158a00f5ba35b87a076e5a6ad9cbedfdf2e021 100644 --- a/lib_dec/dec_tran.c +++ b/lib_dec/dec_tran.c @@ -45,7 +45,7 @@ * * Decode transition (TC) frames *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void decod_tran( Decoder_State *st, /* i/o: decoder static memory */ const int16_t L_frame, /* i : length of the frame */ diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index cf28f654d4cddca964d9f206ace7027fd5e85344..32227b458125eb0a5b4fc28a751e54a89921e289 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*======================================================================*/ /* FUNCTION : decod_tran_fx() */ /*----------------------------------------------------------------------*/ @@ -252,3 +252,4 @@ void decod_tran_fx( return; } +#endif diff --git a/lib_dec/dec_uv.c b/lib_dec/dec_uv.c index 34866754ac0349c76b1b2cc2f0af4f293532a047..e9a0823f7b594ed5ef0b92728c54ec464b3fc3b1 100644 --- a/lib_dec/dec_uv.c +++ b/lib_dec/dec_uv.c @@ -38,7 +38,7 @@ #include "options.h" #include "prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * decod_unvoiced() * @@ -120,7 +120,7 @@ void decod_unvoiced( *-----------------------------------------------------------------*/ index = get_next_indice( st, st->acelp_cfg.gains_mode[i_subfr / L_SUBFR] ); - gain_dec_gacelp_uv_flt( index, code, code2, Es_pred, L_SUBFR, &gain_pit, &gain_code, &gain_code2, &( st->past_gpit_float), &norm_gain_code, &gain_inov ); + gain_dec_gacelp_uv( index, code, code2, Es_pred, L_SUBFR, &gain_pit, &gain_code, &gain_code2, &( st->past_gpit_float), &norm_gain_code, &gain_inov ); st->tilt_code = est_tilt( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0 ); diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index f8a069799c943100975d63a5c173fa23e495107b..3ab65b7280aea1bf68163cfdda51d96a3d745a2e 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -6,8 +6,8 @@ #include "cnst.h" /* Common constants */ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ - -static void gain_dec_gacelp_uv( +#ifdef IVAS_FLOAT_FIXED +static void gain_dec_gacelp_uv_fx( Word16 index, /* i : Quantization index vector Q0 */ Word16 *code, /* i : algebraic code excitation Q9 */ Word16 *code2, /* i : algebraic code excitation Q9 */ @@ -184,8 +184,8 @@ void decod_unvoiced_ivas_fx( *-----------------------------------------------------------------*/ Word16 index = get_next_indice(st_fx, st_fx->acelp_cfg.gains_mode[i_subfr_fx / L_SUBFR]); - //gain_dec_gacelp_uv_flt(index, code, code2, Es_pred, L_SUBFR, &gain_pit, &gain_code, &gain_code2, &(st->past_gpit_float), &norm_gain_code, &gain_inov); - gain_dec_gacelp_uv(index, code_fx, code2_fx, Es_pred_fx, L_SUBFR, &gain_pit_fx, &gain_code_fx, &gain_code2_fx, &(st_fx->past_gpit), &norm_gain_code_fx, &gain_inov_fx); + //gain_dec_gacelp_uv(index, code, code2, Es_pred, L_SUBFR, &gain_pit, &gain_code, &gain_code2, &(st->past_gpit_float), &norm_gain_code, &gain_inov); + gain_dec_gacelp_uv_fx(index, code_fx, code2_fx, Es_pred_fx, L_SUBFR, &gain_pit_fx, &gain_code_fx, &gain_code2_fx, &(st_fx->past_gpit), &norm_gain_code_fx, &gain_inov_fx); //st->tilt_code = est_tilt(exc + i_subfr, gain_pit, code, gain_code, &voice_fac, L_SUBFR, 0); st_fx->tilt_code_fx = est_tilt_ivas_fx(exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, st_fx->Q_exc, L_SUBFR, 0); @@ -254,12 +254,12 @@ void decod_unvoiced_ivas_fx( /*---------------------------------------------------------------------* - * gain_dec_gacelp_uv + * gain_dec_gacelp_uv_fx * * Decoding of pitch and codebook gains for Unvoiced mode *---------------------------------------------------------------------*/ -static void gain_dec_gacelp_uv( +static void gain_dec_gacelp_uv_fx( Word16 index, /* i : Quantization index vector Q0 */ Word16 *code, /* i : algebraic code excitation Q9 */ Word16 *code2, /* i : algebraic code excitation Q9 */ @@ -362,4 +362,5 @@ static void gain_dec_gacelp_uv( return; -} \ No newline at end of file +} +#endif diff --git a/lib_dec/dlpc_avq.c b/lib_dec/dlpc_avq.c index 3138d3e12a7862f9f4bfc7c7e235da7cb6b699dc..6e161254c455d7c59313c752bf5f80c842ad9615 100644 --- a/lib_dec/dlpc_avq.c +++ b/lib_dec/dlpc_avq.c @@ -41,12 +41,12 @@ #include "wmc_auto.h" /*------------------------------------------------------------------* - * dlpc_avq_flt() + * dlpc_avq() * * Variable bitrate multiple LPC un-quantizer *------------------------------------------------------------------*/ -int16_t dlpc_avq_flt( +int16_t dlpc_avq( int16_t *index, /* i : Quantization indices */ float *LSF_Q, /* o : Quantized LSF vectors */ const int16_t numlpc, /* i : Number of sets of lpc */ @@ -175,12 +175,12 @@ static int16_t pack4bits( /*------------------------------------------------------------------* - * decode_lpc_avq_flt() + * decode_lpc_avq() * * *------------------------------------------------------------------*/ -int16_t decode_lpc_avq_flt( +int16_t decode_lpc_avq( Decoder_State *st, /* i/o: decoder state structure */ const int16_t numlpc, /* i : Number of sets of lpc */ int16_t *param_lpc, /* o : lpc parameters */ diff --git a/lib_dec/dlpc_avq_fx.c b/lib_dec/dlpc_avq_fx.c index 1610e17272edb97f658a37b26a4ff4c2eb28ed7b..ac123253685db2563a02b875e99714c91b2d7582 100644 --- a/lib_dec/dlpc_avq_fx.c +++ b/lib_dec/dlpc_avq_fx.c @@ -8,7 +8,7 @@ #include #include "prot_fx1.h" #include "prot_fx2.h" - +#ifdef IVAS_FLOAT_FIXED /* Constants */ #define M 16 /* length of LPC */ @@ -18,7 +18,7 @@ /* Variable bit-rate multiple LPC un-quantizer */ /***********************************************/ -Word16 dlpc_avq( +Word16 dlpc_avq_fx( Word16 *index, /* i : Quantization indices */ Word16 *LSF_Q, /* o : Quantized LSF vectors */ Word16 numlpc, /* i : Number of sets of lpc */ @@ -92,7 +92,7 @@ Word16 dlpc_avq( return (Word16)(p_index-index); } -static Word16 unary_decode( +static Word16 unary_decode_fx( Decoder_State *st, Word16 *ind ) @@ -124,7 +124,7 @@ static Word16 unary_decode( } -static Word16 pack4bits( +static Word16 pack4bits_fx( Word16 nbits, Decoder_State *st, Word16 *prm @@ -151,7 +151,7 @@ static Word16 pack4bits( return(i); } -Word16 decode_lpc_avq( +Word16 decode_lpc_avq_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ Word16* param_lpc /* o : lpc parameters */ @@ -253,7 +253,7 @@ Word16 decode_lpc_avq( IF(GT_16(qn1, 4)) { - nb = unary_decode(st, &qn1); + nb = unary_decode_fx(st, &qn1); if (EQ_16(nb, 1)) { @@ -276,7 +276,7 @@ Word16 decode_lpc_avq( IF(GT_16(qn2, 4)) { - nb = unary_decode(st, &qn2); + nb = unary_decode_fx(st, &qn2); if (EQ_16(nb, 1)) { @@ -319,11 +319,11 @@ Word16 decode_lpc_avq( /* Decode Split-by-2 algebraic VQ */ avqBits = shl(qn1, 2); - pack4bits(avqBits, st, ¶m_lpc[j]); + pack4bits_fx(avqBits, st, ¶m_lpc[j]); j = add(j, qn1); avqBits = shl(qn2, 2); - pack4bits(avqBits, st, ¶m_lpc[j]); + pack4bits_fx(avqBits, st, ¶m_lpc[j]); j = add(j, qn2); } #ifdef IVAS_CODE_AVQ_LPC @@ -341,7 +341,7 @@ Word16 decode_lpc_avq( return sub(st->next_bit_pos, start_bit_pos); } -Word16 decode_lpc_avq_ivas( +Word16 decode_lpc_avq_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ Word16 *param_lpc /* o : lpc parameters */ @@ -436,7 +436,7 @@ Word16 decode_lpc_avq_ivas( IF( GT_16( qn1, 4 ) ) { - nb = unary_decode( st, &qn1 ); + nb = unary_decode_fx( st, &qn1 ); if ( EQ_16( nb, 1 ) ) { @@ -459,7 +459,7 @@ Word16 decode_lpc_avq_ivas( IF( GT_16( qn2, 4 ) ) { - nb = unary_decode( st, &qn2 ); + nb = unary_decode_fx( st, &qn2 ); if ( EQ_16( nb, 1 ) ) { @@ -502,11 +502,11 @@ Word16 decode_lpc_avq_ivas( /* Decode Split-by-2 algebraic VQ */ avqBits = shl( qn1, 2 ); - pack4bits( avqBits, st, ¶m_lpc[j] ); + pack4bits_fx( avqBits, st, ¶m_lpc[j] ); j = add( j, qn1 ); avqBits = shl( qn2, 2 ); - pack4bits( avqBits, st, ¶m_lpc[j] ); + pack4bits_fx( avqBits, st, ¶m_lpc[j] ); j = add( j, qn2 ); } ELSE @@ -522,3 +522,4 @@ Word16 decode_lpc_avq_ivas( return sub( st->next_bit_pos, start_bit_pos ); } +#endif diff --git a/lib_dec/dlpc_stoch.c b/lib_dec/dlpc_stoch.c index 332e7cddbf9bac5c4a5dab52677a10e1f099205c..dc853a8b2ba2959095a09180b792e461bb953896 100644 --- a/lib_dec/dlpc_stoch.c +++ b/lib_dec/dlpc_stoch.c @@ -43,12 +43,12 @@ #include "wmc_auto.h" /*------------------------------------------------------------------* - * lpc_unquantize_flt() + * lpc_unquantize() * * *------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void lpc_unquantize_flt( +#ifndef IVAS_FLOAT_FIXED +void lpc_unquantize( Decoder_State *st, float *lsf, float *lsp, @@ -67,7 +67,7 @@ void lpc_unquantize_flt( nb_indices = 0; if ( st->lpcQuantization == 0 ) { - nb_indices = dlpc_avq_flt( param_lpc, &lsf[M], st->numlpc, st->sr_core ); + nb_indices = dlpc_avq( param_lpc, &lsf[M], st->numlpc, st->sr_core ); for ( k = 0; k < st->numlpc; k++ ) { diff --git a/lib_dec/dlpc_stoch_fx.c b/lib_dec/dlpc_stoch_fx.c index 7ffdfc750b2fb607693e7894173e7293e749edc2..e28044c197135d2db54e75647d808e976faae224 100644 --- a/lib_dec/dlpc_stoch_fx.c +++ b/lib_dec/dlpc_stoch_fx.c @@ -10,13 +10,13 @@ #include "basop_util.h" #include "prot_fx1.h" #include "prot_fx2.h" - +#ifdef IVAS_FLOAT_FIXED /* Constants */ #define M 16 #define BFI_FAC 0.9f -void lpc_unquantize( +void lpc_unquantize_fx( Decoder_State * st, Word16 *lsf, Word16 *lsp, @@ -39,7 +39,7 @@ void lpc_unquantize( IF(st->lpcQuantization == 0 ) { - nb_indices = dlpc_avq(param_lpc, &lsf[m], st->numlpc, st->sr_core); + nb_indices = dlpc_avq_fx(param_lpc, &lsf[m], st->numlpc, st->sr_core); FOR ( k=0; k< st->numlpc; k++ ) { E_LPC_lsf_lsp_conversion(&lsf[(k+1)*m], &lsp[(k+1)*m], m); @@ -107,4 +107,4 @@ void lpc_unquantize( return; } - +#endif diff --git a/lib_dec/er_dec_acelp.c b/lib_dec/er_dec_acelp.c index 01eb2389a32d405cb018f988f9871987705b4fa3..d598cf7aa0af844fa84fb149bd502c565db2fa22 100644 --- a/lib_dec/er_dec_acelp.c +++ b/lib_dec/er_dec_acelp.c @@ -40,14 +40,14 @@ #include #include "prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* - * con_acelp_flt() + * con_acelp() * * Concealment function for ACELP and TD-TCX *--------------------------------------------------------------------*/ -void con_acelp_flt( +void con_acelp( float A[], /* i : coefficients NxAz[M+1] */ const int16_t coder_type, /* i : ACELP coder type */ float synth[], /* i/o: synthesis */ @@ -208,7 +208,7 @@ void con_acelp_flt( { /* pitch cycle is first low-pass filtered */ /*get filter coefficients*/ - genPlcFiltBWAdap_flt( st->sr_core, &lpFiltAdapt[0], 0, st->cummulative_damping_float); + genPlcFiltBWAdap( st->sr_core, &lpFiltAdapt[0], 0, st->cummulative_damping_float); for ( i = 0; i < Tc; i++ ) { *pt_exc++ = ( lpFiltAdapt[0] * pt1_exc[-1] + lpFiltAdapt[1] * pt1_exc[0] + lpFiltAdapt[2] * pt1_exc[1] ); @@ -260,7 +260,7 @@ void con_acelp_flt( { get_subframe_pitch_flt( st->nb_subfr, st->old_fpitch_float, predPitchLag, pitch_buf ); - PulseResynchronization_flt( harmonic_exc_buf, exc, L_frame, st->nb_subfr, st->old_fpitch_float, predPitchLag ); + PulseResynchronization( harmonic_exc_buf, exc, L_frame, st->nb_subfr, st->old_fpitch_float, predPitchLag ); } else { @@ -391,12 +391,12 @@ void con_acelp_flt( } /*get filter coefficients*/ - genPlcFiltBWAdap_flt( st->sr_core, &hp_filt[0], 1, st->cummulative_damping_float); + genPlcFiltBWAdap( st->sr_core, &hp_filt[0], 1, st->cummulative_damping_float); /* PLC: [ACELP: Fade-out] * PLC: retrieve background level */ tmp = 1.0f; - gainSynthDeemph = getLevelSynDeemph_flt( &( tmp ), A, L_SUBFR, st->preemph_fac_float, L_frame / L_SUBFR ); + gainSynthDeemph = getLevelSynDeemph( &( tmp ), A, L_SUBFR, st->preemph_fac_float, L_frame / L_SUBFR ); gainCNG = st->cngTDLevel_float / gainSynthDeemph; gain = st->lp_gainc; /* start-of-the-frame gain */ @@ -415,7 +415,7 @@ void con_acelp_flt( st->lp_gainc = gainCNG; } - highPassFiltering_flt( st->last_good, L_frame + l_fir_fer / 2, noise_buf, hp_filt, l_fir_fer ); + highPassFiltering( st->last_good, L_frame + l_fir_fer / 2, noise_buf, hp_filt, l_fir_fer ); /* Find energy normalization factor */ pt_exc = noise_buf + l_fir_fer / 2; diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index acaddaad91e73e921ecb17f287f0eba54efc3fae..e4907163c08899ad54a2b4d0ea7cce3a79469ce4 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -12,7 +12,7 @@ #include "prot_fx2.h" #include "basop_util.h" #include "rom_dec.h" - +#ifdef IVAS_FLOAT_FIXED extern const Word16 T_DIV_L_Frame[];/*0Q15 * 2^-7 */ /*Table 2^7 * 1/L_frame */ @@ -21,7 +21,7 @@ extern const Word16 T_DIV_L_Frame[];/*0Q15 * 2^-7 */ #define L_EXC_BUF OLD_EXC_SIZE_DEC_16k+L_DIV_MAX+L_SUBFR+1+L_DIV_MAX/2 /*LOCAL FUNCTIONS*/ -static void memsynPrecission(Word16 nbLostCmpt,Word16* mem_syn, Word16* exc, Word16 len, Word16*s_16); +static void memsynPrecission_fx(Word16 nbLostCmpt,Word16* mem_syn, Word16* exc, Word16 len, Word16*s_16); @@ -31,7 +31,7 @@ static void memsynPrecission(Word16 nbLostCmpt,Word16* mem_syn, Word16* exc, Wor * ****************************************************************/ -void con_acelp( +void con_acelp_fx( const Word16 A[], /*nbLostCmpt, st->last_good, stab_fac, &(st->Mode2_lp_gainp), 0); /*Q14*/ + alpha = Damping_fact_fx(coder_type, st->nbLostCmpt, st->last_good, stab_fac, &(st->Mode2_lp_gainp), 0); /*Q14*/ st->cummulative_damping = shl(mult(st->cummulative_damping,alpha),1);/*shl(Q15*Q14,1)=shl(Q14,1) = Q15*/ if (EQ_16(st->nbLostCmpt,1)) { @@ -243,7 +243,7 @@ void con_acelp( /* pitch cycle is first low-pass filtered */ /*get filter coefficients*/ - genPlcFiltBWAdap( + genPlcFiltBWAdap_fx( st->sr_core, /*W32 Q0*/ &lpFiltAdapt[0] /*Q15*/, 0, @@ -315,7 +315,7 @@ void con_acelp( { get_subframe_pitch(st->nb_subfr, st->old_fpitch, predPitchLag, pitch_buf); - PulseResynchronization(harmonic_exc_buf, exc, st->L_frame, st->nb_subfr, st->old_fpitch, predPitchLag); + PulseResynchronization_fx(harmonic_exc_buf, exc, st->L_frame, st->nb_subfr, st->old_fpitch, predPitchLag); } ELSE { set32_fx(pitch_buf, st->old_fpitch, st->nb_subfr); @@ -502,7 +502,7 @@ void con_acelp( } /*get filter coefficients*/ - genPlcFiltBWAdap(st->sr_core, /*W32 Q0*/ + genPlcFiltBWAdap_fx(st->sr_core, /*W32 Q0*/ &hp_filt[0], /*Q15*/ 1, st->cummulative_damping); /*Q15*/ @@ -514,7 +514,7 @@ void con_acelp( tmp = 32767/*1.0f Q15*/; - gainSynthDeemph=getLevelSynDeemph(&(tmp), + gainSynthDeemph=getLevelSynDeemph_fx(&(tmp), A, M, L_SUBFR, @@ -593,7 +593,7 @@ void con_acelp( st->Mode2_lp_gainc = L_shr(st->Mode2_lp_gainc,sub(5,gainCNG_e)); /*15Q16, no scaling*/ } - highPassFiltering(st->last_good, add(st->L_frame,shr(l_fir_fer,1)), noise_buf, hp_filt, l_fir_fer); + highPassFiltering_fx(st->last_good, add(st->L_frame,shr(l_fir_fer,1)), noise_buf, hp_filt, l_fir_fer); pt_exc = noise_buf + l_fir_fer/2; @@ -836,7 +836,7 @@ void con_acelp( p_A = A; /*in case of more than 5 consecutive concealed frames, improve precision of synthesis*/ - memsynPrecission(st->nbLostCmpt,mem_syn, exc, st->L_frame, &s_16); + memsynPrecission_fx(st->nbLostCmpt,mem_syn, exc, st->L_frame, &s_16); FOR (i_subfr = 0; i_subfr < st->L_frame; i_subfr += L_SUBFR) { @@ -922,7 +922,7 @@ void con_acelp( p_A = st->Aq_cng; /*in case of more than 5 consecutive concealed frames, improve precision of synthesis*/ - memsynPrecission(st->nbLostCmpt,mem_syn_unv, exc_unv, st->L_frame, &s_16); + memsynPrecission_fx(st->nbLostCmpt,mem_syn_unv, exc_unv, st->L_frame, &s_16); FOR (i_subfr = 0; i_subfr < st->L_frame; i_subfr += L_SUBFR) { @@ -1137,7 +1137,7 @@ void con_acelp( return; } -static void memsynPrecission(Word16 nbLostCmpt,Word16* mem_syn, Word16* exc, Word16 len, Word16*s_16) +static void memsynPrecission_fx(Word16 nbLostCmpt,Word16* mem_syn, Word16* exc, Word16 len, Word16*s_16) { IF(GT_16(nbLostCmpt,5)) { @@ -1185,3 +1185,4 @@ static void memsynPrecission(Word16 nbLostCmpt,Word16* mem_syn, Word16* exc, Wor } } +#endif diff --git a/lib_dec/er_dec_tcx.c b/lib_dec/er_dec_tcx.c index e6b31d69dedfab16226a9e26e93e2b0059cd6e7e..b1ed7dedb7b7663e7ddf5923ec61841a1028b56a 100644 --- a/lib_dec/er_dec_tcx.c +++ b/lib_dec/er_dec_tcx.c @@ -44,14 +44,14 @@ #include "rom_dec.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------* - * con_tcx_flt() + * con_tcx() * * *-----------------------------------------------------------------*/ -void con_tcx_flt( +void con_tcx( Decoder_State *st, /* i/o: coder memory state */ float synth[], /* i/o: synth[] */ const float coh, /* i : coherence of stereo signal */ @@ -251,7 +251,7 @@ void con_tcx_flt( { get_subframe_pitch_flt( st->nb_subfr, st->old_fpitch_float, predPitchLag * st->L_frame / L_frame, pitch_buf ); - PulseResynchronization_flt( buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB_float, predPitchLag ); + PulseResynchronization( buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB_float, predPitchLag ); } else { @@ -417,7 +417,7 @@ void con_tcx_flt( if ( st->nbLostCmpt == 1 ) { - highPassFiltering_flt( st->last_good, L_frame + L_frame / 2 + L_FIR_FER2, noise, hp_filt, L_FIR_FER2 ); + highPassFiltering( st->last_good, L_frame + L_frame / 2 + L_FIR_FER2, noise, hp_filt, L_FIR_FER2 ); } else { @@ -434,11 +434,11 @@ void con_tcx_flt( tmp = 1.0f; if ( A_cng != NULL ) { - gainSynthDeemph = getLevelSynDeemph_flt( &( tmp ), A_cng, L_frame / 4, st->preemph_fac_float, 1 ) / 4.f; + gainSynthDeemph = getLevelSynDeemph( &( tmp ), A_cng, L_frame / 4, st->preemph_fac_float, 1 ) / 4.f; } else { - gainSynthDeemph = getLevelSynDeemph_flt( &( tmp ), A_local, L_frame / 4, st->preemph_fac_float, 1 ); + gainSynthDeemph = getLevelSynDeemph( &( tmp ), A_local, L_frame / 4, st->preemph_fac_float, 1 ); } if ( st->tcxonly ) { diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index d0b2b1df91a8e5693faeda7cf896074e28703726..4a0208b9dcf99aaa5b2a7b640d98689816093e83 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -10,12 +10,12 @@ #include "prot_fx2.h" #include "basop_util.h" #include "rom_dec.h" - +#ifdef IVAS_FLOAT_FIXED /***************************************************** calcGainc calculates st->lp_gainc ******************************************************/ -static void calcGainc(Word16* exc, Word16 Q_exc, Word32 old_fpitch, Word16 L_subfr, Word32 lp_gainp, Word32* lp_gainc) +static void calcGainc_fx(Word16* exc, Word16 Q_exc, Word32 old_fpitch, Word16 L_subfr, Word32 lp_gainp, Word32* lp_gainc) { Word32 L_c ; Word16 tmp16, tmp16_2, tmp16_3, tmp_e, tmp2_e, tmp_loop, i; @@ -76,7 +76,7 @@ static void calcGainc(Word16* exc, Word16 Q_exc, Word32 old_fpitch, Word16 L_sub } -static void calcGainc2(Word16 *exc, Word16 Q_exc, Word16 L_subfr, Word32* lp_gainc) +static void calcGainc2_fx(Word16 *exc, Word16 Q_exc, Word16 L_subfr, Word32* lp_gainc) { Word16 i, cnt, tmp16 , tmp_e, tmp2_e; Word32 L_c, L_acc, L_tmp; @@ -132,7 +132,7 @@ con_tcx *******************************************************/ -void con_tcx( +void con_tcx_fx( Decoder_State *st, /* i/o: coder memory state */ Word16 synth[] /* i/o: synth[] *//*Q0 */ #ifdef IVAS_CODE_CON_TCX @@ -306,7 +306,7 @@ void con_tcx( IF ( EQ_16(st->nbLostCmpt,1)|| hTcxDec->tcxConceal_recalc_exc) { - calcGainc( exc, Q_exc, st->old_fpitchFB, L_subfr, st->Mode2_lp_gainp, &(st->Mode2_lp_gainc)); + calcGainc_fx( exc, Q_exc, st->old_fpitchFB, L_subfr, st->Mode2_lp_gainp, &(st->Mode2_lp_gainc)); } tmp16 = 0; @@ -500,7 +500,7 @@ void con_tcx( 7-16)/*Q16*/, pitch_buf); - PulseResynchronization(buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB, predPitchLag); + PulseResynchronization_fx(buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB, predPitchLag); } ELSE { @@ -540,14 +540,14 @@ void con_tcx( alpha = 1.0f; if (st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME) { - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &(st->lp_gainp), 0); + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &(st->lp_gainp), 0); } else if (st->element_mode != IVAS_CPE_MDCT) { - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &(st->lp_gainp), 0); + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &(st->lp_gainp), 0); } #else - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), 0);/*Q14*/ + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), 0);/*Q14*/ #endif IF ( EQ_16(st->nbLostCmpt , 1)) { @@ -616,7 +616,7 @@ void con_tcx( set16_fx(&exc[0], 0, add(L_frame,shr(L_frame,1))); IF ( EQ_16(st->nbLostCmpt , 1)) { - calcGainc2(&exc[0], Q_exc, L_subfr, &(st->Mode2_lp_gainc)); + calcGainc2_fx(&exc[0], Q_exc, L_subfr, &(st->Mode2_lp_gainc)); } set32_fx( pitch_buf, L_deposit_h(L_SUBFR), st->nb_subfr); /* PLC: calculate damping factor */ @@ -624,14 +624,14 @@ void con_tcx( alpha = 1.0f; if (st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME) { - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &(st->lp_gainp), 0); + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &(st->lp_gainp), 0); } else if (st->element_mode != IVAS_CPE_MDCT) { - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &(st->lp_gainp), 0); + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &(st->lp_gainp), 0); } #else - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), 0);/*Q14*/ + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), 0);/*Q14*/ #endif } @@ -733,7 +733,7 @@ void con_tcx( } IF ( EQ_16(st->nbLostCmpt,1)) { - highPassFiltering(st->last_good, add(add(L_frame, shr(L_frame,1)),L_FIR_FER2), noise, hp_filt, L_FIR_FER2); + highPassFiltering_fx(st->last_good, add(add(L_frame, shr(L_frame,1)),L_FIR_FER2), noise, hp_filt, L_FIR_FER2); } ELSE { @@ -759,16 +759,16 @@ void con_tcx( #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT if (A_cng != NULL) { - gainSynthDeemph = getLevelSynDeemph(&(tmp), A_cng, L_frame / 4, st->preemph_fac, 1) / 4.f; + gainSynthDeemph = getLevelSynDeemph_fx(&(tmp), A_cng, L_frame / 4, st->preemph_fac, 1) / 4.f; } else { - gainSynthDeemph = getLevelSynDeemph(&(tmp), A_local, L_frame / 4, st->preemph_fac, 1); + gainSynthDeemph = getLevelSynDeemph_fx(&(tmp), A_local, L_frame / 4, st->preemph_fac, 1); } #else tmp16 = 32767; move16(); - gainSynthDeemph = getLevelSynDeemph(&(tmp16), A_local, M, shr(L_frame,2), st->preemph_fac, 1, &gainSynthDeemph_e); + gainSynthDeemph = getLevelSynDeemph_fx(&(tmp16), A_local, M, shr(L_frame,2), st->preemph_fac, 1, &gainSynthDeemph_e); #endif IF (0 != st->tcxonly) { @@ -972,7 +972,7 @@ void con_tcx( alpha_delayed = 1.0f; if (st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE) { - alpha_delayed = Damping_fact(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &(st->lp_gainp), ACELP_CORE); + alpha_delayed = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &(st->lp_gainp), ACELP_CORE); } if (st->plcBackgroundNoiseUpdated && alpha_delayed != 1.0f) @@ -1295,7 +1295,7 @@ void con_tcx_ivas_fx( IF ( EQ_16(st->nbLostCmpt,1)|| hTcxDec->tcxConceal_recalc_exc) { - calcGainc( exc, Q_exc, st->old_fpitchFB, L_subfr, st->Mode2_lp_gainp, &(st->Mode2_lp_gainc)); + calcGainc_fx( exc, Q_exc, st->old_fpitchFB, L_subfr, st->Mode2_lp_gainp, &(st->Mode2_lp_gainc)); } tmp16 = 0; @@ -1459,7 +1459,7 @@ void con_tcx_ivas_fx( 7-16)/*Q16*/, pitch_buf); - PulseResynchronization(buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB, predPitchLag); + PulseResynchronization_fx(buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB, predPitchLag); } ELSE { @@ -1499,14 +1499,14 @@ void con_tcx_ivas_fx( alpha = 1.0f; if (st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME) { - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &(st->lp_gainp), 0); + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &(st->lp_gainp), 0); } else if (st->element_mode != IVAS_CPE_MDCT) { - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &(st->lp_gainp), 0); + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &(st->lp_gainp), 0); } #else - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), 0);/*Q14*/ + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), 0);/*Q14*/ #endif IF ( EQ_16(st->nbLostCmpt , 1)) { @@ -1575,7 +1575,7 @@ void con_tcx_ivas_fx( set16_fx(&exc[0], 0, add(L_frame,shr(L_frame,1))); IF ( EQ_16(st->nbLostCmpt , 1)) { - calcGainc2(&exc[0], Q_exc, L_subfr, &(st->Mode2_lp_gainc)); + calcGainc2_fx(&exc[0], Q_exc, L_subfr, &(st->Mode2_lp_gainc)); } set32_fx( pitch_buf, L_deposit_h(L_SUBFR), st->nb_subfr); /* PLC: calculate damping factor */ @@ -1583,14 +1583,14 @@ void con_tcx_ivas_fx( alpha = 1.0f; if (st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME) { - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &(st->lp_gainp), 0); + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &(st->lp_gainp), 0); } else if (st->element_mode != IVAS_CPE_MDCT) { - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &(st->lp_gainp), 0); + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &(st->lp_gainp), 0); } #else - alpha = Damping_fact(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), 0);/*Q14*/ + alpha = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), 0);/*Q14*/ #endif } @@ -1698,7 +1698,7 @@ void con_tcx_ivas_fx( } IF ( EQ_16(st->nbLostCmpt,1)) { - highPassFiltering(st->last_good, add(add(L_frame, shr(L_frame,1)),L_FIR_FER2), noise, hp_filt, L_FIR_FER2); + highPassFiltering_fx(st->last_good, add(add(L_frame, shr(L_frame,1)),L_FIR_FER2), noise, hp_filt, L_FIR_FER2); } ELSE { @@ -1725,16 +1725,16 @@ void con_tcx_ivas_fx( tmp16 = 32767; IF (A_cng != NULL) { - gainSynthDeemph = shr(getLevelSynDeemph(&(tmp16), A_cng, M, shr(L_frame, 2), st->preemph_fac, 1, &gainSynthDeemph_e) , 2); + gainSynthDeemph = shr(getLevelSynDeemph_fx(&(tmp16), A_cng, M, shr(L_frame, 2), st->preemph_fac, 1, &gainSynthDeemph_e) , 2); } ELSE { - gainSynthDeemph = getLevelSynDeemph(&(tmp16), A_local, M, shr(L_frame, 2), st->preemph_fac, 1, &gainSynthDeemph_e); + gainSynthDeemph = getLevelSynDeemph_fx(&(tmp16), A_local, M, shr(L_frame, 2), st->preemph_fac, 1, &gainSynthDeemph_e); } #else tmp16 = 32767; move16(); - gainSynthDeemph = getLevelSynDeemph(&(tmp16), A_local, M, shr(L_frame,2), st->preemph_fac, 1, &gainSynthDeemph_e); + gainSynthDeemph = getLevelSynDeemph_fx(&(tmp16), A_local, M, shr(L_frame,2), st->preemph_fac, 1, &gainSynthDeemph_e); #endif IF (0 != st->tcxonly) { @@ -1942,7 +1942,7 @@ void con_tcx_ivas_fx( alpha_delayed = 16384; IF (st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE) { - alpha_delayed = Damping_fact(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), ACELP_CORE); + alpha_delayed = Damping_fact_fx(st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac_fx, &(st->Mode2_lp_gainp), ACELP_CORE); } IF (st->plcBackgroundNoiseUpdated && alpha_delayed != 16384) @@ -2087,3 +2087,4 @@ void con_tcx_ivas_fx( return; } #endif +#endif diff --git a/lib_dec/er_scale_syn_fx.c b/lib_dec/er_scale_syn_fx.c index 8ee2514d6439913d33a08f87a45edde365622514..847798483d8d3c322cd37b530c04fd798bf70dc9 100644 --- a/lib_dec/er_scale_syn_fx.c +++ b/lib_dec/er_scale_syn_fx.c @@ -10,16 +10,16 @@ #include "prot_fx2.h" #include "basop_util.h" #include "cnst.h" - +#ifdef IVAS_FLOAT_FIXED /*----------------------------------------------------------------------------------* -* Damping_fact() +* Damping_fact_fx() * * Estimate damping factor *----------------------------------------------------------------------------------*/ /*This BASOP version was ported based on trunk rev. 27621 and updated based on trunk rev. 29287, re-updated based on trunk rev. 32244 */ -Word16 Damping_fact( /* o : damping factor *//*Q14*/ +Word16 Damping_fact_fx( /* o : damping factor *//*Q14*/ const Word16 coder_type, /* i : coding type in last good received frame */ const Word16 nbLostCmpt, /* i : counter of consecutive bfi frames */ const Word16 last_good, /* i : last good frame class */ @@ -135,3 +135,4 @@ Word16 Damping_fact( /* o : damping factor } return alpha; } +#endif \ No newline at end of file diff --git a/lib_dec/er_sync_exc.c b/lib_dec/er_sync_exc.c index 0da906ecfb78c22b2ade8aaf3d0615fb05c21b32..70b930f183a379e679bf424262b89e25e0a68644 100644 --- a/lib_dec/er_sync_exc.c +++ b/lib_dec/er_sync_exc.c @@ -177,12 +177,12 @@ static void RemoveSamples( /*-------------------------------------------------------------------* - * PulseResynchronization_flt() + * PulseResynchronization() * * Resynchronize glottal pulse positions of the signal in src_exc and store it in dst_exc *--------------------------------------------------------------------*/ -void PulseResynchronization_flt( +void PulseResynchronization( const float *src_exc, /* i : Input excitation buffer */ float *dst_exc, /* o : output excitation buffer */ const int16_t nFrameLength, /* i : frame length */ diff --git a/lib_dec/er_sync_exc_fx.c b/lib_dec/er_sync_exc_fx.c index cf9534f331bd5c63e4e6c6ffd6bcc320a29931a7..c6898cd23b09d4336f7a262b4dc68137656dfe96 100644 --- a/lib_dec/er_sync_exc_fx.c +++ b/lib_dec/er_sync_exc_fx.c @@ -12,7 +12,7 @@ #include "prot_fx2.h" #include "basop32.h" #include "basop_util.h" - +#ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * * Perform resynchronisation of the last glottal pulse in voiced lost frame @@ -23,7 +23,7 @@ /** Get the location of the minimum energy in the given signal. * @returns Index of the position of the minimum energy, that is the position i where filter(x[i-filterLength/2],...,x[i+(filterLength-filterLength/2)-1]) is at maximum. */ -static Word16 GetMinimumPosition( +static Word16 GetMinimumPosition_fx( Word16 const * x, /* Input signal. Qx*/ Word16 length, /* The length of the input signal. Q0*/ Word16 filterLength /* the length of the filter length used for the energy calculation. Q0*/ @@ -108,7 +108,7 @@ static Word16 GetMinimumPosition( * \returns Index of the position of the maximum peak, that is the position i where abs(x[i]) has it's maximum. */ -static Word16 FindMaxPeak +static Word16 FindMaxPeak_fx ( Word16 /*float*/ const * x, /* #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#endif -/* static void setnoiseLevelMemory() +/* static void setnoiseLevelMemory_fx() * - * Helper function - updates buffer for minimumStatistics function + * Helper function - updates buffer for minimumStatistics_fx function */ -static void setnoiseLevelMemory(Word16 f, Word16* new_noiseEstimate_e, Word16* noiseLevelMemory_e, Word16* noiseLevelMemory, Word16* currLevelIndex) +static void setnoiseLevelMemory_fx(Word16 f, Word16* new_noiseEstimate_e, Word16* noiseLevelMemory_e, Word16* noiseLevelMemory, Word16* currLevelIndex) { noiseLevelMemory[*currLevelIndex] = f; move16(); @@ -30,7 +29,7 @@ static void setnoiseLevelMemory(Word16 f, Word16* new_noiseEstimate_e, Word16* n /* PLC: [Common: Fade-out] * PLC: and for PLC fade out */ -void minimumStatistics( +void minimumStatistics_fx( Word16* noiseLevelMemory, /* Qx, internal state */ Word16* noiseLevelIndex, /* Q0, internal state */ Word16* currLevelIndex, /* Q0, internal state (circular buffer) */ @@ -138,7 +137,7 @@ void minimumStatistics( /*rescale noiseLevelMemory*/ - setnoiseLevelMemory(f,new_noiseEstimate_e,noiseLevelMemory_e, noiseLevelMemory, currLevelIndex); + setnoiseLevelMemory_fx(f,new_noiseEstimate_e,noiseLevelMemory_e, noiseLevelMemory, currLevelIndex); p = *currLevelIndex; move16(); } @@ -146,7 +145,7 @@ void minimumStatistics( { move16(); - setnoiseLevelMemory(f,new_noiseEstimate_e, noiseLevelMemory_e, noiseLevelMemory, currLevelIndex); + setnoiseLevelMemory_fx(f,new_noiseEstimate_e, noiseLevelMemory_e, noiseLevelMemory, currLevelIndex); /* current min is not a new min, so check if min must be re-searched */ IF (NE_16(p, *currLevelIndex)) @@ -190,10 +189,10 @@ void minimumStatistics( /*----------------------------------------------------------------------* * PLC: [ACELP: Fade-out] - * PLC: getLevelSynDeemph: derives on frame or subframe basis the level + * PLC: getLevelSynDeemph_fx: derives on frame or subframe basis the level * of LPC synthesis and deeemphasis based on the given input *----------------------------------------------------------------------*/ -Word16 getLevelSynDeemph( /*10Q5*/ +Word16 getLevelSynDeemph_fx( /*10Q5*/ Word16 h1Init[], /* i: input value or vector to be processed */ /* Q15 */ Word16 const A[], /* i: LPC coefficients */ /* Qx */ Word16 const lpcorder, /* i: LPC order */ /* Q0 */ @@ -274,7 +273,7 @@ Word16 getLevelSynDeemph( /*10Q5*/ } /* BASOP version: up to date with rev 7422 */ -void genPlcFiltBWAdap( +void genPlcFiltBWAdap_fx( const Word32 sr_core, /* i : core sampling rate */ Word16* lpFiltAdapt, /* o : filter coefficients for filtering codebooks in case of flc */ const Word16 type, /* i : type of filter, either 0 : lowpass or 1 : highpass */ @@ -348,7 +347,7 @@ void genPlcFiltBWAdap( * PLC: high pass filtering *-----------------------------------------------------------------*/ /*VERSIONINFO: This port is up to date with trunk rev. 32434*/ -void highPassFiltering( +void highPassFiltering_fx( const Word16 last_good, /* i: short last classification type */ const Word16 L_buffer, /* i: int buffer length */ Word16 exc2[], /* i/o: Qx unvoiced excitation before the high pass filtering */ @@ -465,8 +464,8 @@ Word16 GetPLCModeDecision_ivas_fx( //); TonalMDCTConceal_Detect_ivas_fx(st->hTonalMDCTConc, pitch, &numIndices - , (st->element_mode == IVAS_CPE_MDCT ? &(st->hTcxCfg->psychParamsTCX20) : st->hTcxCfg->psychParamsCurrent) - ); + , (st->element_mode == IVAS_CPE_MDCT ? &(st->hTcxCfg->psychParamsTCX20) : st->hTcxCfg->psychParamsCurrent), + st->element_mode); test(); test(); @@ -507,7 +506,7 @@ Word16 GetPLCModeDecision_ivas_fx( } #endif -Word16 GetPLCModeDecision( +Word16 GetPLCModeDecision_fx( Decoder_State *st /* i/o: decoder memory state pointer */ ) { @@ -596,14 +595,14 @@ Word16 GetPLCModeDecision( } if (st->element_mode == EVS_MONO) { - TonalMDCTConceal_Detect(&st->tonalMDCTconceal, pitch, &numIndices + TonalMDCTConceal_Detect(&st->tonalMDCTconceal, pitch, &numIndices, st->element_mode #ifdef ADD_IVAS_HTONALMDCTCONC , (st->element_mode == IVAS_CPE_MDCT ? &(st->hTcxCfg->psychParamsTCX20) : st->hTcxCfg->psychParamsCurrent) #endif ); } else { - TonalMDCTConceal_Detect(st->hTonalMDCTConc, pitch, &numIndices + TonalMDCTConceal_Detect(st->hTonalMDCTConc, pitch, &numIndices, st->element_mode #ifdef ADD_IVAS_HTONALMDCTCONC , (st->element_mode == IVAS_CPE_MDCT ? &(st->hTcxCfg->psychParamsTCX20) : st->hTcxCfg->psychParamsCurrent) #endif @@ -647,3 +646,4 @@ Word16 GetPLCModeDecision( } return core; } +#endif diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 2f9e2e22ea4faa0f4d670f06984455e124ce62b7..96c3b57928b31659d1f135f695bc94e022e15328 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -46,14 +46,14 @@ #include "prot_fx2.h" #include "ivas_prot_fx.h" #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*--------------------------------------------------------------------------* - * evs_dec_flt() + * evs_dec() * * Principal decoder routine *--------------------------------------------------------------------------*/ -ivas_error evs_dec_flt( +ivas_error evs_dec( Decoder_State *st, /* i/o: Decoder state structure */ float mem_hp20_out[L_HP20_MEM], /* i/o: HP filter memory for synthesis */ float *output, /* o : output synthesis signal */ @@ -85,7 +85,7 @@ ivas_error evs_dec_flt( error = IVAS_ERR_OK; - push_wmops( "evs_dec_flt" ); + push_wmops( "evs_dec" ); /*------------------------------------------------------------------* * Initialization *-----------------------------------------------------------------*/ @@ -518,7 +518,7 @@ ivas_error evs_dec_flt( * Decode core * -------------------------------------------------------------- */ - dec_acelp_tcx_frame_flt( st, &concealWholeFrame, output, st->p_bpf_noise_buf_float, pcmbufFB, bwe_exc_extended, voice_factors, pitch_buf, NULL ); + dec_acelp_tcx_frame( st, &concealWholeFrame, output, st->p_bpf_noise_buf_float, pcmbufFB, bwe_exc_extended, voice_factors, pitch_buf, NULL ); concealWholeFrameTmp = concealWholeFrame; if ( st->bfi ) @@ -666,18 +666,18 @@ ivas_error evs_dec_flt( * - do CNG during inactive frames * -------------------------------------------------------------- */ - noisy_speech_detection_flt( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, output ); + noisy_speech_detection( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, output ); 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; st->lp_noise_float = st->hFdCngDec->lp_noise_float; - ApplyFdCng_flt( output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0 ); + ApplyFdCng( output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0 ); /* Generate additional comfort noise to mask potential coding artefacts */ if ( st->m_frame_type == ACTIVE_FRAME && st->flag_cna ) { - generate_masking_noise_flt( output, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, NULL, -1 ); + generate_masking_noise( output, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, NULL, -1 ); } } @@ -704,7 +704,7 @@ ivas_error evs_dec_flt( /* Generate additional comfort noise to mask potential coding artefacts */ if ( st->flag_cna ) { - generate_masking_noise_flt( timeDomainBuffer, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, NULL, -1 ); + generate_masking_noise( timeDomainBuffer, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, NULL, -1 ); } else if ( st->L_frame == L_FRAME16k && st->last_flag_cna == 1 && ( ( st->last_core == ACELP_CORE && st->last_coder_type != AUDIO ) || st->last_core == TCX_20_CORE || st->last_core == AMR_WB_CORE ) ) { diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 68e486d6b7cfc5cadc952a8c3e90bf1a4e0eb7de..0952a63593494f2bc72e3a37eedb8d51e864f0ba 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -10,7 +10,7 @@ #include "prot_fx2.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*--------------------------------------------------------------------------* * evs_dec_fx() * @@ -810,7 +810,7 @@ ivas_error evs_dec_fx( /* DECODE CORE */ /* -------------------------------------------------------------- */ - dec_acelp_tcx_frame(st_fx, &concealWholeFrame, output_sp, + dec_acelp_tcx_frame_fx(st_fx, &concealWholeFrame, output_sp, st_fx->p_bpf_noise_buf, pcmbufFB, bwe_exc_extended_fx, voice_factors_fx, pitch_buf_fx); concealWholeFrameTmp = concealWholeFrame; @@ -999,7 +999,7 @@ ivas_error evs_dec_fx( ****************************************/ HANDLE_FD_CNG_DEC hFdCngDec = st_fx->hFdCngDec; move16(); - noisy_speech_detection(st_fx->hFdCngDec, st_fx->VAD && st_fx->m_frame_type == ACTIVE_FRAME, output_sp, 0); + noisy_speech_detection_fx(st_fx->hFdCngDec, st_fx->VAD && st_fx->m_frame_type == ACTIVE_FRAME, output_sp, 0); hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r(hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440/*0.99 Q15*/); IF ( hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) @@ -1010,15 +1010,15 @@ ivas_error evs_dec_fx( st_fx->lp_noise = hFdCngDec->lp_noise; move32(); #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - ApplyFdCng(output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0); + ApplyFdCng_fx(output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0); #else - ApplyFdCng( output_sp, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0); + ApplyFdCng_fx( output_sp, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0); #endif /* Generate additional comfort noise to mask potential coding artefacts */ test(); IF( EQ_16(st_fx->m_frame_type,ACTIVE_FRAME)&&st_fx->flag_cna) { - generate_masking_noise( output_sp, 0, hFdCngDec->hFdCngCom, hFdCngDec->hFdCngCom->frameSize, 0 ); + generate_masking_noise_fx( output_sp, 0, hFdCngDec->hFdCngCom, hFdCngDec->hFdCngCom->frameSize, 0 ); } } @@ -1068,7 +1068,7 @@ ivas_error evs_dec_fx( /* Generate additional comfort noise to mask potential coding artefacts */ IF( st_fx->flag_cna ) { - generate_masking_noise( timeDomainBuffer, 0, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, 0 ); + generate_masking_noise_fx( timeDomainBuffer, 0, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, 0 ); } ELSE IF( EQ_16(st_fx->L_frame,L_FRAME16k)&&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,TCX_20_CORE)||EQ_16(st_fx->last_core,AMR_WB_CORE))) { @@ -1126,7 +1126,7 @@ ivas_error evs_dec_fx( move16(); } - addBassPostFilterFx( st_fx->p_bpf_noise_buf, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, + addBassPostFilter_fx( st_fx->p_bpf_noise_buf, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, timeInBpf_e, CLDFB_NO_COL_MAX, st_fx->cldfbAna->no_col, st_fx->cldfbAna->no_channels, &st_fx->scaleFactor ); IF( NE_16(st_fx->m_frame_type,ACTIVE_FRAME)) @@ -1494,3 +1494,4 @@ ivas_error evs_dec_fx( return IVAS_ERR_OK; } +#endif diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index d0fc708eb3b8fc62ccc4b6a40a224ea38587149e..80cfcdce90e1613d2ac22d8e5653e0dcc55870c0 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -74,17 +74,17 @@ /*------------------------------------------------------------------- * Local fucntions declarations *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -static void perform_noise_estimation_dec_flt( const float *timeDomainInput, float *power_spectrum, HANDLE_FD_CNG_DEC hFdCngDec, const int16_t element_mode, const int16_t bwidth, const int16_t L_frame, const int16_t last_L_frame, const int32_t last_core_brate, const int16_t VAD ); +#ifndef IVAS_FLOAT_FIXED +static void perform_noise_estimation_dec( const float *timeDomainInput, float *power_spectrum, HANDLE_FD_CNG_DEC hFdCngDec, const int16_t element_mode, const int16_t bwidth, const int16_t L_frame, const int16_t last_L_frame, const int32_t last_core_brate, const int16_t VAD ); #endif // IVAS_FLOAT_FIXED /*------------------------------------------------------------------- - * createFdCngDec_flt() + * createFdCngDec() * * Create an instance of type FD_CNG *-------------------------------------------------------------------*/ -ivas_error createFdCngDec_flt( +ivas_error createFdCngDec( HANDLE_FD_CNG_DEC *hFdCngDec ) { HANDLE_FD_CNG_DEC hs; @@ -112,12 +112,12 @@ ivas_error createFdCngDec_flt( /*------------------------------------------------------------------- - * initFdCngDec_flt() + * initFdCngDec() * * Initialize an instance of type FD_CNG *-------------------------------------------------------------------*/ - -void initFdCngDec_flt( +#ifdef IVAS_FLOAT_FIXED +void initFdCngDec( DEC_CORE_HANDLE st /* i/o: decoder state structure */ ) { @@ -130,7 +130,7 @@ void initFdCngDec_flt( /* Set some counters and flags */ hFdCngDec->flag_dtx_mode = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hFdCngDec->lp_noise_float = -20.f; hFdCngDec->lp_speech_float = 25.f; @@ -151,13 +151,13 @@ void initFdCngDec_flt( #endif set_s( hFdCngDec->msLocalMinFlag, 0, NPART_SHAPING ); set_s( hFdCngDec->msNewMinFlag, 0, NPART_SHAPING ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hFdCngDec->msPsdFirstMoment_float, 0.0f, NPART_SHAPING ); set_f( hFdCngDec->msPsdSecondMoment_float, 0.0f, NPART_SHAPING ); #endif hFdCngDec->msPeriodogBufPtr = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hFdCngDec->msPeriodogBuf_float, 0.0f, MSBUFLEN * NPART_SHAPING ); set_f( hFdCngDec->msLogPeriodog_float, 0.0f, NPART_SHAPING ); set_f( hFdCngDec->msLogNoiseEst_float, 0.0f, NPART_SHAPING ); @@ -165,15 +165,15 @@ void initFdCngDec_flt( #endif hFdCngDec->nFFTpart_shaping = 0; +#ifndef IVAS_FLOAT_FIXED set_f( hFdCngDec->hFdCngCom->sidNoiseEstLp_flt, 0.0f, NPART ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) set_f( hFdCngDec->smoothed_psd, 0.0f, L_FRAME16k ); set_f( hFdCngDec->msPeriodog_ST, 0.0f, NPART_SHAPING ); #endif hFdCngDec->ms_last_inactive_bwidth = NB; hFdCngDec->ms_cnt_bw_up = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hFdCngDec->cna_LR_LT = 0.5f; hFdCngDec->cna_ILD_LT = 0.0f; #endif @@ -182,34 +182,104 @@ void initFdCngDec_flt( hFdCngDec->cna_nbands = CNA_INIT_NBANDS; mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, CNA_INIT_NBANDS + 1 ); - hFdCngDec->cna_act_fact_fx = MAX_WORD16; - hFdCngDec->cna_rescale_fact_fx = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) + +#ifndef IVAS_FLOAT_FIXED hFdCngDec->cna_act_fact = 1.0f; hFdCngDec->cna_rescale_fact = 0.0f; +#else + hFdCngDec->cna_act_fact_fx = MAX_WORD16; + hFdCngDec->cna_rescale_fact_fx = 0; #endif hFdCngDec->cna_seed = 5687; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_zero( hFdCngDec->cna_cm, STEREO_DFT_BAND_MAX ); set_zero( hFdCngDec->cna_g_state, STEREO_DFT_BAND_MAX ); #endif st->CNG_mode = -1; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED mvr2r(st->lsp_old, st->lspCNG, M); -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED return; } +#else +void initFdCngDec( + DEC_CORE_HANDLE st /* i/o: decoder state structure */ +) +{ + HANDLE_FD_CNG_DEC hFdCngDec; + + hFdCngDec = st->hFdCngDec; + + /* Initialize common */ + initFdCngCom_flt(hFdCngDec->hFdCngCom, st->cldfbSyn->scale_flt); + + /* Set some counters and flags */ + hFdCngDec->flag_dtx_mode = 0; + hFdCngDec->lp_noise_float = -20.f; + hFdCngDec->lp_speech_float = 25.f; + + /* Initialize noise estimation algorithm */ + set_f(hFdCngDec->bandNoiseShape_float, 0.0f, FFTLEN2); + set_f(hFdCngDec->partNoiseShape_float, 0.0f, NPART); + set_f(hFdCngDec->msPeriodog_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msAlpha_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msBminWin_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msBminSubWin_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msPsd_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msNoiseFloor_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msNoiseEst_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msMinBuf_float, FLT_MAX, MSNUMSUBFR * NPART_SHAPING); + set_f(hFdCngDec->msCurrentMin_float, FLT_MAX, NPART_SHAPING); + set_f(hFdCngDec->msCurrentMinOut_float, FLT_MAX, NPART_SHAPING); + set_f(hFdCngDec->msCurrentMinSubWindow_float, FLT_MAX, NPART_SHAPING); + set_s(hFdCngDec->msLocalMinFlag, 0, NPART_SHAPING); + set_s(hFdCngDec->msNewMinFlag, 0, NPART_SHAPING); + set_f(hFdCngDec->msPsdFirstMoment_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msPsdSecondMoment_float, 0.0f, NPART_SHAPING); + hFdCngDec->msPeriodogBufPtr = 0; + set_f(hFdCngDec->msPeriodogBuf_float, 0.0f, MSBUFLEN * NPART_SHAPING); + set_f(hFdCngDec->msLogPeriodog_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->msLogNoiseEst_float, 0.0f, NPART_SHAPING); + set_f(hFdCngDec->psize_shaping_float, 0.0f, NPART_SHAPING); + hFdCngDec->nFFTpart_shaping = 0; + + set_f(hFdCngDec->hFdCngCom->sidNoiseEstLp_flt, 0.0f, NPART); + + set_f(hFdCngDec->smoothed_psd, 0.0f, L_FRAME16k); + set_f(hFdCngDec->msPeriodog_ST, 0.0f, NPART_SHAPING); + + hFdCngDec->ms_last_inactive_bwidth = NB; + hFdCngDec->ms_cnt_bw_up = 0; + + hFdCngDec->cna_LR_LT = 0.5f; + hFdCngDec->cna_ILD_LT = 0.0f; + hFdCngDec->first_cna_noise_updated = 0; + hFdCngDec->first_cna_noise_update_cnt = 0; + hFdCngDec->cna_nbands = CNA_INIT_NBANDS; + mvs2s(cna_init_bands, hFdCngDec->cna_band_limits, CNA_INIT_NBANDS + 1); + hFdCngDec->cna_act_fact = 1.0f; + hFdCngDec->cna_rescale_fact = 0.0f; + hFdCngDec->cna_seed = 5687; + set_zero(hFdCngDec->cna_cm, STEREO_DFT_BAND_MAX); + set_zero(hFdCngDec->cna_g_state, STEREO_DFT_BAND_MAX); + + st->CNG_mode = -1; + mvr2r(st->lsp_old, st->lspCNG, M); + + return; +} -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- - * configureFdCngDec_flt() + * configureFdCngDec() * * Configure an instance of type FD_CNG *-------------------------------------------------------------------*/ -void configureFdCngDec_flt( +void configureFdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the FD-based CNG process */ const int16_t bwidth, const int32_t total_brate, @@ -323,11 +393,7 @@ void configureFdCngDec_flt( hsCom->startBand = 2; hsCom->stopBand = hsCom->FdCngSetup.sidPartitions[hsCom->FdCngSetup.numPartitions - 1] + 1; -#ifndef IVAS_FLOAT_FIXED 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 ( hsCom->stopFFTbin == 160 ) { @@ -353,11 +419,7 @@ void configureFdCngDec_flt( { stopBandFR = hsCom->stopFFTbin; } -#ifndef IVAS_FLOAT_FIXED 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 ); -#else // 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 ); -#endif // IVAS_FLOAT_FIXED hFdCngDec->nFFTpart_shaping = hFdCngDec->npart_shaping; @@ -367,21 +429,11 @@ void configureFdCngDec_flt( hsCom->fftSineTab_flt = NULL; hsCom->olapWinAna_flt = olapWinAna512; hsCom->olapWinSyn_flt = olapWinSyn256; -#ifdef IVAS_FLOAT_FIXED - hsCom->olapWinAna_fx = olapWinAna512_fx; - hsCom->fftSineTab_fx = NULL; - hsCom->olapWinSyn_fx = olapWinSyn256_fx; -#endif break; case 640: hsCom->fftSineTab_flt = fftSineTab640; hsCom->olapWinAna_flt = olapWinAna640; hsCom->olapWinSyn_flt = olapWinSyn320; -#ifdef IVAS_FLOAT_FIXED - hsCom->olapWinAna_fx = olapWinAna640_fx; - hsCom->fftSineTab_fx = fftSineTab640_fx; - hsCom->olapWinSyn_fx = olapWinSyn320_fx; -#endif break; default: assert( !"Unsupported FFT length for FD-based CNG" ); @@ -393,7 +445,7 @@ void configureFdCngDec_flt( } #endif #ifdef IVAS_FLOAT_FIXED -void configureFdCngDec_fx( +void configureFdCngDec_ivas_fx( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the FD-based CNG process */ const Word16 bwidth, const Word32 total_brate, @@ -564,7 +616,7 @@ void configureFdCngDec_fx( FOR ( j = 0; j < hsCom->nCLDFBpart; j++ ) { hsCom->CLDFBpart[j] = sub( hsCom->part[j + hsCom->nFFTpart], sub( hsCom->stopFFTbin, hsCom->startBand ) ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hsCom->CLDFBpsize_inv_flt[j] = hsCom->psize_inv_flt[j + hsCom->nFFTpart]; // TODO remove floating point dependency #endif hsCom->CLDFBpsize_inv[j] = hsCom->psize_inv[j + hsCom->nFFTpart]; @@ -598,7 +650,7 @@ void configureFdCngDec_fx( hsCom->olapWinAna_fx = olapWinAna512_fx; hsCom->fftSineTab_fx = NULL; hsCom->olapWinSyn_fx = olapWinSyn256_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /* TODO: remove floating point dependency */ hsCom->fftSineTab_flt = NULL; hsCom->olapWinAna_flt = olapWinAna512; @@ -613,7 +665,7 @@ void configureFdCngDec_fx( hsCom->olapWinAna_fx = olapWinAna640_fx; hsCom->fftSineTab_fx = fftSineTab640_fx; hsCom->olapWinSyn_fx = olapWinSyn320_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /* remove floating point dependency */ hsCom->fftSineTab_flt = fftSineTab640; hsCom->olapWinAna_flt = olapWinAna640; @@ -637,12 +689,12 @@ void configureFdCngDec_fx( #endif /*------------------------------------------------------------------- - * deleteFdCngDec_flt() + * deleteFdCngDec() * * Delete the instance of type FD_CNG *-------------------------------------------------------------------*/ -void deleteFdCngDec_flt( +void deleteFdCngDec( HANDLE_FD_CNG_DEC *hFdCngDec ) { HANDLE_FD_CNG_DEC hsDec = *hFdCngDec; @@ -659,12 +711,12 @@ void deleteFdCngDec_flt( /*------------------------------------------------------------------- - * ApplyFdCng_flt() + * ApplyFdCng() * * Apply the CLDFB-based CNG at the decoder *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void ApplyFdCng_flt( +#ifndef IVAS_FLOAT_FIXED +void ApplyFdCng( float *timeDomainInput, float *powerSpectrum, float **realBuffer, /* i/o: Real part of the buffer */ @@ -683,7 +735,7 @@ void ApplyFdCng_flt( int16_t L_frame, last_L_frame; int32_t sr_core; - push_wmops( "ApplyFdCng_flt" ); + push_wmops( "ApplyFdCng" ); /* limit L_frame and core Fs values for MDCT-Stereo modes which can have higher core sampling than 16kHz, but use a downsampled buffer */ L_frame = min( st->L_frame, L_FRAME16k ); @@ -723,7 +775,7 @@ void ApplyFdCng_flt( ( !st->BER_detect ) ) { /* Perform noise estimation at the decoder */ - perform_noise_estimation_dec_flt( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + perform_noise_estimation_dec( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); if ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT ) { @@ -770,7 +822,7 @@ void ApplyFdCng_flt( if ( hFdCngCom->active_frame_counter > 0 ) { /* Perform noise estimation in active frames in the decoder for downward updates */ - perform_noise_estimation_dec_flt( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + perform_noise_estimation_dec( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); } } @@ -812,7 +864,7 @@ void ApplyFdCng_flt( if ( st != NULL && st->cng_type == LP_CNG ) { /* Perform noise estimation on inactive phase at the decoder */ - perform_noise_estimation_dec_flt( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + perform_noise_estimation_dec( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); if ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT ) { @@ -897,7 +949,7 @@ void ApplyFdCng_flt( if ( st->codec_mode == MODE2 ) { /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec_flt( realBuffer, imagBuffer, st, -1 ); + generate_comfort_noise_dec( realBuffer, imagBuffer, st, -1 ); } break; @@ -914,12 +966,12 @@ void ApplyFdCng_flt( /*------------------------------------------------------------------- - * perform_noise_estimation_dec_flt() + * perform_noise_estimation_dec() * * Perform noise estimation at the decoder *-------------------------------------------------------------------*/ -static void perform_noise_estimation_dec_flt( +static void perform_noise_estimation_dec( const float *timeDomainInput, float *power_spectrum, HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: FD_CNG structure containing all buffers and variables */ @@ -1235,24 +1287,7 @@ static void perform_noise_estimation_dec_flt( DEC, element_mode ); /* Expand MS outputs */ -#ifdef IVAS_FLOAT_FIXED - Word16 logNoiseFx[NPART_SHAPING]; - Word32 noiseFx[NPART_SHAPING]; - Word16 q_out; - for (int ii = 0; ii < npart; ii++) - { - logNoiseFx[ii] = (Word16)(msLogNoiseEst[ii] * pow(2, Q9)); - } - expand_range(logNoiseFx, noiseFx, &q_out, npart); - - for (int ii = 0; ii < npart; ii++) - { - /* converting back to float. */ - msNoiseEst[ii] = (float)(noiseFx[ii] * pow(2, q_out - 31)); - } -#else expand_range_flt( msLogNoiseEst, msNoiseEst, npart ); -#endif } return; @@ -1260,12 +1295,12 @@ static void perform_noise_estimation_dec_flt( #endif /*------------------------------------------------------------------- - * FdCng_decodeSID_flt() + * FdCng_decodeSID() * * Decode the FD-CNG bitstream *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void FdCng_decodeSID_flt( +#ifndef IVAS_FLOAT_FIXED +void FdCng_decodeSID( Decoder_State *st /* i/o: decoder state structure */ ) { @@ -1344,7 +1379,7 @@ void FdCng_decodeSID_flt( #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- - * FdCng_decodeSID_flt() + * FdCng_decodeSID_ivas_fx() * * Decode the FD-CNG bitstream *-------------------------------------------------------------------*/ @@ -1444,12 +1479,12 @@ void FdCng_decodeSID_ivas_fx( #endif /*------------------------------------------------------------------- - * noisy_speech_detection_flt() + * noisy_speech_detection() * * *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void noisy_speech_detection_flt( +#ifndef IVAS_FLOAT_FIXED +void noisy_speech_detection( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: FD_CNG structure */ const int16_t vad, /* i : VAD flag */ const float syn[] /* i : input time-domain frame */ @@ -1481,12 +1516,12 @@ void noisy_speech_detection_flt( #endif /*------------------------------------------------------------------- - * generate_comfort_noise_dec_flt() + * generate_comfort_noise_dec() * * Generate the comfort noise based on the target noise level *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) -void generate_comfort_noise_dec_flt( +#ifndef IVAS_FLOAT_FIXED +void generate_comfort_noise_dec( float **bufferReal, /* o : Real part of input bands */ float **bufferImag, /* o : Imaginary part of input bands */ Decoder_State *st, /* i/o: decoder state structure */ @@ -1747,14 +1782,14 @@ void generate_comfort_noise_dec_flt( return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- - * generate_comfort_noise_dec_hf_flt() + * generate_comfort_noise_dec_hf() * * Generate the comfort noise based on the target noise level for the CLDFB part *-------------------------------------------------------------------*/ -void generate_comfort_noise_dec_hf_flt( +void generate_comfort_noise_dec_hf( float **bufferReal, /* o : Real part of input bands */ float **bufferImag, /* o : Imaginary part of input bands */ HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ @@ -1823,12 +1858,12 @@ void generate_comfort_noise_dec_hf_flt( #endif /*------------------------------------------------------------------- - * generate_masking_noise_flt() + * generate_masking_noise() * * Generate additional comfort noise (kind of noise filling) *-------------------------------------------------------------------*/ - -void generate_masking_noise_flt( +#ifndef IVAS_FLOAT_FIXED +void generate_masking_noise( float *timeDomainBuffer, /* i/o: time-domain signal */ HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ const int16_t length, /* i : frame size */ @@ -1840,7 +1875,6 @@ void generate_masking_noise_flt( const int16_t nchan_out /* i : number of output channels */ ) { -#ifndef IVAS_FLOAT_FIXED float *cngNoiseLevel_flt = hFdCngCom->cngNoiseLevel_flt; float *ptr_level = cngNoiseLevel_flt; float *fftBuffer = hFdCngCom->fftBuffer_flt; @@ -1930,7 +1964,7 @@ void generate_masking_noise_flt( else { /* very low level case - update random seeds and reset FFT buffer; don't fully skip SynthesisSTFT_flt(), because of the buffer updates done there... */ - generate_masking_noise_update_seed_flt( hFdCngCom ); + generate_masking_noise_update_seed( hFdCngCom ); set_f( fftBuffer, 0.f, hFdCngCom->fftlen ); } @@ -1956,26 +1990,8 @@ void generate_masking_noise_flt( } return; -#else - Word32 tdb_temp[L_FRAME16k]; - Word16 tdb_temp_exp; - generate_masking_noise_ivas_fx( tdb_temp, &tdb_temp_exp, hFdCngCom, length, core, 1, secondary, element_mode, hStereoCng, nchan_out ); - if ( return_noise ) - { - for ( Word32 i = 0; i < min( hFdCngCom->frameSize, length ); i++ ) - { - timeDomainBuffer[i] = fix_to_float(tdb_temp[i], tdb_temp_exp ); - } - } - else - { - for ( Word32 i = 0; i < min( hFdCngCom->frameSize, length ); i++ ) - { - timeDomainBuffer[i] += fix_to_float(tdb_temp[i], tdb_temp_exp); - } - } -#endif } +#endif #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- @@ -2039,7 +2055,8 @@ void generate_masking_noise_ivas_fx( } Word16 exp; - Word32 scale_temp = BASOP_util_Pow2( Mpy_32_32( float_to_fix( -scaleTable_cn_only[i].scale_flt / 10.f, Q31 ), LOG_10_BASE_2 ), Q2, &exp ); + //Word32 scale_temp = BASOP_util_Pow2( Mpy_32_32( float_to_fix( -scaleTable_cn_only[i].scale_flt / 10.f, Q31 ), LOG_10_BASE_2 ), Q2, &exp ); + Word32 scale_temp = BASOP_util_Pow2( Mpy_32_32( L_shl( negate( scaleTable_cn_only[i].scale_ivas / 10 ), 18 ), LOG_10_BASE_2 ), Q2, &exp ); scale_temp = L_sub( scale_temp, L_shl( 1, Q31 - exp ) ); scale_fx = L_shl( scale_temp, exp - Q1 ); // Q30 } @@ -2112,7 +2129,7 @@ void generate_masking_noise_ivas_fx( ELSE { /* very low level case - update random seeds and reset FFT buffer; don't fully skip SynthesisSTFT_flt(), because of the buffer updates done there... */ - generate_masking_noise_update_seed( hFdCngCom ); + generate_masking_noise_update_seed_fx( hFdCngCom ); set_l( fftBuffer_fx, 0, hFdCngCom->fftlen ); } @@ -2121,28 +2138,12 @@ void generate_masking_noise_ivas_fx( IF( secondary ) { // SynthesisSTFT_flt(fftBuffer, maskingNoise, hStereoCng->olapBufferSynth22, hFdCngCom->olapWinSyn_flt, 0, hFdCngCom, element_mode, nchan_out); - FOR( i = 0; i < hFdCngCom->fftlen; i++ ) - { - hStereoCng->olapBufferSynth22_32fx[i] = float_to_fix( hStereoCng->olapBufferSynth22[i], *exp_out ); - } SynthesisSTFT_fx( fftBuffer_fx, *exp_out, maskingNoise_fx, hStereoCng->olapBufferSynth22_32fx, hFdCngCom->olapWinSyn_fx, 0, hFdCngCom, element_mode, nchan_out ); - FOR( i = 0; i < hFdCngCom->fftlen; i++ ) - { - hStereoCng->olapBufferSynth22[i] = fix_to_float( hStereoCng->olapBufferSynth22_32fx[i], *exp_out ); - } } ELSE { // SynthesisSTFT_flt(fftBuffer, maskingNoise, hFdCngCom->olapBufferSynth2_flt, hFdCngCom->olapWinSyn_flt, 0, hFdCngCom, element_mode, nchan_out); - FOR( i = 0; i < hFdCngCom->fftlen; i++ ) - { - hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix( hFdCngCom->olapBufferSynth2_flt[i], *exp_out ); - } SynthesisSTFT_fx( fftBuffer_fx, *exp_out, maskingNoise_fx, hFdCngCom->olapBufferSynth2_fx, hFdCngCom->olapWinSyn_fx, 0, hFdCngCom, element_mode, nchan_out ); - FOR( i = 0; i < hFdCngCom->fftlen; i++ ) - { - hFdCngCom->olapBufferSynth2_flt[i] = fix_to_float( hFdCngCom->olapBufferSynth2_fx[i], *exp_out ); - } } *exp_out = *exp_out - 9; @@ -2163,13 +2164,13 @@ void generate_masking_noise_ivas_fx( #endif /*------------------------------------------------------------------- - * generate_masking_noise_update_seed_flt() + * generate_masking_noise_update_seed() * - * Update seed for scenarios where generate_masking_noise_flt() is + * Update seed for scenarios where generate_masking_noise() is * not called based on signal statistics *-------------------------------------------------------------------*/ -void generate_masking_noise_update_seed_flt( +void generate_masking_noise_update_seed( HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ) { @@ -2199,14 +2200,14 @@ void generate_masking_noise_update_seed_flt( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- - * generate_masking_noise_mdct_flt() + * generate_masking_noise_mdct() * * Generate additional comfort noise (kind of noise filling) *-------------------------------------------------------------------*/ -void generate_masking_noise_mdct_flt( +void generate_masking_noise_mdct( float *mdctBuffer, /* i/o: time-domain signal */ HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ) @@ -2287,7 +2288,7 @@ void generate_masking_noise_mdct_flt( return; } -#endif + /*------------------------------------------------------------------- * generate_stereo_masking_noise() * @@ -2322,11 +2323,11 @@ void generate_stereo_masking_noise( if ( !fadeOut ) { - generate_masking_noise_flt( N1, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out ); + generate_masking_noise( N1, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out ); /* Generate masking noise for secondary channel */ if ( flag_sec_CNA ) { - generate_masking_noise_flt( N2, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out ); + generate_masking_noise( N2, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out ); gamma = hStereoCng->c_PS_LT * hStereoCng->c_PS_LT; scale = 1.0f; if ( gamma < 0.9f ) @@ -2411,7 +2412,7 @@ void generate_stereo_masking_noise( return; } - +#endif #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- * generate_stereo_masking_noise_fx() @@ -2420,181 +2421,6 @@ void generate_stereo_masking_noise( *-------------------------------------------------------------------*/ void generate_stereo_masking_noise_fx( - float *syn, /* i/o: time-domain signal */ - 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 */ -) -{ - HANDLE_FD_CNG_COM hFdCngCom; - Word32 gamma_fx, scale_fx /*, SP_ratio_fx needs to be integrated*/; - Word32 Np_fx[L_FRAME16k]; - Word32 Ns_fx[L_FRAME16k]; - Word32 N1_fx[L_FRAME16k]; - Word32 N2_fx[L_FRAME16k]; - Word16 N1_fx_exp, N2_fx_exp; - int16_t i; - - IF( st->idchan == 0 ) - { - hFdCngCom = st->hFdCngDec->hFdCngCom; - // mvr2r(hStereoCng->olapBufferSynth22, Ns, hFdCngCom->frameSize / 2); - // mvr2r(hFdCngCom->olapBufferSynth2_flt, Np, hFdCngCom->frameSize / 2); - for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) - { - Ns_fx[i] = float_to_fix( hStereoCng->olapBufferSynth22[i], Q6 ); - Np_fx[i] = float_to_fix( hFdCngCom->olapBufferSynth2_flt[i], Q6 ); - } - set_l( &Np_fx[hFdCngCom->frameSize / 2], 0, hFdCngCom->frameSize / 2 ); - set_l( &Ns_fx[hFdCngCom->frameSize / 2], 0, hFdCngCom->frameSize / 2 ); - - IF( !fadeOut ) - { - // generate_masking_noise_flt(N1, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out); - generate_masking_noise_ivas_fx( N1_fx, &N1_fx_exp, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out ); // N1_fx Q6 - /* Generate masking noise for secondary channel */ - IF( flag_sec_CNA ) - { - // generate_masking_noise_flt(N2, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out); - generate_masking_noise_ivas_fx( N2_fx, &N2_fx_exp, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out ); // N2_fx Q6 - // gamma = hStereoCng->c_PS_LT * hStereoCng->c_PS_LT; - gamma_fx = float_to_fix( hStereoCng->c_PS_LT * hStereoCng->c_PS_LT, Q30 ); - // scale = 1.0f; - scale_fx = ONE_IN_Q30; - // if (gamma < 0.9f) - IF( gamma_fx < 966367642 ) - { - // gamma = gamma / (1 - gamma); - // gamma = (float)sqrt(gamma + 1) - (float)sqrt(gamma); - // scale = 1.0f / (float)sqrt(1 + gamma * gamma); - Word16 exp_gamma = 0; - Word16 divisor1 = Inv16( (Word16) L_shr( L_sub( ONE_IN_Q30, gamma_fx ), Q15 ), &exp_gamma ); // Q15-exp_gamma - gamma_fx = L_shl( Mpy_32_16_1( gamma_fx, divisor1 ), exp_gamma ); // Q30 - Word16 exp_gamma1 = Q1, exp_gamma2 = Q1, exp_gamma3 = Q1; - gamma_fx = Sqrt32( L_add( gamma_fx, ONE_IN_Q30 ), &exp_gamma1 ); - // gamma_fx = L_shl( gamma_fx, exp_gamma1 ); - Word32 temp = Sqrt32( gamma_fx, &exp_gamma2 ); // Q31-exp_gamma1 - gamma_fx = L_sub( gamma_fx, L_shl( temp, exp_gamma2 - exp_gamma1 ) ); // Q31-exp_gamma1 - gamma_fx = L_shl( gamma_fx, exp_gamma1 - Q1 ); // Q30 - Word32 divisor2 = Sqrt32( L_add( ONE_IN_Q30, L_shl( Mpy_32_32( gamma_fx, gamma_fx ), Q1 ) ), &exp_gamma3 ); // Q31 - exp_gamma3 - scale_fx = L_shl( divide3232( ONE_IN_Q30, divisor2 ), Q15 + exp_gamma3 ); // Q30 - } - ELSE - { - gamma_fx = 0; - } - - FOR( i = 0; i < 2 * hFdCngCom->frameSize / 4; i++ ) - { - // Np[i] += scale * (N1[i] + gamma * N2[i]); - // Ns[i] += scale * sign(hStereoCng->c_PS_LT) * (N1[i] - gamma * N2[i]); - Np_fx[i] = L_add( Np_fx[i], - Mpy_32_32( scale_fx, L_shl( L_add( N1_fx[i], Mpy_32_32( gamma_fx, L_shl( N2_fx[i], Q1 ) ) ), Q1 ) ) ); // Q6 - Word32 add2 = Mpy_32_32( scale_fx, L_shl( L_sub( N1_fx[i], Mpy_32_32( gamma_fx, L_shl( N2_fx[i], Q1 ) ) ), Q1 ) ); // Q6 - if ( hStereoCng->c_PS_LT < 0.0f ) - { - add2 = L_negate( add2 ); - } - Ns_fx[i] = L_add( Ns_fx[i], add2 ); - } - FOR( ; i < hFdCngCom->frameSize; i++ ) - { - // Np[i] = scale * (N1[i] + gamma * N2[i]); - // Ns[i] = scale * sign(hStereoCng->c_PS_LT) * (N1[i] - gamma * N2[i]); - Np_fx[i] = Mpy_32_32( scale_fx, L_shl( L_add( N1_fx[i], Mpy_32_32( gamma_fx, L_shl( N2_fx[i], Q1 ) ) ), Q1 ) ); // Q6 - Ns_fx[i] = Mpy_32_32( scale_fx, L_shl( L_sub( N1_fx[i], Mpy_32_32( gamma_fx, L_shl( N2_fx[i], Q1 ) ) ), Q1 ) ); // Q6 - IF( hStereoCng->c_PS_LT < 0.0f ) - { - Ns_fx[i] = L_negate( Ns_fx[i] ); - } - } - /* Below code to be converted */ - float gamma = fix_to_float( gamma_fx, Q30 ); - float scale = fix_to_float( scale_fx, Q30 ); - scale *= (float) ( hFdCngCom->fftlen / 2 ); - // scale_fx = L_shr(scale_fx, Q1) * hFdCngCom->fftlen; - for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) - { - hFdCngCom->olapBufferSynth2_flt[i] = scale * ( hFdCngCom->olapBufferSynth2_flt[i + 5 * hFdCngCom->frameSize / 4] + gamma * hStereoCng->olapBufferSynth22[i + 5 * hFdCngCom->frameSize / 4] ); - hStereoCng->olapBufferSynth22[i] = sign( hStereoCng->c_PS_LT ) * scale * ( hFdCngCom->olapBufferSynth2_flt[i + 5 * hFdCngCom->frameSize / 4] - gamma * hStereoCng->olapBufferSynth22[i + 5 * hFdCngCom->frameSize / 4] ); - } - } - else - { - FOR( i = 0; i < hFdCngCom->frameSize / 2; i++ ) - { - // Np[i] += N1[i]; - Np_fx[i] = L_add( Np_fx[i], N1_fx[i] ); // Q6 - } - // mvr2r(&N1[hFdCngCom->frameSize / 2], &Np[hFdCngCom->frameSize / 2], hFdCngCom->frameSize / 2); - mvl2l( &N1_fx[hFdCngCom->frameSize / 2], &Np_fx[hFdCngCom->frameSize / 2], hFdCngCom->frameSize / 2 ); - float scale = (float) ( hFdCngCom->fftlen / 2 ); - for ( i = 0; i < hFdCngCom->frameSize; i++ ) - { - hFdCngCom->olapBufferSynth2_flt[i] = scale * hFdCngCom->olapBufferSynth2_flt[i + 5 * hFdCngCom->frameSize / 4]; - } - } - } - else - { - set_f( hFdCngCom->olapBufferSynth2_flt, 0.0f, hFdCngCom->frameSize / 2 ); - set_f( hStereoCng->olapBufferSynth22, 0.0f, hFdCngCom->frameSize / 2 ); - } - if ( flag_sec_CNA ) - { - // mvr2r(Ns, hStereoCng->maskingNoiseS, hFdCngCom->frameSize); - for ( i = 0; i < hFdCngCom->frameSize; i++ ) - { - hStereoCng->maskingNoiseS[i] = fix_to_float( Ns_fx[i], Q6 ); - } - hStereoCng->enableSecCNA = 1; - } - else - { - set_f( hStereoCng->olapBufferSynth22, 0.0f, hFdCngCom->frameSize ); - } - - /* add masking noise */ - // v_add(Np, syn, syn, hFdCngCom->frameSize); - for ( i = 0; i < hFdCngCom->frameSize; i++ ) - { - syn[i] = syn[i] + fix_to_float( Np_fx[i], Q6 ); - } - } - else if ( hStereoCng->enableSecCNA ) - { - float SP_ratio = hStereoTD->SP_ratio_LT; /* Use long-term SP ratio based on L/R synthesis */ - /* scale and add masking noise */ - for ( i = 0; i < *hStereoCng->frameSize / 4; i++ ) - { - float scale = ( ( hStereoTD->prevSP_ratio * ( *hStereoCng->frameSize / 4 - (float) i ) + SP_ratio * (float) i ) / ( *hStereoCng->frameSize / 4 ) ); - syn[i] += scale * hStereoCng->maskingNoiseS[i]; - } - for ( ; i < *hStereoCng->frameSize / 2; i++ ) - { - syn[i] += SP_ratio * hStereoCng->maskingNoiseS[i]; - } - for ( ; i < *hStereoCng->frameSize; i++ ) - { - syn[i] += SP_ratio * hStereoCng->maskingNoiseS[i]; - } - hStereoTD->prevSP_ratio = SP_ratio; - } - - return; -} - - -/*------------------------------------------------------------------- - * generate_stereo_masking_noise_16fx() - * - * Generate additional comfort noise (kind of noise filling) - *-------------------------------------------------------------------*/ - -void generate_stereo_masking_noise_16fx( Word16 *syn, /* i/o: time-domain signal */ Word16 Q_syn, Decoder_State *st, /* i/o: decoder state structure */ @@ -2617,27 +2443,25 @@ void generate_stereo_masking_noise_16fx( IF(st->idchan == 0) { hFdCngCom = st->hFdCngDec->hFdCngCom; - // mvr2r(hStereoCng->olapBufferSynth22, Ns, hFdCngCom->frameSize / 2); - // mvr2r(hFdCngCom->olapBufferSynth2_flt, Np, hFdCngCom->frameSize / 2); - for (i = 0; i < hFdCngCom->frameSize / 2; i++) - { - Ns_fx[i] = float_to_fix(hStereoCng->olapBufferSynth22[i], Q6); - Np_fx[i] = float_to_fix(hFdCngCom->olapBufferSynth2_flt[i], Q6); - } + Copy_Scale_sig_16_32( hStereoCng->olapBufferSynth22_fx, Ns_fx, hFdCngCom->frameSize / 2, Q6 - st->Q_syn ); + Copy32(hFdCngCom->olapBufferSynth2_fx, Np_fx, hFdCngCom->frameSize / 2); + set_l(&Np_fx[hFdCngCom->frameSize / 2], 0, hFdCngCom->frameSize / 2); set_l(&Ns_fx[hFdCngCom->frameSize / 2], 0, hFdCngCom->frameSize / 2); IF(!fadeOut) { - // generate_masking_noise_flt(N1, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out); + // generate_masking_noise(N1, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out); + Copy_Scale_sig_16_32( hStereoCng->olapBufferSynth22_fx, hStereoCng->olapBufferSynth22_32fx, hFdCngCom->fftlen, -(st->Q_syn - 15) ); + generate_masking_noise_ivas_fx(N1_fx, &N1_fx_exp, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out); // N1_fx Q6 /* Generate masking noise for secondary channel */ IF(flag_sec_CNA) { - // generate_masking_noise_flt(N2, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out); + // generate_masking_noise(N2, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out); generate_masking_noise_ivas_fx(N2_fx, &N2_fx_exp, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out); // N2_fx Q6 // gamma = hStereoCng->c_PS_LT * hStereoCng->c_PS_LT; - gamma_fx = float_to_fix(hStereoCng->c_PS_LT * hStereoCng->c_PS_LT, Q30); + gamma_fx = L_shr( Mpy_32_32( hStereoCng->c_PS_LT_fx, hStereoCng->c_PS_LT_fx ), 1 ); // scale = 1.0f; scale_fx = ONE_IN_Q30; // if (gamma < 0.9f) @@ -2670,7 +2494,7 @@ void generate_stereo_masking_noise_16fx( Np_fx[i] = L_add(Np_fx[i], Mpy_32_32(scale_fx, L_shl(L_add(N1_fx[i], Mpy_32_32(gamma_fx, L_shl(N2_fx[i], Q1))), Q1))); // Q6 Word32 add2 = Mpy_32_32(scale_fx, L_shl(L_sub(N1_fx[i], Mpy_32_32(gamma_fx, L_shl(N2_fx[i], Q1))), Q1)); // Q6 - if (hStereoCng->c_PS_LT < 0.0f) + if (hStereoCng->c_PS_LT_fx < 0) { add2 = L_negate(add2); } @@ -2682,15 +2506,12 @@ void generate_stereo_masking_noise_16fx( // Ns[i] = scale * sign(hStereoCng->c_PS_LT) * (N1[i] - gamma * N2[i]); Np_fx[i] = Mpy_32_32(scale_fx, L_shl(L_add(N1_fx[i], Mpy_32_32(gamma_fx, L_shl(N2_fx[i], Q1))), Q1)); // Q6 Ns_fx[i] = Mpy_32_32(scale_fx, L_shl(L_sub(N1_fx[i], Mpy_32_32(gamma_fx, L_shl(N2_fx[i], Q1))), Q1)); // Q6 - IF(hStereoCng->c_PS_LT < 0.0f) + IF(hStereoCng->c_PS_LT_fx < 0) { Ns_fx[i] = L_negate(Ns_fx[i]); } } /* Below code to be converted */ - //float gamma = fix_to_float(gamma_fx, Q30); - //float scale = fix_to_float(scale_fx, Q30); - //scale *= (float)(hFdCngCom->fftlen / 2); Word32 scale_fx_tmp = Mpy_32_32(scale_fx, L_shl(hFdCngCom->fftlen / 2, Q22)); // Q21 // scale_fx = L_shr(scale_fx, Q1) * hFdCngCom->fftlen; for (i = 0; i < hFdCngCom->frameSize / 2; i++) @@ -2724,6 +2545,9 @@ void generate_stereo_masking_noise_16fx( hFdCngCom->olapBufferSynth2[i] = (Word16) L_shr( Mpy_32_16_1( scale_fx, hFdCngCom->olapBufferSynth2[i + 5 * hFdCngCom->frameSize / 4] ), Q6 ); // Q_olap } } + + Copy_Scale_sig_32_16(hStereoCng->olapBufferSynth22_32fx, hStereoCng->olapBufferSynth22_fx, hFdCngCom->fftlen, (st->Q_syn - 15)); + } else { @@ -2732,11 +2556,7 @@ void generate_stereo_masking_noise_16fx( } if (flag_sec_CNA) { - // mvr2r(Ns, hStereoCng->maskingNoiseS, hFdCngCom->frameSize); - for (i = 0; i < hFdCngCom->frameSize; i++) - { - hStereoCng->maskingNoiseS[i] = fix_to_float(Ns_fx[i], Q6); - } + Copy_Scale_sig_32_16(Ns_fx, hStereoCng->maskingNoiseS_fx, hFdCngCom->frameSize, 0); // Q6 hStereoCng->enableSecCNA = 1; } else @@ -2753,34 +2573,35 @@ void generate_stereo_masking_noise_16fx( } else if (hStereoCng->enableSecCNA) { - //float SP_ratio = hStereoTD->SP_ratio_LT; /* Use long-term SP ratio based on L/R synthesis */ - Word16 SP_ratio_fx = float_to_fix16(hStereoTD->SP_ratio_LT, Q15); /* Use long-term SP ratio based on L/R synthesis */ - Word16 prevSP_ratio_fx = float_to_fix16(hStereoTD->prevSP_ratio, Q15); /* Use long-term SP ratio based on L/R synthesis */ + Word16 SP_ratio_fx = extract_h( hStereoTD->SP_ratio_LT_fx ); /* Use long-term SP ratio based on L/R synthesis */ + Word16 prevSP_ratio_fx = hStereoTD->prevSP_ratio_fx; /* Use long-term SP ratio based on L/R synthesis */ /* scale and add masking noise */ for (i = 0; i < *hStereoCng->frameSize / 4; i++) { - //float scale = ( ( hStereoTD->prevSP_ratio * ( *hStereoCng->frameSize / 4 - (float) i ) + SP_ratio * (float) i ) / ( *hStereoCng->frameSize / 4 ) ); - Word16 scale_fx_tmp = (Word16)(((Word32)prevSP_ratio_fx * (*hStereoCng->frameSize / 4 - i) + SP_ratio_fx * i) / (*hStereoCng->frameSize / 4)); //Q15 + //Word16 scale_fx_tmp = idiv1616( add( imult1616( prevSP_ratio_fx, sub( shr( *hStereoCng->frameSize, 2 ), i ) ), imult1616( SP_ratio_fx, i ) ), shr( *hStereoCng->frameSize, 2 ) ); // Q15 + Word16 s; + Word16 scale_fx_tmp = BASOP_Util_Divide3216_Scale( L_add( L_mult0( prevSP_ratio_fx, sub( shr( *hStereoCng->frameSize, 2 ), i ) ), L_mult0( SP_ratio_fx, i ) ), shr( *hStereoCng->frameSize, 2 ), &s ); // Q15 + scale_fx_tmp = shl(scale_fx_tmp, s); //syn[i] += scale * hStereoCng->maskingNoiseS[i]; - syn[i] = add(syn[i], mult(scale_fx_tmp, float_to_fix16(hStereoCng->maskingNoiseS[i], Q15))); + syn[i] = add( syn[i], mult( scale_fx_tmp, shr( hStereoCng->maskingNoiseS_fx[i], Q6 - Q_syn ) ) ); } for (; i < *hStereoCng->frameSize / 2; i++) { //syn[i] += SP_ratio * hStereoCng->maskingNoiseS[i]; - syn[i] = add(syn[i], mult(SP_ratio_fx, float_to_fix16(hStereoCng->maskingNoiseS[i], Q15))); + syn[i] = add( syn[i], mult( SP_ratio_fx, shr( hStereoCng->maskingNoiseS_fx[i], Q6 - Q_syn ) ) ); } for (; i < *hStereoCng->frameSize; i++) { //syn[i] += SP_ratio * hStereoCng->maskingNoiseS[i]; - syn[i] = add(syn[i], mult(SP_ratio_fx, float_to_fix16(hStereoCng->maskingNoiseS[i], Q15))); + syn[i] = add( syn[i], mult( SP_ratio_fx, shr( hStereoCng->maskingNoiseS_fx[i], Q6 - Q_syn ) ) ); } - hStereoTD->prevSP_ratio = hStereoTD->SP_ratio_LT; + hStereoTD->prevSP_ratio_fx = extract_h(hStereoTD->SP_ratio_LT_fx); } return; } #endif - +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- * generate_masking_noise_hf_cldfb() * @@ -2879,79 +2700,19 @@ void generate_masking_noise_lb_dirac( fftBuffer[1] = 0.f; /* Perform STFT synthesis */ -#ifdef IVAS_FLOAT_FIXED - Word32 fftBuffer_fx[FFTLEN], timeDomainBuffer_fx[L_FRAME16k]; - Word16 exp = Q14; - for (i = 0; i < hFdCngCom->fftlen; i++) - { - fftBuffer_fx[i] = float_to_fix(fftBuffer[i], exp); - } - for (i = 0; i < hFdCngCom->fftlen; i++) - { - hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(hFdCngCom->olapBufferSynth2_flt[i], exp); - } - - SynthesisSTFT_dirac_fx(fftBuffer_fx, timeDomainBuffer_fx + n_samples_start, hFdCngCom->olapBufferSynth2_fx, hFdCngCom->olapWinSyn_fx, n_samples_out_loop, hFdCngCom); - - for (i = 0; i < hFdCngCom->fftlen; i++) - { - hFdCngCom->olapBufferSynth2_flt[i] = fix_to_float(hFdCngCom->olapBufferSynth2_fx[i], exp); - } - exp = exp - 9; - for (i = 0; i < hFdCngCom->frameSize; i++) - { - tdBuffer[i] = fix_to_float(timeDomainBuffer_fx[i], exp); - } - - for (i = 0; i < hFdCngCom->frameSize; i++) - { - hFdCngCom->exc_cng_flt[i] = fix_to_float(hFdCngCom->exc_cng_32fx[i], exp); - } -#else SynthesisSTFT_dirac_flt( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2_flt, hFdCngCom->olapWinSyn_flt, n_samples_out_loop, hFdCngCom ); -#endif } else { /* very low level case - update random seeds */ - generate_masking_noise_update_seed_flt( hFdCngCom ); + generate_masking_noise_update_seed( hFdCngCom ); set_f( fftBuffer, 0.f, hFdCngCom->fftlen ); /* Perform STFT synthesis */ -#ifdef IVAS_FLOAT_FIXED - Word32 fftBuffer_fx[FFTLEN], timeDomainBuffer_fx[L_FRAME16k]; - Word16 exp = Q14; - for (i = 0; i < hFdCngCom->fftlen; i++) - { - fftBuffer_fx[i] = float_to_fix(fftBuffer[i], exp); - } - for (i = 0; i < hFdCngCom->fftlen; i++) - { - hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(hFdCngCom->olapBufferSynth2_flt[i], exp); - } - - SynthesisSTFT_dirac_fx(fftBuffer_fx, timeDomainBuffer_fx + n_samples_start, hFdCngCom->olapBufferSynth2_fx, (Word16 *)hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom); - - for (i = 0; i < hFdCngCom->fftlen; i++) - { - hFdCngCom->olapBufferSynth2_flt[i] = fix_to_float(hFdCngCom->olapBufferSynth2_fx[i], exp); - } - exp = exp - 9; - for (i = 0; i < hFdCngCom->frameSize; i++) - { - tdBuffer[i] = fix_to_float(timeDomainBuffer_fx[i], exp); - } - - for (i = 0; i < hFdCngCom->frameSize; i++) - { - hFdCngCom->exc_cng_flt[i] = fix_to_float(hFdCngCom->exc_cng_32fx[i], exp); - } -#else SynthesisSTFT_dirac_flt( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2_flt, hFdCngCom->olapWinSyn_flt, n_samples_out_loop, hFdCngCom ); -#endif } n_samples_out -= hFdCngCom->frameSize; @@ -2963,7 +2724,7 @@ void generate_masking_noise_lb_dirac( return; } - +#endif #ifdef IVAS_FLOAT_FIXED void generate_masking_noise_lb_dirac_fx( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ @@ -3077,7 +2838,7 @@ void generate_masking_noise_lb_dirac_fx( ELSE { /* very low level case - update random seeds */ - generate_masking_noise_update_seed( hFdCngCom ); + generate_masking_noise_update_seed_fx( hFdCngCom ); set32_fx( fftBuffer, 0, hFdCngCom->fftlen ); /* Perform STFT synthesis */ @@ -3095,7 +2856,7 @@ void generate_masking_noise_lb_dirac_fx( return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------- * generate_masking_noise_hf_cldfb() * @@ -3197,7 +2958,7 @@ void generate_masking_noise_dirac( } #endif #ifdef IVAS_FLOAT_FIXED -void generate_masking_noise_dirac_fx( +void generate_masking_noise_dirac_ivas_fx( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ Word32 *tdBuffer_fx, /* i/o: time-domain signal, if NULL no LB-CNA */ @@ -3581,7 +3342,7 @@ void FdCngDecodeMDCTStereoSID( /*------------------------------------------------------------------- - * FdCngDecodeDiracMDCTStereoSID() + * FdCngDecodeDiracMDCTStereoSID_fx() * * Decode FD-CNG parameters for CNG in 2TC DirAC mode from the bitstream *-------------------------------------------------------------------*/ diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 5743b96d9f22ac92a89f30d9dc11d8880f37a991..b2d730debe44f646395700fc840ef84afb6bbb18 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -35,7 +35,7 @@ const Word16 maxN_37bits = FD_CNG_maxN_37bits; const Word16 maxC_37bits = FD_CNG_maxC_37bits; const Word16 stages_37bits = FD_CNG_stages_37bits; /* - createFdCngDec + createFdCngDec_fx Parameters: @@ -44,7 +44,7 @@ const Word16 stages_37bits = FD_CNG_stages_37bits; Function: create an instance of type FD_CNG */ -ivas_error createFdCngDec (HANDLE_FD_CNG_DEC *hFdCngDec) +ivas_error createFdCngDec_fx (HANDLE_FD_CNG_DEC *hFdCngDec) { HANDLE_FD_CNG_DEC hs; ivas_error error; @@ -67,7 +67,7 @@ ivas_error createFdCngDec (HANDLE_FD_CNG_DEC *hFdCngDec) } #ifdef IVAS_FLOAT_FIXED -void ivas_initFdCngDec_fx( +void initFdCngDec_ivas_fx( DEC_CORE_HANDLE st, /* i/o: decoder state structure */ Word16 scale ) { @@ -111,7 +111,7 @@ void ivas_initFdCngDec_fx( set32_fx( hFdCngDec->msBminSubWin, 0, NPART_SHAPING ); set16_fx( hFdCngDec->msPsd, 0, NPART_SHAPING ); - set32_fx( hFdCngDec->msPsd_fx, 0, NPART_SHAPING ); + set32_fx( hFdCngDec->msPsd_fx, 0, NPART_SHAPING ); set16_fx( hFdCngDec->msNoiseFloor, 0, NPART_SHAPING ); set32_fx( hFdCngDec->msNoiseEst, 0, NPART_SHAPING ); @@ -150,7 +150,7 @@ void ivas_initFdCngDec_fx( hFdCngDec->hFdCngCom->periodog_exp = 0; move16(); set32_fx( hFdCngDec->smoothed_psd_fx, 0, L_FRAME16k ); - + hFdCngDec->q_smoothed_psd = Q4; set32_fx( hFdCngDec->hFdCngCom->sidNoiseEstLp, 0, NPART ); hFdCngDec->ms_last_inactive_bwidth = NB; @@ -184,7 +184,7 @@ void ivas_initFdCngDec_fx( return; } #endif -void initFdCngDec( +void initFdCngDec_fx( DEC_CORE_HANDLE st, /* i/o: decoder state structure */ Word16 scale ) @@ -227,7 +227,7 @@ void initFdCngDec( set32_fx( hFdCngDec->msBminSubWin, 0, NPART_SHAPING ); set16_fx( hFdCngDec->msPsd, 0, NPART_SHAPING ); - set32_fx( hFdCngDec->msPsd_fx, 0, NPART_SHAPING ); + set32_fx( hFdCngDec->msPsd_fx, 0, NPART_SHAPING ); set16_fx( hFdCngDec->msNoiseFloor, 0, NPART_SHAPING ); set32_fx( hFdCngDec->msNoiseEst, 0, NPART_SHAPING ); @@ -263,6 +263,10 @@ void initFdCngDec( hFdCngDec->hFdCngCom->fftBuffer_exp = 0; hFdCngDec->hFdCngCom->periodog_exp = 0; set32_fx(hFdCngDec->smoothed_psd_fx, 0, L_FRAME16k); +#ifdef IVAS_FLOAT_FIXED + hFdCngDec->q_smoothed_psd = Q4; +#endif + #ifdef IVAS_CODE_CNG set_f(hFdCngDec->hFdCngCom->sidNoiseEstLp, 0.0f, NPART); @@ -292,7 +296,7 @@ void initFdCngDec( } /* - configureFdCngDec + configureFdCngDec_fx Parameters: @@ -308,7 +312,7 @@ void initFdCngDec( Returns: void */ -void configureFdCngDec ( +void configureFdCngDec_fx ( HANDLE_FD_CNG_DEC hFdCngDec, /* i/o: Contains the variables related to the CLDFB-based CNG process */ Word16 bwidth, Word32 total_brate, @@ -523,7 +527,7 @@ void configureFdCngDec ( /* - deleteFdCngDec + deleteFdCngDec_fx Parameters: @@ -535,7 +539,7 @@ void configureFdCngDec ( Returns: void */ -void deleteFdCngDec (HANDLE_FD_CNG_DEC *hFdCngDec) +void deleteFdCngDec_fx (HANDLE_FD_CNG_DEC *hFdCngDec) { HANDLE_FD_CNG_DEC hsDec = *hFdCngDec; @@ -549,7 +553,7 @@ void deleteFdCngDec (HANDLE_FD_CNG_DEC *hFdCngDec) /* - ApplyFdCng + ApplyFdCng_fx Parameters: @@ -570,7 +574,7 @@ void deleteFdCngDec (HANDLE_FD_CNG_DEC *hFdCngDec) Returns: error */ -Word16 ApplyFdCng ( +Word16 ApplyFdCng_fx ( Word16 *timeDomainInput, /* i : pointer to time domain input */ Word16 Q, #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT @@ -672,9 +676,9 @@ Word16 ApplyFdCng ( { /* Perform noise estimation at the decoder */ #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec(timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD); + perform_noise_estimation_dec_fx(timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD); #else - perform_noise_estimation_dec (timeDomainInput, Q, hFdCngDec); + perform_noise_estimation_dec_fx (timeDomainInput, Q, hFdCngDec); #endif /* Update the shaping parameters */ @@ -849,9 +853,9 @@ Word16 ApplyFdCng ( { /* Perform noise estimation in active frames in the decoder for downward updates */ #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec(timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD); + perform_noise_estimation_dec_fx(timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD); #else - perform_noise_estimation_dec(timeDomainInput, Q, hFdCngDec); + perform_noise_estimation_dec_fx(timeDomainInput, Q, hFdCngDec); #endif } } @@ -940,9 +944,9 @@ Word16 ApplyFdCng ( { /* Perform noise estimation on inactive phase at the decoder */ #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec(timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD); + perform_noise_estimation_dec_fx(timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD); #else - perform_noise_estimation_dec(timeDomainInput, Q, hFdCngDec); + perform_noise_estimation_dec_fx(timeDomainInput, Q, hFdCngDec); #endif /* Update the shaping parameters */ @@ -1158,7 +1162,7 @@ Word16 ApplyFdCng ( IF ( EQ_16(st->codec_mode, MODE2)) { /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec (cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &(st->Q_exc), 2, -1); + generate_comfort_noise_dec_fx (cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &(st->Q_exc), 2, -1); } BREAK; @@ -1172,7 +1176,7 @@ Word16 ApplyFdCng ( } #ifdef IVAS_FLOAT_FIXED -Word16 ApplyFdCng_fx( +Word16 ApplyFdCng_ivas_fx( Word16 *timeDomainInput, /* i : pointer to time domain input */ Word16 Q, Word32 *powerSpectrum, @@ -1267,7 +1271,7 @@ Word16 ApplyFdCng_fx( ( !st->BER_detect ) ) { /* Perform noise estimation at the decoder */ - perform_noise_estimation_dec_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); /* Update the shaping parameters */ test(); @@ -1422,12 +1426,15 @@ Word16 ApplyFdCng_fx( L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ #ifdef BASOP_NOGLOB - st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) ); + st->hTcxDec->conCngLevelBackgroundTrace = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); #else - st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) ); + st->hTcxDec->conCngLevelBackgroundTrace = round_fx( Sqrt32( L_tmp, &L_tmp_exp ) ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) ); #endif L_tmp_exp = add( L_tmp_exp, 1 ); - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp = L_tmp_exp; + //st->hTcxDec->CngLevelBackgroundTrace_bfi_exp = L_tmp_exp; + st->hTcxDec->conCngLevelBackgroundTrace_e = L_tmp_exp; move16(); } ELSE @@ -1471,11 +1478,14 @@ Word16 ApplyFdCng_fx( L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ #ifdef BASOP_NOGLOB - st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) ); + //st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) ); + st->hTcxDec->conCngLevelBackgroundTrace = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); #else + st->hTcxDec->conCngLevelBackgroundTrace = round_fx( Sqrt32( L_tmp, &L_tmp_exp ) ); st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) ); #endif - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp = L_tmp_exp; + //st->hTcxDec->CngLevelBackgroundTrace_bfi_exp = L_tmp_exp; + st->hTcxDec->conCngLevelBackgroundTrace_e = L_tmp_exp; move16(); } @@ -1529,7 +1539,7 @@ Word16 ApplyFdCng_fx( IF( hFdCngCom->active_frame_counter > 0 ) { /* Perform noise estimation in active frames in the decoder for downward updates */ - perform_noise_estimation_dec_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); } } test(); @@ -1588,7 +1598,7 @@ Word16 ApplyFdCng_fx( IF( st != NULL && EQ_16( st->cng_type, LP_CNG ) ) { /* Perform noise estimation on inactive phase at the decoder */ - perform_noise_estimation_dec_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); /* Update the shaping parameters */ @@ -1851,7 +1861,7 @@ Word16 ApplyFdCng_fx( IF( EQ_16( st->codec_mode, MODE2 ) ) { /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); + generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); } BREAK; @@ -1866,7 +1876,7 @@ Word16 ApplyFdCng_fx( #endif // IVAS_FLOAT_FIXED /* - perform_noise_estimation_dec + perform_noise_estimation_dec_fx Parameters: @@ -1880,7 +1890,7 @@ Word16 ApplyFdCng_fx( Returns: void */ -void perform_noise_estimation_dec ( +void perform_noise_estimation_dec_fx ( const Word16 *timeDomainInput, /* i: pointer to time domain input */ const Word16 Q, #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT @@ -2329,7 +2339,7 @@ void perform_noise_estimation_dec ( } #ifdef IVAS_FLOAT_FIXED -void perform_noise_estimation_dec_fx( +void perform_noise_estimation_dec_ivas_fx( const Word16 *timeDomainInput, /* i: pointer to time domain input */ const Word16 Q, Word32 *power_spectrum, @@ -2784,9 +2794,10 @@ void perform_noise_estimation_dec_fx( hFdCngDec->msPsd_exp_fft = hFdCngDec->msNoiseEst_exp; /* Expand partitions into bins of power spectrum */ - scalebands_fx( msNoiseEst, part, nFFTpart, hFdCngDec->midband_shaping, nFFTpart, sub( stopFFTbin, startBand ), hFdCngDec->bandNoiseShape, 1 ); + scalebands_fx( msNoiseEst, part, nFFTpart, hFdCngDec->midband_shaping, nFFTpart, sub( stopFFTbin, startBand ), hFdCngDec->bandNoiseShape, 1 ); hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; Copy32( hFdCngDec->bandNoiseShape, &hFdCngDec->smoothed_psd_fx[startBand], sub( stopFFTbin, startBand ) ); + hFdCngDec->q_smoothed_psd = sub(Q31, hFdCngDec->bandNoiseShape_exp); set32_fx( &hFdCngDec->smoothed_psd_fx[stopFFTbin], 0, sub( L_FRAME16k, stopFFTbin ) ); } ELSE @@ -2940,7 +2951,7 @@ void perform_noise_estimation_dec_fx( /* - FdCng_decodeSID + FdCng_decodeSID_fx Parameters: @@ -2955,7 +2966,7 @@ void perform_noise_estimation_dec_fx( Returns: void */ -void FdCng_decodeSID (HANDLE_FD_CNG_COM st, Decoder_State *corest) +void FdCng_decodeSID_fx (HANDLE_FD_CNG_COM st, Decoder_State *corest) { Word16 i, N, index; Word32 *sidNoiseEst; @@ -3083,7 +3094,7 @@ void FdCng_decodeSID (HANDLE_FD_CNG_COM st, Decoder_State *corest) /* - noisy_speech_detection + noisy_speech_detection_fx Parameters: @@ -3102,7 +3113,7 @@ void FdCng_decodeSID (HANDLE_FD_CNG_COM st, Decoder_State *corest) void */ -void noisy_speech_detection ( +void noisy_speech_detection_fx ( HANDLE_FD_CNG_DEC hFdCngDec,/* i/o: FD_CNG structure */ const Word16 vad, const Word16 * syn, /* i : input time-domain frame */ @@ -3213,7 +3224,7 @@ void noisy_speech_detection ( void -generate_comfort_noise_dec ( +generate_comfort_noise_dec_fx ( Word32 **bufferReal, /* o : matrix to real part of input bands */ Word32 **bufferImag, /* o : matrix to imaginary part of input bands */ Word16 *bufferScale, /* o : pointer to scalefactor for real and imaginary part of input bands */ @@ -3629,7 +3640,7 @@ generate_comfort_noise_dec ( void -generate_comfort_noise_dec_hf ( +generate_comfort_noise_dec_hf_fx ( Word32 **bufferReal, /* o : matrix to real part of input bands */ Word32 **bufferImag, /* o : matrix to imaginary part of input bands */ Word16 *bufferScale, /* o : pointer to scalefactor for real and imaginary part of input bands */ @@ -3830,7 +3841,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( /* - generate_masking_noise + generate_masking_noise_fx Parameters: @@ -3845,7 +3856,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( void */ -void generate_masking_noise ( +void generate_masking_noise_fx ( Word16 *timeDomainBuffer, /* i/o : pointer to time domain output buffer 15Q0 */ Word16 Q, HANDLE_FD_CNG_COM hFdCngCom /* i/o : pointer to FD_CNG_COM structure */ @@ -4031,13 +4042,13 @@ void generate_masking_noise ( } /*------------------------------------------------------------------- - * generate_masking_noise_update_seed() + * generate_masking_noise_update_seed_fx() * - * Update seed for scenarios where generate_masking_noise() is + * Update seed for scenarios where generate_masking_noise_fx() is * not called based on signal statistics *-------------------------------------------------------------------*/ -void generate_masking_noise_update_seed ( +void generate_masking_noise_update_seed_fx ( HANDLE_FD_CNG_COM hFdCngCom /* i/o : pointer to FD_CNG_COM structure */ ) { @@ -4069,7 +4080,7 @@ void generate_masking_noise_update_seed ( /************************************************************ * Generate additional comfort noise (kind of noise filling) * ************************************************************/ -void generate_masking_noise_mdct ( +void generate_masking_noise_mdct_fx ( Word32 *mdctBuffer, /* i/o: time-domain signal */ Word16 *mdctBuffer_e, /* i/o: exponent time-domain signal */ HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ @@ -4273,11 +4284,11 @@ void generate_stereo_masking_noise( if (!fadeOut) { - generate_masking_noise(N1, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out); + generate_masking_noise_fx(N1, hFdCngCom, hFdCngCom->frameSize, 0, 1, 0, st->element_mode, hStereoCng, nchan_out); /* Generate masking noise for secondary channel */ if (flag_sec_CNA) { - generate_masking_noise(N2, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out); + generate_masking_noise_fx(N2, hFdCngCom, hFdCngCom->frameSize, 0, 1, 1, st->element_mode, hStereoCng, nchan_out); gamma = hStereoCng->c_PS_LT * hStereoCng->c_PS_LT; scale = 1.0f; if (gamma < 0.9f) @@ -4500,7 +4511,7 @@ void generate_masking_noise_dirac( if (slot_index == 0) { /* very low level case - update random seeds */ - generate_masking_noise_update_seed(hFdCngCom); + generate_masking_noise_update_seed_fx(hFdCngCom); set_f(fftBuffer, 0.f, hFdCngCom->fftlen); diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index 787cc614e738ad14b458bc24b4b867fb96dc05c9..6b87bd222e82cbb68a0e229553c742fb52ed10f2 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -39,11 +39,7 @@ void Es_pred_dec_fx( #ifdef IVAS_GAIN_MOD PMT("Verify if Es_pred_dec_fx should use noltp parameters") #endif -#ifdef EVS_FLOAT -#if 1//def IVAS_GAIN_MOD IF(no_ltp == 0) -#endif -#endif // EVS_FLOAT { SWITCH(nb_bits) { @@ -55,27 +51,19 @@ void Es_pred_dec_fx( *Es_pred = Es_pred_qua_4b_fx[enr_idx]; move16(); BREAK; -#ifdef EVS_FLOAT -#if 1//def IVAS_GAIN_MOD case 3: *Es_pred = Es_pred_qua_3b_fx[enr_idx]; break; -#endif -#endif // EVS_FLOAT default: *Es_pred = Es_pred_qua_5b_fx[enr_idx]; move16(); BREAK; } } -#ifdef EVS_FLOAT -#if 1//def IVAS_GAIN_MOD ELSE { *Es_pred = Es_pred_qua_4b_no_ltp_fx[enr_idx]; } -#endif -#endif } /*======================================================================================*/ /* FUNCTION : void gain_dec_tc_fx () */ @@ -838,15 +826,12 @@ void gain_dec_lbr_fx( move16(); cdbk_fx = gp_gamma_3sfr_6b_fx; -#ifdef EVS_FLOAT -#if 1//def IVAS_GAIN_MOD + IF(EQ_16(nBits, 7)) { cdbk_fx = gp_gamma_3sfr_7b_fx; //PMT("verify if gp_gamma_3sfr_7b_fx is correct") } -#endif -#endif move16(); /* Q14/Q9*/ /* calculate predicted gain */ diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c index 140241660b96e3b78c309f5a41a4bbcacaf89f42..abdbc52f6a15d52d75fcc6a12e7546c964a00c39 100644 --- a/lib_dec/gs_dec.c +++ b/lib_dec/gs_dec.c @@ -48,7 +48,7 @@ * * Decode audio (AC) frames *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void decod_audio( Decoder_State *st, /* i/o: decoder static memory */ float dct_epit[], /* o : GSC excitation in DCT domain */ diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index a0a3c8fbe0a72a38994ba691bc83cb0080cb3a88..430b1653e64c0588f8b135473078872170d99a65 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -10,7 +10,7 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "ivas_cnst.h" - +#ifdef IVAS_FLOAT_FIXED /*=========================================================================*/ /* FUNCTION : void decod_audio_fx(); */ /*-------------------------------------------------------------------------*/ @@ -1314,7 +1314,6 @@ void gsc_dec_fx( } -#ifdef IVAS_FLOAT_FIXED /*==========================================================================*/ /* FUNCTION : void gsc_dec_ivas_fx () */ /*--------------------------------------------------------------------------*/ @@ -1644,7 +1643,6 @@ void gsc_dec_ivas_fx( return; } -#endif /*-------------------------------------------------------------------* * GSC_dec_init() @@ -1686,7 +1684,6 @@ void GSC_dec_init( return; } -#ifdef IVAS_FLOAT_FIXED void GSC_dec_init_ivas_fx( GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ ) @@ -1713,4 +1710,4 @@ void GSC_dec_init_ivas_fx( return; } -#endif +#endif \ No newline at end of file diff --git a/lib_dec/hf_synth.c b/lib_dec/hf_synth.c index 25f94331caeec4e912d7cdaf0a7ad727b7bac9e4..2267d44d8f79713af77fbf7bc9d303ce85598105 100644 --- a/lib_dec/hf_synth.c +++ b/lib_dec/hf_synth.c @@ -63,7 +63,7 @@ static void envelope( AMRWB_IO_DEC_HANDLE hAmrwb_IO, const int32_t core_brate, c static void AdaptiveStartBand( int16_t *start_band, const int32_t core_brate, const float *lsf, const float voicing_fac, const int16_t clas, int16_t *voicing_flag, int16_t *start_band_old, float *OptCrit_old ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * hf_synth_init() * @@ -119,7 +119,7 @@ void hf_synth_amr_wb_init( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * hf_synth_amr_wb_reset() * @@ -882,7 +882,7 @@ static void AdaptiveStartBand( } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * hf_synth_reset() * diff --git a/lib_dec/hq_core_dec.c b/lib_dec/hq_core_dec.c index 6e85b92aa4bfadb2427fcc7feed90d0ac10656d6..839d6b299d6e6d1babd598e8c2471242229d1b55 100644 --- a/lib_dec/hq_core_dec.c +++ b/lib_dec/hq_core_dec.c @@ -54,7 +54,7 @@ * * HQ core decoder *--------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void hq_core_dec( Decoder_State *st, /* i/o: decoder state structure */ float synth[], /* o : output synthesis */ @@ -341,7 +341,7 @@ void hq_core_dec( floatToFixed_arrL( t_audio_q, t_audio_q_fx, Q_audio, L_FRAME48k_EXT ); floatToFixed_arr( hHQ_core->old_out, hHQ_core->old_out_fx, hHQ_core->Q_old_wtda, L_FRAME48k ); floatToFixed_arr( hHQ_core->old_outLB, hHQ_core->old_out_LB_fx, hHQ_core->Q_old_wtda_LB, L_FRAME32k ); - floatToFixed_arr( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, Q_old_syn_Overl, L_FRAME32k / 2 ); + //floatToFixed_arr( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, Q_old_syn_Overl, L_FRAME32k / 2 ); //floatToFixed_arr( st->old_Aq_12_8, st->old_Aq_12_8_fx, Q_old_Aq_12_8, M + 1 ); /* Initializations for TCX MDCT framework, to be used for switching frame */ @@ -377,7 +377,7 @@ void hq_core_dec( /* LB synthesis */ - IMDCT( t_audio_q_fx, E_audio, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio_16_fx, tcx_cfg->tcx_aldo_window_1, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, + IMDCT_fx( t_audio_q_fx, E_audio, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio_16_fx, tcx_cfg->tcx_aldo_window_1, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, 0, st->bfi, hHQ_core->old_out_LB_fx, &hHQ_core->Q_old_wtda_LB, st, 0, acelp_zir_fx ); Scale_sig( wtda_audio_16_fx + L_frame, overlap, Q1 ); @@ -386,7 +386,7 @@ void hq_core_dec( /* FB synthesis */ - IMDCT( t_audio_q_fx, E_audio, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio_16_fx, tcx_cfg->tcx_aldo_window_1_FB, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, + IMDCT_fx( t_audio_q_fx, E_audio, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio_16_fx, tcx_cfg->tcx_aldo_window_1_FB, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, 0, st->bfi, hHQ_core->old_out_fx, &hHQ_core->Q_old_wtda, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir_fx ); Scale_sig( wtda_audio_16_fx + L_frameTCX, overlapFB, Q1 ); @@ -399,7 +399,7 @@ void hq_core_dec( } // Fixed to Float fixedToFloat_arrL( t_audio_q_fx, t_audio_q, Q_audio, L_FRAME48k_EXT ); - fixedToFloat_arr( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, Q_old_syn_Overl, L_FRAME32k / 2 ); + //fixedToFloat_arr( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, Q_old_syn_Overl, L_FRAME32k / 2 ); fixedToFloat_arr( hHQ_core->old_out_LB_fx, hHQ_core->old_outLB, hHQ_core->Q_old_wtda_LB, L_FRAME32k ); fixedToFloat_arr( hHQ_core->old_out_fx, hHQ_core->old_out, hHQ_core->Q_old_wtda, L_FRAME48k ); fixedToFloat_arr( output_fx, output, 0, L_frame_glob ); @@ -441,14 +441,14 @@ void hq_core_dec( /* LB synthesis */ - IMDCT_flt( t_audio_q, hTcxDec->syn_Overl_float, hTcxDec->syn_Overl_TDAC_float, wtda_audio, tcx_cfg->tcx_aldo_window_1_trunc_flt, tcx_cfg->tcx_aldo_window_2_flt, tcx_cfg->tcx_mdct_window_half_flt, tcx_cfg->tcx_mdct_window_minimum_flt, tcx_cfg->tcx_mdct_window_trans_flt, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, + IMDCT( t_audio_q, hTcxDec->syn_Overl_float, hTcxDec->syn_Overl_TDAC_float, wtda_audio, tcx_cfg->tcx_aldo_window_1_trunc_flt, tcx_cfg->tcx_aldo_window_2_flt, tcx_cfg->tcx_mdct_window_half_flt, tcx_cfg->tcx_mdct_window_minimum_flt, tcx_cfg->tcx_mdct_window_trans_flt, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, MDCT_IV, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, 0, st->bfi, hHQ_core->old_outLB, 0, st, 0, acelp_zir ); mvr2r( wtda_audio + ( overlap >> 1 ) - tcx_offset, output, L_frame_glob ); /* FB synthesis */ - IMDCT_flt( t_audio_q, hTcxDec->syn_OverlFB_float, hTcxDec->syn_Overl_TDACFB_float, wtda_audio, tcx_cfg->tcx_aldo_window_1_FB_trunc_flt, tcx_cfg->tcx_aldo_window_2_FB_flt, tcx_cfg->tcx_mdct_window_halfFB_flt, tcx_cfg->tcx_mdct_window_minimumFB_flt, tcx_cfg->tcx_mdct_window_transFB_flt, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, + IMDCT( t_audio_q, hTcxDec->syn_OverlFB_float, hTcxDec->syn_Overl_TDACFB_float, wtda_audio, tcx_cfg->tcx_aldo_window_1_FB_trunc_flt, tcx_cfg->tcx_aldo_window_2_FB_flt, tcx_cfg->tcx_mdct_window_halfFB_flt, tcx_cfg->tcx_mdct_window_minimumFB_flt, tcx_cfg->tcx_mdct_window_transFB_flt, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, MDCT_IV, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, 0, st->bfi, hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); mvr2r( wtda_audio + ( overlapFB >> 1 ) - tcx_offsetFB, synth, L_frameTCX_glob ); @@ -649,7 +649,7 @@ void hq_core_dec( * * Initialize HQ core state structure *-------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED void HQ_core_dec_init_flt( HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ ) @@ -666,11 +666,11 @@ void HQ_core_dec_init_flt( hHQ_core->oldHqVoicing = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hHQ_core->prev_noise_level, 0.0f, 2 ); #endif hHQ_core->prev_R = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE ); #endif set_s( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM ); @@ -685,21 +685,21 @@ void HQ_core_dec_init_flt( //hHQ_core->energy_lt = 300.0f; hHQ_core->HqVoicing = 0; +#ifndef IVAS_FLOAT_FIXED set_f( hHQ_core->fer_samples, 0, L_FRAME48k ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) set_f( hHQ_core->prev_env, 0, SFM_N_WB ); set_f( hHQ_core->prev_normq, 0, SFM_N_WB ); #endif hHQ_core->prev_hqswb_clas = HQ_NORMAL; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hHQ_core->last_ni_gain, 0, BANDS_MAX ); set_f( hHQ_core->last_env, 0, BANDS_MAX ); #endif hHQ_core->last_max_pos_pulse = 0; hHQ_core->prev_frm_hfe2 = 0; hHQ_core->prev_stab_hfe2 = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hHQ_core->prev_ni_ratio = 0.5f; set_f( hHQ_core->prev_En_sb, 0.0f, NB_SWB_SUBBANDS ); #endif @@ -709,7 +709,7 @@ void HQ_core_dec_init_flt( * HQ FEC *----------------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hHQ_core->X_sav, 0.0f, PH_ECU_SPEC_SIZE ); #endif hHQ_core->num_p = 0; @@ -717,20 +717,20 @@ void HQ_core_dec_init_flt( hHQ_core->ni_seed_forfec = 0; hHQ_core->last_fec = 0; hHQ_core->ph_ecu_HqVoicing = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hHQ_core->oldgapsynth, 0.0f, L_FRAME48k ); hHQ_core->env_stab = 0.75f; #endif hHQ_core->mem_norm_hqfec[0] = 31; set_s( hHQ_core->mem_norm_hqfec + 1, 39, SFM_N_ENV_STAB - 1 ); hHQ_core->mem_env_delta_hqfec = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hHQ_core->env_stab_plc = 0.0f; set_f( hHQ_core->env_stab_state_p, 1.0f / NUM_ENV_STAB_PLC_STATES, NUM_ENV_STAB_PLC_STATES ); #endif hHQ_core->envstabplc_hocnt = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hHQ_core->mag_chg_1st, 1.0f, LGW_MAX ); set_f( hHQ_core->Xavg, 0.0f, LGW_MAX ); hHQ_core->beta_mute = BETA_MUTE_FAC_INI_FLT; @@ -745,8 +745,82 @@ void HQ_core_dec_init_flt( return; } +#else +void HQ_core_dec_init_flt( + HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ +) +{ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) + set_f(hHQ_core->old_out, 0, L_FRAME48k); + set_f(hHQ_core->old_outLB, 0, L_FRAME32k); + set_s(hHQ_core->old_is_transient, 0, 3); + + hHQ_core->oldHqVoicing = 0; + + set_f(hHQ_core->prev_noise_level, 0.0f, 2); + hHQ_core->prev_R = 0; + set_f(hHQ_core->prev_coeff_out, 0, L_HQ_WB_BWE); + set_s(hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM); + + /* HQ GENERIC */ + hHQ_core->hq_generic_seed = RANDOM_INITSEED; + + hHQ_core->mem_norm[0] = 31; + set_s(hHQ_core->mem_norm + 1, 39, SFM_N_ENV_STAB - 1); + hHQ_core->mem_env_delta = 0; + hHQ_core->no_att_hangover = 0; + hHQ_core->energy_lt = 300.0f; + + hHQ_core->HqVoicing = 0; + set_f(hHQ_core->fer_samples, 0, L_FRAME48k); + set_f(hHQ_core->prev_env, 0, SFM_N_WB); + set_f(hHQ_core->prev_normq, 0, SFM_N_WB); + hHQ_core->prev_hqswb_clas = HQ_NORMAL; + + set_f(hHQ_core->last_ni_gain, 0, BANDS_MAX); + set_f(hHQ_core->last_env, 0, BANDS_MAX); + hHQ_core->last_max_pos_pulse = 0; + hHQ_core->prev_frm_hfe2 = 0; + hHQ_core->prev_stab_hfe2 = 0; + hHQ_core->prev_ni_ratio = 0.5f; + set_f(hHQ_core->prev_En_sb, 0.0f, NB_SWB_SUBBANDS); + + + /*----------------------------------------------------------------------------------* + * HQ FEC + *----------------------------------------------------------------------------------*/ + + set_f(hHQ_core->X_sav, 0.0f, PH_ECU_SPEC_SIZE); + hHQ_core->num_p = 0; + hHQ_core->ph_ecu_active = 0; + hHQ_core->ni_seed_forfec = 0; + hHQ_core->last_fec = 0; + hHQ_core->ph_ecu_HqVoicing = 0; + set_f(hHQ_core->oldgapsynth, 0.0f, L_FRAME48k); + hHQ_core->env_stab = 0.75f; + hHQ_core->mem_norm_hqfec[0] = 31; + set_s(hHQ_core->mem_norm_hqfec + 1, 39, SFM_N_ENV_STAB - 1); + hHQ_core->mem_env_delta_hqfec = 0; + hHQ_core->env_stab_plc = 0.0f; + set_f(hHQ_core->env_stab_state_p, 1.0f / NUM_ENV_STAB_PLC_STATES, NUM_ENV_STAB_PLC_STATES); + hHQ_core->envstabplc_hocnt = 0; + + set_f(hHQ_core->mag_chg_1st, 1.0f, LGW_MAX); + set_f(hHQ_core->Xavg, 0.0f, LGW_MAX); + hHQ_core->beta_mute = BETA_MUTE_FAC_INI_FLT; + + hHQ_core->time_offs = 0; + hHQ_core->ber_occured_in_pvq = 0; + + hHQ_core->last_hq_core_type = -1; + + reset_preecho_dec(hHQ_core); + + return; +} +#endif + +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * HQ_nbfec_init_flt() * diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 2c3fe933291a08fd699961d329bc0cdd04a2b414..d033fdef08cb32da075f2a45dce31d71c29e6f9d 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -11,7 +11,7 @@ #include "prot.h" #include "ivas_prot_fx.h" #endif - +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------- * hq_core_dec() * @@ -358,13 +358,13 @@ void hq_core_dec_fx( index = tcx_cfg->tcx_last_overlap_mode; /* LB synthesis */ - IMDCT(t_audio_q, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, + IMDCT_fx(t_audio_q, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, MDCT_IV, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max(L_frameTCX, L_spec) >> 1, L_frame_glob, 0, st->bfi, hHQ_core->old_outLB, 0, st, 0, acelp_zir); mvr2r(wtda_audio + (overlap >> 1) - tcx_offset, output, L_frame_glob); /* FB synthesis */ - IMDCT(t_audio_q, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, + IMDCT_fx(t_audio_q, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, MDCT_IV, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max(L_frameTCX, L_spec) >> 1, L_frameTCX_glob, 0, st->bfi, hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir); mvr2r(wtda_audio + (overlapFB >> 1) - tcx_offsetFB, synth, L_frameTCX_glob); @@ -585,7 +585,7 @@ void hq_core_dec_fx( return; } -#ifdef IVAS_FLOAT_FIXED + void ivas_hq_core_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure fx */ Word16 synth[], /* o : output synthesis */ @@ -961,7 +961,7 @@ void ivas_hq_core_dec_fx( /* LB synthesis */ E_audio = 31 - Q_audio; move16(); - IMDCT( t_audio_q, E_audio, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio_16, tcx_cfg->tcx_aldo_window_1, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, + IMDCT_fx( t_audio_q, E_audio, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio_16, tcx_cfg->tcx_aldo_window_1, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, 0, st_fx->bfi, hHQ_core->old_out_LB_fx, &hHQ_core->Q_old_wtda_LB, st_fx, 0, acelp_zir ); // values till L_frame same @@ -971,7 +971,7 @@ void ivas_hq_core_dec_fx( /* FB synthesis */ - IMDCT( t_audio_q, E_audio, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio_16, tcx_cfg->tcx_aldo_window_1_FB, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, + IMDCT_fx( t_audio_q, E_audio, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio_16, tcx_cfg->tcx_aldo_window_1_FB, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, 0, st_fx->bfi, hHQ_core->old_out_fx, &hHQ_core->Q_old_wtda, st_fx, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); Scale_sig( wtda_audio_16 + L_frameTCX, overlapFB, Q1 ); @@ -1195,7 +1195,7 @@ void ivas_hq_core_dec_fx( } return; } -#endif + /*-------------------------------------------------------------------* * hq_core_dec_init() @@ -1203,7 +1203,7 @@ void ivas_hq_core_dec_fx( * Initialize HQ core state structure *-------------------------------------------------------------------*/ -void HQ_core_dec_init( +void HQ_core_dec_init_fx( HQ_DEC_HANDLE hHQ_core /* i/o: HQ core data handle */ ) { @@ -1295,12 +1295,12 @@ void HQ_core_dec_init( } /*-------------------------------------------------------------------* - * HQ_nbfec_init() + * HQ_nbfec_init_fx() * * Initialize HQ NB FEC state structure *-------------------------------------------------------------------*/ -void HQ_nbfec_init( +void HQ_nbfec_init_fx( HQ_NBFEC_HANDLE hHQ_nbfec /* i/o: HQ NB FEC data handle */ ) { @@ -1346,3 +1346,5 @@ void HQ_nbfec_init( return; } + +#endif \ No newline at end of file diff --git a/lib_dec/hq_hr_dec.c b/lib_dec/hq_hr_dec.c index 4ecdfb91462b0734a935c23bc332cddacaf9bc8b..a814232b35ce6b9a2421f0db788036eee69c5e39 100644 --- a/lib_dec/hq_hr_dec.c +++ b/lib_dec/hq_hr_dec.c @@ -40,7 +40,7 @@ #include "rom_com.h" #include "prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*--------------------------------------------------------------------------* * hq_pred_hb_bws() * diff --git a/lib_dec/hq_lr_dec.c b/lib_dec/hq_lr_dec.c index 90b5d0f05e5462e98edfd254a87cb9c21fd5eb62..1a2e0266b592fa1e935656ad8e6f5e0cbbc18808 100644 --- a/lib_dec/hq_lr_dec.c +++ b/lib_dec/hq_lr_dec.c @@ -63,7 +63,7 @@ static void spt_shorten_domain_set_dec( Decoder_State *st, const int16_t p2a_fla * * HQ low rate decoding routine *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void hq_lr_dec( Decoder_State *st, /* i/o: decoder state structure */ float yout[], /* o : transform-domain output coefs. */ diff --git a/lib_dec/igf_dec.c b/lib_dec/igf_dec.c index 390d99e1513a7b3f5cf9f287bfcf238403c8e360..c9251d4d68b5e48f6bb881ab2f48d00b7c8d8dea 100644 --- a/lib_dec/igf_dec.c +++ b/lib_dec/igf_dec.c @@ -303,7 +303,7 @@ static void IGF_setLinesToZero_flt( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * IGF_prep_flt() * @@ -1121,7 +1121,7 @@ int16_t IGFDecReadLevel_flt( return IGFAllZero; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * IGFDecApplyMono_flt() * @@ -1355,7 +1355,7 @@ void IGFDecApplyStereo_flt( return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * IGFDecSetMode_flt() * @@ -1440,7 +1440,7 @@ void IGFDecUpdateInfo_flt( hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0]; hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[0]; hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[0]; #endif @@ -1469,7 +1469,7 @@ void IGFDecUpdateInfo_flt( } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * IGFDecReplicateTCX10State_flt() * @@ -1494,7 +1494,7 @@ void IGFDecReplicateTCX10State_flt( } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * IGFDecCopyLPCFlatSpectrum_flt() * @@ -1583,7 +1583,7 @@ void IGFDecRestoreTCX10SubFrameData_flt( hIGFDec->flatteningTrigger = hPrivateData->igf_flatteningTrigger_subframe[subFrameIdx]; hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2]; hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[subFrameIdx * ( IGF_START_MX ) / 2]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2]; hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[subFrameIdx * IGF_START_MX / 2]; #endif @@ -1603,30 +1603,46 @@ void IGFDecRestoreTCX10SubFrameData_flt( * * Initialize IGF decoder parameters *-----------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED void init_igf_dec_flt( IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: IGF decoder handle */ ) { set_c( (int8_t *) ( hIGFDec->infoTCXNoiseBuf ), 0, IGF_START_MX ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hIGFDec->igfData.pSpecFlatBuf, 0, IGF_START_MX ); #endif hIGFDec->igfData.igfInfo.nfSeedBuf[0] = 9733; hIGFDec->igfData.igfInfo.nfSeedBuf[1] = 9733; hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[0]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[0]; #endif hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0]; hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[0]; #endif return; } - - +#else +void init_igf_dec_flt( + IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: IGF decoder handle */ +) +{ + set_c((int8_t *)(hIGFDec->infoTCXNoiseBuf), 0, IGF_START_MX); + set_f(hIGFDec->igfData.pSpecFlatBuf, 0, IGF_START_MX); + hIGFDec->igfData.igfInfo.nfSeedBuf[0] = 9733; + hIGFDec->igfData.igfInfo.nfSeedBuf[1] = 9733; + hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[0]; + hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[0]; + hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0]; + hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0]; + hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[0]; + + return; +} +#endif /*-----------------------------------------------------------------------* * get_igf_startline_flt() * diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index 9a3aaa8e17880c284a4c433be7a7d74eac752b55..8f32c1179ee004d2ffd475ec329268eae1e1894d 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -4050,7 +4050,7 @@ void IGFDecUpdateInfo_ivas_fx( hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf_fx[0]; /* TODO: remove float init */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[0]; hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[0]; #endif @@ -4140,7 +4140,6 @@ void IGFDecCopyLPCFlatSpectrum_fx( { IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData; H_IGF_GRID hGrid; - int16_t i; IF( hInstance ) { @@ -4154,11 +4153,6 @@ void IGFDecCopyLPCFlatSpectrum_fx( Copy32( pSpectrumFlat, hPrivateData->pSpecFlat, hGrid->startLine ); - ///* TODO: remove float dependency */ - //for ( i = hGrid->minSrcSubband - IGF_MID_WHITENING_LEVEL2; i < hGrid->startLine; i++ ) - //{ - // hPrivateData->pSpecFlat_float[i] = me2f( hPrivateData->pSpecFlat[i], hPrivateData->pSpecFlat_exp ); - //} } } @@ -4238,7 +4232,7 @@ void IGFDecRestoreTCX10SubFrameData_fx( hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf_fx[subFrameIdx * IGF_START_MX / 2]; /* TODO: remove float init */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2]; hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[subFrameIdx * IGF_START_MX / 2]; #endif diff --git a/lib_dec/igf_scf_dec_fx.c b/lib_dec/igf_scf_dec_fx.c index 23ac1c9588f3eb857d04b9d4f2b6a6e1c4f80f5f..2a4d4cad2834bc11d48868eb3d86b693791f3473 100644 --- a/lib_dec/igf_scf_dec_fx.c +++ b/lib_dec/igf_scf_dec_fx.c @@ -78,7 +78,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(st, &hPrivateData->acState); + bit = ari_decode_14bits_bit_ext_fx(st, &hPrivateData->acState); if (bit != 0) { x = s_or(x, 1); @@ -101,7 +101,7 @@ static Word16 arith_decode_residual_fx( /* decode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ - val = ari_decode_14bits_s27_ext(st, &hPrivateData->acState, cumulativeFrequencyTable); + val = ari_decode_14bits_s27_ext_fx(st, &hPrivateData->acState, cumulativeFrequencyTable); /* meaning of the values of val: */ /* esc_{0} IGF_MIN_ENC_SEPARATE ... IGF_MAX_ENC_SEPARATE esc_{IGF_SYMBOLS_IN_TABLE - 1} */ @@ -193,7 +193,7 @@ static void decode_sfe_vector_fx( { /* (t == 0) && (f == 0) */ /* decode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ - res = ari_decode_14bits_s27_ext(st, &hPrivateData->acState, (const UWord16*) hPrivateData->cf_se00); + res = ari_decode_14bits_s27_ext_fx(st, &hPrivateData->acState, (const UWord16*) hPrivateData->cf_se00); pred = arith_decode_bits_fx(hPrivateData, st, 2); /* LSBs as 2 bit raw */ x[f] = add(shl(res, 2), pred); @@ -314,7 +314,7 @@ void IGFSCFDecoderDecode( /* insert data */ hPublicData->bitsRead = st->next_bit_pos; move16(); - ari_start_decoding_14bits(st, &hPublicData->acState); /* start AC decoding */ + ari_start_decoding_14bits_fx(st, &hPublicData->acState); /* start AC decoding */ /* check if coder needs a reset and do it if necessary */ IF (indepFlag != 0) diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 4092bc41856f3970af99af2c20c6e298dbf408dd..e2ff37a542950b162cf0f7e1310b65a761aa9e30 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -48,13 +48,13 @@ #include "prot_fx2.h" #include "ivas_prot_fx.h" #endif -#ifndef IVAS_FLOAT_FIXED + /*----------------------------------------------------------------------* * init_decoder() * * Initialization of static variables for the decoder *----------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error init_decoder( Decoder_State *st, /* o : Decoder static variables structure */ const int16_t idchan, /* i : channel ID */ @@ -104,8 +104,6 @@ ivas_error init_decoder( /* LSF initilalizations */ mvr2r( GEWB_Ave, st->mem_AR, M ); - init_lvq_fx(st->offset_scale1_fx, st->offset_scale2_fx, st->offset_scale1_p_fx, st->offset_scale2_p_fx, st->no_scales_fx, st->no_scales_p_fx); - set_f( st->mem_MA, 0, M ); set_f( st->dispMem, 0, 8 ); @@ -134,9 +132,6 @@ ivas_error init_decoder( st->stab_fac = 0.0f; st->stab_fac_smooth = 0.0f; set_f( st->agc_mem2, 0, 2 ); -#ifdef IVAS_FLOAT_FIXED - set16_fx(st->agc_mem_fx, 0, 2); -#endif set_f( st->mem_syn3, 0, M ); st->stab_fac_smooth_lt = 0.0f; st->log_energy_diff_lt = 0.0f; @@ -196,31 +191,6 @@ ivas_error init_decoder( st->old_bfi_cnt = 0; -#ifdef IVAS_FLOAT_FIXED - /* Initializaing Q factors*/ - st->Q_syn = 0; - move16(); - st->Q_syn2 = 0; - move16(); - st->Q_syn_cng = 0; - move16(); - st->prev_Q_syn = 0; - move16(); - st->prev_Q_syn_fr = 0; - move16(); - st->Q_exc = 0; - move16(); - st->Q_exc_cng = 0; - move16(); - st->prev_Q_exc = 0; - move16(); - st->prev_Q_exc_fr = 0; - move16(); - st->Q_stat_noise_ge = GE_SHIFT; - move16(); - st->Q_stat_noise = 0; - move16(); -#endif /*-----------------------------------------------------------------* * parameters for AC mode (GSC) *-----------------------------------------------------------------*/ @@ -272,16 +242,9 @@ ivas_error init_decoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for NB/formant postflter\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - Init_post_filter(st->hPFstat);//fixed - st->psf_lp_noise_fx = 0; - /*to be cleaned up*/ - Init_post_filter_ivas(st->hPFstat); - st->psf_lp_noise = 0.0f; -#else + Init_post_filter_ivas( st->hPFstat ); st->psf_lp_noise = 0.0f; -#endif } else { @@ -344,7 +307,7 @@ ivas_error init_decoder( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); } - td_cng_dec_init_flt( st ); + td_cng_dec_init( st ); } else { @@ -374,9 +337,6 @@ ivas_error init_decoder( } /* HQ core initialization */ -#ifdef IVAS_FLOAT_FIXED - HQ_core_dec_init( st->hHQ_core ); -#endif HQ_core_dec_init_flt( st->hHQ_core ); if ( st->element_mode == EVS_MONO ) @@ -432,9 +392,6 @@ ivas_error init_decoder( } fd_bwe_dec_init_flt( st->hBWE_FD ); -#ifdef IVAS_FLOAT_FIXED - fd_bwe_dec_init(st, st->hBWE_FD); -#endif } else { @@ -488,7 +445,7 @@ ivas_error init_decoder( } /* AMR-WB IO init */ - amr_wb_dec_init_flt( st->hAmrwb_IO ); + amr_wb_dec_init( st->hAmrwb_IO ); /* AMR-WB IO HF synth init */ hf_synth_amr_wb_init( st->hAmrwb_IO ); @@ -588,10 +545,6 @@ ivas_error init_decoder( st->old_Es_pred = 0; set_f( st->old_Aq_12_8 + 1, 0, M ); st->old_Aq_12_8[0] = 1; -#ifdef IVAS_FLOAT_FIXED - set16_fx( st->old_Aq_12_8_fx + 1, 0, M ); - st->old_Aq_12_8_fx[0] = ONE_IN_Q12; -#endif /*-----------------------------------------------------------------* * SC-VBR parameters @@ -652,11 +605,6 @@ ivas_error init_decoder( st->hTcxDec->old_synthFB = st->hTcxDec->synth_history + NS2SA( st->output_Fs, PH_ECU_MEM_NS ); st->hTcxDec->prev_good_synth = st->hTcxDec->old_synthFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ); -#ifdef IVAS_FLOAT_FIXED - set16_fx(st->hTcxDec->FBTCXdelayBuf, 0, 111); - st->hTcxDec->old_synthFB_fx = st->hTcxDec->synth_history_fx + NS2SA( st->output_Fs, PH_ECU_MEM_NS ); - st->hTcxDec->prev_good_synth_fx = st->hTcxDec->old_synthFB_fx + NS2SA(st->output_Fs, PH_ECU_LOOKAHEAD_NS); -#endif } else { @@ -737,7 +685,7 @@ ivas_error init_decoder( } /* Init Core Decoder */ - open_decoder_LPD_flt( st, st->total_brate, st->last_total_brate, st->bwidth, 0, st->element_mode, 1 ); + open_decoder_LPD( st, st->total_brate, st->last_total_brate, st->bwidth, 0, st->element_mode, 1 ); /* PLC mode initialization */ st->m_decodeMode = DEC_NO_FRAM_LOSS; @@ -759,27 +707,19 @@ ivas_error init_decoder( if ( ( st->element_mode == IVAS_CPE_MDCT || idchan == 0 ) && mc_mode != MC_MODE_MCT && mc_mode != MC_MODE_PARAMUPMIX ) { /* Create FD_CNG instance */ - if ( ( error = createFdCngDec_flt( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) { return error; } /* Init FD-CNG */ - initFdCngDec_flt( st ); -#ifdef IVAS_FLOAT_FIXED - st->cldfbSyn->scale = (Word16) ( st->cldfbSyn->scale_flt * ( 1u << norm_s( (Word16) st->cldfbSyn->scale_flt ) ) ); - initFdCngDec( st, st->cldfbSyn->scale ); -#endif // IVAS_FLOAT_FIXED + initFdCngDec( st ); } else { st->hFdCngDec = NULL; } -#ifdef IVAS_FLOAT_FIXED - st->cngTDLevel = 0; - st->cngTDLevel_e = 0; -#endif // IVAS_FLOAT_FIXED st->cngTDLevel_float = 0.f; st->lp_noise_float = -20.0f; st->force_lpd_reset = 0; @@ -807,7 +747,7 @@ void reset_preecho_dec( HQ_DEC_HANDLE hHQ_core /* i/o: HQ decoder handle */ ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hHQ_core->memfilt_lb = 0; hHQ_core->mean_prev_hb = 0; hHQ_core->smoothmem = 1; @@ -838,7 +778,7 @@ void destroy_cldfb_decoder_ivas_fx( deleteCldfb_ivas_fx( &st->cldfbSyn ); /* delete synthesis at output sampling rate */ deleteCldfb_ivas_fx( &st->cldfbSynHB ); - deleteFdCngDec( &st->hFdCngDec ); + deleteFdCngDec_fx( &st->hFdCngDec ); return; } @@ -854,7 +794,7 @@ void destroy_cldfb_decoder_flt( deleteCldfb_ivas( &st->cldfbSyn ); /* delete synthesis at output sampling rate */ deleteCldfb_ivas( &st->cldfbSynHB ); - deleteFdCngDec_flt( &st->hFdCngDec ); + deleteFdCngDec( &st->hFdCngDec ); return; } diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c index 7ad048e8df20b90c343a3adaeb3b0a9374aaf879..c5cf8a7bc5d15b8076ceeb4b1a642415001c75f3 100644 --- a/lib_dec/init_dec_fx.c +++ b/lib_dec/init_dec_fx.c @@ -13,7 +13,7 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif - +#ifdef IVAS_FLOAT_FIXED #define IVAS_FLOAT_FIXED_TO_BE_REMOVED /*----------------------------------------------------------------------* @@ -249,7 +249,7 @@ ivas_error init_decoder_fx( return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for NB/formant postflter\n")); } - Init_post_filter(st_fx->hPFstat); + Init_post_filter_fx(st_fx->hPFstat); st_fx->psf_lp_noise_fx = 0; } ELSE @@ -347,7 +347,7 @@ ivas_error init_decoder_fx( return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n")); } - td_cng_dec_init(st_fx); + td_cng_dec_init_fx(st_fx); } ELSE { @@ -418,7 +418,7 @@ ivas_error init_decoder_fx( } /* HQ core initialization */ - HQ_core_dec_init(st_fx->hHQ_core); + HQ_core_dec_init_fx(st_fx->hHQ_core); IF (EQ_16(st_fx->element_mode, EVS_MONO)) { @@ -427,7 +427,7 @@ ivas_error init_decoder_fx( { return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ NB FEC\n")); } - HQ_nbfec_init(st_fx->hHQ_nbfec); + HQ_nbfec_init_fx(st_fx->hHQ_nbfec); } ELSE { @@ -601,7 +601,7 @@ ivas_error init_decoder_fx( } /* AMR-WB IO init */ - amr_wb_dec_init(st_fx->hAmrwb_IO); + amr_wb_dec_init_fx(st_fx->hAmrwb_IO); /* AMR-WB IO HF synth init */ hf_synth_amr_wb_init_fx(st_fx->hAmrwb_IO); @@ -740,7 +740,7 @@ ivas_error init_decoder_fx( move16(); /* Init Decoder */ - open_decoder_LPD( st_fx, st_fx->total_brate, st_fx->bwidth); + open_decoder_LPD_fx( st_fx, st_fx->total_brate, st_fx->bwidth); st_fx->m_decodeMode = DEC_NO_FRAM_LOSS; move16(); @@ -762,13 +762,13 @@ ivas_error init_decoder_fx( { /* Create FD_CNG instance */ - if ((error = createFdCngDec(&st_fx->hFdCngDec)) != IVAS_ERR_OK ) + if ((error = createFdCngDec_fx(&st_fx->hFdCngDec)) != IVAS_ERR_OK ) { return error; } /* Init FD-CNG */ - initFdCngDec( st_fx, st_fx->cldfbSyn->scale ); + initFdCngDec_fx( st_fx, st_fx->cldfbSyn->scale ); } ELSE { @@ -831,7 +831,7 @@ ivas_error init_decoder_fx( } -#ifdef IVAS_FLOAT_FIXED + ivas_error init_decoder_ivas_fx( Decoder_State *st_fx, /* o: Decoder static variables structure */ const Word16 idchan, /* i : channel ID */ @@ -969,7 +969,7 @@ ivas_error init_decoder_ivas_fx( set16_fx(st_fx->old_exc_fx, 0, L_EXC_MEM_DEC); //++To be removed -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED mvr2r( GEWB_Ave, st_fx->lsf_old, M ); lsf2lsp( st_fx->lsf_old, st_fx->lsp_old, M, INT_FS_12k8 ); #endif//IVAS_FLOAT_FIXED @@ -985,7 +985,7 @@ ivas_error init_decoder_ivas_fx( st_fx->use_acelp_preq = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st_fx->stab_fac = 0.0f; st_fx->mem_deemph = 0.0f; set_f(st_fx->mem_syn1, 0, M); @@ -993,7 +993,7 @@ ivas_error init_decoder_ivas_fx( st_fx->stab_fac_smooth = 0.0f; set_f(st_fx->agc_mem2, 0, 2); set_f(st_fx->mem_syn3, 0, M); -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED //st_fx->stab_fac_smooth_lt = 0.0f; //st_fx->log_energy_diff_lt = 0.0f; @@ -1197,7 +1197,7 @@ ivas_error init_decoder_ivas_fx( return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n")); } #ifdef ISM_DISABLE // To be removed when fixed version is available. -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if ( st_fx->ivas_format != ISM_FORMAT ) { GSC_dec_init_ivas(st_fx->hGSCDec); @@ -1222,7 +1222,7 @@ ivas_error init_decoder_ivas_fx( return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FEC WI\n")); } #ifdef ISM_DISABLE // To be removed when fixed version is available. -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if ( st_fx->ivas_format != ISM_FORMAT ) { set_f(st_fx->hWIDec->old_exc2, 0, L_EXC_MEM); @@ -1249,11 +1249,11 @@ ivas_error init_decoder_ivas_fx( return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for NB/formant postflter\n")); } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED Init_post_filter_ivas(st_fx->hPFstat); st_fx->psf_lp_noise = 0.0f; #endif - Init_post_filter(st_fx->hPFstat); + Init_post_filter_fx(st_fx->hPFstat); st_fx->psf_lp_noise_fx = 0; } ELSE @@ -1335,7 +1335,7 @@ ivas_error init_decoder_ivas_fx( #ifdef IVAS_FLOAT_FIXED td_cng_dec_init_ivas_fx( st_fx ); #else - td_cng_dec_init_flt( st_fx ); + td_cng_dec_init( st_fx ); #endif // IVAS_FLOAT_FIXED } ELSE @@ -1375,7 +1375,7 @@ ivas_error init_decoder_ivas_fx( #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED // To be removed when fixed version is available. HQ_core_dec_init_flt(st_fx->hHQ_core); #endif - HQ_core_dec_init(st_fx->hHQ_core); + HQ_core_dec_init_fx(st_fx->hHQ_core); IF(EQ_16(st_fx->element_mode, EVS_MONO)) { @@ -1384,12 +1384,12 @@ ivas_error init_decoder_ivas_fx( { return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ NB FEC\n")); } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED // To be removed when fixed version is available. HQ_nbfec_init_flt(st_fx->hHQ_nbfec); #endif #endif - HQ_nbfec_init(st_fx->hHQ_nbfec); + HQ_nbfec_init_fx(st_fx->hHQ_nbfec); } ELSE { @@ -1415,9 +1415,6 @@ ivas_error init_decoder_ivas_fx( return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n")); } -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED // To be removed when fixed version is available. - td_bwe_dec_init(st_fx->hBWE_TD, st_fx->extl, st_fx->output_Fs); -#endif td_bwe_dec_init_ivas_fx(st_fx, st_fx->hBWE_TD, st_fx->output_Fs); } ELSE @@ -1429,7 +1426,7 @@ ivas_error init_decoder_ivas_fx( if ( st_fx->ivas_format != ISM_FORMAT ) { st_fx->old_bwe_delay = -1; - set_f(st_fx->hb_prev_synth_buffer, 0, NS2SA(48000, DELAY_BWE_TOTAL_NS)); + //set_f(st_fx->hb_prev_synth_buffer, 0, NS2SA(48000, DELAY_BWE_TOTAL_NS)); } #endif st_fx->old_bwe_delay = -1; /*Q0*/ move16(); @@ -1447,8 +1444,9 @@ ivas_error init_decoder_ivas_fx( } #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED // To be removed when fixed version is available. - //fd_bwe_dec_init_flt(st_fx->hBWE_FD); + // fd_bwe_dec_init_flt(st_fx->hBWE_FD); #endif + fd_bwe_dec_init(st_fx, st_fx->hBWE_FD); } ELSE @@ -1511,7 +1509,7 @@ ivas_error init_decoder_ivas_fx( return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HR BWE\n")); } #ifdef ISM_DISABLE // To be removed when fixed version is available. -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if ( st_fx->ivas_format != ISM_FORMAT ) { hr_bwe_dec_init_flt(st_fx->hBWE_FD_HR); @@ -1540,14 +1538,14 @@ ivas_error init_decoder_ivas_fx( if ( st_fx->ivas_format != ISM_FORMAT ) { /* AMR-WB IO init */ - amr_wb_dec_init_flt(st_fx->hAmrwb_IO); + amr_wb_dec_init(st_fx->hAmrwb_IO); /* AMR-WB IO HF synth init */ hf_synth_amr_wb_init(st_fx->hAmrwb_IO); } #endif /* AMR-WB IO init */ - amr_wb_dec_init(st_fx->hAmrwb_IO); + amr_wb_dec_init_fx(st_fx->hAmrwb_IO); /* AMR-WB IO HF synth init */ hf_synth_amr_wb_init_fx(st_fx->hAmrwb_IO); @@ -1602,7 +1600,7 @@ ivas_error init_decoder_ivas_fx( { return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF\n")); } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED bass_psfilter_init(st_fx->hBPF); #endif bass_psfilter_init_fx(st_fx->hBPF); @@ -1715,7 +1713,7 @@ ivas_error init_decoder_ivas_fx( { return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SC-VBR\n")); } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED if ( st_fx->ivas_format != ISM_FORMAT ) { sc_vbr_dec_init_flt(st_fx->hSC_VBR); @@ -1786,9 +1784,9 @@ ivas_error init_decoder_ivas_fx( return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxDec\n")); } -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED // To be removed when fixed version is available. +#ifndef IVAS_FLOAT_FIXED set_f(st_fx->hTcxDec->FBTCXdelayBuf_float, 0.0f, 111); - + // st_fx->hTcxDec->old_synthFB = st_fx->hTcxDec->synth_history + NS2SA(st_fx->output_Fs, PH_ECU_MEM_NS); st_fx->hTcxDec->prev_good_synth = st_fx->hTcxDec->old_synthFB + NS2SA(st_fx->output_Fs, PH_ECU_LOOKAHEAD_NS); #endif @@ -1890,7 +1888,7 @@ ivas_error init_decoder_ivas_fx( open_decoder_LPD_ivas_fx(st_fx, st_fx->total_brate, st_fx->last_total_brate, st_fx->bwidth, 0, st_fx->element_mode, 1, &Q_syn_Overl_TDAC, &Q_fer_samples, &Q_syn_Overl, &Q_syn_Overl_TDACFB, &Q_syn_OverlFB, &Q_old_out, &Q_old_outLB, &Q_old_Aq_12_8); #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED // To be removed when fixed version is available. - open_decoder_LPD_flt(st_fx, st_fx->total_brate, st_fx->last_total_brate, st_fx->bwidth, 0, st_fx->element_mode, 1); + open_decoder_LPD(st_fx, st_fx->total_brate, st_fx->last_total_brate, st_fx->bwidth, 0, st_fx->element_mode, 1); #endif /* PLC mode initialization */ @@ -1924,16 +1922,16 @@ ivas_error init_decoder_ivas_fx( { /* Create FD_CNG instance */ - IF ((error = createFdCngDec(&st_fx->hFdCngDec)) != IVAS_ERR_OK) + IF ((error = createFdCngDec_fx(&st_fx->hFdCngDec)) != IVAS_ERR_OK) { return error; } /* Init FD-CNG */ #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED // To be removed when fixed version is available. - initFdCngDec_flt(st_fx); + initFdCngDec(st_fx); #endif - ivas_initFdCngDec_fx(st_fx, st_fx->cldfbSyn->scale); + initFdCngDec_ivas_fx(st_fx, st_fx->cldfbSyn->scale); } ELSE { @@ -1993,7 +1991,7 @@ ivas_error init_decoder_ivas_fx( return error; } -#endif + /*----------------------------------------------------------------------* @@ -2023,12 +2021,12 @@ void reset_preecho_dec_fx( } /*----------------------------------------------------------------------* - * destroy_cldfb_decoder() + * destroy_cldfb_decoder_fx() * * Free memory which was allocated in init_decoder() *----------------------------------------------------------------------*/ -void destroy_cldfb_decoder( +void destroy_cldfb_decoder_fx( Decoder_State *st_fx /* o: Decoder static variables structure */ ) { @@ -2044,7 +2042,8 @@ void destroy_cldfb_decoder( /* delete synthesis for output SR */ deleteCldfb(&st_fx->cldfbSyn); - deleteFdCngDec( &st_fx->hFdCngDec ); + deleteFdCngDec_fx( &st_fx->hFdCngDec ); return; } +#endif \ No newline at end of file diff --git a/lib_dec/inov_dec.c b/lib_dec/inov_dec.c index c9fc260cb32648ce3a85e42b8f6811afaf467f2b..482d867d969f585b9727a63b70eb92fc1027870d 100644 --- a/lib_dec/inov_dec.c +++ b/lib_dec/inov_dec.c @@ -97,17 +97,7 @@ void inov_decode( } else { -#ifdef IVAS_FLOAT_FIXED - Word16 code_fx[256] = { 0 }; - dec_acelp_fast_fx( st, nBits, code_fx, L_subfr ); - FOR( Word16 lp = 0; lp < L_subfr; lp++ ) - { - code[lp] = (float) code_fx[lp] / 512; - } - -#else dec_acelp_fast( st, nBits, code, L_subfr ); -#endif } } else if ( ( st->idchan == 1 && st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] <= 7 ) || ( st->idchan == 0 && st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] <= 3 ) ) @@ -118,16 +108,7 @@ void inov_decode( } else { -#ifdef IVAS_FLOAT_FIXED - Word16 code_fx[L_SUBFR] = { 0 }; - dec_acelp_fast_fx( st, st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], code_fx, L_SUBFR ); - FOR( Word16 lp = 0; lp < L_SUBFR; lp++ ) - { - code[lp] = (float) code_fx[lp] / 512; - } -#else dec_acelp_fast( st, st->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], code, L_SUBFR ); -#endif } } else diff --git a/lib_dec/inov_dec_fx.c b/lib_dec/inov_dec_fx.c index 84900512024ec38d60a970aa2a1051f4d02b1ca1..53aab75bc4f9f0ffcd320657189d2e0cf9d9ef8f 100644 --- a/lib_dec/inov_dec_fx.c +++ b/lib_dec/inov_dec_fx.c @@ -8,7 +8,7 @@ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ - +#ifdef IVAS_FLOAT_FIXED /*======================================================================*/ /* FUNCTION : inov_decode_fx() */ /*-----------------------------------------------------------------------*/ @@ -70,8 +70,6 @@ void inov_decode_fx( IF ( !Opt_AMR_WB ) { -#ifdef EVS_FLOAT -#if 1//def IVAS_CODE if (st_fx->acelp_cfg.fcb_mode) { int16_t i; @@ -121,7 +119,7 @@ void inov_decode_fx( indexing_indices[i] = get_next_indice(st_fx, bitcnt); } config = PulseConfTable[st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]]; - D_ACELP_indexing(code, config, NB_TRACK_FCB_4T, indexing_indices, &st_fx->BER_detect); + D_ACELP_indexing_fx(code, config, NB_TRACK_FCB_4T, indexing_indices, &st_fx->BER_detect); } } else @@ -130,8 +128,6 @@ void inov_decode_fx( } } else -#endif -#endif { nBits = st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]; @@ -302,7 +298,7 @@ void inov_decode_ivas_fx( indexing_indices[i] = get_next_indice( st_fx, bitcnt ); } config = PulseConfTable[st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]]; - D_ACELP_indexing( code, config, NB_TRACK_FCB_4T, indexing_indices, &st_fx->BER_detect ); + D_ACELP_indexing_fx( code, config, NB_TRACK_FCB_4T, indexing_indices, &st_fx->BER_detect ); } } ELSE @@ -368,4 +364,5 @@ void inov_decode_ivas_fx( cb_shape_fx( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, code, tilt_code, shr( add( pt_pitch, 26 ), 6 ), 0, L_subfr ); return; } +#endif #endif \ No newline at end of file diff --git a/lib_dec/ivas_agc_dec.c b/lib_dec/ivas_agc_dec.c index 1da6f64cefbfba764a7e908c11f63ad1f2b4e94c..83a2147632fb5d79ff12e48b1103bc960402bad2 100644 --- a/lib_dec/ivas_agc_dec.c +++ b/lib_dec/ivas_agc_dec.c @@ -32,6 +32,7 @@ #include #include "options.h" +#ifndef IVAS_FLOAT_FIXED #include "prot.h" #include "ivas_prot.h" #include @@ -39,7 +40,6 @@ #include "wmc_auto.h" - /*-----------------------------------------------------------------------------------------* * Function ivas_agc_dec_init() * @@ -275,3 +275,4 @@ void ivas_agc_read_bits( return; } +#endif diff --git a/lib_dec/ivas_agc_dec_fx.c b/lib_dec/ivas_agc_dec_fx.c index c328a9d6de1952171aa741b38fd4fb633e242404..eea0759b001dbbff9b21f8fea564d32aeedd6300 100644 --- a/lib_dec/ivas_agc_dec_fx.c +++ b/lib_dec/ivas_agc_dec_fx.c @@ -60,7 +60,9 @@ static void ivas_agc_dec_init_fx( ivas_agc_chan_data_t *ptr = hAgcDec->gain_data; hAgcDec->agc_com.in_delay = delay; + move16(); hAgcDec->agc_com.num_coeff = IVAS_SPAR_MAX_DMX_CHS; + move16(); ivas_agc_calcGainParams_fx( &hAgcDec->agc_com.absEmin, &hAgcDec->agc_com.betaE, &hAgcDec->agc_com.maxAttExp, hAgcDec->agc_com.num_coeff ); ivas_agc_initWindowFunc_fx( hAgcDec->agc_com.winFunc_fx, output_frame - hAgcDec->agc_com.in_delay ); @@ -69,12 +71,16 @@ static void ivas_agc_dec_init_fx( { /* gain_state */ ptrG->lastGain_fx = MAX_16; + move16(); ptrG->gainExpVal = 0; + move16(); ptrG++; /* gain_data */ ptr->absGainExp = hAgcDec->agc_com.absEmin; + move16(); ptr->absGainExpCurr = hAgcDec->agc_com.absEmin; + move16(); ptr++; } @@ -101,8 +107,9 @@ ivas_error ivas_spar_agc_dec_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AGC decoder" ); } - output_frame = (Word16) Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ); + output_frame = extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); delay = NS2SA_fx2( output_Fs, ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) ); + move16(); IF( ( hAgc->agc_com.winFunc_fx = (Word16 *) malloc( sizeof( Word16 ) * ( output_frame - delay ) ) ) == NULL ) { @@ -139,6 +146,7 @@ void ivas_spar_agc_dec_close_fx( { ivas_agc_dec_state_t *hAgc; + test(); IF( hAgcDec == NULL || *hAgcDec == NULL ) { return; @@ -182,16 +190,18 @@ void ivas_agc_dec_process_fx( Word16 gainLast, gain; ivas_agc_dec_state_t *pState = hAgcDec; - offset = sub(output_frame, pState->agc_com.in_delay); + offset = sub( output_frame, pState->agc_com.in_delay ); FOR( i = 0; i < n_channels; i++ ) { pState->gain_state[i].gainExpVal = sub( pState->gain_data[i].absGainExp, pState->gain_data[i].absGainExpCurr ); + test(); IF( GT_16( pState->gain_state[i].gainExpVal, ( pState->agc_com.maxAttExp + 1 ) ) || LT_16( pState->gain_state[i].gainExpVal, -1 ) ) { /* Such conditions indicate packet loss, better reset and do nothing*/ - pState->gain_data[i].absGainExp = pState->agc_com.absEmin; move16(); + pState->gain_data[i].absGainExp = pState->agc_com.absEmin; + move16(); pState->gain_state[i].gainExpVal = 0; move16(); } @@ -231,15 +241,17 @@ 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(); + tmp = negate( pState->gain_state[i].gainExpVal ); + move16(); IF( LT_16( tmp, 0 ) ) { - tmp_2 = MAX_16; move16(); + tmp_2 = MAX_16; + move16(); FOR( j = 0; j < negate( tmp ); j++ ) { tmp_2 = mult( pState->agc_com.winFunc_fx[idx - pState->agc_com.in_delay], tmp_2 ); } - IF ( LT_16( tmp_2, 0 ) ) + IF( LT_16( tmp_2, 0 ) ) { tmp_2 = div_l( ONE_IN_Q30, negate( tmp_2 ) ); // Q14 tmp_2 = negate( tmp_2 ); @@ -251,7 +263,8 @@ void ivas_agc_dec_process_fx( } ELSE { - tmp_2 = MAX_16; move16(); + tmp_2 = MAX_16; + move16(); FOR( j = 0; j < ( tmp ); j++ ) { tmp_2 = mult( pState->agc_com.winFunc_fx[idx - pState->agc_com.in_delay], tmp_2 ); @@ -269,10 +282,12 @@ 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(); + tmp = pState->gain_state[i].gainExpVal; + move16(); IF( LT_16( tmp, 0 ) ) { - tmp_2 = MAX_16; move16(); + tmp_2 = MAX_16; + move16(); FOR( idx = 0; idx < negate( tmp ); idx++ ) { tmp_2 = mult( pState->agc_com.winFunc_fx[offset - 1], tmp_2 ); @@ -281,7 +296,8 @@ void ivas_agc_dec_process_fx( } ELSE { - tmp_2 = MAX_16; move16(); + tmp_2 = MAX_16; + move16(); FOR( idx = 0; idx < ( tmp ); idx++ ) { tmp_2 = mult( pState->agc_com.winFunc_fx[offset - 1], tmp_2 ); @@ -298,7 +314,8 @@ void ivas_agc_dec_process_fx( pcm_out[i][idx] = Mpy_32_16_1( pcm_in[i][idx], gain ); // Q_pcm_out = Q_pcm_in - 3 } } - pState->gain_data[i].absGainExp = pState->gain_data[i].absGainExpCurr; move16(); + pState->gain_data[i].absGainExp = pState->gain_data[i].absGainExpCurr; + move16(); } return; diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index d952c32114cdd0cbbd36c144996eaeea4500ab04..e360e599edd24f6e5505d82eb37d0fb10639fc98 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -46,6 +46,7 @@ #ifdef IVAS_FLOAT_FIXED #include "prot_fx1.h" #include "prot_fx2.h" +#include "ivas_rom_com_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define float_to_fixQ29( n ) float_to_fix( n, Q29 ) @@ -64,11 +65,11 @@ static void ivas_binRenderer_filterModule( float out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals */ float CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals */ float CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals */ - const Word16 numTimeSlots, /* i : number of time slots to process */ + const int16_t numTimeSlots, /* i : number of time slots to process */ BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ ) { - Word16 bandIdx, k, chIdx, tapIdx; + int16_t bandIdx, k, chIdx, tapIdx; float *filterStatesLeftRealPtr, *filterStatesLeftImagPtr; const float *filterTapsLeftRealPtr, *filterTapsLeftImagPtr, *filterTapsRightRealPtr, *filterTapsRightImagPtr; @@ -121,12 +122,12 @@ static void ivas_binRenderer_filterModule( } #else /*------------------------------------------------------------------------- - * ivas_binRenderer_filterModule_fixed() + * ivas_binRenderer_filterModule_fx() * * *-------------------------------------------------------------------------*/ -static void ivas_binRenderer_filterModule_fixed( +static void ivas_binRenderer_filterModule_fx( Word64 out_Conv_CLDFB_real[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : real part of Binaural signals */ Word64 out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals */ Word32 CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals */ @@ -227,7 +228,7 @@ static void ivas_binRenderer_filterModule_fixed( * * Open convolution module handle of fastconv binaural renderer *-------------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED #define NUM_TAPS_F0_6 ( Word16 )( 58 ) // (int16_t) ceil( 0.6f * hBinRenConvModule->numTaps ) #define NUM_TAPS_F0_5 ( Word16 )( 48 ) // (int16_t) ceil( 0.5f * hBinRenConvModule->numTaps ) #define NUM_TAPS_F0_4 ( Word16 )( 39 ) // (int16_t) ceil( 0.4f * hBinRenConvModule->numTaps ) @@ -695,7 +696,262 @@ static ivas_error ivas_binRenderer_convModuleOpen( return IVAS_ERR_OK; } +#else + +static ivas_error ivas_binRenderer_convModuleOpen( + BINAURAL_RENDERER_HANDLE hBinRenderer, + const int16_t renderer_type, + const int16_t isLoudspeaker, + const AUDIO_CONFIG input_config, + const HRTFS_FASTCONV_HANDLE hHrtf +) +{ + int16_t bandIdx, chIdx; + BINRENDERER_CONV_MODULE_HANDLE hBinRenConvModule; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ((hBinRenConvModule = (BINRENDERER_CONV_MODULE_HANDLE)malloc(sizeof(BINRENDERER_CONV_MODULE))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if (!isLoudspeaker) + { + hBinRenderer->nInChannels = audioCfg2channels(input_config); + } + else + { + /* Note: needs to be revisited if multiple LFE support is required */ + hBinRenderer->nInChannels = (audioCfg2channels(input_config) - isLoudspeaker); + } + + if (renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) + { + hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; + + /* Use variable order filtering */ + bandIdx = 0; + for (; bandIdx < 5; bandIdx++) + { + hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; + } + for (; bandIdx < 10; bandIdx++) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t)ceilf(0.6f * hBinRenConvModule->numTaps); + } + for (; bandIdx < 20; bandIdx++) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t)ceilf(0.5f * hBinRenConvModule->numTaps); + } + for (; bandIdx < 30; bandIdx++) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t)ceilf(0.4f * hBinRenConvModule->numTaps); + } + for (; bandIdx < hBinRenderer->conv_band; bandIdx++) + { + hBinRenConvModule->numTapsArray[bandIdx] = (int16_t)ceilf(0.3f * hBinRenConvModule->numTaps); + } + } + else + { + if (hBinRenderer->ivas_format == SBA_FORMAT) + { + hBinRenConvModule->numTaps = BINAURAL_NTAPS_SBA; + } + else + { + hBinRenConvModule->numTaps = BINAURAL_NTAPS; + } + + /* Use fixed order filtering */ + bandIdx = 0; + for (; bandIdx < hBinRenderer->conv_band; bandIdx++) + { + hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; + } + } + + /* allocate memory for filter states */ + if ((hBinRenConvModule->filterTapsLeftReal = (float ***)malloc(hBinRenderer->conv_band * sizeof(float **))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if ((hBinRenConvModule->filterTapsLeftImag = (float ***)malloc(hBinRenderer->conv_band * sizeof(float **))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if ((hBinRenConvModule->filterTapsRightReal = (float ***)malloc(hBinRenderer->conv_band * sizeof(float **))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if ((hBinRenConvModule->filterTapsRightImag = (float ***)malloc(hBinRenderer->conv_band * sizeof(float **))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + for (bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++) + { + if ((hBinRenConvModule->filterTapsLeftReal[bandIdx] = (float **)malloc(hBinRenderer->nInChannels * sizeof(float *))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if ((hBinRenConvModule->filterTapsLeftImag[bandIdx] = (float **)malloc(hBinRenderer->nInChannels * sizeof(float *))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + if ((hBinRenConvModule->filterTapsRightReal[bandIdx] = (float **)malloc(hBinRenderer->nInChannels * sizeof(float *))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if ((hBinRenConvModule->filterTapsRightImag[bandIdx] = (float **)malloc(hBinRenderer->nInChannels * sizeof(float *))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + } + + + if ((hBinRenConvModule->filterStatesLeftReal = (float ***)malloc(hBinRenderer->conv_band * sizeof(float **))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if ((hBinRenConvModule->filterStatesLeftImag = (float ***)malloc(hBinRenderer->conv_band * sizeof(float **))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + for (bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++) + { + if ((hBinRenConvModule->filterStatesLeftReal[bandIdx] = (float **)malloc(hBinRenderer->nInChannels * sizeof(float *))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if ((hBinRenConvModule->filterStatesLeftImag[bandIdx] = (float **)malloc(hBinRenderer->nInChannels * sizeof(float *))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + for (chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++) + { + if ((hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx] = (float *)malloc(hBinRenConvModule->numTapsArray[bandIdx] * sizeof(float))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + + if ((hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx] = (float *)malloc(hBinRenConvModule->numTapsArray[bandIdx] * sizeof(float))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n")); + } + } + } + + /* set memories */ + for (bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++) + { + for (chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++) + { + int16_t tmp = 0; + + if (isLoudspeaker) + { + if (input_config == IVAS_AUDIO_CONFIG_5_1) + { + tmp = channelIndex_CICP6[chIdx]; + } + else if (input_config == IVAS_AUDIO_CONFIG_7_1) + { + tmp = channelIndex_CICP12[chIdx]; + } + else if (input_config == IVAS_AUDIO_CONFIG_5_1_2) + { + tmp = channelIndex_CICP14[chIdx]; + } + else if (input_config == IVAS_AUDIO_CONFIG_5_1_4) + { + tmp = channelIndex_CICP16[chIdx]; + } + else if (input_config == IVAS_AUDIO_CONFIG_7_1_4) + { + tmp = channelIndex_CICP19[chIdx]; + } + } + + if (renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) + { + /* set the memories to zero */ + set_zero(hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx], hBinRenConvModule->numTapsArray[bandIdx]); + set_zero(hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx], hBinRenConvModule->numTapsArray[bandIdx]); + if (isLoudspeaker) + { + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftBRIRReal[bandIdx][tmp]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftBRIRImag[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightBRIRReal[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightBRIRImag[bandIdx][tmp]; + } + } + else + { + /* set the memories to zero */ + set_zero(hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx], hBinRenConvModule->numTaps); + set_zero(hBinRenConvModule->filterStatesLeftImag[bandIdx][chIdx], hBinRenConvModule->numTaps); + if (isLoudspeaker) + { + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal[bandIdx][tmp]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag[bandIdx][tmp]; + } + else + { + if (input_config == IVAS_AUDIO_CONFIG_HOA3) + { + /* HOA3 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; + } + else if (input_config == IVAS_AUDIO_CONFIG_HOA2) + { + /* HOA2 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2[bandIdx][chIdx]; + } + else if (input_config == IVAS_AUDIO_CONFIG_FOA) + { + /* FOA filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA[bandIdx][chIdx]; + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + } + } + } + + + hBinRenderer->hBinRenConvModule = hBinRenConvModule; + + return IVAS_ERR_OK; +} +#endif /*-------------------------------------------------------------------------* * ivas_init_binaural_hrtf() @@ -1330,8 +1586,8 @@ static void ivas_binaural_obtain_DMX_fx( //outRealRightPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f - foa_const ); //outImagRightPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f - foa_const ); - outRealRightPtr_fx[bandIdx] += L_add( outRealRightPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], L_sub( ONE_IN_Q30, foa_const_fx ) ) ); //Q_in - 1 - outImagRightPtr_fx[bandIdx] += L_add( outImagRightPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], L_sub( ONE_IN_Q30, foa_const_fx ) ) ); //Q_in - 1 + outRealRightPtr_fx[bandIdx] = L_add( outRealRightPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], L_sub( ONE_IN_Q30, foa_const_fx ) ) ); //Q_in - 1 + outImagRightPtr_fx[bandIdx] = L_add( outImagRightPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], L_sub( ONE_IN_Q30, foa_const_fx ) ) ); //Q_in - 1 } } } @@ -1346,8 +1602,8 @@ static void ivas_binaural_obtain_DMX_fx( * * Open fastconv binaural renderer handle *-------------------------------------------------------------------------*/ - -ivas_error ivas_binRenderer_open( +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_binRenderer_open_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { @@ -1428,7 +1684,7 @@ ivas_error ivas_binRenderer_open( IF( st_ivas->hoa_dec_mtx == NULL ) { - IF( ( error = ivas_sba_get_hoa_dec_matrix( out_setup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_sba_get_hoa_dec_matrix_fx( out_setup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) { return error; } @@ -1491,11 +1747,7 @@ ivas_error ivas_binRenderer_open( { FOR( k = 0; k < hBinRenderer->nInChannels; k++ ) { -#ifndef IVAS_FLOAT_FIXED - hBinRenderer->hReverb->dmxmtx[chIdx][k] = dmxmtx_table[chIdx][k]; -#else hBinRenderer->hReverb->dmxmtx_fx[chIdx][k] = dmxmtx_table_fx[chIdx][k]; -#endif } } } @@ -1512,17 +1764,13 @@ ivas_error ivas_binRenderer_open( { FOR( k = 0; k < 11; k++ ) { -#ifndef IVAS_FLOAT_FIXED - ivas_dirac_dec_get_response( (int16_t) ls_azimuth_CICP19[k], (int16_t) ls_elevation_CICP19[k], hBinRenderer->hReverb->foa_enc[k], 1 ); -#else - ivas_dirac_dec_get_response_fixed( (int16_t) ls_azimuth_CICP19[k], (int16_t) ls_elevation_CICP19[k], hBinRenderer->hReverb->foa_enc_fx[k], 1 ); + ivas_dirac_dec_get_response_fixed( (Word16) L_shr_r( ls_azimuth_CICP19_fx[k], 22 ), (Word16) L_shr_r( ls_elevation_CICP19_fx[k], 22 ), hBinRenderer->hReverb->foa_enc_fx[k], 1 ); // Q29: hBinRenderer->hReverb->foa_enc_fx[k] -#endif } } ELSE IF( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) { - IF( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + 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 ) { return error; } @@ -1537,7 +1785,189 @@ ivas_error ivas_binRenderer_open( return error; } +#else +ivas_error ivas_binRenderer_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + BINAURAL_RENDERER_HANDLE hBinRenderer; + int16_t convBand, chIdx, k; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hBinRenderer = (BINAURAL_RENDERER_HANDLE) malloc( sizeof( BINAURAL_RENDERER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Renderer\n" ) ); + } + + hBinRenderer->hInputSetup = &st_ivas->hIntSetup; + + /* Define of head rotation has to be done in binRendeder in CLDFB*/ + hBinRenderer->rotInCldfb = 0; + if ( st_ivas->ivas_format == MC_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) + { + hBinRenderer->rotInCldfb = 1; + } + + + /* Declare some common variables needed for renderer */ + /* Which format used for binaural rendering (needed for late reverb) ? MC or SBA */ + if ( st_ivas->hIntSetup.is_loudspeaker_setup ) + { + hBinRenderer->ivas_format = MC_FORMAT; + } + else + { + hBinRenderer->ivas_format = SBA_FORMAT; + } + hBinRenderer->max_band = (int16_t) ( ( BINAURAL_MAXBANDS * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); + convBand = hBinRenderer->max_band; + + hBinRenderer->timeSlots = MAX_PARAM_SPATIAL_SUBFRAMES; /* Corresponds to 5 msec sound to motion latency */ + + if ( convBand > BINAURAL_CONVBANDS ) + { + hBinRenderer->conv_band = BINAURAL_CONVBANDS; + } + else + { + hBinRenderer->conv_band = convBand; + } + + /*LFE rendering switched off by default*/ + hBinRenderer->render_lfe = 0; + + if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->hIntSetup.is_loudspeaker_setup ) + { + hBinRenderer->render_lfe = 1; + } + + /* Load HRTF tables */ + if ( ( error = ivas_binaural_hrtf_open( &st_ivas->hHrtfFastConv, st_ivas->hIntSetup.output_config, st_ivas->renderer_type ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && ( st_ivas->hIntSetup.is_loudspeaker_setup == 0 ) ) + { + IVAS_OUTPUT_SETUP out_setup; + + /* Allocate memories and buffers needed for convolutional module in CICP19 */ + if ( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, 1, IVAS_AUDIO_CONFIG_7_1_4, st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_output_init( &out_setup, IVAS_AUDIO_CONFIG_7_1_4 ); + + if ( st_ivas->hoa_dec_mtx == NULL ) + { + if ( ( error = ivas_sba_get_hoa_dec_matrix( out_setup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + hBinRenderer->hoa_dec_mtx = st_ivas->hoa_dec_mtx; + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_BRIR_latency_s * 1000000000.f ); + } + else + { + /* Allocate memories and buffers needed for convolutional module */ + if ( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, st_ivas->hIntSetup.is_loudspeaker_setup, st_ivas->hIntSetup.output_config, st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + if ( hBinRenderer->ivas_format == MC_FORMAT ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HRIR_latency_s * 1000000000.f ); + } + else + { + if ( hBinRenderer->nInChannels == 16 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); + } + else if ( hBinRenderer->nInChannels == 9 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA2_latency_s * 1000000000.f ); + } + else if ( hBinRenderer->nInChannels == 4 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_FOA_latency_s * 1000000000.f ); + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + } + else + { + /* same value for MC or HOA both use MC BRIR*/ + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_BRIR_latency_s * 1000000000.f ); + } + } + + /* Allocate memories needed for reverb module */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_binaural_reverb_open_fastconv( &( hBinRenderer->hReverb ), hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hIntSetup.output_config, st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* initialize the dmx matrix */ + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + for ( k = 0; k < hBinRenderer->nInChannels; k++ ) + { + hBinRenderer->hReverb->dmxmtx[chIdx][k] = dmxmtx_table[chIdx][k]; + } + } + } + else + { + hBinRenderer->hReverb = NULL; + } + + hBinRenderer->hEFAPdata = NULL; + + if ( hBinRenderer->hReverb != NULL ) + { + if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) + { + for ( k = 0; k < 11; k++ ) + { + ivas_dirac_dec_get_response( (int16_t) ls_azimuth_CICP19[k], (int16_t) ls_elevation_CICP19[k], hBinRenderer->hReverb->foa_enc[k], 1 ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Copy handles to bin renderer handle*/ + hBinRenderer->hEFAPdata = st_ivas->hEFAPdata; + } + } + + /* Copy the handles to main handle */ + st_ivas->hBinRenderer = hBinRenderer; + return error; +} +#endif /*------------------------------------------------------------------------- * ivas_binRenderer_convModuleClose() @@ -1724,7 +2154,11 @@ void ivas_binRenderer_close( IF( ( *hBinRenderer )->hReverb != NULL ) { +#ifdef IVAS_FLOAT_FIXED + ivas_binaural_reverb_close_fx( &( ( *hBinRenderer )->hReverb ) ); +#else ivas_binaural_reverb_close( &( ( *hBinRenderer )->hReverb ) ); +#endif } free( *hBinRenderer ); @@ -1868,7 +2302,7 @@ void ivas_binaural_add_LFE( } #else -void ivas_binaural_add_LFE_fix( +void ivas_binaural_add_LFE_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word16 output_frame, /* i : length of input frame */ Word32 *input_fx[], /* i : transport channels */ @@ -2063,7 +2497,7 @@ void ivas_binRenderer( set64_fx( Cldfb_ImagBuffer_Binaural_fx[i][j], 0, hBinRenderer->conv_band ); } } - ivas_binRenderer_filterModule_fixed( Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, exp_real_final ); + ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, exp_real_final ); #endif /* Obtain the binaural dmx and compute the reverb */ @@ -2178,3 +2612,131 @@ void ivas_binRenderer( pop_wmops(); return; } + +#ifdef IVAS_FLOAT_FIXED +void ivas_binRenderer_fx( + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ + const int16_t numTimeSlots, /* i : number of time slots to render */ + Word32 Cldfb_RealBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + Word32 Cldfb_ImagBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ + Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ + Word16 *Q_in /* i : LS signals exp */ +) +{ + Word16 chIdx, i, j, k; + //to be checked: feasibility with 32 bit buffers + Word64 Cldfb_RealBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word64 Cldfb_ImagBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + push_wmops("fastconv_binaural_rendering"); + + /* Compute Convolution */ + /* memory reset for the binaural output */ + FOR(chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++) + { + FOR(k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++) + { + set32_fx(Cldfb_RealBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX); + set32_fx(Cldfb_ImagBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX); + set64_fx(Cldfb_RealBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX); + set64_fx(Cldfb_ImagBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX); + } + } + + /* Head rotation in HOA3 or CICPx */ + IF(hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] && hBinRenderer->rotInCldfb) + { + IF(hBinRenderer->hInputSetup->is_loudspeaker_setup == 0) + { + /* Rotation in SHD (HOA3) */ + IF(hCombinedOrientationData->shd_rot_max_order == -1) + { + rotateFrame_shd_cldfb(RealBuffer_fx, ImagBuffer_fx, hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3); + *Q_in = sub(*Q_in, 1); //( Q_in + 14 - 15 ) + } + ELSE IF(hCombinedOrientationData->shd_rot_max_order > 0) + { + rotateFrame_shd_cldfb(RealBuffer_fx, ImagBuffer_fx, hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hCombinedOrientationData->shd_rot_max_order); + *Q_in = sub(*Q_in, 1); //( Q_in + 14 - 15 ) + } + } + ELSE + { + /* Rotation in SD (CICPx) */ + rotateFrame_sd_cldfb_fixed(hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], RealBuffer_fx, ImagBuffer_fx, + hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band); + } + } + + /* HOA decoding to CICP19 if needed*/ + IF(hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16) + { + ivas_sba2mc_cldfb_fixed(*(hBinRenderer->hInputSetup), RealBuffer_fx, ImagBuffer_fx, + hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx); + } + ivas_binRenderer_filterModule_fx(Cldfb_RealBuffer_Binaural_64fx, Cldfb_ImagBuffer_Binaural_64fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, *Q_in); + + FOR(i = 0; i < BINAURAL_CHANNELS; i++) + { + FOR(j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++) + { + FOR(k = 0; k < CLDFB_NO_CHANNELS_MAX; k++) + { + Cldfb_RealBuffer_Binaural_fx[i][j][k] = W_extract_l( W_shr( Cldfb_RealBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 + Cldfb_ImagBuffer_Binaural_fx[i][j][k] = W_extract_l( W_shr( Cldfb_ImagBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 + } + } + } + /* Obtain the binaural dmx and compute the reverb */ + IF(hBinRenderer->hReverb != NULL) + { + Word32 reverbRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 reverbIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 inRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 inIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + + ivas_binaural_obtain_DMX_fx(numTimeSlots, hBinRenderer, RealBuffer_fx, ImagBuffer_fx, inRe_fx, inIm_fx); + // inRe_fx, inIm_fx Q = *Q_in - Q1 + + FOR(chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++) + { + FOR(k = 0; k < numTimeSlots; k++) + { + set32_fx(reverbRe_fx[chIdx][k], 0, hBinRenderer->max_band); + set32_fx(reverbIm_fx[chIdx][k], 0, hBinRenderer->max_band); + } + } + + ivas_binaural_reverb_processSubframe_fx(hBinRenderer->hReverb, BINAURAL_CHANNELS, numTimeSlots, inRe_fx, inIm_fx, reverbRe_fx, reverbIm_fx); + // reverbRe_fx, reverbIm_fx Q = *Q_in - 1 // + + FOR(i = 0; i < BINAURAL_CHANNELS; i++) + { + FOR(j = 0; j < numTimeSlots; j++) + { + + FOR(k = 0; k < hBinRenderer->hReverb->numBins; k++) + { + reverbRe_fx[i][j][k] = L_shl(reverbRe_fx[i][j][k], 1); //*Q_in + reverbIm_fx[i][j][k] = L_shl(reverbIm_fx[i][j][k], 1); //*Q_in + } + } + } + + /* Add the conv module and reverb module output */ + FOR(chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++) + { + FOR(k = 0; k < numTimeSlots; k++) + { + /* Combine first and second parts to generate binaural output signal with room effect */ + v_add_32(Cldfb_RealBuffer_Binaural_fx[chIdx][k], reverbRe_fx[chIdx][k], Cldfb_RealBuffer_Binaural_fx[chIdx][k], hBinRenderer->conv_band); + v_add_32(Cldfb_ImagBuffer_Binaural_fx[chIdx][k], reverbIm_fx[chIdx][k], Cldfb_ImagBuffer_Binaural_fx[chIdx][k], hBinRenderer->conv_band); + } + } + } + pop_wmops(); + return; +} + +#endif \ No newline at end of file diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 525b529c48d35c42fcaafcb03970880c02db3589..25e7078cbfeae675676bb5a3e3f5d2afbaab5457 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -95,7 +95,7 @@ ivas_error ivas_core_dec( MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ const int16_t n_channels, /* i : number of channels to be decoded */ Word32 *output_32_fx[], /* o : output synthesis signal */ - float hb_synth[][L_FRAME48k], /* o : output HB synthesis signal */ + Word32 hb_synth_32_fx[][L_FRAME48k], /* o : output HB synthesis signal */ Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ) @@ -105,47 +105,21 @@ ivas_error ivas_core_dec( STEREO_ICBWE_DEC_HANDLE hStereoICBWE; STEREO_TD_DEC_DATA_HANDLE hStereoTD; int16_t sharpFlag[CPE_CHANNELS]; - float synth[CPE_CHANNELS][L_FRAME48k]; - float tmp_buffer[L_FRAME48k]; - //float output[CPE_CHANNELS][L_FRAME48k]; - //fixedToFloat_arrL(output_32_fx[0],output[0],Q11,L_FRAME48k); - //if(n_channels > 1)fixedToFloat_arrL(output_32_fx[1],output[1],Q11,L_FRAME48k); -#ifdef IVAS_FLOAT_FIXED - //Word32 synth_fx[CPE_CHANNELS][L_FRAME48k]; - set_zero( tmp_buffer, L_FRAME48k ); Word16 tmp_buffer_fx[L_FRAME48k]; - //Word32 tmp_buffer_fx_32[L_FRAME48k]; set_s(tmp_buffer_fx, 0, L_FRAME48k); Word16 tmp16 = 0, tmp16_2, j; Word16 Q_white_exc; Q_white_exc = 0; -#endif + int16_t tmps, incr; - //float bwe_exc_extended[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; -#ifdef IVAS_FLOAT_FIXED Word32 bwe_exc_extended_fx[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; -#endif - //float voice_factors[CPE_CHANNELS][NB_SUBFR16k]; -#ifdef IVAS_FLOAT_FIXED + Word16 voice_factors_fx[CPE_CHANNELS][NB_SUBFR16k]; -#else - float voice_factors[CPE_CHANNELS][NB_SUBFR16k]; - float tmp; -#endif int16_t core_switching_flag[CPE_CHANNELS]; - //float old_syn_12k8_16k[CPE_CHANNELS][L_FRAME16k]; - //float pitch_buf[CPE_CHANNELS][NB_SUBFR16k]; -#ifdef IVAS_FLOAT_FIXED + Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k]; Word32 old_syn_12k8_16k_fx[CPE_CHANNELS][L_FRAME16k]; - //for ( i = 0; i < CPE_CHANNELS; i++ ) - //{ - // for ( int j = 0; j < NB_SUBFR16k; j++ ) - // { - // pitch_buf[i][j] = 0.f; - // } - //} -#endif + int16_t unbits[CPE_CHANNELS]; int16_t sid_bw[CPE_CHANNELS]; FRAME_MODE frameMode[CPE_CHANNELS]; @@ -153,20 +127,20 @@ ivas_error ivas_core_dec( int32_t element_brate, output_Fs; int32_t last_element_brate; int16_t use_cldfb_for_dft; - float *p_output_mem; + Word32 *p_output_mem_fx; int16_t flag_sec_CNA; int16_t read_sid_info; int16_t last_element_mode; int16_t nchan_out; - float *save_hb_synth; + Word32 *save_hb_synth_32_fx; ivas_error error; Word32 L_tmp; Word16 Q_synth; - //Word32 *output_32p_fx[CPE_CHANNELS]; Word16 output_16_fx[CPE_CHANNELS][L_FRAME48k]; - //Word32 output_32_fx[CPE_CHANNELS][L_FRAME48k]; - //output_32p_fx[0] = output_32_fx[0]; - //output_32p_fx[1] = output_32_fx[1]; + Word16 hb_synth_16_fx[CPE_CHANNELS][L_FRAME48k]; + + Word16 synth_16_fx[CPE_CHANNELS][L_FRAME48k]; + Word32 synth_32_fx[CPE_CHANNELS][L_FRAME48k]; FOR( i = 0; i < CPE_CHANNELS; i++ ) { @@ -174,14 +148,10 @@ ivas_error ivas_core_dec( set16_fx( output_16_fx[i], 0, L_FRAME48k ); } -#ifdef IVAS_FLOAT_FIXED - Word16 hb_synth_fx[6][L_FRAME48k]; /*not sure about number of channels so kept it as 6 will change it later*/ - //Word16 output_16fx[CPE_CHANNELS][L_FRAME48k]; - Word16 synth_16fx[CPE_CHANNELS][L_FRAME48k]; Word32 pitch_buf_32fx[CPE_CHANNELS][NB_SUBFR16k]; Word16 tdm_lsfQ_PCh_fx[M], tdm_lspQ_PCh_fx[M]; Word32 conceal_eof_gain32; -#endif + #ifdef BASOP_NOGLOB Flag Overflow; #endif @@ -193,46 +163,6 @@ ivas_error ivas_core_dec( * General initialization *-----------------------------------------------------------------*/ -//#ifndef TO_BE_REMOVED_CONVERSION -// Word16 k; -// -// if ( hSCE != NULL ) -// { -// sts = hSCE->hCoreCoder; -// } -// else -// { -// sts = hCPE->hCoreCoder; -// } -// -// //core_coding_part will go in this loop, once the things are done -// for ( k = 0; k < n_channels; k++ ) -// { -// if ( sts[k]->hTcxDec != NULL ) -// { -// floatToFixed_arr( sts[k]->hHQ_core->old_out, sts[k]->hHQ_core->old_out_fx, 0, L_FRAME48k ); -// floatToFixed_arr( sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_out_LB_fx, 0, L_FRAME32k ); -// floatToFixed_arrL( sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_outLB_fx, 11, L_FRAME32k ); -// //sts[k]->hTcxDec->conceal_eof_gain32 = floatToFixed( sts[k]->hTcxDec->conceal_eof_gain_float, 15 ); -// } -// } -// -// if ( hCPE != NULL && hCPE->last_element_mode == IVAS_CPE_MDCT && hCPE->element_mode == IVAS_CPE_DFT ) -// { -// floatToFixed_arrL( hCPE->input_mem_LB[0], hCPE->input_mem_LB_fx[0], 11, STEREO_DFT32MS_OVL_16k ); -// } -// -// IF( sts[0]->element_mode == IVAS_CPE_MDCT && sts[0]->total_brate == SID_2k40 ) -// { -// FOR( Word16 ch = 0; ch < CPE_CHANNELS; ++ch ) -// { -// f2me_buf( sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, &sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, sts[ch]->hFdCngDec->hFdCngCom->stopBand - sts[ch]->hFdCngDec->hFdCngCom->startBand ); -// floatToFixed_arr( sts[ch]->hFdCngDec->hFdCngCom->A_cng_flt, sts[ch]->hFdCngDec->hFdCngCom->A_cng, Q14, M + 1 ); -// } -// } -// -//#endif - use_cldfb_for_dft = 0; tdm_LRTD_flag = -1; read_sid_info = 1; /* read SID by default */ @@ -245,7 +175,7 @@ ivas_error ivas_core_dec( last_element_brate = hSCE->last_element_brate; /* note: this parameter is unused */ last_element_mode = IVAS_SCE; hStereoTD = NULL; - p_output_mem = NULL; + p_output_mem_fx = NULL; nchan_out = 1; IF( st_ivas != NULL && st_ivas->ivas_format == ISM_FORMAT ) { @@ -263,7 +193,8 @@ ivas_error ivas_core_dec( last_element_mode = hCPE->last_element_mode; hStereoICBWE = hCPE->hStereoICBWE; hStereoTD = hCPE->hStereoTD; - p_output_mem = hCPE->output_mem[1]; + p_output_mem_fx = hCPE->output_mem_fx[1]; + nchan_out = hCPE->nchan_out; IF( hCPE->hStereoTD != NULL ) @@ -278,7 +209,6 @@ ivas_error ivas_core_dec( } output_Fs = sts[0]->output_Fs; - // output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); output_frame = extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); FOR( n = 0; n < n_channels; n++ ) @@ -343,8 +273,8 @@ ivas_error ivas_core_dec( } set16_fx( voice_factors_fx[n], 0, NB_SUBFR16k ); - set16_fx( hb_synth_fx[n], 0, L_FRAME48k ); - + set32_fx( hb_synth_32_fx[n], 0, L_FRAME48k ); + set16_fx(hb_synth_16_fx[n], 0, L_FRAME48k); /*------------------------------------------------------------------* * Decision matrix (selection of technologies) *-----------------------------------------------------------------*/ @@ -398,11 +328,11 @@ ivas_error ivas_core_dec( IF( sba_dirac_stereo_flag && hSCE && sts[0]->total_brate <= SID_2k40 && sts[0]->cng_type == FD_CNG ) { - save_hb_synth = hSCE->save_hb_synth; + save_hb_synth_32_fx = hSCE->save_hb_synth_fx; } ELSE { - save_hb_synth = NULL; + save_hb_synth_32_fx = NULL; } /*------------------------------------------------------------------* @@ -431,13 +361,6 @@ ivas_error ivas_core_dec( } #ifndef TO_BE_REMOVED_CONVERSION - if ( hCPE != NULL && hCPE->last_element_mode == IVAS_CPE_MDCT && hCPE->element_mode == IVAS_CPE_DFT ) - { - fixedToFloat_arrL( hCPE->input_mem_LB_fx[0], hCPE->input_mem_LB[0], 11, STEREO_DFT32MS_OVL_16k ); - //fixedToFloat_arrL( hCPE->old_outLB_mdct_fx, hCPE->old_outLB_mdct, 11, STEREO_MDCT2DFT_FADE_LEN_48k ); - } - // n_channels loop - // sts is initialized here for (Word16 k = 0; k < n_channels; k++ ) { if ( sts[k]->hTcxDec != NULL ) @@ -445,15 +368,12 @@ ivas_error ivas_core_dec( fixedToFloat_arr( sts[k]->hHQ_core->old_out_fx, sts[k]->hHQ_core->old_out, 0, L_FRAME48k ); fixedToFloat_arr( sts[k]->hHQ_core->old_out_LB_fx, sts[k]->hHQ_core->old_outLB, 0, L_FRAME32k ); } - //fixedToFloat_arr( voice_factors_fx[k], voice_factors[k], 15, NB_SUBFR16k ); - fixedToFloat_arr( hb_synth_fx[k], hb_synth[k], 0, L_FRAME48k ); // 0 is assumed as original values are set to 0 } IF( sts[0]->element_mode == IVAS_CPE_MDCT && sts[0]->total_brate == SID_2k40 ) { FOR( Word16 ch = 0; ch < CPE_CHANNELS; ++ch ) { me2f_buf( sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, sts[ch]->hFdCngDec->hFdCngCom->stopBand - sts[ch]->hFdCngDec->hFdCngCom->startBand ); - fixedToFloat_arr( sts[ch]->hFdCngDec->hFdCngCom->A_cng, sts[ch]->hFdCngDec->hFdCngCom->A_cng_flt, Q14, M + 1 ); } } @@ -506,41 +426,8 @@ ivas_error ivas_core_dec( *---------------------------------------------------------------------*/ #if 1 /*Float to fix conversions*/ - Word16 Q_hb_prev_synth_buffer, - /*Q_FBTCXdelayBuf = 15,*/ /*Q_prev_synth_buffer, */Q_syn_Overl = 15, Q_fer_samples = 15, Q_old_syn_Overl = 15, /*Q_olapBufferAna = 15,*/ Q_olapBufferSynth = 15, - Q_olapBufferSynth2 = 15, Q_old_synthFB = 15; /*Initializing with max values to avoid warnings*/ - - Q_hb_prev_synth_buffer = Q_factor_arr( st->hb_prev_synth_buffer, NS2SA( 48000, DELAY_BWE_TOTAL_NS ) ); - //Q_prev_synth_buffer = Q_factor_arr( st->prev_synth_buffer, 96 ); - floatToFixed_arr( st->hb_prev_synth_buffer, st->hb_prev_synth_buffer_fx, Q_hb_prev_synth_buffer, NS2SA( 48000, DELAY_BWE_TOTAL_NS ) ); - - IF( st->hHQ_core ) - { - Q_fer_samples = Q_factor_arr( st->hHQ_core->fer_samples, 960 ); - } - IF( st->hTcxDec ) - { - //Q_FBTCXdelayBuf = Q_factor_arr( st->hTcxDec->FBTCXdelayBuf_float, 111 ); - //Q_prev_synth_buffer = s_min( Q_prev_synth_buffer, Q_FBTCXdelayBuf ); - //Q_prev_synth_buffer = s_min( Q_prev_synth_buffer, 11 ); - Q_syn_Overl = Q_factor_arr( st->hTcxDec->syn_Overl_float, 320 ); - Q_old_syn_Overl = Q_factor_arr( st->hTcxDec->old_syn_Overl_float, L_FRAME32k / 2 ) - 1; - } - Q_syn_Overl = s_min( Q_fer_samples, Q_syn_Overl ) - 1; - IF( st->hHQ_core ) - { + Word16 Q_olapBufferSynth = 15, Q_olapBufferSynth2 = 15; /*Initializing with max values to avoid warnings*/ - } - IF( st->hTcxDec ) - { - //floatToFixed_arr16( st->hTcxDec->FBTCXdelayBuf_float, st->hTcxDec->FBTCXdelayBuf, Q_prev_synth_buffer, 111 ); - //floatToFixed_arrL( st->hTcxDec->FBTCXdelayBuf_float, st->hTcxDec->FBTCXdelayBuf_32, OUTPUT_Q, 111 ); - floatToFixed_arr( st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, Q_syn_Overl, 320 ); - floatToFixed_arr16( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, Q_old_syn_Overl, L_FRAME32k / 2 ); - } - //floatToFixed_arr16( st->prev_synth_buffer, st->prev_synth_buffer_fx, Q_prev_synth_buffer, 96 ); - //floatToFixed_arr16( st->prev_synth_buffer, st->prev_synth_buffer_fx, 0, 96 ); - //st->q_prev_synth_buffer_fx = 0; IF( st->cldfbAna ) { floatToFixed_arr32( st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_fx, Q10, st->cldfbAna->cldfb_state_length ); @@ -550,40 +437,17 @@ ivas_error ivas_core_dec( floatToFixed_arr32( st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_fx, Q11, st->cldfbSyn->cldfb_state_length ); } - IF( st->hFdCngDec ) - { - Q_olapBufferSynth2 = Q_factor_arrL( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 640 ) - 1; - floatToFixed_arr32( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, Q_olapBufferSynth2, 640 ); - } IF( st->cldfbBPF ) floatToFixed_arr32( st->cldfbBPF->cldfb_state, st->cldfbBPF->cldfb_state_fx, Q11, st->cldfbBPF->cldfb_state_length ); - IF( ( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) ) && ( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) ) ) - { - IF( EQ_16( nchan_out, 1 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) && LE_32( st->element_brate, IVAS_24k4 ) && GT_32( last_element_brate, IVAS_24k4 ) ) - { - Q_old_synthFB = Q_factor_arr( st->hTcxDec->old_synthFB, st->hTcxDec->old_synth_lenFB ) - 1; - floatToFixed_arr16( st->hTcxDec->old_synthFB, st->hTcxDec->old_synthFB_fx, Q_old_synthFB, st->hTcxDec->old_synth_lenFB ); - } - } #endif Copy_Scale_sig_16_32( st->previoussynth_fx, st->previoussynth_fx_32, L_FRAME48k, 0 ); - IF ( ( error = core_switching_pre_dec_ivas_fx( st, output_frame, sts[0]->last_core_brate, nchan_out, last_element_mode, last_element_brate, Q_old_synthFB, &Q_olapBufferSynth, &Q_olapBufferSynth2) ) != IVAS_ERR_OK ) + IF ( ( error = core_switching_pre_dec_ivas_fx( st, output_frame, sts[0]->last_core_brate, nchan_out, last_element_mode, last_element_brate, st->Q_syn, &Q_olapBufferSynth, &Q_olapBufferSynth2) ) != IVAS_ERR_OK ) { return error; } #if 1 /*Fixed to float function changes*/ - fixedToFloat_arr( st->hb_prev_synth_buffer_fx, st->hb_prev_synth_buffer, Q_hb_prev_synth_buffer, NS2SA( 48000, DELAY_BWE_TOTAL_NS ) ); - //fixedToFloat_arr( st->prev_synth_buffer_fx, st->prev_synth_buffer, Q_prev_synth_buffer, 96 ); - //st->q_prev_synth_buffer_fx = Q_prev_synth_buffer; - //fixedToFloat_arr( st->prev_synth_buffer_fx, st->prev_synth_buffer, 0, 96 ); - //st->q_prev_synth_buffer_fx = 0; - - IF( st->hTcxDec ) - { - fixedToFloat_arr( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, Q_old_syn_Overl, L_FRAME32k / 2 ); - } IF( st->cldfbAna ) fixedToFloat_arrL( st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, Q10, st->cldfbAna->cldfb_state_length ); @@ -591,14 +455,6 @@ ivas_error ivas_core_dec( fixedToFloat_arrL( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, Q11, st->cldfbSyn->cldfb_state_length ); IF( st->cldfbBPF ) fixedToFloat_arrL( st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, Q11, st->cldfbBPF->cldfb_state_length ); - IF( st->hHQ_core ) - { - - } - IF( st->hFdCngDec ) - { - fixedToFloat_arrL( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, Q_olapBufferSynth2, L_FRAME32k ); - } #endif flag_sec_CNA = -1; @@ -616,23 +472,28 @@ ivas_error ivas_core_dec( IF ( st->core == ACELP_CORE ) { /* ACELP core decoder */ - Word16 /*output_fx[L_FRAME48k],*/ synth_fxl[L_FRAME48k], old_syn_12k8_16k_fx_16[L_FRAME16k]; + Word16 old_syn_12k8_16k_fx_16[L_FRAME16k]; set_s(output_16_fx[n], 0, L_FRAME48k); - Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_fx; - if (save_hb_synth) { - save_hb_synth_fx = save_hb_synth_fx_arr; + Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_16_fx; + IF (save_hb_synth_32_fx) { + save_hb_synth_16_fx = save_hb_synth_fx_arr; } - else { - save_hb_synth_fx = NULL; + ELSE { + save_hb_synth_16_fx = NULL; } - //Word32 bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET]; /* float2fix, to be removed */ - acelp_decoder_state_float2fix(st, hCPE == NULL ? NULL : hCPE->hStereoCng); - //if (hStereoTD) { - // floatToFixed_arr(hStereoTD->tdm_Pri_pitch_buf, hStereoTD->tdm_Pri_pitch_buf_fx, Q6, NB_SUBFR); - //} - IF ( ( error = acelp_core_dec_ivas_fx( st, output_16_fx[n], synth_fxl, save_hb_synth_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng, read_sid_info ) ) != IVAS_ERR_OK ) + acelp_decoder_state_float2fix(st); + + IF( st->hFdCngDec != NULL ) + { + Scale_sig32( st->hFdCngDec->msNoiseEst, NPART_SHAPING, sub( st->hFdCngDec->msNoiseEst_exp, 27 ) ); + st->hFdCngDec->msNoiseEst_exp = 27; + + Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] - 1 ) - 3 ); + } + + IF( ( error = acelp_core_dec_ivas_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng, read_sid_info ) ) != IVAS_ERR_OK ) { return error; } @@ -640,36 +501,33 @@ ivas_error ivas_core_dec( /* fix2float, to be removed */ Copy_Scale_sig_16_32(output_16_fx[n],output_32_fx[n],L_FRAME48k, Q11 - st->Q_syn2); Scale_sig(output_16_fx[n], L_FRAME48k, -st->Q_syn2); - acelp_decoder_state_fix2float(st, hCPE == NULL ? NULL : hCPE->hStereoCng); - //fixedToFloat_arr(output_16_fx[n], output[n], 0, L_FRAME48k); - fixedToFloat_arr(synth_fxl, synth[n], 0, L_FRAME48k); - if (save_hb_synth) { - fixedToFloat_arr(save_hb_synth_fx, save_hb_synth, 0, L_FRAME48k); - } - //fixedToFloat_arrL(bwe_exc_extended_fx, bwe_exc_extended[n], 2*st->Q_exc, L_FRAME32k + NL_BUFF_OFFSET); - //fixedToFloat_arr(voice_factors_fx[n], voice_factors[n], Q15, NB_SUBFR16k); - //fixedToFloat_arr(old_syn_12k8_16k_fx, old_syn_12k8_16k[n], -1, L_FRAME16k); + acelp_decoder_state_fix2float(st); + + if ( save_hb_synth_32_fx ) + { + Copy_Scale_sig_16_32( save_hb_synth_16_fx, save_hb_synth_32_fx, output_frame, Q11 ); + hSCE->q_save_hb_synth_fx = Q11; + } + Copy_Scale_sig_16_32(old_syn_12k8_16k_fx_16, old_syn_12k8_16k_fx[n],L_FRAME16k,Q11 - (-1)); - //fixedToFloat_arr(pitch_buf_fx[n], pitch_buf[n], Q6, NB_SUBFR16k); } Copy_Scale_sig_32_16(st->previoussynth_fx_32, st->previoussynth_fx, L_FRAME48k, 0); IF( ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - Word16 Qsyn_temp = st->Q_syn; //Q gets change in below function. + Word16 Qsyn_temp = st->Q_syn; stereo_tcx_dec_mode_switch_reconf_To_fixed_2( st, 1, last_element_mode, frameMode[n]); /* TCX decoder */ Scale_sig(st->hPFstat->mem_stp, L_SUBFR, -Qsyn_temp); Scale_sig(st->hPFstat->mem_pf_in, L_SUBFR, -Qsyn_temp); + Scale_sig32(st->hFdCngDec->msNoiseEst, NPART_SHAPING, sub(st->hFdCngDec->msNoiseEst_exp, 27)); + st->hFdCngDec->msNoiseEst_exp = 27; - stereo_tcx_core_dec_fx( st, frameMode[n], output_16_fx[n], synth_16fx[n], pitch_buf_32fx[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format ); + stereo_tcx_core_dec_fx( st, frameMode[n], output_16_fx[n], synth_16_fx[n], pitch_buf_32fx[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format ); - //fixedToFloat_arr( output_16_fx[n], output[n], 0, st->L_frame ); Copy_Scale_sig_16_32(output_16_fx[n],output_32_fx[n],L_FRAME48k,Q11); - fixedToFloat_arr( synth_16fx[n], synth[n], 0, st->hTcxDec->L_frameTCX ); - //fixedToFloat_arrL( pitch_buf_32fx[n], pitch_buf[n], Q6, NB_SUBFR16k ); Copy_Scale_sig_32_16(pitch_buf_32fx[n], pitch_buf_fx[n],NB_SUBFR16k,0); @@ -680,41 +538,29 @@ ivas_error ivas_core_dec( if ( st->core == HQ_CORE ) { /* HQ core decoder */ - Word16 synth_fxl[L_FRAME48k]; - //Word16 output_fx[L_FRAME48k]; Q_synth = 0; Word16 Q_output = 0; HQ_DEC_HANDLE hHQ_core; - Word16 tmp_size = NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ); hHQ_core = st->hHQ_core; st->hHQ_core->Q_old_wtda = -1; st->hHQ_core->Q_old_wtda_LB = -1; - floatToFixed_arr( synth[n], synth_fxl, st->Q_syn, L_FRAME48k ); - //floatToFixed_arr( output[n], output_16_fx[n], st->Q_syn, L_FRAME48k ); - #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED floatToFixed_arr( hHQ_core->old_out, hHQ_core->old_out_fx, hHQ_core->Q_old_wtda, L_FRAME48k ); floatToFixed_arr( hHQ_core->old_outLB, hHQ_core->old_out_LB_fx, hHQ_core->Q_old_wtda_LB, L_FRAME32k ); - floatToFixed_arr( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, -1, L_FRAME32k / 2 ); - floatToFixed_arr( st->hTcxDec->prev_good_synth - tmp_size, st->hTcxDec->prev_good_synth_fx - tmp_size, 0, 2 * output_frame + tmp_size ); #endif - ivas_hq_core_dec_fx( st, synth_fxl, &Q_synth, output_frame, NORMAL_HQ_CORE, core_switching_flag[n], output_16_fx[n], &Q_output ); + ivas_hq_core_dec_fx( st, synth_16_fx[n], &Q_synth, output_frame, NORMAL_HQ_CORE, core_switching_flag[n], output_16_fx[n], &Q_output ); Copy_Scale_sig_16_32(output_16_fx[n], output_32_fx[n], L_FRAME48k, Q11 - Q_output); + Scale_sig(synth_16_fx[n], L_FRAME48k, -Q_synth); Scale_sig(output_16_fx[n], L_FRAME48k, -Q_output); - fixedToFloat_arr( synth_fxl, synth[n], Q_synth, L_FRAME48k ); - //fixedToFloat_arr( output_16_fx[n], output[n], 0, L_FRAME48k ); #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED fixedToFloat_arr( hHQ_core->old_out_fx, hHQ_core->old_out, hHQ_core->Q_old_wtda, L_FRAME48k ); fixedToFloat_arr( hHQ_core->old_out_LB_fx, hHQ_core->old_outLB, hHQ_core->Q_old_wtda_LB, L_FRAME32k ); - fixedToFloat_arr( st->hTcxDec->old_syn_Overl, st->hTcxDec->old_syn_Overl_float, -1, L_FRAME32k / 2 ); - fixedToFloat_arr( st->hTcxDec->prev_good_synth_fx - tmp_size, st->hTcxDec->prev_good_synth - tmp_size, 0, 2 * output_frame + tmp_size ); - #endif } @@ -725,22 +571,12 @@ ivas_error ivas_core_dec( IF ( st->element_mode == IVAS_CPE_TD && n == 0 ) { - /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ - - //Word16 tdm_Pri_pitch_buf_fx[NB_SUBFR]; - Copy_Scale_sig_32_16(hCPE->hCoreCoder[0]->old_pitch_buf_fx, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, 2 * NB_SUBFR16k + 2, -10); td_stereo_param_updt_fx( st->lsp_old_fx, st->lsf_old_fx, st->old_pitch_buf_16_fx + st->nb_subfr, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, hStereoTD->tdm_Pri_pitch_buf_fx, st->flag_ACELP16k, hStereoTD->tdm_use_IAWB_Ave_lpc, Q6 ); Copy_Scale_sig_16_32(hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, 10); - - //for ( i = 0; i < NB_SUBFR; i++ ) - //{ - // //hStereoTD->tdm_Pri_pitch_buf[i] = fix16_to_float( tdm_Pri_pitch_buf_fx[i], Q16 ); - // hStereoTD->tdm_Pri_pitch_buf[i] = fix16_to_float( tdm_Pri_pitch_buf_fx[i], Q6 ); - //} } } /* n_channels loop */ @@ -749,10 +585,10 @@ ivas_error ivas_core_dec( * MDCT stereo: joint TCX Core Decoding *---------------------------------------------------------------------*/ - IF ( sts[0]->element_mode == IVAS_CPE_MDCT ) + IF ( EQ_16(sts[0]->element_mode, IVAS_CPE_MDCT )) { /* active-frame decoding */ - IF ( sts[0]->core_brate > SID_2k40 ) + IF ( GT_32(sts[0]->core_brate, SID_2k40 )) { IF ( hMCT ) { @@ -762,11 +598,8 @@ ivas_error ivas_core_dec( } ELSE { -#ifdef IVAS_FLOAT_FIXED #if 1 Word16 e_sig = 17; - //Word32 *output_fx[CPE_CHANNELS]; - Word16 synth_fx_16[CPE_CHANNELS][L_FRAME48k]; Word16 ch; sts = hCPE->hCoreCoder; Word16 will_estimate_noise_on_channel[CPE_CHANNELS]; @@ -775,103 +608,17 @@ ivas_error ivas_core_dec( will_estimate_noise_on_channel[1] = sts[1]->core == TCX_20_CORE && !sts[1]->VAD; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - //output_fx[ch] = malloc( sizeof( Word32 ) * L_FRAME48k ); - // synth_fx[ch] = malloc(sizeof(Word16) * L_FRAME48k); stereo_tcx_dec_mode_switch_reconf_To_fixed( sts[ch], 1, hCPE->last_element_mode ); st = sts[ch]; - IF( st->hTonalMDCTConc ) - { - FOR( i = 0; i < s_min( st->hTonalMDCTConc->nScaleFactors, 64 ); i++ ) - { - st->hTonalMDCTConc->scaleFactorsBackground_fx[i] = floatToFixed( st->hTonalMDCTConc->scaleFactorsBackground_flt[i], 15 ); - } - - if ( sts[0]->bfi && st->tonal_mdct_plc_active && st->hTonalMDCTConc->pTCI ) - { - FOR( i = 0; i < s_min( st->hTonalMDCTConc->pTCI->numIndexes, 30 ); i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phaseDiff_float[i]; - if ( pd >= PI2 ) - pd = fmodf( pd, PI2 ) - PI2; - st->hTonalMDCTConc->pTCI->phaseDiff[i] = (Word16) floatToFixed( pd, Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i]; - pd = fmodf( pd, PI2 ); - st->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i] = (Word16) ( pd * ( 1u << Q13 ) ); - } - } - } - IF( st->hTcxDec ) - st->hTcxDec->tcxltp_last_gain_unmodified = (Word16) floatToFixed( st->hTcxDec->tcxltp_last_gain_unmodified_float, 15 ); - - //if ( !sts[0]->bfi && ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] ) ) - //{ - // sts[ch]->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx = floatToFixed( sts[ch]->hFdCngDec->hFdCngCom->likelihood_noisy_speech_flt, 31 ); - //} - IF( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || sts[ch]->bfi ) - { - for ( int p = 0; p < s_min( sts[ch]->hFdCngDec->hFdCngCom->fftlen, 640 ); p++ ) - { - sts[ch]->hFdCngDec->hFdCngCom->fftBuffer[p] = (Word32) ( sts[ch]->hFdCngDec->hFdCngCom->fftBuffer_flt[p] * ( 1u << ( 31 - sts[ch]->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); - } - sts[ch]->hFdCngDec->msNoiseEst_exp = 31 - Q4; - for ( int p = 0; p < NPART_SHAPING; p++ ) - { - sts[ch]->hFdCngDec->msNoiseEst[p] = (Word32) ( sts[ch]->hFdCngDec->msNoiseEst_float[p] * ( 1u << ( 31 - sts[ch]->hFdCngDec->msNoiseEst_exp ) ) ); - } - sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q3; // Q3 - IF( st->hFdCngDec && st->hFdCngDec->hFdCngCom ) - { - FOR( Word16 ind = 0; ind < 340; ind++ ) - { - st->hFdCngDec->hFdCngCom->cngNoiseLevel[ind] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[ind] * ( 1LL << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); - } - //st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = float_to_fix16( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_flt, 15 ); - } - } - - IF( st->hTcxDec ) - floatToFixed_arr( st->hTcxDec->syn_Overl_float, st->hTcxDec->syn_Overl, st->Q_syn, L_FRAME32k / 2 ); - IF( st->hTcxDec ) - floatToFixed_arr( st->hTcxDec->syn_OverlFB_float, st->hTcxDec->syn_OverlFB, st->Q_syn, L_FRAME_MAX / 2 ); st->prev_Q_syn = st->Q_syn; IF( st->hHQ_core ) floatToFixed_arr( st->hHQ_core->old_outLB, st->hHQ_core->old_out_LB_fx, st->Q_syn, L_FRAME32k ); - IF( st->hTcxDec ) - floatToFixed_arr( st->hTcxDec->syn_Overl_TDACFB_float, st->hTcxDec->syn_Overl_TDACFB, -1 - st->Q_syn, L_FRAME_MAX / 2 ); - IF( st->hTcxDec ) - floatToFixed_arr( st->hTcxDec->syn_Overl_TDAC_float, st->hTcxDec->syn_Overl_TDAC, -1 - st->Q_syn, L_FRAME32k / 2 ); - IF( st->hTcxDec ) - floatToFixed_arr( st->hTcxDec->old_syn_Overl_float, st->hTcxDec->old_syn_Overl, -1 - st->Q_syn, L_FRAME32k / 2 ); - - //IF( st->hTcxDec ) - //floatToFixed_arr( st->hTcxDec->old_excFB, st->hTcxDec->old_excFB_fx, st->Q_exc, s_min( 960, st->L_frame ) ); - - if ( !st->tcxonly ) - { - floatToFixed_arr( st->p_bpf_noise_buf_float, st->p_bpf_noise_buf, 0, L_FRAME_16k ); - } - - IF( st->hTcxDec ) - floatToFixed_arr( st->hTcxDec->old_synth_float, st->hTcxDec->old_synth, st->Q_syn, 1280 ); - IF( st->hTcxDec ) - floatToFixed_arr( st->hTcxDec->synth_history, st->hTcxDec->synth_history_fx, st->Q_syn, s_min( 2496, NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ) ); IF( st->hHQ_core ) floatToFixed_arr( st->hHQ_core->old_out, st->hHQ_core->old_out_fx, st->Q_syn, 960 ); - IF( st->hTonalMDCTConc ) - floatToFixed_arr( st->hTonalMDCTConc->lastPcmOut_float, st->hTonalMDCTConc->lastPcmOut, 0, s_min( 960, st->hTonalMDCTConc->nSamples ) ); - IF( st->hTonalMDCTConc ) - floatToFixed_arr( st->hTonalMDCTConc->secondLastPcmOut_float, st->hTonalMDCTConc->secondLastPcmOut, 0, s_min( 960, st->hTonalMDCTConc->nSamples ) / 2 ); - //IF( st->hTcxDec ) - //st->hTcxDec->conceal_eof_gain = (Word16) floatToFixed( st->hTcxDec->conceal_eof_gain_float, Q14 ); - IF( st->hTcxDec ) - f2me_16( st->hTcxDec->CngLevelBackgroundTrace_bfi, &st->hTcxDec->conCngLevelBackgroundTrace, &st->hTcxDec->conCngLevelBackgroundTrace_e ); if ( st->hTcxDec && st->hTcxDec->conLastFrameLevel_e < 0 ) { st->hTcxDec->conLastFrameLevel_e = 0; @@ -884,102 +631,44 @@ ivas_error ivas_core_dec( st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; IF( st->hTcxDec ) st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - IF( st->hFdCngDec && st->hFdCngDec->hFdCngCom ) - floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, 15, 17 ); } - IF( st_ivas->hLsSetUpConversion ) - f2me_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion ) - f2me_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion ) + //f2me_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion ) + //f2me_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); FOR( Word16 chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) { FOR( Word16 chInIdx = 0; chInIdx < s_min( st_ivas->nchan_transport, 16 ); chInIdx++ ) { - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx] ) - st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx][chOutIdx] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx], 30 ); /*Q30*/ + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx] ) + //st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx][chOutIdx] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx], 30 ); /*Q30*/ } } - - IF( sts[0]->bfi && ( hCPE->hStereoMdct->mdct_stereo_mode[0] > SMDCT_DUAL_MONO || hCPE->hStereoMdct->mdct_stereo_mode[1] > SMDCT_DUAL_MONO ) ) - { - floatToFixed_arr( sts[0]->hTonalMDCTConc->lastBlockData.spectralData_float, sts[0]->hTonalMDCTConc->lastBlockData.spectralData, ( 15 - sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp ), L_FRAME_MAX ); - floatToFixed_arr( sts[1]->hTonalMDCTConc->lastBlockData.spectralData_float, sts[1]->hTonalMDCTConc->lastBlockData.spectralData, ( 15 - sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ), L_FRAME_MAX ); - } #endif - stereo_mdct_core_dec_fx( st_ivas, hCPE, output_32_fx, synth_fx_16 ); -#if 1 // Fix to float conversion - IF( sts[0]->bfi && ( hCPE->hStereoMdct->mdct_stereo_mode[0] > SMDCT_DUAL_MONO || hCPE->hStereoMdct->mdct_stereo_mode[1] > SMDCT_DUAL_MONO ) ) - { - fixedToFloat_arr( sts[0]->hTonalMDCTConc->lastBlockData.spectralData, sts[0]->hTonalMDCTConc->lastBlockData.spectralData_float, ( 15 - sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp ), sts[0]->L_frameTCX_past ); - fixedToFloat_arr( sts[1]->hTonalMDCTConc->lastBlockData.spectralData, sts[1]->hTonalMDCTConc->lastBlockData.spectralData_float, ( 15 - sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ), sts[0]->L_frameTCX_past ); - } + stereo_mdct_core_dec_fx( st_ivas, hCPE, output_32_fx, synth_16_fx ); - IF( st_ivas->hLsSetUpConversion ) - me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion ) - me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); +#if 1 // Fix to float conversion + //IF( st_ivas->hLsSetUpConversion ) + //me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion ) + //me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); FOR( ch = 0; ch < 2; ch++ ) { stereo_tcx_dec_mode_switch_reconf_To_fixed( sts[ch], 0, hCPE->last_element_mode ); - //me2f_buf( sts[ch]->hIGFDec->virtualSpec, sts[ch]->hIGFDec->virtualSpec_e, sts[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - st = hCPE->hCoreCoder[ch]; - fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->Q_syn, L_FRAME_MAX / 2 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->Q_syn, L_FRAME32k / 2 ); - st->hTcxDec->tcxltp_last_gain_unmodified_float = fix16_to_float( st->hTcxDec->tcxltp_last_gain_unmodified, Q15 ); - //st->hTcxDec->conceal_eof_gain_float = fix16_to_float( st->hTcxDec->conceal_eof_gain, Q14 ); - if ( sts[ch]->last_core != -1 && sts[ch]->nbLostCmpt == 1 ) - { - if ( !( sts[ch]->rf_flag && sts[ch]->use_partial_copy && ( sts[ch]->rf_frame_type == RF_TCXTD1 || sts[ch]->rf_frame_type == RF_TCXTD2 ) ) ) - { - IF( sts[ch]->hTonalMDCTConc != NULL && sts[ch]->last_core == TCX_20_CORE && sts[ch]->second_last_core == TCX_20_CORE && ( ( sts[ch]->old_fpitch <= L_shl( sts[ch]->L_frame, 15 ) ) || ( sts[ch]->hTcxDec->tcxltp_last_gain_unmodified <= 13107 /*0.4f*/ ) ) - /* it is fine to call the detection even if no ltp information - is available, meaning that st->old_fpitch == - st->tcxltp_second_last_pitch == st->L_frame */ - && ( sts[ch]->old_fpitch == sts[ch]->hTcxDec->tcxltp_second_last_pitch ) && !sts[ch]->last_tns_active && !sts[ch]->second_last_tns_active ) - { - - if ( sts[ch]->hTonalMDCTConc->pTCI->numIndexes < MAX_NUMBER_OF_IDX ) - { - FOR( i = 0; i < s_min( 30, sts[ch]->hTonalMDCTConc->pTCI->numIndexes ); i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phaseDiff_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phaseDiff[i], Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i], Q13 ); - } - } - } - } - } - - //if ( !sts[0]->bfi && ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] ) ) - //{ - // sts[ch]->hFdCngDec->hFdCngCom->likelihood_noisy_speech_flt = fixedToFloat( sts[ch]->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx, 31 ); - //} + st = hCPE->hCoreCoder[ch]; IF( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || sts[ch]->bfi ) { if ( !sts[ch]->bfi ) { - for ( int p = 0; p < s_min( 640, sts[ch]->hFdCngDec->hFdCngCom->fftlen ); p++ ) - { - sts[ch]->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) sts[ch]->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - sts[ch]->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); - } for ( int p = 0; p < s_min( 62, sts[ch]->hFdCngDec->npart_shaping ); p++ ) { sts[ch]->hFdCngDec->msNoiseEst_float[p] = ( (float) sts[ch]->hFdCngDec->msNoiseEst[p] / ( 1u << ( 31 - sts[ch]->hFdCngDec->msNoiseEst_exp ) ) ); } - - for ( int p = 0; p < s_min( 320, sts[ch]->hFdCngDec->hFdCngCom->stopFFTbin - sts[ch]->hFdCngDec->hFdCngCom->startBand ); p++ ) - { - sts[ch]->hFdCngDec->bandNoiseShape_float[p] = ( (float) sts[ch]->hFdCngDec->bandNoiseShape[p] / ( 1u << ( 31 - sts[ch]->hFdCngDec->bandNoiseShape_exp ) ) ); - } - for ( int p = 0; p < s_min( 340, sts[ch]->hFdCngDec->hFdCngCom->stopFFTbin - sts[ch]->hFdCngDec->hFdCngCom->startBand ); p++ ) { sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); @@ -993,68 +682,23 @@ ivas_error ivas_core_dec( { sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); } - for ( int p = 0; p < FDNS_NPTS; p++ ) - { - sts[ch]->hTonalMDCTConc->scaleFactorsBackground_flt[p] = (float) sts[ch]->hTonalMDCTConc->scaleFactorsBackground_fx[p] / ONE_IN_Q16; - } - } - if ( sts[ch]->element_mode != IVAS_CPE_MDCT || sts[ch]->core == ACELP_CORE ) - { - int A_cng_q = 15 - norm_s( sts[ch]->hFdCngDec->hFdCngCom->A_cng[0] ); - for ( int p = 0; p < M; p++ ) - { - sts[ch]->hFdCngDec->hFdCngCom->A_cng_flt[p] = ( (float) sts[ch]->hFdCngDec->hFdCngCom->A_cng[p] / ( 1u << A_cng_q ) ); - } } } } - //for ( int p = 0; p < s_min( 960, st->L_frame ); p++ ) - //{ - // st->hTcxDec->old_excFB[p] = (float) ( st->hTcxDec->old_excFB_fx[p] ) / ( 1u << st->Q_exc ); - //} - for ( int p = 0; p < s_min( 320, st->L_frame / 2 ); p++ ) - { - st->hTcxDec->old_syn_Overl_float[p] = (float) st->hTcxDec->old_syn_Overl[p] * 2 * ( 1u << st->Q_syn ); - st->hTcxDec->syn_Overl_TDACFB_float[p] = (float) ( (float) st->hTcxDec->syn_Overl_TDACFB[p] * 2 * pow( 2, st->Q_syn ) ); - st->hTcxDec->syn_Overl_TDAC_float[p] = (float) ( (float) st->hTcxDec->syn_Overl_TDAC[p] * 2 * pow( 2, st->Q_syn ) ); - } for ( int p = 0; p < 640; p++ ) { st->hHQ_core->old_outLB[p] = (float) st->hHQ_core->old_out_LB_fx[p] / ( 1u << st->Q_syn ); } - if ( !st->tcxonly ) - { - fixedToFloat_arr( st->p_bpf_noise_buf, st->p_bpf_noise_buf_float, 0, L_FRAME_16k ); - } - - - fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, st->Q_syn, 1280 ); - fixedToFloat_arr( st->hTcxDec->synth_history_fx, st->hTcxDec->synth_history, st->Q_syn, s_min( 2496, NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ) ); - fixedToFloat_arr( st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synthFB, st->Q_syn, s_min( 2496, st->hTcxDec->old_synth_lenFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ) ); - for ( int p = 0; p < 960; p++ ) { st->hHQ_core->old_out[p] = (float) st->hHQ_core->old_out_fx[p] / ( 1u << st->Q_syn ); } - - IF( st->hTcxDec ) - st->hTcxDec->CngLevelBackgroundTrace_bfi = me2f_16( st->hTcxDec->conCngLevelBackgroundTrace, st->hTcxDec->conCngLevelBackgroundTrace_e ); - - IF( st->hTonalMDCTConc && st->hTonalMDCTConc->lastPcmOut_float ) - fixedToFloat_arr( st->hTonalMDCTConc->lastPcmOut, st->hTonalMDCTConc->lastPcmOut_float, 0, s_min( 960, st->hTonalMDCTConc->nSamples ) ); - IF( sts[0]->bfi == 0 && !st->hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) - fixedToFloat_arr( st->hTonalMDCTConc->secondLastPcmOut, st->hTonalMDCTConc->secondLastPcmOut_float, 0, s_min( 480, st->hTonalMDCTConc->nSamples / 2 ) ); } - fixedToFloat_arr( synth_fx_16[0], synth[0], 15 - e_sig, 960 ); - fixedToFloat_arr( synth_fx_16[1], synth[1], 15 - e_sig, 960 ); - //fixedToFloat_arrL( output_32_fx[0], output[0], Q11, 960 ); - //fixedToFloat_arrL( output_32_fx[1], output[1], Q11, 960 ); -#endif -#else - stereo_mdct_core_dec( st_ivas, hCPE, output, synth ); + Scale_sig(synth_16_fx[0],L_FRAME48k,e_sig - 15); + Scale_sig(synth_16_fx[1],L_FRAME48k,e_sig - 15); #endif } } @@ -1062,104 +706,37 @@ ivas_error ivas_core_dec( ELSE IF( hCPE->nchan_out == 1 ) { #ifdef IVAS_FLOAT_FIXED - /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ - double max_synth = 0.0f; - Word16 Q_syn = 15, synth_fxl[CPE_CHANNELS][L_FRAME48k]; - //double max_output = 0.0f; - //Word16 Q_output = 31; - //Word32 output_fx[CPE_CHANNELS][L_FRAME48k]; sts[0] = hCPE->hCoreCoder[0]; sts[1] = hCPE->hCoreCoder[1]; if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) { - for ( int jj = 0; jj < output_frame; jj++ ) - { - max_synth = max( max_synth, fabs( synth[0][jj] ) ); - } - if ( (Word16) max_synth != 0 ) - { - Q_syn = norm_s( (Word16) max_synth ); - } - - for ( int jj = 0; jj < output_frame; jj++ ) - { - synth_fxl[0][jj] = float_to_fix16( synth[0][jj], Q_syn ); - } - - //for ( int jj = 0; jj < output_frame; jj++ ) - //{ - // max_output = max( max_output, fabs( output[0][jj] ) ); - //} - //if ( (Word32) max_output != 0 ) - //{ - // Q_output = norm_l( (Word32) max_output ); - //} - - //for ( int jj = 0; jj < output_frame; jj++ ) - //{ - // output_32_fx[0][jj] = float_to_fix( output[0][jj], Q11 ); - //} - } - - if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) - { - f2me_buf_16( sts[0]->hTcxLtpDec->tcxltp_mem_in_float, sts[0]->hTcxLtpDec->tcxltp_mem_in, &sts[0]->hTcxLtpDec->exp_tcxltp_mem_in, TCXLTP_MAX_DELAY ); - f2me_buf_16( sts[1]->hTcxLtpDec->tcxltp_mem_in_float, sts[1]->hTcxLtpDec->tcxltp_mem_in, &sts[1]->hTcxLtpDec->exp_tcxltp_mem_in, TCXLTP_MAX_DELAY ); - f2me_buf_16( sts[0]->hTcxLtpDec->tcxltp_mem_out_float, sts[0]->hTcxLtpDec->tcxltp_mem_out, &sts[0]->hTcxLtpDec->exp_tcxltp_mem_out, L_FRAME48k ); - f2me_buf_16( sts[1]->hTcxLtpDec->tcxltp_mem_out_float, sts[1]->hTcxLtpDec->tcxltp_mem_out, &sts[1]->hTcxLtpDec->exp_tcxltp_mem_out, L_FRAME48k ); - f2me_buf_16( sts[0]->hHQ_core->old_out, sts[0]->hHQ_core->old_out_fx, &sts[0]->hHQ_core->exp_old_out, L_FRAME48k ); f2me_buf_16( sts[1]->hHQ_core->old_out, sts[1]->hHQ_core->old_out_fx, &sts[1]->hHQ_core->exp_old_out, L_FRAME48k ); } - updateBuffersForDmxMdctStereo_fx( hCPE, output_frame, output_32_fx[0], output_32_fx[1], synth_fxl ); + updateBuffersForDmxMdctStereo_fx( hCPE, output_frame, output_32_fx[0], output_32_fx[1], synth_16_fx ); if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) { - me2f_buf_16( sts[0]->hTcxLtpDec->tcxltp_mem_in, sts[0]->hTcxLtpDec->exp_tcxltp_mem_in, sts[0]->hTcxLtpDec->tcxltp_mem_in_float, TCXLTP_MAX_DELAY ); - me2f_buf_16( sts[0]->hTcxLtpDec->tcxltp_mem_out, sts[0]->hTcxLtpDec->exp_tcxltp_mem_out, sts[0]->hTcxLtpDec->tcxltp_mem_out_float, L_FRAME48k ); me2f_buf_16( sts[0]->hHQ_core->old_out_fx, sts[0]->hHQ_core->exp_old_out, sts[0]->hHQ_core->old_out, L_FRAME48k ); me2f_buf_16( sts[1]->hHQ_core->old_out_fx, sts[1]->hHQ_core->exp_old_out, sts[1]->hHQ_core->old_out, L_FRAME48k ); } - //for ( i = 1; i < CPE_CHANNELS; i++ ) - //{ - // for ( int jj = 0; jj < L_FRAME48k; jj++ ) - // { - // output[i][jj] = fix_to_float( output_32_fx[i][jj], Q11 ); - // } - //} - - for ( i = 1; i < CPE_CHANNELS; i++ ) - { - for ( int jj = 0; jj < output_frame; jj++ ) - { - synth[i][jj] = fix16_to_float( synth_fxl[i][jj], Q_syn ); - } - } #else updateBuffersForDmxMdctStereo( hCPE, output_frame, output, synth ); #endif } - - if ( sts[0]->bfi == 0 && sts[0]->prev_bfi == 1 ) + test(); + IF ( EQ_16(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 */ - for ( n = 0; n < n_channels; ++n ) + FOR ( n = 0; n < n_channels; ++n ) { - if ( sts[n]->last_core_bfi != ACELP_CORE ) + IF ( NE_16(sts[n]->last_core_bfi, ACELP_CORE) ) { -#ifdef IVAS_FLOAT_FIXED + Scale_sig32(sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub(sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 27)); sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 27; - for ( int p = 0; p < sts[n]->hFdCngDec->hFdCngCom->stopFFTbin - sts[n]->hFdCngDec->hFdCngCom->startBand; p++ ) - { - sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); - } - for ( int p = 0; p < FDNS_NPTS; p++ ) - { - sts[n]->hTonalMDCTConc->scaleFactorsBackground_fx[p] = (Word32) ( sts[n]->hTonalMDCTConc->scaleFactorsBackground_flt[p] * ONE_IN_Q16 ); - } TonalMdctConceal_whiten_noise_shape_ivas_fx( sts[n], L_FRAME16k, ON_FIRST_GOOD_FRAME ); @@ -1167,13 +744,6 @@ ivas_error ivas_core_dec( { sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = (float) sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - sts[n]->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ); } - for ( int p = 0; p < FDNS_NPTS; p++ ) - { - sts[n]->hTonalMDCTConc->scaleFactorsBackground_flt[p] = (float) sts[n]->hTonalMDCTConc->scaleFactorsBackground_fx[p] / ONE_IN_Q16; - } -#else - TonalMdctConceal_whiten_noise_shape_ivas( sts[n], L_FRAME16k, ON_FIRST_GOOD_FRAME ); -#endif // IVAS_FLOAT_FIXED } } } @@ -1185,51 +755,16 @@ ivas_error ivas_core_dec( if ( sts[0]->element_mode == IVAS_CPE_TD && hCPE->hStereoCng != NULL ) { -#ifdef IVAS_FLOAT_FIXED /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ - //Word32 output_fx[CPE_CHANNELS][L_FRAME16k]; - Word16 Q_c_PS_LT = 31, Q_output = 31; - double max_output_fx = 0; - - //for ( i = 0; i < CPE_CHANNELS; i++ ) - //{ - // for ( int jj = 0; jj < L_FRAME16k; jj++ ) - // { - // max_output_fx = max( max_output_fx, fabs( output[i][jj] ) ); - // } - //} + Word16 Q_c_PS_LT = 31, Q_output = 11; - if ( (Word32) max_output_fx != 0 ) - { - Q_output = norm_l( (Word32) max_output_fx ); - } - Q_output = 11; - //for ( i = 0; i < CPE_CHANNELS; i++ ) - //{ - // for ( int jj = 0; jj < L_FRAME16k; jj++ ) - // { - // output_32_fx[i][jj] = float_to_fix( output[i][jj], Q11 ); - // } - //} - - if ( (Word32) hCPE->hStereoCng->c_PS_LT != 0 ) - { - Q_c_PS_LT = norm_l( (Word32) hCPE->hStereoCng->c_PS_LT ); - } - Word32 c_PS_LT_fx = float_to_fix( hCPE->hStereoCng->c_PS_LT, Q_c_PS_LT ); + Word32 c_PS_LT_fx = L_deposit_h( hCPE->hStereoCng->c_PS_LT_fx); + Q_c_PS_LT = Q31; stereo_cng_compute_PScorr_fx( output_32_fx[0], output_32_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); - hCPE->hStereoCng->c_PS_LT = fix_to_float( c_PS_LT_fx, Q_c_PS_LT ); -#ifdef DUMPS_ENABLED - dbgwrite_txt( &( hCPE->hStereoCng->c_PS_LT ), 1, "Fixed_code_c_PS_LT.txt", NULL ); -#endif -#else - stereo_cng_compute_PScorr( output, &hCPE->hStereoCng->c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); -#ifdef DUMPS_ENABLED - dbgwrite_txt( &( hCPE->hStereoCng->c_PS_LT ), 1, "Float_code_c_PS_LT.txt", NULL ); -#endif -#endif + hCPE->hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx ); + } /*---------------------------------------------------------------------* @@ -1245,33 +780,8 @@ ivas_error ivas_core_dec( *---------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED - Word32 hb_synth_fxg[CPE_CHANNELS][L_FRAME48k]; - if (st->last_core == ACELP_CORE && (st->core == TCX_20_CORE || st->core == TCX_10_CORE || st->core == HQ_CORE) && st->hBWE_TD != NULL) - { - FOR(int ch_ind = 0; ch_ind < n_channels; ch_ind++) - { - FOR(int ind = 0; ind < L_FRAME48k; ind++) - { - hb_synth_fxg[ch_ind][ind] = (Word32)(hb_synth[ch_ind][ind] * (1 << 11)); - } - } - if (st->hBWE_TD != NULL) - { - for (int i = 0; i < L_SHB_LAHEAD; i++) - { - for (int ii = 0; ii < L_SHB_LAHEAD; ii++) - { - st->hBWE_TD->syn_overlap_fx_32[ii] = (Word32)(st->hBWE_TD->syn_overlap[ii] * (1 << 11)); - } - } - } - } /*cldfb struct*/ - IF(st->hBWE_TD != NULL) - { - floatToFixed_arr(st->hBWE_TD->old_bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended_fx, st->prev_Q_bwe_exc - 16, NL_BUFF_OFFSET); - } /*------------------fix-to-fix-start---------------------*/ /*core_switching_post_dec*/ Q_synth = 0; @@ -1280,59 +790,33 @@ ivas_error ivas_core_dec( st->hHQ_core->Q_old_postdec = 0; st->hHQ_core->Q_old_wtda = 0; } - st->bws_cnt = st->bws_cnt; - st->coder_type = st->coder_type; - st->prev_coder_type = st->prev_coder_type; - st->prev_bws_cnt = st->prev_bws_cnt; - st->old_ppp_mode = st->old_ppp_mode; /*------------------fix-to-fix-end-----------------------*/ - Word16 *synth_fx16; - Word16 *output_mem_fx; + Word16 output_mem_16_fx[L_FRAME48k]; + Word16 *p_output_mem_16; - synth_fx16 = (Word16 *)malloc(L_FRAME48k * sizeof(Word16)); - //Word32 output_fx32[L_FRAME48k]; - output_mem_fx = (Word16 *)malloc(NS2SA(st->output_Fs, 3125000) * sizeof(Word16)); - - IF(p_output_mem != NULL) + IF(p_output_mem_fx != NULL) { - floatToFixed_arr(p_output_mem, output_mem_fx, 0, NS2SA(st->output_Fs, 3125000)); + p_output_mem_16 = output_mem_16_fx; + Copy_Scale_sig_32_16(p_output_mem_fx, p_output_mem_16, NS2SA_fx2(output_Fs, STEREO_DFT32MS_OVL_NS), negate(Q11)); } ELSE { - set16_fx(output_mem_fx, 0, NS2SA(st->output_Fs, 3125000)); + p_output_mem_16 = NULL; + set16_fx(output_mem_16_fx, 0, NS2SA(st->output_Fs, 3125000)); } - floatToFixed_arr(synth[n], synth_fx16, Q_synth, L_FRAME48k); - //floatToFixed_arrL(output[n], output_32_fx[n], Q11, L_FRAME48k); Scale_sig32(output_32_fx[n], L_FRAME48k, Q4 - Q11); - Word16 s_tmp; - s_tmp = extract_l(L_shr(st->output_Fs, 13)); - Word16 Fs_kHz = shl(add(s_tmp, 1), 3); - - Word16 delta = 1; - move16(); - IF(GE_16(output_frame, L_FRAME16k)) - { - delta = shr(Fs_kHz, 3); - } - IF(st->hHQ_core != NULL) { floatToFixed_arr(st->hHQ_core->old_out, st->hHQ_core->old_out_fx, 0, L_FRAME48k); } - //if (st->hTcxDec != NULL) - //{ - // st->hTcxDec->conceal_eof_gain = (Word16)floatToFixed(st->hTcxDec->conceal_eof_gain_float, 14); - //} - /*size of synth is choosen as delay comp to start with*/ /*-------------------cldfb-start-------------------------*/ - floatToFixed_arrL(st->bpf_noise_buf_float, st->bpf_noise_buf_32, 11, L_FRAME_16k); if (st->cldfbAna != NULL) { floatToFixed_arrL(st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_fx, 10, st->cldfbAna->cldfb_size); @@ -1350,7 +834,6 @@ ivas_error ivas_core_dec( Word16 q_audio, old_syn_fx; old_syn_fx = Q11; q_audio = Q12; - #endif test(); test(); test(); test(); IF ( EQ_16(st->last_core, ACELP_CORE) && (EQ_16(st->core, TCX_20_CORE) || EQ_16(st->core, TCX_10_CORE) || EQ_16(st->core, HQ_CORE) ) && st->hBWE_TD != NULL ) @@ -1358,11 +841,11 @@ ivas_error ivas_core_dec( test(); test(); test(); test(); IF ( (EQ_16(st->bwidth, SWB) || EQ_16(st->bwidth, FB) ) && (EQ_16(st->last_extl, SWB_TBE) || EQ_16(st->last_extl, FB_TBE) ) ) { - GenTransition_fixed( st->hBWE_TD, hb_synth_fxg[n], output_Fs, st->element_mode, st->L_frame, st->rf_flag, st->total_brate ); + GenTransition_fixed( st->hBWE_TD, hb_synth_32_fx[n], output_Fs, st->element_mode, st->L_frame, st->rf_flag, st->total_brate ); } ELSE IF (EQ_16(st->bwidth, WB) && EQ_16(st->last_extl, WB_TBE) ) { - GenTransition_WB_fixed( st->hBWE_TD, hb_synth_fxg[n], output_Fs ); + GenTransition_WB_fixed( st->hBWE_TD, hb_synth_32_fx[n], output_Fs ); move16(); } @@ -1393,10 +876,11 @@ ivas_error ivas_core_dec( test(); test(); test(); IF (sba_dirac_stereo_flag && NE_16(st->element_mode, IVAS_CPE_MDCT) && !(EQ_32(st->core_brate, SID_2k40) && EQ_16(st->cng_type, FD_CNG))) { - Copy_Scale_sig_16_32(synth_fx16, hSCE->save_synth_fx, output_frame, 0); + //Copy_Scale_sig_16_32(synth_16_fx[n], hSCE->save_synth_fx, output_frame, Q11 - Q_synth); + Copy_Scale_sig_16_32(synth_16_fx[n], hSCE->save_synth_fx, output_frame, hSCE->q_save_synth_fx - Q_synth); } - IF ( ( error = core_switching_post_dec_ivas_fx( st, synth_fx16, output_32_fx[n], output_mem_fx, ( st_ivas != NULL ) ? st_ivas->ivas_format : UNDEFINED_FORMAT, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, ( hCPE != NULL ) ? hCPE->last_element_mode : IVAS_SCE, &Q_synth ) ) != IVAS_ERR_OK ) + IF ( ( error = core_switching_post_dec_ivas_fx( st, synth_16_fx[n], output_32_fx[n], p_output_mem_16, ( st_ivas != NULL ) ? st_ivas->ivas_format : UNDEFINED_FORMAT, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, ( hCPE != NULL ) ? hCPE->last_element_mode : IVAS_SCE, &Q_synth ) ) != IVAS_ERR_OK ) { return error; } @@ -1405,7 +889,8 @@ ivas_error ivas_core_dec( test(); test(); test(); IF (sba_dirac_stereo_flag && hSCE && EQ_32(st->core_brate, SID_2k40) && EQ_16(st->cng_type, FD_CNG)) { - Copy_Scale_sig_16_32(synth_fx16, hSCE->save_synth_fx, output_frame, 0); + //Copy_Scale_sig_16_32(synth_16_fx[n], hSCE->save_synth_fx, output_frame, Q11 - Q_synth); + Copy_Scale_sig_16_32(synth_16_fx[n], hSCE->save_synth_fx, output_frame, hSCE->q_save_synth_fx - Q_synth); } /* if we transition from inactive to active coding in MDCT-Stereo DTX and the output format is mono DMX, we need to sync the upsampled buffer between channels here */ @@ -1424,18 +909,6 @@ ivas_error ivas_core_dec( Scale_sig32(output_32_fx[n], L_FRAME48k, Q11 - Q4); #ifdef IVAS_FLOAT_FIXED - if (st->last_core == ACELP_CORE && (st->core == TCX_20_CORE || st->core == TCX_10_CORE || st->core == HQ_CORE) && st->hBWE_TD != NULL) - { - // Delete from here - FOR(int ch_ind = 0; ch_ind < n_channels; ch_ind++) - { - fixedToFloat_arrL(hb_synth_fxg[ch_ind], hb_synth[ch_ind], 11, L_FRAME48k); - } - } - if (sba_dirac_stereo_flag && st->element_mode != IVAS_CPE_MDCT && !(st->core_brate == SID_2k40 && st->cng_type == FD_CNG)) - { - mvr2r(synth[n], hSCE->save_synth, output_frame); - } /*-------------------cldfb-start-------------------------*/ /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ @@ -1454,9 +927,8 @@ ivas_error ivas_core_dec( } /*-------------------cldfb-end---------------------------*/ + Scale_sig(synth_16_fx[n], L_FRAME48k, negate(Q_synth)); - fixedToFloat_arr(synth_fx16, synth[n], Q_synth, L_FRAME48k); - //fixedToFloat_arrL(output_32_fx[n], output[n], Q11, L_FRAME48k); IF(st->hHQ_core != NULL) { fixedToFloat_arr(st->hHQ_core->old_out_fx, st->hHQ_core->old_out, 0, L_FRAME48k); @@ -1476,15 +948,6 @@ ivas_error ivas_core_dec( st->hBWE_FD->prev_L_swb_norm = st->hBWE_FD->prev_L_swb_norm; st->hBWE_FD->prev_flag = st->hBWE_FD->prev_flag; } - - free(synth_fx16); - free(output_mem_fx); - - if (sba_dirac_stereo_flag && hSCE && st->core_brate == SID_2k40 && st->cng_type == FD_CNG) - { - mvr2r(synth[n], hSCE->save_synth, output_frame); - } - #endif /*---------------------------------------------------------------------* * WB TBE decoding @@ -1493,14 +956,7 @@ ivas_error ivas_core_dec( #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - Word16 hb_synth_fx_16[CPE_CHANNELS][L_FRAME48k]; - //Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k]; - //Word16 output_fx_16[CPE_CHANNELS][L_FRAME48k]; - Word16 synth_fx_16[CPE_CHANNELS][L_FRAME48k]; Word16 Q_input, Q_hb_synth_fx, Q_synth_fx; - - Word32 synth_fx32[L_FRAME48k]; - Word32 hb_synth_fx32[L_FRAME48k]; Word16 Q_syn_hb; Q_input = 0; @@ -1514,18 +970,8 @@ ivas_error ivas_core_dec( FD_BWE_DEC_HANDLE hBWE_FD; hBWE_FD = st->hBWE_FD; - //floatToFixed_arrL( old_syn_12k8_16k[n], old_syn_12k8_16k_fx, Q11, L_FRAME16k ); // Can be removed got from last fn - - //floatToFixed_arrL( bwe_exc_extended[n], bwe_exc_extended_fx[n], 2 * st->Q_exc, L_FRAME32k + NL_BUFF_OFFSET ); - Copy_Scale_sig_32_16(output_32_fx[n], output_16_fx[n], L_FRAME48k, -Q11); - floatToFixed_arr( hb_synth[n], hb_synth_fx_16[n], Q_hb_synth_fx, L_FRAME48k ); - //floatToFixed_arr( output[n], output_16_fx[n], Q_input, L_FRAME48k ); - floatToFixed_arr( synth[n], synth_fx_16[n], Q_synth_fx, L_FRAME48k ); - - IF( hBWE_TD != NULL ) - { - floatToFixed_arr( hBWE_TD->old_bwe_exc_extended, hBWE_TD->old_bwe_exc_extended_fx, st->prev_Q_bwe_exc - 16, NL_BUFF_OFFSET ); - } + Copy_Scale_sig_32_16(output_32_fx[n], output_16_fx[n], L_FRAME48k, negate(Q11)); + Copy_Scale_sig_32_16(hb_synth_32_fx[n], hb_synth_16_fx[n], L_FRAME48k, negate(Q11)); #endif test(); test(); @@ -1537,7 +983,7 @@ ivas_error ivas_core_dec( { /* WB TBE decoder */ - ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_fx_16[n], &Q_hb_synth_fx ); + ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_16_fx[n], &Q_hb_synth_fx ); } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && !tdm_LRTD_flag && NE_16( st->extl, -1 ) && EQ_16( st->bws_cnt, 0 ) && EQ_32( st->extl_brate, 0 ) ) { @@ -1546,13 +992,13 @@ ivas_error ivas_core_dec( ELSE IF( EQ_16( st->extl, WB_BWE ) && EQ_16( st->bws_cnt, 0 ) ) { /* WB BWE decoder */ - Q_hb_synth_fx = ivas_wb_bwe_dec_fx( st, output_16_fx[n], synth_fx_16[n], hb_synth_fx_16[n], use_cldfb_for_dft, output_frame, voice_factors_fx[n], pitch_buf_fx[n], &Q_synth_fx ); + Q_hb_synth_fx = ivas_wb_bwe_dec_fx( st, output_16_fx[n], synth_16_fx[n], hb_synth_16_fx[n], use_cldfb_for_dft, output_frame, voice_factors_fx[n], pitch_buf_fx[n], &Q_synth_fx ); } /* Memories Re-Scaling */ - Copy_Scale_sig_16_32( hb_synth_fx_16[n], hb_synth_fx32, L_FRAME48k, Q11 - Q_hb_synth_fx ); + Copy_Scale_sig_16_32( hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, Q11 - Q_hb_synth_fx ); Copy_Scale_sig_16_32( output_16_fx[n], output_32_fx[n], L_FRAME48k, Q11 - Q_input ); - Copy_Scale_sig_16_32( synth_fx_16[n], synth_fx32, L_FRAME48k, Q11 - Q_synth_fx ); + Copy_Scale_sig_16_32( synth_16_fx[n], synth_32_fx[n], L_FRAME48k, Q11 - Q_synth_fx ); IF( hBWE_FD != NULL ) { @@ -1583,9 +1029,9 @@ ivas_error ivas_core_dec( /* SWB TBE decoder */ Q_white_exc = 0; move16(); - ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_fx32, pitch_buf_fx[n], &Q_white_exc ); + ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc ); - Copy_Scale_sig_32_16( st->hBWE_TD->old_tbe_synth_fx_32, st->hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, st->prev_Qx - Q11 ); // Check + Copy_Scale_sig_32_16( st->hBWE_TD->old_tbe_synth_fx_32, st->hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, st->prev_Qx - Q11 ); IF( GT_16(Q_white_exc, 31 )) { @@ -1596,18 +1042,17 @@ ivas_error ivas_core_dec( /* FB TBE decoder */ IF( EQ_16( st->extl, FB_TBE ) ) { - fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_fx32, 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); + fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_32_fx[n], 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); } } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || ( GE_32( output_Fs, 32000 ) && EQ_16( st->core, ACELP_CORE ) && GT_16( st->bwidth, NB ) && GT_16( st->bws_cnt, 0 ) && !st->ppp_mode_dec && !( EQ_16( st->nelp_mode_dec, 1 ) && EQ_16( st->bfi, 1 ) ) ) ) { /* SWB BWE decoder */ - Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_fx32, hb_synth_fx32, use_cldfb_for_dft, output_frame ); + Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); - // Output - Scale_sig32( hb_synth_fx32, output_frame, Q11 - Q_syn_hb ); + Scale_sig32( hb_synth_32_fx[n], output_frame, Q11 - Q_syn_hb ); - Copy_Scale_sig_32_16( st->hBWE_FD->L_old_wtda_swb_fx32, st->hBWE_FD->L_old_wtda_swb_fx, output_frame, hBWE_FD->old_wtda_swb_fx_exp - Q11 ); // Check + Copy_Scale_sig_32_16( st->hBWE_FD->L_old_wtda_swb_fx32, st->hBWE_FD->L_old_wtda_swb_fx, output_frame, hBWE_FD->old_wtda_swb_fx_exp - Q11 ); } /*---------------------------------------------------------------------* @@ -1631,7 +1076,7 @@ ivas_error ivas_core_dec( move16(); FOR( i = 0; i < j; i++ ) { - hb_synth_fx32[i] = Mpy_32_16_1( hb_synth_fx32[i], tmp16_2 ); /* Q11 */ + hb_synth_32_fx[n][i] = Mpy_32_16_1( hb_synth_32_fx[n][i], tmp16_2 ); /* Q11 */ move32(); #ifdef BASOP_NOGLOB tmp16_2 = add_o( tmp16_2, tmp16, &Overflow ); /* Q15 */ @@ -1648,79 +1093,42 @@ ivas_error ivas_core_dec( IF ( ( output_frame >= L_FRAME32k && st->hTdCngDec != NULL ) || ( st->element_mode == IVAS_CPE_DFT && st->bwidth >= SWB && st->hTdCngDec != NULL ) ) { /* SHB CNG decoder */ - Word16 synth_fxl[960], hb_synth_fxl[960]; /* Q-2 */ + Word16 synth_fxl[960]; /* Q-2 */ Word16 q = 2; - //st->prev_Q_bwe_syn2 = 0; - Copy_Scale_sig_32_16(hb_synth_fx32, hb_synth_fxl, L_FRAME48k, -(Q11 + q)); - Copy_Scale_sig_32_16(synth_fx32, synth_fxl, L_FRAME48k, -(Q11 + q)); + Copy_Scale_sig_32_16(hb_synth_32_fx[n], hb_synth_16_fx[n], L_FRAME48k, -(Q11 + q)); + Copy_Scale_sig_32_16(synth_32_fx[n], synth_fxl, L_FRAME48k, -(Q11 + q)); Scale_sig(st->hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, (Q8 - st->prev_Q_bwe_syn)); Scale_sig32(st->hBWE_TD->genSHBsynth_Hilbert_Mem_fx, HILBERT_MEM_SIZE, (st->prev_Q_bwe_syn2 - Q11)); Copy_Scale_sig_32_16(st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 2 * ALLPASSSECTIONS_STEEP, (st->prev_Q_bwe_syn2 - Q11)); - swb_CNG_dec_ivas_fx( st, synth_fxl, hb_synth_fxl, sid_bw[n], -q ); + swb_CNG_dec_ivas_fx( st, synth_fxl, hb_synth_16_fx[n], sid_bw[n], -q ); - Copy_Scale_sig_16_32(hb_synth_fxl, hb_synth_fx32, L_FRAME48k, (Q11 + q)); - Copy_Scale_sig_16_32(synth_fxl, synth_fx32, L_FRAME48k, (Q11 + q)); + Copy_Scale_sig_16_32(hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, (Q11 + q)); + Copy_Scale_sig_16_32(synth_fxl, synth_32_fx[n], L_FRAME48k, (Q11 + q)); Scale_sig(st->hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, -(Q8 - st->prev_Q_bwe_syn)); Scale_sig32(st->hBWE_TD->genSHBsynth_Hilbert_Mem_fx, HILBERT_MEM_SIZE, -(st->prev_Q_bwe_syn2 - Q11)); Copy_Scale_sig_16_32(st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, -(st->prev_Q_bwe_syn2 - Q11)); } -#ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - - fixedToFloat_arrL(hb_synth_fx32, hb_synth[n], Q11, L_FRAME48k); - //fixedToFloat_arrL(output_32_fx[n], output[n], Q11, L_FRAME48k); - fixedToFloat_arrL(synth_fx32, synth[n], Q11, L_FRAME48k); - - IF(hBWE_TD != NULL) - { - fixedToFloat_arr(hBWE_TD->old_bwe_exc_extended_fx, hBWE_TD->old_bwe_exc_extended, st->prev_Q_bwe_exc - 16, NL_BUFF_OFFSET); - fixedToFloat_arr(hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap, st->prev_Q_bwe_syn2, L_SHB_LAHEAD); // Check - } -#endif /*-------------------------------------------------------------------* * Inter-channel BWE decoding *-------------------------------------------------------------------*/ test(); IF ( EQ_16(n, 0) && GE_16(st->element_mode, IVAS_CPE_DFT )) { - Word32 *hb_synth_0 = (Word32 *) malloc( sizeof( Word32 ) * L_FRAME48k ); - Word32 *hb_synth_1 = (Word32 *) malloc( sizeof( Word32 ) * L_FRAME48k ); Word16 q = 11; - floatToFixed_arrL( hb_synth[0], hb_synth_0, q, L_FRAME48k ); - floatToFixed_arrL( hb_synth[1], hb_synth_1, q, L_FRAME48k ); - if ( hCPE->hStereoDft != NULL ) { - floatToFixed_arrL( hCPE->hStereoDft->hb_stefi_sig, hCPE->hStereoDft->hb_stefi_sig_fx, q, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) ); + //floatToFixed_arrL( hCPE->hStereoDft->hb_stefi_sig, hCPE->hStereoDft->hb_stefi_sig_fx, q, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) ); hCPE->hStereoDft->td_gain_fx[0] = 1; } Scale_sig( tmp_buffer_fx, L_FRAME48k, Q11 - Q_white_exc ); - stereo_icBWE_dec_fx( hCPE, hb_synth_0, hb_synth_1, tmp_buffer_fx /*fb_synth_ref*/, voice_factors_fx[0], output_frame, &q ); - + stereo_icBWE_dec_fx( hCPE, hb_synth_32_fx[0], hb_synth_32_fx[1], tmp_buffer_fx /*fb_synth_ref*/, voice_factors_fx[0], output_frame, &q ); - fixedToFloat_arrL( hb_synth_0, hb_synth[0], q, L_FRAME48k ); - fixedToFloat_arrL( hb_synth_1, hb_synth[1], q, L_FRAME48k ); + Scale_sig32(hb_synth_32_fx[0], L_FRAME48k, sub(Q11 , q)); + Scale_sig32(hb_synth_32_fx[1], L_FRAME48k, sub(Q11 , q)); - - if ( hCPE->hStereoDft != NULL ) - { - - fixedToFloat_arrL( hCPE->hStereoDft->hb_stefi_sig_fx, hCPE->hStereoDft->hb_stefi_sig, 16, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) ); - hCPE->hStereoDft->hb_nrg_subr[0] = (float) hCPE->hStereoDft->hb_nrg_subr_fx[0] / ( 1u << hCPE->hStereoDft->Q_nrg_subr ); - hCPE->hStereoDft->hb_nrg_subr[1] = (float) hCPE->hStereoDft->hb_nrg_subr_fx[1] / ( 1u << hCPE->hStereoDft->Q_nrg_subr ); - hCPE->hStereoDft->hb_nrg[0] = (float) hCPE->hStereoDft->hb_nrg_fx[0] / ( 1u << ( hCPE->hStereoDft->Q_nrg_subr + 9 ) ); - - if ( hCPE->hStereoDft->td_gain_fx[0] == 0 ) - { - hCPE->hStereoDft->td_gain[0] = 0; - } - } - - - free( hb_synth_0 ); - free( hb_synth_1 ); } IF( EQ_16( st->element_mode, EVS_MONO ) ) @@ -1733,7 +1141,7 @@ ivas_error ivas_core_dec( { tmps = NS2SA_fx2( output_Fs, DELAY_CLDFB_NS ); - waveform_adj2_fix( st->hTonalMDCTConc->secondLastPcmOut, synth_16fx[n] + tmps, st->plcInfo.data_noise, &st->plcInfo.outx_new_n1_fx, + waveform_adj2_fix( st->hTonalMDCTConc->secondLastPcmOut, synth_16_fx[n] + tmps, st->plcInfo.data_noise, &st->plcInfo.outx_new_n1_fx, &st->plcInfo.nsapp_gain_fx, &st->plcInfo.nsapp_gain_n_fx, &st->plcInfo.recovery_gain, st->plcInfo.step_concealgain_fx, st->plcInfo.Pitch_fx, st->plcInfo.FrameSize, tmps, st->hPlcInfo->nbLostCmpt + 1, st->bfi ); @@ -1780,19 +1188,12 @@ ivas_error ivas_core_dec( move16(); FOR ( i = 0; i < tmps; i++ ) { - hb_synth_fx[n][i] = mult_r(hb_synth_fx[n][i], sin_table256_fx[tmp16]); + hb_synth_32_fx[n][i] = Mpy_32_16_1(hb_synth_32_fx[n][i], sin_table256_fx[tmp16]); move16(); tmp16 = add(tmp16, incr); } set16_fx( st->hb_prev_synth_buffer_fx, 0, tmps ); -#if 1 //To be removed - for (i = 0; i < tmps; i++) - { - hb_synth[n][i] *= sin_table256[i * incr]; - } - set_f(st->hb_prev_synth_buffer, 0.0f, tmps); -#endif } ELSE IF ( LT_16(tmps, st->old_bwe_delay )) { @@ -1808,15 +1209,7 @@ ivas_error ivas_core_dec( tmp16 = add(tmp16, incr); } Copy(tmp_buffer_fx, st->hb_prev_synth_buffer_fx, tmps); -#if 1 //To be removed - for (i = 0; i < tmps; i++) - { - tmp_buffer[i] = st->hb_prev_synth_buffer[i] * sin_table256[255 - i * incr] + - st->hb_prev_synth_buffer[st->old_bwe_delay - 1 - i] * sin_table256[i * incr]; - } - mvr2r(tmp_buffer, st->hb_prev_synth_buffer, tmps); -#endif } ELSE IF ( GT_16(tmps, st->old_bwe_delay )) { @@ -1844,53 +1237,28 @@ ivas_error ivas_core_dec( } Copy( tmp_buffer_fx, st->hb_prev_synth_buffer_fx, tmps ); - -#if 1 //To be removed - for (i = 0; i < st->old_bwe_delay; i++) - { - tmp_buffer[i] = st->hb_prev_synth_buffer[i] * sin_table256[255 - i * incr]; - } - - for (; i < tmps; i++) - { - tmp_buffer[i] = 0.0f; - } - - for (i = 0; i < st->old_bwe_delay; i++) - { - tmp_buffer[tmps - 1 - i] += st->hb_prev_synth_buffer[st->old_bwe_delay - 1 - i] * sin_table256[i * incr]; - } - - mvr2r(tmp_buffer, st->hb_prev_synth_buffer, tmps); -#endif } test(); test(); test(); IF ( ( NE_16(st->element_mode, IVAS_CPE_TD) && !use_cldfb_for_dft ) || ( EQ_16(hCPE->element_mode, IVAS_CPE_TD) && tdm_LRTD_flag ) ) { /* Delay hb_synth */ - Word32 hb_synth_fxl[960], hb_prev_synth_buffer_fx_32[111]; - floatToFixed_arrL(hb_synth[n], hb_synth_fxl, Q11, 960); - floatToFixed_arrL(st->hb_prev_synth_buffer, hb_prev_synth_buffer_fx_32, Q11, 111); + Word32 hb_prev_synth_buffer_fx_32[111]; - delay_signal_fx( hb_synth_fxl, output_frame, hb_prev_synth_buffer_fx_32, tmps ); - - fixedToFloat_arrL(hb_synth_fxl, hb_synth[n], Q11, 960); - fixedToFloat_arrL(hb_prev_synth_buffer_fx_32, st->hb_prev_synth_buffer, Q11, 111); + Copy_Scale_sig_16_32(st->hb_prev_synth_buffer_fx, hb_prev_synth_buffer_fx_32, 111, 11); + delay_signal_fx( hb_synth_32_fx[n], output_frame, hb_prev_synth_buffer_fx_32, tmps ); + Copy_Scale_sig_32_16(hb_prev_synth_buffer_fx_32, st->hb_prev_synth_buffer_fx, 111, -11); } ELSE { - Copy( hb_synth_fx[n] + output_frame - tmps, st->hb_prev_synth_buffer_fx, tmps ); //ToDo: Scale Signl with appropriate Q. -#if 1 // TO BE REMOVED - mvr2r(hb_synth[n] + output_frame - tmps, st->hb_prev_synth_buffer, tmps); -#endif + Copy_Scale_sig_32_16(hb_synth_32_fx[n] + output_frame - tmps, st->hb_prev_synth_buffer_fx, tmps,negate(Q11)); } st->old_bwe_delay = tmps; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) - if ( st->hBWE_TD != NULL ) +#ifndef IVAS_FLOAT_FIXED + IF( st->hBWE_TD != NULL ) { - mvr2r( hb_synth[n], st->hBWE_TD->old_hb_synth, output_frame ); + Copy_Scale_sig_32_16( hb_synth_32_fx[n], st->hBWE_TD->old_hb_synth_fx, output_frame, negate( Q11 ) ); } #endif @@ -1899,10 +1267,7 @@ ivas_error ivas_core_dec( IF ( GE_16(output_frame, L_FRAME32k) && GT_16(st->extl, SWB_CNG) && EQ_16(st->core, ACELP_CORE) && st->hTdCngDec != NULL ) { #ifdef IVAS_FLOAT_FIXED - Word32 hb_synth_fxl[960]; - //Word32 L_tmp; Word16 exp, fra; - floatToFixed_arrL(hb_synth[n], hb_synth_fxl, Q11, 960); #endif SWITCH(output_frame) { @@ -1923,7 +1288,7 @@ ivas_error ivas_core_dec( L_tmp = L_deposit_l(2); /*0.001 in Q11*/ Word16 gb = find_guarded_bits_fx(output_frame); - L_tmp = L_add(L_tmp, sum2_f_32_fx(hb_synth_fxl, output_frame, sub(11, gb))); + L_tmp = L_add(L_tmp, sum2_f_32_fx(hb_synth_32_fx[n], output_frame, sub(11, gb))); L_tmp = Mpy_32_16_1(L_tmp , tmp16); exp = norm_l(L_tmp); fra = Log2_norm_lc(L_shl(L_tmp, exp)); @@ -1947,33 +1312,6 @@ ivas_error ivas_core_dec( * - updates for potential TD->DFT stereo switching *----------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED - // TO DO delete below - //Word32 output_fx[CPE_CHANNELS][L_FRAME48k]; - Word32 synth_fxg[CPE_CHANNELS][L_FRAME48k]; - //Word32 hb_synth_fxg[CPE_CHANNELS][L_FRAME48k]; - - FOR(int ch_ind = 0; ch_ind < n_channels; ch_ind++) - { - FOR(int ind = 0; ind < L_FRAME48k; ind++) - { - //output_32_fx[ch_ind][ind] = (Word32)(output[ch_ind][ind] * (1 << 11)); - synth_fxg[ch_ind][ind] = (Word32)(synth[ch_ind][ind] * (1 << 11)); - hb_synth_fxg[ch_ind][ind] = (Word32)(hb_synth[ch_ind][ind] * (1 << 11)); - } - } - //Word16 q_DFT[2] = { 3, 3 }; - //Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; - - //IF(DFT != NULL) - //{ - // FOR(int ind = 0; ind < CPE_CHANNELS; ind++) - // { - // FOR(int jj = 0; jj < STEREO_DFT_BUF_MAX; jj++) - // { - // DFT_fx[ind][jj] = (Word32)(DFT[ind][jj] * (1 << q_DFT[ind])); - // } - // } - //} if (hCPE != NULL) { @@ -1992,83 +1330,6 @@ ivas_error ivas_core_dec( hCPE->hCoreCoder[ch_ind]->hHQ_core->oldOut_fx[ind] = (Word32)(hCPE->hCoreCoder[ch_ind]->hHQ_core->old_out[ind] * (1 << 11)); } } - if (hCPE->hCoreCoder[ch_ind]->p_bpf_noise_buf_float != NULL) - { - FOR(int ind = 0; ind < L_FRAME16k; ind++) - { - hCPE->hCoreCoder[ch_ind]->p_bpf_noise_buf_32[ind] = (Word32)(hCPE->hCoreCoder[ch_ind]->p_bpf_noise_buf_float[ind] * (1 << 11)); - } - } - } - if (hCPE->input_mem[ch_ind]) - { - FOR(int ind = 0; ind < NS2SA(output_Fs, STEREO_DFT32MS_OVL_NS); ind++) - { - hCPE->input_mem_fx[ch_ind][ind] = (Word32)(hCPE->input_mem[ch_ind][ind] * (1 << 11)); - } - } - if (hCPE->input_mem_LB[ch_ind]) - { - FOR(int ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++) - { - hCPE->input_mem_LB_fx[ch_ind][ind] = (Word32)(hCPE->input_mem_LB[ch_ind][ind] * (1 << 11)); - } - } - if (hCPE->input_mem_BPF[0] != NULL) - { - FOR(int ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++) - { - hCPE->input_mem_BPF_fx[0][ind] = (Word32)(hCPE->input_mem_BPF[0][ind] * (1 << 11)); - } - } - IF(hCPE->output_mem[ch_ind] != NULL) - { - FOR(Word32 kk = 0; kk < NS2SA(hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS); kk++) - { - hCPE->output_mem_fx[ch_ind][kk] = (Word32)(hCPE->output_mem[ch_ind][kk] * (1 << OUTPUT_Q)); - } - } - IF(hCPE->hStereoDft != NULL) - { - FOR(int ind = 0; ind < NS2SA(16000, DELAY_BWE_TOTAL_NS); ind++) - { - hCPE->hStereoDft->ap_delay_mem_fx[ind] = (Word32)(hCPE->hStereoDft->ap_delay_mem[ind] * (1 << 11)); - } - hCPE->hStereoDft->q_ap_delay_mem_fx = 11; - FOR(int ind = 0; ind < NS2SA(16000, STEREO_DFT32MS_OVL_NS); ind++) - { - hCPE->hStereoDft->buff_LBTCX_mem_fx[ind] = (Word32)(hCPE->hStereoDft->buff_LBTCX_mem[ind] * (1 << 11)); - } - IF(hCPE->hStereoDft->hTcxLtpDec != NULL) - { - FOR(Word32 p = 0; p < L_FRAME48k; p++) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32)(hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * (1u << OUTPUT_Q)); - } - FOR(Word32 p = 0; p < TCXLTP_MAX_DELAY; p++) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32)(hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * (1u << OUTPUT_Q)); - } - } - - } - IF(hCPE->hCoreCoder[ch_ind]->hTcxLtpDec != NULL) - { - FOR(Word32 p = 0; p < L_FRAME48k; p++) - { - hCPE->hCoreCoder[ch_ind]->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32)(hCPE->hCoreCoder[ch_ind]->hTcxLtpDec->tcxltp_mem_out_float[p] * (1u << OUTPUT_Q)); - } - FOR(Word32 p = 0; p < TCXLTP_MAX_DELAY; p++) - { - hCPE->hCoreCoder[ch_ind]->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32)(hCPE->hCoreCoder[ch_ind]->hTcxLtpDec->tcxltp_mem_in_float[p] * (1u << OUTPUT_Q)); - } - } - IF(hCPE->hCoreCoder[ch_ind]->hTcxDec != NULL) - { - FOR(Word32 kk = 0; kk < 111; kk++) - { - //hCPE->hCoreCoder[ch_ind]->hTcxDec->FBTCXdelayBuf_32[kk] = (Word32)(hCPE->hCoreCoder[ch_ind]->hTcxDec->FBTCXdelayBuf_float[kk] * (1 << OUTPUT_Q)); - } } } } @@ -2087,24 +1348,6 @@ ivas_error ivas_core_dec( hSCE->hCoreCoder[0]->hHQ_core->oldOut_fx[ind] = (Word32)(hSCE->hCoreCoder[0]->hHQ_core->old_out[ind] * (1 << 11)); } } - IF(hSCE->hCoreCoder[0]->hTcxDec != NULL) - { - FOR(Word32 kk = 0; kk < 111; kk++) - { - //hSCE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_32[kk] = (Word32)(hSCE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_float[kk] * (1 << OUTPUT_Q)); - } - } - IF(hSCE->hCoreCoder[0]->hTcxLtpDec != NULL) - { - FOR(Word32 p = 0; p < L_FRAME48k; p++) - { - hSCE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32)(hSCE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_out_float[p] * (1u << OUTPUT_Q)); - } - FOR(Word32 p = 0; p < TCXLTP_MAX_DELAY; p++) - { - hSCE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32)(hSCE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_in_float[p] * (1u << OUTPUT_Q)); - } - } } } @@ -2117,7 +1360,7 @@ ivas_error ivas_core_dec( IF ( NE_16(st->element_mode, IVAS_CPE_MDCT) || sba_dirac_stereo_flag ) { - ivas_post_proc_fx( hSCE, hCPE, n, synth_fxg[n], NULL, output_frame, sba_dirac_stereo_flag ); + ivas_post_proc_fx( hSCE, hCPE, n, synth_32_fx[n], NULL, output_frame, sba_dirac_stereo_flag ); } /* update OLA buffers - needed for switching to DFT stereo */ @@ -2125,7 +1368,7 @@ ivas_error ivas_core_dec( { IF ( hCPE != NULL ) { - stereo_td2dft_update_fx( hCPE, n, output_32_fx[n], synth_fxg[n], hb_synth_fxg[n], output_frame ); + stereo_td2dft_update_fx( hCPE, n, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], output_frame ); } } } @@ -2134,11 +1377,11 @@ ivas_error ivas_core_dec( Word16 q = 11; IF ( EQ_16(hCPE->last_element_mode, IVAS_CPE_MDCT )) { - stereo_mdct2dft_update_fx( hCPE, output_32_fx[0], synth_fxg[0] ); + stereo_mdct2dft_update_fx( hCPE, output_32_fx[0], synth_32_fx[0] ); } Word16 q_DFT[2] = { 3, 3 }; - stereo_dft_dec_core_switching_fx( hCPE, output_32_fx[0], synth_fxg[0], hb_synth_fxg[0], DFT_fx, output_frame, use_cldfb_for_dft, 0, &q, q_DFT ); + stereo_dft_dec_core_switching_fx( hCPE, output_32_fx[0], synth_32_fx[0], hb_synth_32_fx[0], DFT_fx, output_frame, use_cldfb_for_dft, 0, &q, q_DFT ); hCPE->hStereoDft->q_dft = s_min( q_DFT[0], q_DFT[1] ); @@ -2151,11 +1394,11 @@ ivas_error ivas_core_dec( IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) { /* mono output for non-residual coding modes uses CLDFB instead of DFT - requires DFT buffer update in case of bitrate switching */ - stereo_td2dft_update_fx( hCPE, n, output_32_fx[n], synth_fxg[n], hb_synth_fxg[n], output_frame ); + stereo_td2dft_update_fx( hCPE, n, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], output_frame ); } } - Copy32( synth_fxg[n], output_32_fx[n], output_frame ); + Copy32( synth_32_fx[n], output_32_fx[n], output_frame ); /*--------------------------------------------------------* * Common updates @@ -2192,9 +1435,8 @@ ivas_error ivas_core_dec( Scale_sig(st->delay_buf_out_fx, NS2SA(st->output_Fs, DELAY_CLDFB_NS), exp_max - 0); Scale_sig(st->hHQ_core->old_out_fx + NS2SA(st->output_Fs, N_ZERO_MDCT_NS), NS2SA(st->output_Fs, PH_ECU_LOOKAHEAD_NS) - NS2SA(st->output_Fs, N_ZERO_MDCT_NS), exp_max - 0); Scale_sig(st->prev_synth_buffer_fx, NS2SA(48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS), exp_max - st->q_prev_synth_buffer_fx); - Scale_sig(st->hTcxDec->synth_history_fx + output_frame, 2 * output_frame - NS2SA(st->output_Fs, DELAY_CLDFB_NS) + NS2SA(st->output_Fs, PH_ECU_MEM_NS) - output_frame, exp_max - st->hTcxDec->q_synth_history_fx); + Scale_sig(st->hTcxDec->synth_history_fx + output_frame, 2 * output_frame - NS2SA(st->output_Fs, DELAY_CLDFB_NS) + NS2SA(st->output_Fs, PH_ECU_MEM_NS) - output_frame, exp_max - st->Q_syn); - st->hTcxDec->q_synth_history_fx = exp_max - st->q_prev_synth_buffer_fx; st->q_prev_synth_buffer_fx = exp_max - st->q_prev_synth_buffer_fx; } /* Save synthesis for HQ FEC */ @@ -2207,26 +1449,7 @@ ivas_error ivas_core_dec( Scale_sig( st->delay_buf_out_fx, NS2SA( st->output_Fs, DELAY_CLDFB_NS ), -exp_max ); #ifdef IVAS_FLOAT_FIXED - // TO DO delete below - FOR( int ch_ind = 0; ch_ind < n_channels; ch_ind++ ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - //output[ch_ind][i] = fixedToFloat(output_32_fx[ch_ind][i], 11); - synth[ch_ind][i] = (float) synth_fxg[ch_ind][i] / (float) ( 1 << 11 ); - hb_synth[ch_ind][i] = (float) hb_synth_fxg[ch_ind][i] / (float) ( 1 << 11 ); - } - } - //IF( DFT != NULL ) - //{ - // FOR( i = 0; i < CPE_CHANNELS; i++ ) - // { - // FOR( Word16 jj = 0; jj < STEREO_DFT_BUF_MAX; jj++ ) - // { - // DFT[i][jj] = (float) DFT_fx[i][jj] / (float) ( 1 << q_DFT[i] ); - // } - // } - //} + if ( hCPE != NULL ) { @@ -2245,80 +1468,6 @@ ivas_error ivas_core_dec( hCPE->hCoreCoder[ch_ind]->hHQ_core->old_out[ind] = (float) hCPE->hCoreCoder[ch_ind]->hHQ_core->oldOut_fx[ind] / (float) ( 1 << 11 ); } } - if ( hCPE->hCoreCoder[ch_ind]->p_bpf_noise_buf_float != NULL ) - { - FOR( int ind = 0; ind < L_FRAME16k; ind++ ) - { - hCPE->hCoreCoder[ch_ind]->p_bpf_noise_buf_float[ind] = (float) hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[ind] / (float) ( 1 << 11 ); - } - } - IF(hCPE->hCoreCoder[ch_ind]->hTcxLtpDec != NULL) - { - FOR(Word32 p = 0; p < L_FRAME48k; p++) - { - hCPE->hCoreCoder[ch_ind]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float)hCPE->hCoreCoder[ch_ind]->hTcxLtpDec->tcxltp_mem_out_32[p] / (1u << OUTPUT_Q); - } - FOR(Word32 p = 0; p < TCXLTP_MAX_DELAY; p++) - { - hCPE->hCoreCoder[ch_ind]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float)hCPE->hCoreCoder[ch_ind]->hTcxLtpDec->tcxltp_mem_in_32[p] / (1u << OUTPUT_Q); - } - } - IF(hCPE->hCoreCoder[ch_ind]->hTcxDec != NULL) - { - FOR(Word32 kk = 0; kk < 111; kk++) - { - //hCPE->hCoreCoder[ch_ind]->hTcxDec->FBTCXdelayBuf_float[kk] = (float)hCPE->hCoreCoder[ch_ind]->hTcxDec->FBTCXdelayBuf_32[kk] / (1 << OUTPUT_Q); - } - } - } - if ( hCPE->input_mem_fx[ch_ind] ) - { - FOR( i = 0; i < NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ); i++ ) - { - hCPE->input_mem[ch_ind][i] = (float) hCPE->input_mem_fx[ch_ind][i] / (float) ( 1 << 11 ); - } - } - IF(hCPE->output_mem[ch_ind] != NULL) - { - FOR(Word32 kk = 0; kk < NS2SA(hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS); kk++) - { - hCPE->output_mem[ch_ind][kk] = (float)hCPE->output_mem_fx[ch_ind][kk] / (1u << 11); - } - } - if ( hCPE->input_mem_LB[ch_ind] ) - { - FOR( i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - { - hCPE->input_mem_LB[ch_ind][i] = (float) hCPE->input_mem_LB_fx[ch_ind][i] / (float) ( 1 << 11 ); - } - } - if ( hCPE->input_mem_BPF[0] != NULL ) - { - FOR( i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_BPF[0][i] = (float) hCPE->input_mem_BPF_fx[0][i] / (float) ( 1 << 11 ); - } - IF( hCPE->hStereoDft != NULL ) - { - FOR( int ind = 0; ind < NS2SA( 16000, DELAY_BWE_TOTAL_NS ); ind++ ) - { - hCPE->hStereoDft->ap_delay_mem[ind] = (float) hCPE->hStereoDft->ap_delay_mem_fx[ind] / (float) ( 1 << 11 ); - } - FOR( int ind = 0; ind < NS2SA( 16000, STEREO_DFT32MS_OVL_NS ); ind++ ) - { - hCPE->hStereoDft->buff_LBTCX_mem[ind] = (float) hCPE->hStereoDft->buff_LBTCX_mem_fx[ind] / (float) ( 1 << 11 ); - } - - IF(hCPE->hStereoDft->hTcxLtpDec != NULL) - { - FOR(Word32 p = 0; p < L_FRAME48k; p++) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float)hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / (1u << OUTPUT_Q); - } - FOR(Word32 p = 0; p < TCXLTP_MAX_DELAY; p++) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] = (float)hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] / (1u << OUTPUT_Q); - } - } } } } @@ -2338,34 +1487,8 @@ ivas_error ivas_core_dec( hSCE->hCoreCoder[0]->hHQ_core->old_out[ind] = (float) hSCE->hCoreCoder[0]->hHQ_core->oldOut_fx[ind] / (float) ( 1 << 11 ); } } - IF(hSCE->hCoreCoder[0]->hTcxDec != NULL) - { - FOR(Word32 kk = 0; kk < 111; kk++) - { - //hSCE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_float[kk] = (float)hSCE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_32[kk] / (1 << OUTPUT_Q); - } - } - IF(hSCE->hCoreCoder[0]->hTcxLtpDec != NULL) - { - FOR(Word32 p = 0; p < L_FRAME48k; p++) - { - hSCE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float)hSCE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_out_32[p] / (1u << OUTPUT_Q); - } - FOR(Word32 p = 0; p < TCXLTP_MAX_DELAY; p++) - { - hSCE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float)hSCE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_in_32[p] / (1u << OUTPUT_Q); - } - } } } - - if ((st->last_codec_mode == MODE1 && st->hTcxDec != NULL) && ((st->last_core == ACELP_CORE && !(st->bfi == 1 && st->last_con_tcx == 1)) || st->last_core == HQ_CORE)) - { - for (i = 0; i < 2 * output_frame + NS2SA(st->output_Fs, PH_ECU_LOOKAHEAD_NS); i++) - { - fix2f_16(&st->hTcxDec->synth_history_fx[i], &st->hTcxDec->synth_history[i], st->hTcxDec->q_synth_history_fx); - } - } #endif } /* n_channels loop */ diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index e5eabe3d44508ca86754cefead30c3280d9a67da..aa32ce707df66ae07010cd56eff8127a4fdee1c9 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -122,13 +122,6 @@ ivas_error ivas_corecoder_dec_reconfig_fx( if ( st_ivas->hSCE[0] != NULL ) { -#if 1 /*TODO:To be removed later*/ - free( st_ivas->hSCE[0]->save_synth ); - st_ivas->hSCE[0]->save_synth = NULL; - - free( st_ivas->hSCE[0]->save_hb_synth ); - st_ivas->hSCE[0]->save_hb_synth = NULL; -#endif free( st_ivas->hSCE[0]->save_synth_fx ); st_ivas->hSCE[0]->save_synth_fx = NULL; @@ -396,40 +389,24 @@ ivas_error ivas_corecoder_dec_reconfig_fx( } set32_fx( st_ivas->hCPE[0]->hStereoDft->buff_LBTCX_mem_fx, 0, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) ); -#if 1 /*TODO: To be removed later*/ - set_f( st_ivas->hCPE[0]->hStereoDft->buff_LBTCX_mem, 0, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) ); -#endif st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ st_ivas->hCPE[0]->hCoreCoder[1] = NULL; - IF( st_ivas->hSCE[0]->save_synth == NULL ) + IF( st_ivas->hSCE[0]->save_synth_fx == NULL ) { -#if 1 /*TODO: To be removed later*/ - IF( ( st_ivas->hSCE[0]->save_synth = (float *) malloc( sizeof( float ) * output_frame ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for stereo output\n" ) ); - } - set_zero( st_ivas->hSCE[0]->save_synth, output_frame ); -#endif IF( ( st_ivas->hSCE[0]->save_synth_fx = (Word32 *) malloc( sizeof( *( st_ivas->hSCE[0]->save_synth_fx ) ) * output_frame ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for stereo output\n" ) ); } set32_fx( st_ivas->hSCE[0]->save_synth_fx, 0, output_frame ); st_ivas->hSCE[0]->q_save_synth_fx = 0; + //st_ivas->hSCE[0]->q_save_synth_fx = Q11; move16(); } - IF( st_ivas->hSCE[0]->save_hb_synth == NULL ) + IF( st_ivas->hSCE[0]->save_hb_synth_fx == NULL ) { -#if 1 /*TODO: To be removed later*/ - IF( ( st_ivas->hSCE[0]->save_hb_synth = (float *) malloc( sizeof( float ) * output_frame ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate HB memory for stereo output\n" ) ); - } - set_zero( st_ivas->hSCE[0]->save_hb_synth, output_frame ); -#endif IF( ( st_ivas->hSCE[0]->save_hb_synth_fx = (Word32 *) malloc( sizeof( *( st_ivas->hSCE[0]->save_hb_synth_fx ) ) * output_frame ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate HB memory for stereo output\n" ) ); @@ -867,7 +844,7 @@ ivas_error ivas_hp20_dec_reconfig_fx( return error; } -#endif +#else ivas_error ivas_hp20_dec_reconfig( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nchan_hp20_old /* i : number of HP20 filters in previous frame */ @@ -944,7 +921,7 @@ ivas_error ivas_hp20_dec_reconfig( return error; } - +#endif /*-------------------------------------------------------------------* * ivas_cldfb_dec_reconfig() @@ -956,8 +933,8 @@ ivas_error ivas_cldfb_dec_reconfig_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 nchan_transport_old, /* i : number of TCs in previous frame */ Word16 numCldfbAnalyses_old, /* i : number of CLDFB analysis instances in previous frame */ - const Word16 numCldfbSyntheses_old, /* i : number of CLDFB synthesis instances in previous frame */ - const Word16 Q_cldfbSynDec ) + const Word16 numCldfbSyntheses_old /* i : number of CLDFB synthesis instances in previous frame */ +) { Word16 i, numCldfbAnalyses, numCldfbSyntheses; DECODER_CONFIG_HANDLE hDecoderConfig; @@ -977,7 +954,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* resample CLDFB analysis instances */ FOR( i = 0; i < min( numCldfbAnalyses, numCldfbAnalyses_old ); i++ ) { - IF( EQ_32( L_mult0( extract_l(L_mult0( st_ivas->cldfbAnaDec[i]->no_channels, st_ivas->cldfbAnaDec[i]->no_col )), FRAMES_PER_SEC ), hDecoderConfig->output_Fs ) ) + IF( NE_32( L_mult0( extract_l(L_mult0( st_ivas->cldfbAnaDec[i]->no_channels, st_ivas->cldfbAnaDec[i]->no_col )), FRAMES_PER_SEC ), hDecoderConfig->output_Fs ) ) { resampleCldfb_ivas_fx( st_ivas->cldfbAnaDec[i], hDecoderConfig->output_Fs ); } @@ -1030,7 +1007,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( 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 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], 21 - 11); // Scaling down from 21 to 11 } return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 48a92c535f351bfb583570754c8da50f293ccc6c..a86493ba4209e06e2a95a47cffcf4cb717ba339d 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -168,16 +168,6 @@ ivas_error ivas_cpe_dec( { if ( st_ivas->hQMetaData != NULL && ivas_total_brate > IVAS_SID_5k2 ) { -#ifdef IVAS_FLOAT_FIXED - if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) - { - stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, Mpy_32_32(1503238554 /* 0.7f in Q31 */, L_mult0(st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC) ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); - } - else - { - stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, L_mult0(st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); - } -#else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, (int32_t) ( 0.7f * st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); @@ -186,21 +176,10 @@ ivas_error ivas_cpe_dec( { 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 ); } -#endif } else { /* Note: This only works for stereo operation. If DTX would be applied for multiple CPEs a different bitrate signaling is needed */ -#ifdef IVAS_FLOAT_FIXED - if ( ivas_total_brate <= IVAS_SID_5k2 ) - { - stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); - } - else - { - stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); - } -#else if ( ivas_total_brate <= IVAS_SID_5k2 ) { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); @@ -209,7 +188,6 @@ ivas_error ivas_cpe_dec( { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } -#endif } } @@ -222,11 +200,7 @@ ivas_error ivas_cpe_dec( } else { -#ifdef IVAS_FLOAT_FIXED - stereo_dft_config_fx( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); -#else stereo_dft_config( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); -#endif } } @@ -241,9 +215,6 @@ ivas_error ivas_cpe_dec( { /* Update DFT Stereo memories */ stereo_dft_dec_update( hCPE->hStereoDft, output_frame, 0 ); -#ifdef IVAS_FLOAT_FIXED - stereo_dft_dec_update_fx( hCPE->hStereoDft, output_frame, 0 ); -#endif if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) { @@ -702,20 +673,6 @@ ivas_error create_cpe_dec( } set_zero( hCPE->input_mem_LB[i], STEREO_DFT32MS_OVL_16k ); -#ifdef IVAS_FLOAT_FIXED - IF( ( hCPE->input_mem_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); - } - set32_fx( hCPE->input_mem_fx[i], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - - IF( ( hCPE->input_mem_LB_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * STEREO_DFT32MS_OVL_16k ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); - } - set32_fx( hCPE->input_mem_LB_fx[i], 0, STEREO_DFT32MS_OVL_16k ); -#endif - if ( i == 0 ) { if ( ( hCPE->input_mem_BPF[0] = (float *) malloc( sizeof( float ) * STEREO_DFT32MS_OVL_16k ) ) == NULL ) @@ -723,13 +680,6 @@ ivas_error create_cpe_dec( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); } set_zero( hCPE->input_mem_BPF[0], STEREO_DFT32MS_OVL_16k ); -#ifdef IVAS_FLOAT_FIXED - if ( ( hCPE->input_mem_BPF_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * STEREO_DFT32MS_OVL_16k ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); - } - set32_fx( hCPE->input_mem_BPF_fx[0], 0, STEREO_DFT32MS_OVL_16k ); -#endif } @@ -886,9 +836,6 @@ ivas_error create_cpe_dec( hCPE->hStereoMdct->reverse_dmx = 0; hCPE->hStereoMdct->smooth_ratio = 1.f; -#ifdef IVAS_FLOAT_FIXED - hCPE->hStereoMdct->smooth_ratio_fx = ONE_IN_Q26; -#endif set_s( hCPE->hStereoMdct->prev_ms_mask[0], 0, MAX_SFB ); set_s( hCPE->hStereoMdct->prev_ms_mask[1], 0, MAX_SFB ); hCPE->hStereoMdct->lastCoh = 1.f; @@ -989,12 +936,6 @@ void destroy_cpe_dec( hCPE->input_mem[n] = NULL; free( hCPE->output_mem[n] ); hCPE->output_mem[n] = NULL; -#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; -#endif if ( hCPE->prev_synth_chs[n] != NULL ) { @@ -1004,10 +945,6 @@ void destroy_cpe_dec( } free( hCPE->input_mem_BPF[0] ); hCPE->input_mem_BPF[0] = NULL; -#ifdef IVAS_FLOAT_FIXED - free( hCPE->input_mem_BPF_fx[0] ); - hCPE->input_mem_BPF_fx[0] = NULL; -#endif } diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index 807281206f0292343aad50e575d45888f345a85a..bf2c88053e428b55d4291288fd273e801ed58ece 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -77,16 +77,9 @@ ivas_error ivas_cpe_dec_fx( Word16 nb_bits, last_core; Word16 last_bwidth; Word16 tdm_ratio_idx; -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - float *output_flt[CPE_CHANNELS]; - float outputHB[CPE_CHANNELS][L_FRAME48k]; /* 'float' buffer for output HB synthesis, both channels */ - float res_buf[STEREO_DFT_N_8k]; - Word32 outputHB_fx[CPE_CHANNELS][L_FRAME48k]; /* buffer for output HB synthesis, both channels */ - Word32 res_buf_fx[STEREO_DFT_N_8k]; -#else - Word32 outputHB_fx[CPE_CHANNELS][L_FRAME48k]; /* buffer for output HB synthesis, both channels */ - Word32 res_buf_fx[STEREO_DFT_N_8k]; -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED + Word32 outputHB_fx[CPE_CHANNELS][L_FRAME48k]; /* buffer for output HB synthesis, both channels */ /* Q11 */ + Word16 q_res_buf = Q8; + Word32 res_buf_fx[STEREO_DFT_N_8k]; /* Q(q_res_buf) */ CPE_DEC_HANDLE hCPE; Decoder_State **sts; Word32 ivas_total_brate; @@ -96,30 +89,24 @@ ivas_error ivas_cpe_dec_fx( error = IVAS_ERR_OK; -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - output_flt[0] = malloc( sizeof( float ) * L_FRAME48k ); - output_flt[1] = malloc( sizeof( float ) * L_FRAME48k ); - FOR( int k = 0; k < L_FRAME48k; k++ ) - { - output_flt[0][k] = (float) output[0][k] / ( 1 << *q_output ); - output_flt[1][k] = (float) output[1][k] / ( 1 << *q_output ); - } -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED - push_wmops( "ivas_cpe_dec" ); ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); hCPE = st_ivas->hCPE[cpe_id]; sts = hCPE->hCoreCoder; last_core = sts[0]->last_core; + move16(); last_bwidth = sts[0]->last_bwidth; + move16(); sts[0]->BER_detect = s_or( sts[0]->BER_detect, st_ivas->BER_detect ); sts[1]->BER_detect = s_or( sts[1]->BER_detect, st_ivas->BER_detect ); element_brate_ref = hCPE->element_brate; + move32(); /*------------------------------------------------------------------* * Read stereo technology info & audio bandwidth @@ -133,156 +120,75 @@ ivas_error ivas_cpe_dec_fx( * dynamically allocate data structures depending on the actual stereo mode *----------------------------------------------------------------*/ -#ifndef IVAS_FLOAT_FIXED - IF( ( error = stereo_memory_dec( ivas_total_brate, hCPE, nb_bits_metadata, st_ivas->hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) - { - return error; - } -#else -#if 1 // Float to fix conversions +#if 1 // Float to fix conversions float maxim = 0; - Word16 q_output_mem, q_buff_LBTCX_mem, q_input_mem_LB, q_old_out = 31, q_old_out_LB = 31, q_tcxltp_mem_in_float=15; + Word16 q_output_mem, q_buff_LBTCX_mem, q_input_mem_LB, q_old_out = 31, q_old_out_LB = 31, q_tcxltp_mem_in_float; q_output_mem = 11; - IF(hCPE->hStereoDft) - FOR(Word16 ind1 = 0; ind1 < 2; ind1++) { - FOR(Word16 ind2 = 0; ind2 < s_max(hCPE->hStereoDft->dft32ms_ovl, hCPE->hStereoDft->dft32ms_ovl - NS2SA( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS )); ind2++) { - hCPE->output_mem_fx[ind1][ind2] = (Word32)(hCPE->output_mem[ind1][ind2] * (1<hStereoDft) - FOR(Word16 ind1 = 0; ind1 < s_min(50, NS2SA( hCPE->hCoreCoder[0]->last_L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS )); ind1++) { - hCPE->hStereoDft->buff_LBTCX_mem_fx[ind1] = (Word32)(hCPE->hStereoDft->buff_LBTCX_mem[ind1] * (1<hStereoDft && hCPE->input_mem_LB[0] && NE_16(hCPE->hCoreCoder[0]->last_core, ACELP_CORE)) - FOR(Word16 ind1 = 0; ind1 < s_min(NS2SA( hCPE->hCoreCoder[0]->last_L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ), 50); ind1++) { - hCPE->input_mem_LB_fx[0][ind1] = (Word32)(hCPE->input_mem_LB[0][ind1] * (1<hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core) - FOR(Word16 ind2 = 0; ind2 < st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC; ind2++) { - maxim = fmaxf(fabsf(hCPE->hCoreCoder[ind1]->hHQ_core->old_out[ind2]), maxim); - } - } - IF (maxim > 1.f) q_old_out = norm_l((Word32)maxim); - q_old_out -= 1; - FOR(Word16 ind1 = 0; ind1 < 2; ind1++) { - IF(hCPE->hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core) - FOR(Word16 ind2 = 0; ind2 < 960; ind2++) { - hCPE->hCoreCoder[ind1]->hHQ_core->oldOut_fx[ind2] = (Word32)(hCPE->hCoreCoder[ind1]->hHQ_core->old_out[ind2] * (1<hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core ) + FOR( Word16 ind2 = 0; ind2 < 960; ind2++ ) + { + hCPE->hCoreCoder[ind1]->hHQ_core->oldOut_fx[ind2] = (Word32) ( hCPE->hCoreCoder[ind1]->hHQ_core->old_out[ind2] * ( 1 << q_old_out ) ); } } maxim = 0; - FOR(Word16 ind1 = 0; ind1 < 2; ind1++) { - IF(hCPE->hCoreCoder[ind1]->hHQ_core) - FOR(Word16 ind2 = 0; ind2 < L_FRAME32k; ind2++) { - maxim = fmaxf(fabsf(hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB[ind2]), maxim); + FOR( Word16 ind1 = 0; ind1 < 2; ind1++ ) + { + IF( hCPE->hCoreCoder[ind1]->hHQ_core ) + FOR( Word16 ind2 = 0; ind2 < L_FRAME32k; ind2++ ) + { + maxim = fmaxf( fabsf( hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB[ind2] ), maxim ); } } - IF (maxim > 1.f) q_old_out_LB = norm_l((Word32)maxim); + IF( maxim > 1.f ) + q_old_out_LB = norm_l( (Word32) maxim ); q_old_out_LB -= 1; - FOR(Word16 ind1 = 0; ind1 < 1; ind1++) { - IF(hCPE->hCoreCoder[ind1]->hHQ_core) + FOR( Word16 ind1 = 0; ind1 < 1; ind1++ ) + { + IF( hCPE->hCoreCoder[ind1]->hHQ_core ) { - FOR(Word16 ind2 = 0; ind2 < L_FRAME32k; ind2++) { - hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB_fx[ind2] = (Word32)(hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB[ind2] * (1<hCoreCoder[ind1]->hHQ_core->old_outLB_fx[ind2] = (Word32) ( hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB[ind2] * ( 1 << q_old_out_LB ) ); } hCPE->hCoreCoder[ind1]->hHQ_core->q_old_outLB_fx = q_old_out_LB; } } q_tcxltp_mem_in_float = 11; - IF(hCPE->hStereoDft && hCPE->hStereoDft->hTcxLtpDec) - FOR(Word16 ind = 0; ind < s_min(12, (Word16)( TCXLTP_MAX_DELAY * st_ivas->hDecoderConfig->output_Fs ) / 48000) ; ind++) { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[ind] = (Word32)(hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[ind] * (1<hStereoDft && hCPE->hStereoDft->hTcxLtpDec) - FOR(Word16 ind = 0; ind < s_min(12, (Word16)( L_FRAME48k * st_ivas->hDecoderConfig->output_Fs ) / 48000) ; ind++) { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[ind] = (Word32)(hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[ind] * (1<hCoreCoder[ind2] && hCPE->hCoreCoder[ind2]->hTcxLtpDec) - FOR(Word16 ind = 0; ind < s_min(12, (Word16)(TCXLTP_MAX_DELAY * st_ivas->hDecoderConfig->output_Fs) / 48000); ind++) { - hCPE->hCoreCoder[ind2]->hTcxLtpDec->tcxltp_mem_in_32[ind] = (Word32)(hCPE->hCoreCoder[ind2]->hTcxLtpDec->tcxltp_mem_in_float[ind] * (1 << q_tcxltp_mem_in_float)); - } - IF(hCPE->hCoreCoder[ind2] && hCPE->hCoreCoder[ind2]->hTcxLtpDec) - FOR(Word16 ind = 0; ind < s_min(12, (Word16)(L_FRAME48k * st_ivas->hDecoderConfig->output_Fs) / 48000); ind++) { - hCPE->hCoreCoder[ind2]->hTcxLtpDec->tcxltp_mem_out_32[ind] = (Word32)(hCPE->hCoreCoder[ind2]->hTcxLtpDec->tcxltp_mem_out_float[ind] * (1 << q_tcxltp_mem_in_float)); - } - IF(hCPE->hCoreCoder[ind2] && hCPE->hCoreCoder[ind2]->cldfbSyn) - hCPE->hCoreCoder[ind2]->cldfbSyn->scale = (Word16)(hCPE->hCoreCoder[ind2]->cldfbSyn->scale_flt * (1u << norm_s((Word16)hCPE->hCoreCoder[0]->cldfbSyn->scale_flt))); - } - FOR(Word16 ind = 0; ind < L_FRAME16k / 2; ind++) { - IF(hCPE->hCoreCoder[0] && hCPE->hCoreCoder[0]->hTcxDec) - hCPE->hCoreCoder[0]->hTcxDec->old_syn_Overl_32[ind] = (Word32)(hCPE->hCoreCoder[0]->hTcxDec->old_syn_Overl_float[ind] * (ONE_IN_Q11)); - IF(hCPE->hCoreCoder[1] && hCPE->hCoreCoder[1]->hTcxDec) - hCPE->hCoreCoder[1]->hTcxDec->old_syn_Overl_32[ind] = (Word32)(hCPE->hCoreCoder[1]->hTcxDec->old_syn_Overl_float[ind] * (ONE_IN_Q11)); - } - IF(hCPE->hStereoTD) - FOR(Word16 ind = 0; ind < L_FRAME16k / 2; ind++) { - hCPE->hStereoTD->TCX_old_syn_Overl_fx[ind] = (Word32)(hCPE->hStereoTD->TCX_old_syn_Overl[ind] * (ONE_IN_Q11)); + FOR( Word16 ind2 = 0; ind2 < 2; ind2++ ) + { + IF( hCPE->hCoreCoder[ind2] && hCPE->hCoreCoder[ind2]->cldfbSyn ) + hCPE->hCoreCoder[ind2]->cldfbSyn->scale = (Word16) ( hCPE->hCoreCoder[ind2]->cldfbSyn->scale_flt * ( 1u << norm_s( (Word16) hCPE->hCoreCoder[0]->cldfbSyn->scale_flt ) ) ); } - #endif // Float to fix conversions IF( ( error = stereo_memory_dec_fx( ivas_total_brate, hCPE, nb_bits_metadata, st_ivas->hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) { return error; } -#if 1 // Fix to float conversions - IF(hCPE->hStereoDft) - FOR(Word16 ind1 = 0; ind1 < 2; ind1++) { - FOR(Word16 ind2 = 0; ind2 < s_max(hCPE->hStereoDft->dft32ms_ovl, hCPE->hStereoDft->dft32ms_ovl - NS2SA( st_ivas->hDecoderConfig->output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS )); ind2++) { - hCPE->output_mem[ind1][ind2] = (float)hCPE->output_mem_fx[ind1][ind2] / (float)(1<input_mem_LB[0]) - FOR(Word16 ind1 = 0; ind1 < s_min(NS2SA( hCPE->hCoreCoder[0]->last_L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ), 50); ind1++) { - hCPE->input_mem_LB[0][ind1] = (float)(hCPE->input_mem_LB_fx[0][ind1]) / (float)(1<hStereoDft) - FOR(Word16 ind1 = 0; ind1 < s_min(NS2SA( s_min( hCPE->hCoreCoder[0]->last_L_frame * FRAMES_PER_SEC, 16000 ), STEREO_DFT32MS_OVL_NS ), 50); ind1++) { - hCPE->hStereoDft->buff_LBTCX_mem[ind1] = (float)(hCPE->hStereoDft->buff_LBTCX_mem_fx[ind1]) / (float)(1<hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core) - FOR(Word16 ind2 = 0; ind2 < 960; ind2++) { - hCPE->hCoreCoder[ind1]->hHQ_core->old_out[ind2] = (float)(hCPE->hCoreCoder[ind1]->hHQ_core->oldOut_fx[ind2]) / (1<hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core) - FOR(Word16 ind2 = 0; ind2 < L_FRAME32k; ind2++) { - hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB[ind2] = (float)(hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB_fx[ind2]) / (1<hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core ) + FOR( Word16 ind2 = 0; ind2 < 960; ind2++ ) + { + hCPE->hCoreCoder[ind1]->hHQ_core->old_out[ind2] = (float) ( hCPE->hCoreCoder[ind1]->hHQ_core->oldOut_fx[ind2] ) / ( 1 << q_old_out ); } } - IF(hCPE->hStereoDft && hCPE->hStereoDft->hTcxLtpDec) - FOR(Word16 ind = 0; ind < s_min(12, (Word16)( TCXLTP_MAX_DELAY * st_ivas->hDecoderConfig->output_Fs ) / 48000) ; ind++) { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[ind] = (float)hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[ind] / (float)(1<hStereoDft && hCPE->hStereoDft->hTcxLtpDec) - FOR(Word16 ind = 0; ind < s_min(12, (Word16)( L_FRAME48k * st_ivas->hDecoderConfig->output_Fs ) / 48000) ; ind++) { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[ind] = (float)hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[ind] / (float)(1<hCoreCoder[ind2] && hCPE->hCoreCoder[ind2]->hTcxLtpDec) - FOR(Word16 ind = 0; ind < s_min(12, (Word16)( TCXLTP_MAX_DELAY * st_ivas->hDecoderConfig->output_Fs ) / 48000) ; ind++) { - hCPE->hCoreCoder[ind2]->hTcxLtpDec->tcxltp_mem_in_float[ind] = (float)hCPE->hCoreCoder[ind2]->hTcxLtpDec->tcxltp_mem_in_32[ind] / (float)(1<hCoreCoder[ind2] && hCPE->hCoreCoder[ind2]->hTcxLtpDec) - FOR(Word16 ind = 0; ind < s_min(12, (Word16)( L_FRAME48k * st_ivas->hDecoderConfig->output_Fs ) / 48000) ; ind++) { - hCPE->hCoreCoder[ind2]->hTcxLtpDec->tcxltp_mem_out_float[ind] = (float)hCPE->hCoreCoder[ind2]->hTcxLtpDec->tcxltp_mem_out_32[ind] / (float)(1<hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core ) + FOR( Word16 ind2 = 0; ind2 < L_FRAME32k; ind2++ ) + { + hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB[ind2] = (float) ( hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB_fx[ind2] ) / ( 1 << q_old_out_LB ); } } - FOR(Word16 ind = 0; ind < L_FRAME16k / 2; ind++) { - IF(hCPE->hCoreCoder[0] && hCPE->hCoreCoder[0]->hTcxDec) - hCPE->hCoreCoder[0]->hTcxDec->old_syn_Overl_float[ind] = (float)hCPE->hCoreCoder[0]->hTcxDec->old_syn_Overl_32[ind] / (float)(ONE_IN_Q11); - IF(hCPE->hCoreCoder[1] && hCPE->hCoreCoder[1]->hTcxDec) - hCPE->hCoreCoder[1]->hTcxDec->old_syn_Overl_float[ind] = (float)hCPE->hCoreCoder[1]->hTcxDec->old_syn_Overl_32[ind] / (float)(ONE_IN_Q11); - } -#endif // Fix to float conversions #endif /*------------------------------------------------------------------* @@ -290,82 +196,47 @@ ivas_error ivas_cpe_dec_fx( *-----------------------------------------------------------------*/ n_channels = CPE_CHANNELS; + move16(); IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { n_channels = 1; /* in DFT stereo, only M channel is coded */ + move16(); } tdm_ratio_idx = LRTD_STEREO_RIGHT_IS_PRIM; + move16(); FOR( n = 0; n < n_channels; n++ ) { sts[n]->idchan = n; + move16(); sts[n]->element_mode = hCPE->element_mode; + move16(); IF( !st_ivas->bfi ) { sts[n]->tdm_LRTD_flag = 0; + move16(); } /* TD stereo parameters */ IF( hCPE->hStereoTD != NULL ) { hCPE->hStereoTD->tdm_lp_reuse_flag = 0; + move16(); hCPE->hStereoTD->tdm_low_rate_mode = 0; + move16(); hCPE->hStereoTD->tdm_Pitch_reuse_flag = 0; + move16(); } } /*----------------------------------------------------------------* * Resets/updates in case of stereo switching *----------------------------------------------------------------*/ - Word16 q_temp = 11;//any q works - FOR(n = 0; n < CPE_CHANNELS; n++) - { - if (hCPE->output_mem[n] != NULL) - { - floatToFixed_arrL(&hCPE->output_mem[n][0], &hCPE->output_mem_fx[n][0], q_temp, NS2SA_fx2(st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS));//any q works - } -#ifndef FIX_746 - if (hCPE->input_mem[n] != NULL) - { - floatToFixed_arrL(&hCPE->input_mem[n][0], &hCPE->input_mem_fx[n][0], q_temp, NS2SA(hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS)); - } -#endif - if (hCPE->input_mem_LB[n] != NULL) - { - floatToFixed_arrL(&hCPE->input_mem_LB[n][0], &hCPE->input_mem_LB_fx[n][0], q_temp, STEREO_DFT32MS_OVL_16k); - } - - //if (hCPE->hCoreCoder[n] != NULL) - //{ - // floatToFixed_arrL(&hCPE->hCoreCoder[n]->prev_synth_buffer[0], &hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[0], q_temp, NS2SA(48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS)); - // floatToFixed_arr(&hCPE->hCoreCoder[n]->prev_synth_buffer[0], &hCPE->hCoreCoder[n]->prev_synth_buffer_fx[0], 0, NS2SA(48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS)); - //} - } stereo_switching_dec( hCPE, ivas_total_brate ); - FOR(n = 0; n < CPE_CHANNELS; n++) - { - if (hCPE->output_mem[n] != NULL) - { - fixedToFloat_arrL(&hCPE->output_mem_fx[n][0], &hCPE->output_mem[n][0], q_temp, NS2SA_fx2(st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS));//any q works - } - if (hCPE->input_mem[n] != NULL) - { - fixedToFloat_arrL(&hCPE->input_mem_fx[n][0], &hCPE->input_mem[n][0], q_temp, NS2SA(hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS)); - } - if (hCPE->input_mem_LB[n] != NULL) - { - fixedToFloat_arrL(&hCPE->input_mem_LB_fx[n][0], &hCPE->input_mem_LB[n][0], q_temp, STEREO_DFT32MS_OVL_16k); - } - //if (hCPE->hCoreCoder[n] != NULL) - //{ - //fixedToFloat_arrL(&hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[0], &hCPE->hCoreCoder[n]->prev_synth_buffer[0], q_temp, NS2SA(48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS)); - //fixedToFloat_arrL(&hCPE->hCoreCoder[n]->prev_synth_buffer_fx[0], &hCPE->hCoreCoder[n]->prev_synth_buffer[0], 0, NS2SA(48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS)); - //} - } /*----------------------------------------------------------------* * Configuration of stereo decoder *----------------------------------------------------------------*/ @@ -374,19 +245,25 @@ ivas_error ivas_cpe_dec_fx( FOR( n = 0; n < n_channels; n++ ) { sts[n]->codec_mode = MODE1; + move16(); } + test(); + test(); + test(); + test(); IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && ( NE_32( hCPE->element_brate, hCPE->last_element_brate ) || NE_16( hCPE->last_element_mode, hCPE->element_mode ) || EQ_16( sts[0]->ini_frame, 0 ) || ( NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) ) { + test(); IF( st_ivas->hQMetaData != NULL && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) { - IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, (Word32) ( st_ivas->hQMetaData->bits_frame_nominal * 35 /* 0.7f * FRAMES_PER_SEC */ ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, (Word32) ( st_ivas->hQMetaData->bits_frame_nominal * 35 /* 0.7f * 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 ); + stereo_dft_config_fx( 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 @@ -394,11 +271,11 @@ ivas_error ivas_cpe_dec_fx( /* Note: This only works for stereo operation. If DTX would be applied for multiple CPEs a different bitrate signaling is needed */ IF( LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) { - stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } ELSE { - stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } } } @@ -407,12 +284,12 @@ ivas_error ivas_cpe_dec_fx( { IF( hCPE->hStereoTD->tdm_LRTD_flag ) { - sts[0]->bits_frame_nominal = (Word16) ( L_shr( hCPE->element_brate, 1 ) / FRAMES_PER_SEC ); - sts[1]->bits_frame_nominal = (Word16) ( L_shr( hCPE->element_brate, 1 ) / FRAMES_PER_SEC ); + sts[0]->bits_frame_nominal = extract_l( L_shr( hCPE->element_brate, 1 ) / FRAMES_PER_SEC ); + sts[1]->bits_frame_nominal = extract_l( L_shr( 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 ); + stereo_dft_config_fx( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } } @@ -426,28 +303,29 @@ ivas_error ivas_cpe_dec_fx( IF( !st_ivas->bfi ) { /* Update DFT Stereo memories */ - stereo_dft_dec_update( hCPE->hStereoDft, output_frame, 0 ); -#ifdef IVAS_FLOAT_FIXED stereo_dft_dec_update_fx( hCPE->hStereoDft, output_frame, 0 ); -#endif IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) { IF( EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) { hCPE->hCoreCoder[n]->core_brate = ivas_total_brate; + move16(); hCPE->hCoreCoder[0]->total_brate = ivas_total_brate; + move16(); } ELSE { hCPE->hCoreCoder[n]->core_brate = SID_2k40; + move16(); } } /* read DFT Stereo side info */ nb_bits = extract_l( L_sub( ( hCPE->element_brate / FRAMES_PER_SEC ), Mpy_32_16_1( 26214, sts[0]->bits_frame_nominal ) ) ); // 0.8f in q15 = 26214 cpe_brate = st_ivas->hCPE[0]->element_brate; - IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + move32(); + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { sts[1]->bit_stream = sts[0]->bit_stream + sub( sub( (Word16) ( cpe_brate / FRAMES_PER_SEC ), 1 ), nb_bits_metadata ); sts[1]->bit_stream = sts[1]->bit_stream + (Word16) ( hCPE->brate_surplus / FRAMES_PER_SEC ); @@ -465,43 +343,38 @@ ivas_error ivas_cpe_dec_fx( sts[1]->total_brate = L_sub( IVAS_SID_5k2, SID_2k40 ); } - IF( ( ( EQ_16( (Word16) st_ivas->ivas_format, MASA_FORMAT ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) || ( EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) && LT_32( cpe_brate, MASA_STEREO_MIN_BITRATE ) ) ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) + test(); + test(); + test(); + test(); + IF( ( ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) || ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && LT_32( cpe_brate, MASA_STEREO_MIN_BITRATE ) ) ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) { sts[0]->total_brate = hCPE->element_brate; /* Only mono downmix was transmitted in this case */ + move32(); } ELSE { - IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_FORMAT ) || EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + test(); + IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { nb_bits = sub( nb_bits, nb_bits_metadata ); IF( LT_32( hCPE->brate_surplus, 0 ) ) { - nb_bits = add( nb_bits, (Word16) ( hCPE->brate_surplus / FRAMES_PER_SEC ) ); + nb_bits = add( nb_bits, extract_l( hCPE->brate_surplus / FRAMES_PER_SEC ) ); } } -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 Q_coh = 13, Q_res_buf = 8; - // Q_res_buf = Q_factor_arrL( res_buf, STEREO_DFT_N_8k ); - floatToFixed_arr(hCPE->hStereoCng->coh, hCPE->hStereoCng->coh_fx, Q_coh, 14 ); - floatToFixed_arrL( res_buf, res_buf_fx, Q_res_buf, STEREO_DFT_N_8k ); -#endif stereo_dft_dec_read_BS_fx( ivas_total_brate, hCPE->element_brate, &sts[0]->total_brate, sts[1], hCPE->hStereoDft, sts[0]->bwidth, output_frame, res_buf_fx, &nb_bits, hCPE->hStereoCng->coh_fx, st_ivas->ivas_format ); -#if 1 /*Fixed To Float changes*/ - fixedToFloat_arr( hCPE->hStereoCng->coh_fx, hCPE->hStereoCng->coh, Q_coh, 14 ); /*Q-13*/ - fixedToFloat_arrL( res_buf_fx, res_buf, Q_res_buf, STEREO_DFT_N_8k ); -#endif -#else - stereo_dft_dec_read_BS( ivas_total_brate, hCPE->element_brate, &sts[0]->total_brate, sts[1], hCPE->hStereoDft, sts[0]->bwidth, output_frame, res_buf, &nb_bits, hCPE->hStereoCng->coh, st_ivas->ivas_format ); -#endif } /* subtract metadata bitbudget */ sts[0]->total_brate = L_sub( sts[0]->total_brate, nb_bits_metadata * FRAMES_PER_SEC ); /* subtract bit-rate for combined format coding */ - IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) && ( EQ_16( (Word16) st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( (Word16) st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_16( (Word16) st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) + test(); + test(); + test(); + IF( 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 ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) { sts[0]->total_brate = L_add( sts[0]->total_brate, hCPE->brate_surplus ); } @@ -509,14 +382,16 @@ ivas_error ivas_cpe_dec_fx( ELSE { hCPE->hStereoDft->sg_mem_corrupt = 1; + move16(); } } ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { /* signal bitrate for BW selection in the SCh */ sts[0]->bits_frame_channel = 0; - sts[1]->bits_frame_channel = (Word16) ( hCPE->element_brate / FRAMES_PER_SEC ); - sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, (Word16) ( hCPE->brate_surplus / FRAMES_PER_SEC ) ); + move16(); + sts[1]->bits_frame_channel = extract_l( hCPE->element_brate / FRAMES_PER_SEC ); + sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, extract_l( hCPE->brate_surplus / FRAMES_PER_SEC ) ); IF( st_ivas->hQMetaData != NULL ) { sts[1]->bits_frame_channel = sub( sts[1]->bits_frame_channel, st_ivas->hQMetaData->metadata_max_bits ); @@ -526,12 +401,18 @@ ivas_error ivas_cpe_dec_fx( { /* compute bit-rate surplus per channel in combined format coding */ Word32 brate_surplus[CPE_CHANNELS]; - IF( EQ_16( (Word16) st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( (Word16) st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_16( (Word16) 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 ) ) { brate_surplus[0] = L_shr( L_mult( (Word16) L_shr( ( hCPE->brate_surplus / FRAMES_PER_SEC ), 1 ), FRAMES_PER_SEC ), 1 ); + move32(); brate_surplus[1] = L_sub( hCPE->brate_surplus, brate_surplus[0] ); + move32(); } + test(); + test(); IF( EQ_16( is_DTXrate( ivas_total_brate ), 1 ) && ( EQ_16( sts[0]->first_CNG, 0 ) || EQ_16( sts[1]->first_CNG, 0 ) ) ) { IF( ( error = initMdctStereoDtxData_fx( hCPE ) ) != IVAS_ERR_OK ) @@ -544,30 +425,34 @@ ivas_error ivas_cpe_dec_fx( FOR( n = 0; n < n_channels; n++ ) { IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) - { sts[n]->total_brate = SID_2k40; + move32(); sts[1]->bit_stream = sts[0]->bit_stream + SID_2k40 / FRAMES_PER_SEC; } ELSE { /*total bitrate must be set to the element bitrate to avoid false BER IF bits read are larger than half the bitrate*/ sts[n]->total_brate = hCPE->element_brate; + move32(); } - sts[n]->bits_frame_nominal = (Word16) ( sts[n]->total_brate / FRAMES_PER_SEC ); + sts[n]->bits_frame_nominal = extract_l( sts[n]->total_brate / FRAMES_PER_SEC ); sts[n]->bits_frame_channel = extract_l( L_shr( ( hCPE->element_brate / FRAMES_PER_SEC ), sub( n_channels, 1 ) ) ); /* subtract bit-rate for combined format coding */ - IF( EQ_16( (Word16) st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( (Word16) st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_16( (Word16) 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 ) ) { - sts[n]->bits_frame_channel = add( sts[n]->bits_frame_channel, (Word16) ( brate_surplus[n] / FRAMES_PER_SEC ) ); + sts[n]->bits_frame_channel = add( sts[n]->bits_frame_channel, extract_l( brate_surplus[n] / FRAMES_PER_SEC ) ); sts[n]->total_brate = L_add( sts[n]->total_brate, brate_surplus[n] ); } } IF( !st_ivas->hMCT ) { - IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_FORMAT ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { FOR( n = 0; n < n_channels; n++ ) { @@ -598,27 +483,35 @@ ivas_error ivas_cpe_dec_fx( IF( EQ_16( is_DTXrate( ivas_total_brate ), 1 ) ) { sts[n]->VAD = 0; + move16(); sts[n]->active_cnt = 0; + move16(); IF( sts[1] != NULL ) { sts[1]->active_cnt = 0; + move16(); } } ELSE { sts[n]->VAD = 1; + move16(); sts[n]->active_cnt++; sts[n]->active_cnt = s_min( sts[n]->active_cnt, 100 ); } /* set CNA flag */ + test(); + test(); IF( ( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && LE_32( hCPE->element_brate, CNA_MAX_BRATE_DFT_STEREO ) ) || LE_32( hCPE->element_brate, CNA_MAX_BRATE_STEREO ) ) { sts[n]->flag_cna = 1; + move16(); } ELSE { sts[n]->flag_cna = 0; + move16(); } } @@ -629,12 +522,14 @@ ivas_error ivas_cpe_dec_fx( { tdm_configure_dec( st_ivas->ivas_format, st_ivas->ism_mode, hCPE, &tdm_ratio_idx, nb_bits_metadata ); - sts[1]->bit_stream = sts[0]->bit_stream + (Word16) ( sts[0]->total_brate / FRAMES_PER_SEC ); + sts[1]->bit_stream = sts[0]->bit_stream + extract_l( sts[0]->total_brate / FRAMES_PER_SEC ); } ELSE { sts[1]->coder_type = sts[1]->last_coder_type; + move16(); tdm_ratio_idx = hCPE->hStereoTD->tdm_last_ratio_idx; + move16(); } } @@ -642,508 +537,228 @@ ivas_error ivas_cpe_dec_fx( * Core Decoder *----------------------------------------------------------------*/ + test(); + 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 ) ) ) { #ifndef TO_BE_REMOVED_CONVERSION - Word16 k; - - //{ - // sts = hCPE->hCoreCoder; - //} - - //core_coding_part will go in this loop, once the things are done - for (k = 0; k < n_channels; k++) - { - if (sts[k]->hTcxDec != NULL) - { - floatToFixed_arr(sts[k]->hHQ_core->old_out, sts[k]->hHQ_core->old_out_fx, 0, L_FRAME48k); - floatToFixed_arr(sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_out_LB_fx, 0, L_FRAME32k); - floatToFixed_arrL(sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_outLB_fx, 11, L_FRAME32k); - //sts[k]->hTcxDec->conceal_eof_gain32 = floatToFixed( sts[k]->hTcxDec->conceal_eof_gain_float, 15 ); - } - } - - if (hCPE != NULL && hCPE->last_element_mode == IVAS_CPE_MDCT && hCPE->element_mode == IVAS_CPE_DFT) - { - floatToFixed_arrL(hCPE->input_mem_LB[0], hCPE->input_mem_LB_fx[0], 11, STEREO_DFT32MS_OVL_16k); - } - - IF(sts[0]->element_mode == IVAS_CPE_MDCT && sts[0]->total_brate == SID_2k40) - { - FOR(Word16 ch = 0; ch < CPE_CHANNELS; ++ch) + Word16 k; + for ( k = 0; k < n_channels; k++ ) { - f2me_buf(sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, &sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, sts[ch]->hFdCngDec->hFdCngCom->stopBand - sts[ch]->hFdCngDec->hFdCngCom->startBand); - floatToFixed_arr(sts[ch]->hFdCngDec->hFdCngCom->A_cng_flt, sts[ch]->hFdCngDec->hFdCngCom->A_cng, Q14, M + 1); + if ( sts[k]->hTcxDec != NULL ) + { + floatToFixed_arr( sts[k]->hHQ_core->old_out, sts[k]->hHQ_core->old_out_fx, 0, L_FRAME48k ); + floatToFixed_arr( sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_out_LB_fx, 0, L_FRAME32k ); + floatToFixed_arrL( sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_outLB_fx, 11, L_FRAME32k ); + } } - } - - floatToFixed_arrL( output_flt[0], output[0], Q11, L_FRAME48k ); - floatToFixed_arrL( output_flt[1], output[1], Q11, L_FRAME48k ); #endif - IF( ( error = ivas_core_dec( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB, NULL, st_ivas->sba_dirac_stereo_flag ) ) != IVAS_ERR_OK ) + IF( ( 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 ) { return error; } - fixedToFloat_arrL(output[0], output_flt[0], Q11, L_FRAME48k); - fixedToFloat_arrL(output[1], output_flt[1], Q11, L_FRAME48k); } IF( st_ivas->hMCT ) { pop_wmops(); - + return error; } /*----------------------------------------------------------------* * Stereo decoder & upmixing *----------------------------------------------------------------*/ - for (int j = 0; j < output_frame; j++) - { - output[0][j] = (Word32)(output_flt[0][j] * (1 << *q_output)); - output[1][j] = (Word32)(output_flt[1][j] * (1 << *q_output)); - outputHB_fx[0][j] = (Word32)(outputHB[0][j] * (1 << *q_output)); - outputHB_fx[1][j] = (Word32)(outputHB[1][j] * (1 << *q_output)); - } + test(); + test(); 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 ) ) ) { - float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; - set_f( DFT[0], 0.0f, STEREO_DFT_BUF_MAX ); - set_f( DFT[1], 0.0f, STEREO_DFT_BUF_MAX ); + set32_fx( DFT_fx[0], 0, STEREO_DFT_BUF_MAX ); + set32_fx( DFT_fx[1], 0, STEREO_DFT_BUF_MAX ); #ifndef TO_BE_REMOVED_CONVERSION Word16 k; - - //{ - // sts = hCPE->hCoreCoder; - //} - - //core_coding_part will go in this loop, once the things are done - for (k = 0; k < n_channels; k++) - { - if (sts[k]->hTcxDec != NULL) - { - floatToFixed_arr(sts[k]->hHQ_core->old_out, sts[k]->hHQ_core->old_out_fx, 0, L_FRAME48k); - floatToFixed_arr(sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_out_LB_fx, 0, L_FRAME32k); - floatToFixed_arrL(sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_outLB_fx, 11, L_FRAME32k); - //sts[k]->hTcxDec->conceal_eof_gain32 = floatToFixed( sts[k]->hTcxDec->conceal_eof_gain_float, 15 ); - } - } - - if (hCPE != NULL && hCPE->last_element_mode == IVAS_CPE_MDCT && hCPE->element_mode == IVAS_CPE_DFT) + for ( k = 0; k < n_channels; k++ ) { - floatToFixed_arrL(hCPE->input_mem_LB[0], hCPE->input_mem_LB_fx[0], 11, STEREO_DFT32MS_OVL_16k); + if ( sts[k]->hTcxDec != NULL ) + { + floatToFixed_arr( sts[k]->hHQ_core->old_out, sts[k]->hHQ_core->old_out_fx, 0, L_FRAME48k ); + floatToFixed_arr( sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_out_LB_fx, 0, L_FRAME32k ); + floatToFixed_arrL( sts[k]->hHQ_core->old_outLB, sts[k]->hHQ_core->old_outLB_fx, 11, L_FRAME32k ); + } } - IF(sts[0]->element_mode == IVAS_CPE_MDCT && sts[0]->total_brate == SID_2k40) + IF( sts[0]->element_mode == IVAS_CPE_MDCT && sts[0]->total_brate == SID_2k40 ) { FOR(Word16 ch = 0; ch < CPE_CHANNELS; ++ch) { f2me_buf(sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, &sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, sts[ch]->hFdCngDec->hFdCngCom->stopBand - sts[ch]->hFdCngDec->hFdCngCom->startBand); - floatToFixed_arr(sts[ch]->hFdCngDec->hFdCngCom->A_cng_flt, sts[ch]->hFdCngDec->hFdCngCom->A_cng, Q14, M + 1); } } #endif - set32_fx( DFT_fx[0], 0, STEREO_DFT_BUF_MAX ); - set32_fx( DFT_fx[1], 0, STEREO_DFT_BUF_MAX ); /* core decoder */ - floatToFixed_arrL(output_flt[0], output[0], Q11, L_FRAME48k); - floatToFixed_arrL(output_flt[1], output[1], Q11, L_FRAME48k); - IF( ( error = ivas_core_dec( NULL, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB, DFT_fx, 0 ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_core_dec( NULL, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB_fx, DFT_fx, 0 ) ) != IVAS_ERR_OK ) { return error; } - fixedToFloat_arrL(output[0], output_flt[0], Q11, L_FRAME48k); - fixedToFloat_arrL(output[1], output_flt[1], Q11, L_FRAME48k); - fixedToFloat_arrL(DFT_fx[0], DFT[0], hCPE->hStereoDft->q_dft, STEREO_DFT_BUF_MAX); - fixedToFloat_arrL(DFT_fx[1], DFT[1], hCPE->hStereoDft->q_dft, STEREO_DFT_BUF_MAX); + // Scaling of DFT's + Word16 shift; + Word32 tmp1, tmp2; + maximum_abs_32_fx( DFT_fx[0], STEREO_DFT_BUF_MAX, &tmp1 ); + maximum_abs_32_fx( DFT_fx[1], STEREO_DFT_BUF_MAX, &tmp2 ); + + shift = s_min( ( tmp1 == 0 ) ? 31 : norm_l( tmp1 ), ( tmp2 == 0 ) ? 31 : norm_l( tmp2 ) ); + + IF( shift != 31 ) + { + shift = hCPE->hStereoDft->q_dft + shift - Q11; /* Q11 for guard bits */ + + IF( shift > hCPE->hStereoDft->q_dft ) + { + Scale_sig32( DFT_fx[0], STEREO_DFT_BUF_MAX, shift - hCPE->hStereoDft->q_dft ); + Scale_sig32( DFT_fx[1], STEREO_DFT_BUF_MAX, shift - hCPE->hStereoDft->q_dft ); + hCPE->hStereoDft->q_dft = shift; + } + } + ELSE + { + hCPE->hStereoDft->q_dft = Q8; + } /* DFT Stereo residual decoding */ + test(); IF( GT_16( hCPE->hStereoDft->res_cod_band_max, 0 ) && !st_ivas->bfi ) { -#ifndef IVAS_FLOAT_FIXED - stereo_dft_dec_res( hCPE, res_buf, output_flt[1] ); -#else - { - Word32 output_fix[L_FRAME8k]; - hCPE->hStereoDft->q_res_cod_mem_fx = 0; // keeping same as shift needed inside. - floatToFixed_arrL(hCPE->hStereoDft->res_cod_mem, hCPE->hStereoDft->res_cod_mem_fx, Q16, sizeof(hCPE->hStereoDft->res_cod_mem_fx) / sizeof(hCPE->hStereoDft->res_cod_mem_fx[0])); + Word16 q = Q11; + Word16 q_out_DFT[2]; - Copy_Scale_sig_32_16(hCPE->hCoreCoder[0]->old_pitch_buf_fx, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, 2 * NB_SUBFR16k + 2, -10); + Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->old_pitch_buf_fx, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, 2 * NB_SUBFR16k + 2, -10 ); - stereo_dft_dec_res_fx(hCPE, res_buf_fx, Q8, output_fix); + stereo_dft_dec_res_fx( hCPE, res_buf_fx, q_res_buf, output[1] ); - Copy_Scale_sig_16_32(hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, 10); + Copy_Scale_sig_16_32( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, 10 ); - fixedToFloat_arrL(hCPE->hStereoDft->res_cod_mem_fx, hCPE->hStereoDft->res_cod_mem, Q16, sizeof(hCPE->hStereoDft->res_cod_mem_fx) / sizeof(hCPE->hStereoDft->res_cod_mem_fx[0])); - fixedToFloat_arrL(&output_fix[0], output_flt[1], Q15, L_FRAME8k); - } -#endif + Scale_sig32( output[1], L_FRAME8k, Q11 - Q15 ); // Q15 -> Q11 + + q_out_DFT[0] = q_out_DFT[1] = hCPE->hStereoDft->q_dft; - stereo_dft_dec_analyze( hCPE, output_flt[1], DFT, 1, L_FRAME8k, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0 ); + stereo_dft_dec_analyze_fx( hCPE, output[1], DFT_fx, 1, L_FRAME8k, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, &q, q_out_DFT ); + + Scale_sig32( DFT_fx[1], STEREO_DFT_BUF_MAX, hCPE->hStereoDft->q_dft - q_out_DFT[1] ); } /* DFT stereo CNG */ -#ifndef IVAS_FLOAT_FIXED - stereo_dtf_cng( hCPE, ivas_total_brate, DFT, output_frame ); -#else { - Word16 q_dft, q_smoothed_psd; - float max_val = 0.0; - int i_max_val =0, i_max_val_psd = 0; - for (int ii = 0; ii < sizeof(DFT) / sizeof(DFT[0]); ii++) - { - for (int jj = 0; jj < sizeof(DFT[0]) / sizeof(DFT[0][0]); jj++) - { - if (max_val < fabs(DFT[ii][jj])) - { - max_val = (float)fabs(DFT[ii][jj]); - } - } - } - max_val = 0.0; - for (int ii = 0; ii < sizeof(sts[0]->hFdCngDec->smoothed_psd) / sizeof(sts[0]->hFdCngDec->smoothed_psd[0]); ii++) - { - if (max_val < fabs(sts[0]->hFdCngDec->smoothed_psd[ii])) - { - max_val = (float)fabs(sts[0]->hFdCngDec->smoothed_psd[ii]); - } - } - i_max_val_psd = (int)max_val; - sts[0]->hFdCngDec->q_smoothed_psd = norm_l(i_max_val_psd) - Q4; - i_max_val = (int)max_val; - q_dft = s_min(Q8, norm_l(i_max_val)); - //hCPE->hStereoDft->q_dft = norm_l(i_max_val); - //IF (hCPE->hStereoDft->q_dft > Q8) - //{ - // hCPE->hStereoDft->q_dft = Q8; - //} - floatToFixed_arrL(sts[0]->hFdCngDec->bandNoiseShape_float, sts[0]->hFdCngDec->bandNoiseShape, Q31 - sts[0]->hFdCngDec->bandNoiseShape_exp, FFTLEN2); - floatToFixed_arrL(&DFT[0][0], &DFT_fx[0][0], q_dft, sizeof(DFT) / sizeof(DFT[0][0])); - //floatToFixed_arr(&hCPE->hCoreCoder[0]->hTdCngDec->shb_lpcCNG[0], &hCPE->hCoreCoder[0]->hTdCngDec->shb_lpcCNG_fx[0], Q15, sizeof(hCPE->hCoreCoder[0]->hTdCngDec->shb_lpcCNG_fx) / sizeof(hCPE->hCoreCoder[0]->hTdCngDec->shb_lpcCNG_fx[0])); - floatToFixed_arr(&hCPE->hStereoCng->cm[0], &hCPE->hStereoCng->cm_fx[0], Q15, sizeof( hCPE->hStereoCng->cm_fx ) / sizeof( hCPE->hStereoCng->cm_fx[0] ) ); - floatToFixed_arr(&hCPE->hStereoCng->coh[0], &hCPE->hStereoCng->coh_fx[0], Q15, sizeof(hCPE->hStereoCng->coh_fx) / sizeof(hCPE->hStereoCng->coh_fx[0]) ); - floatToFixed_arrL(&sts[0]->hFdCngDec->smoothed_psd[0], &sts[0]->hFdCngDec->smoothed_psd_fx[0], sts[0]->hFdCngDec->q_smoothed_psd, sizeof(sts[0]->hFdCngDec->smoothed_psd_fx) / sizeof(sts[0]->hFdCngDec->smoothed_psd_fx[0])); - hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->q_cngNoiseLevel = s_max(0, Q31 - hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp); - floatToFixed_arrL(&hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[0], - &hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel[0], - hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->q_cngNoiseLevel, - FFTCLDFBLEN); + Word16 q_dft; + + q_dft = hCPE->hStereoDft->q_dft; + + //TODO : To check this + hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->q_cngNoiseLevel = Q31 - hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp; stereo_dtf_cng_fx( hCPE, ivas_total_brate, DFT_fx, output_frame, q_dft ); - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel[0], - &hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[0], - hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->q_cngNoiseLevel, - FFTCLDFBLEN); - fixedToFloat_arrL(&sts[0]->hFdCngDec->smoothed_psd_fx[0], &sts[0]->hFdCngDec->smoothed_psd[0], sts[0]->hFdCngDec->q_smoothed_psd, sizeof(sts[0]->hFdCngDec->smoothed_psd_fx) / sizeof(sts[0]->hFdCngDec->smoothed_psd_fx[0])); - fixedToFloat_arr(&hCPE->hStereoCng->coh_fx[0], &hCPE->hStereoCng->coh[0], Q15, sizeof(hCPE->hStereoCng->coh_fx) / sizeof(hCPE->hStereoCng->coh_fx[0]) ); - fixedToFloat_arr( &hCPE->hStereoCng->cm_fx[0], &hCPE->hStereoCng->cm[0], Q15, sizeof( hCPE->hStereoCng->cm_fx ) / sizeof( hCPE->hStereoCng->cm_fx[0] ) ); - //fixedToFloat_arr(&hCPE->hCoreCoder[0]->hTdCngDec->shb_lpcCNG_fx[0], &hCPE->hCoreCoder[0]->hTdCngDec->shb_lpcCNG[0], Q15, sizeof(hCPE->hCoreCoder[0]->hTdCngDec->shb_lpcCNG) / sizeof(hCPE->hCoreCoder[0]->hTdCngDec->shb_lpcCNG[0])); - fixedToFloat_arrL(sts[0]->hFdCngDec->bandNoiseShape, sts[0]->hFdCngDec->bandNoiseShape_float, Q31 - sts[0]->hFdCngDec->bandNoiseShape_exp, FFTLEN2); - fixedToFloat_arrL(&DFT_fx[0][0], &DFT[0][0], q_dft, sizeof(DFT) / sizeof(DFT[0][0])); + fixedToFloat_arrL( &hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel[0], + &hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[0], + hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->q_cngNoiseLevel, + FFTCLDFBLEN ); } -#endif /* decoding */ IF( EQ_16( hCPE->nchan_out, 1 ) ) { #if 1 - float l_hb_nrg = 0.0, l_hb_nrg_subr = 0.0; - float max_val = 0.0; - int i_max_val = 0, i_max_val_psd; - { - for (int ii = 0; ii < sizeof(sts[0]->hFdCngDec->smoothed_psd) / sizeof(sts[0]->hFdCngDec->smoothed_psd[0]); ii++) - { - if (max_val < fabs(sts[0]->hFdCngDec->smoothed_psd[ii])) - { - max_val = (float)fabs(sts[0]->hFdCngDec->smoothed_psd[ii]); - } - } - i_max_val_psd = (int)max_val; - sts[0]->hFdCngDec->q_smoothed_psd = norm_l(i_max_val_psd) - Q4; - max_val = 0.0; - for (int ii = 0; ii < sizeof(DFT) / sizeof(DFT[0]); ii++) + IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) { - for (int jj = 0; jj < sizeof(DFT[0]) / sizeof(DFT[0][0]); jj++) - { - if (max_val < fabs(DFT[ii][jj])) + hCPE->hStereoDft->q_smoothed_nrg = hCPE->hStereoDft->q_dft; + FOR( int ii = 0; ii < sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx ) / sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx[0] ); ii++ ) { - max_val = (float)fabs(DFT[ii][jj]); + hCPE->hStereoDft->q_DFT_past_DMX_fx[ii] = hCPE->hStereoDft->q_dft; } - } - } - i_max_val = (int)max_val; - hCPE->hStereoDft->q_dft = norm_l(i_max_val) - Q6; - IF(hCPE->hStereoDft->q_dft > Q15) - { - hCPE->hStereoDft->q_dft = Q15; - } - ELSE IF(hCPE->hStereoDft->q_dft < 0) - { - hCPE->hStereoDft->q_dft = 0; - } - //hCPE->hStereoDft->q_dft = s_min(hCPE->hStereoDft->q_dft, sts[0]->hFdCngDec->q_smoothed_psd); - IF(hCPE->hStereoDft->q_dft < 0) - { - hCPE->hStereoDft->q_dft = 0; - } - IF(EQ_16(hCPE->hStereoDft->first_frame, 1)) - { - hCPE->hStereoDft->q_smoothed_nrg = hCPE->hStereoDft->q_dft; - FOR(int ii = 0; ii < sizeof(hCPE->hStereoDft->q_DFT_past_DMX_fx) / sizeof(hCPE->hStereoDft->q_DFT_past_DMX_fx[0]); ii++) - { - hCPE->hStereoDft->q_DFT_past_DMX_fx[ii] = hCPE->hStereoDft->q_dft; - } - hCPE->hStereoDft->first_frame = 0; + hCPE->hStereoDft->first_frame = 0; } - floatToFixed_arrL(&DFT[0][0], &DFT_fx[0][0], hCPE->hStereoDft->q_dft, sizeof(DFT) / sizeof(DFT[0][0])); - floatToFixed_arrL(&hCPE->hStereoDft->res_cod_mem[0], &hCPE->hStereoDft->res_cod_mem_fx[0], hCPE->hStereoDft->q_dft, sizeof(hCPE->hStereoDft->res_cod_mem_fx) / sizeof(hCPE->hStereoDft->res_cod_mem_fx[0])); - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - if (l_hb_nrg_subr < hCPE->hStereoDft->hb_nrg_subr[ii]) - { - l_hb_nrg_subr = hCPE->hStereoDft->hb_nrg_subr[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg_subr = 0; - if (l_hb_nrg_subr > (float)MAX_32) - { - int quotient = (int)ceil(l_hb_nrg_subr / (float)MAX_32); - hCPE->hStereoDft->q_hb_nrg_subr = Q31 - norm_l(quotient); - } - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - hCPE->hStereoDft->hb_nrg_subr_fx[ii] = (Word32)(hCPE->hStereoDft->hb_nrg_subr[ii] / ((float)(1 << hCPE->hStereoDft->q_hb_nrg_subr))); - } - - - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_fx) / sizeof(hCPE->hStereoDft->hb_nrg_fx[0]); ii++) - { - if (l_hb_nrg < hCPE->hStereoDft->hb_nrg[ii]) - { - l_hb_nrg = hCPE->hStereoDft->hb_nrg[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg = 0; - if (l_hb_nrg > (float)MAX_32) - { - int quotient = (int)ceil(l_hb_nrg / (float)MAX_32); - hCPE->hStereoDft->q_hb_nrg = Q31 - norm_l(quotient); - } - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_fx) / sizeof(hCPE->hStereoDft->hb_nrg_fx[0]); ii++) - { - hCPE->hStereoDft->hb_nrg_fx[ii] = (Word32)(hCPE->hStereoDft->hb_nrg[ii] / ((float)(1 << hCPE->hStereoDft->q_hb_nrg))); - } - - floatToFixed_arr(&hCPE->hStereoCng->cm[0], &hCPE->hStereoCng->cm_fx[0], Q15, sizeof(hCPE->hStereoCng->cm_fx) / sizeof(hCPE->hStereoCng->cm_fx[0])); - } + scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_res_cod_mem_fx ) ); + hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft; #endif stereo_dft_unify_dmx_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng->prev_sid_nodata ); #if 1 - { - if (hCPE->hStereoDft->res_cod_band_max > 0) - { - if (!sts[0]->bfi) - { - fixedToFloat_arrL(&hCPE->hStereoDft->res_mem_fx[0], &hCPE->hStereoDft->res_mem[0], hCPE->hStereoDft->q_res_mem, 2 * hCPE->hStereoDft->band_limits[hCPE->hStereoDft->res_cod_band_max]); - } - else - { - fixedToFloat_arrL(&hCPE->hStereoDft->res_cod_mem_fx[0], &hCPE->hStereoDft->res_cod_mem[0], hCPE->hStereoDft->q_res_cod_mem_fx, sizeof(hCPE->hStereoDft->res_cod_mem_fx) / sizeof(hCPE->hStereoDft->res_cod_mem_fx[0])); - } - } - fixedToFloat_arrL(&DFT_fx[0][0], &DFT[0][0], hCPE->hStereoDft->q_dft, (sizeof(DFT) / (2 * sizeof(DFT[0][0])))); - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - hCPE->hStereoDft->hb_nrg_subr[0] = ((float)hCPE->hStereoDft->hb_nrg_subr_fx[0] * ((float)(1 << hCPE->hStereoDft->q_hb_nrg_subr))); - } - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_fx) / sizeof(hCPE->hStereoDft->hb_nrg_fx[0]); ii++) - { - hCPE->hStereoDft->hb_nrg[ii] = ((float)hCPE->hStereoDft->hb_nrg_fx[ii] * ((float)(1 << hCPE->hStereoDft->q_hb_nrg))); - } - fixedToFloat_arr(&hCPE->hStereoCng->cm_fx[0], &hCPE->hStereoCng->cm[0], Q15, sizeof(hCPE->hStereoCng->cm_fx) / sizeof(hCPE->hStereoCng->cm_fx[0])); - fixedToFloat_arrL(&hCPE->hStereoDft->td_gain_fx[0], &hCPE->hStereoDft->td_gain[0], Q15, sizeof(hCPE->hStereoDft->td_gain_fx) / sizeof(hCPE->hStereoDft->td_gain_fx[0])); - } + scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q16, hCPE->hStereoDft->q_res_cod_mem_fx ) ); + hCPE->hStereoDft->q_res_cod_mem_fx = Q16; #endif } ELSE { - float l_hb_nrg = 0.0, l_hb_nrg_subr = 0.0; - float max_val = 0.0; - int i_max_val = 0, i_max_val_psd; +#if 1 { - for (int ii = 0; ii < sizeof(sts[0]->hFdCngDec->smoothed_psd) / sizeof(sts[0]->hFdCngDec->smoothed_psd[0]); ii++) - { - if (max_val < fabs(sts[0]->hFdCngDec->smoothed_psd[ii])) - { - max_val = (float)fabs(sts[0]->hFdCngDec->smoothed_psd[ii]); - } - } - i_max_val_psd = (int)max_val; - sts[0]->hFdCngDec->q_smoothed_psd = norm_l(i_max_val_psd) - Q4; - max_val = 0.0; - for (int ii = 0; ii < sizeof(DFT) / sizeof(DFT[0]); ii++) - { - for (int jj = 0; jj < sizeof(DFT[0]) / sizeof(DFT[0][0]); jj++) - { - if (max_val < fabs(DFT[ii][jj])) - { - max_val = (float)fabs(DFT[ii][jj]); - } - } - } - i_max_val = (int)max_val; - hCPE->hStereoDft->q_dft = norm_l(i_max_val) - Q6; - IF (hCPE->hStereoDft->q_dft > Q15) - { - hCPE->hStereoDft->q_dft = Q15; - } - ELSE IF(hCPE->hStereoDft->q_dft < 0) - { - hCPE->hStereoDft->q_dft = 0; - } - hCPE->hStereoDft->q_dft = s_min(hCPE->hStereoDft->q_dft, sts[0]->hFdCngDec->q_smoothed_psd); - IF (hCPE->hStereoDft->q_dft < 0) - { - hCPE->hStereoDft->q_dft = 0; - } - IF (EQ_16(hCPE->hStereoDft->first_frame, 1)) + IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) { hCPE->hStereoDft->q_smoothed_nrg = hCPE->hStereoDft->q_dft; - FOR (int ii = 0; ii < sizeof(hCPE->hStereoDft->q_DFT_past_DMX_fx) / sizeof(hCPE->hStereoDft->q_DFT_past_DMX_fx[0]); ii++) + FOR( int ii = 0; ii < sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx ) / sizeof( hCPE->hStereoDft->q_DFT_past_DMX_fx[0] ); ii++ ) { - hCPE->hStereoDft->q_DFT_past_DMX_fx[ii] = hCPE->hStereoDft->q_dft; + hCPE->hStereoDft->q_DFT_past_DMX_fx[ii] = hCPE->hStereoDft->q_dft; } hCPE->hStereoDft->first_frame = 0; } - // sts[0]->hFdCngDec->cna_rescale_fact_fx = (Word16)floatToFixed(sts[0]->hFdCngDec->cna_rescale_fact, 15); - floatToFixed_arrL(&sts[0]->hFdCngDec->smoothed_psd[0], &sts[0]->hFdCngDec->smoothed_psd_fx[0], sts[0]->hFdCngDec->q_smoothed_psd, sizeof(sts[0]->hFdCngDec->smoothed_psd_fx) / sizeof(sts[0]->hFdCngDec->smoothed_psd_fx[0])); - floatToFixed_arrL(&DFT[0][0], &DFT_fx[0][0], hCPE->hStereoDft->q_dft , sizeof(DFT) / sizeof(DFT[0][0])); - floatToFixed_arrL(&hCPE->hStereoDft->res_cod_mem[0], &hCPE->hStereoDft->res_cod_mem_fx[0], hCPE->hStereoDft->q_dft, sizeof(hCPE->hStereoDft->res_cod_mem_fx) / sizeof(hCPE->hStereoDft->res_cod_mem_fx[0])); - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - if (l_hb_nrg_subr < hCPE->hStereoDft->hb_nrg_subr[ii]) - { - l_hb_nrg_subr = hCPE->hStereoDft->hb_nrg_subr[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg_subr = 0; - if (l_hb_nrg_subr > (float)MAX_32) - { - int quotient = (int) ceil(l_hb_nrg_subr / (float)MAX_32); - hCPE->hStereoDft->q_hb_nrg_subr = Q31 - norm_l(quotient); - } - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - hCPE->hStereoDft->hb_nrg_subr_fx[ii] = (Word32)(hCPE->hStereoDft->hb_nrg_subr[ii] / ((float)(1 << hCPE->hStereoDft->q_hb_nrg_subr))); - } - - - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_fx) / sizeof(hCPE->hStereoDft->hb_nrg_fx[0]); ii++) - { - if (l_hb_nrg < hCPE->hStereoDft->hb_nrg[ii]) - { - l_hb_nrg = hCPE->hStereoDft->hb_nrg[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg = 0; - if (l_hb_nrg > (float)MAX_32) - { - int quotient = (int) ceil(l_hb_nrg / (float)MAX_32); - hCPE->hStereoDft->q_hb_nrg = Q31 - norm_l(quotient); - } - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_fx) / sizeof(hCPE->hStereoDft->hb_nrg_fx[0]); ii++) - { - hCPE->hStereoDft->hb_nrg_fx[ii] = (Word32)(hCPE->hStereoDft->hb_nrg[ii] / ((float)(1 << hCPE->hStereoDft->q_hb_nrg))); - } - - //floatToFixed_arr(&sts[0]->hFdCngDec->cna_cm[0], &sts[0]->hFdCngDec->cna_cm_fx[0], Q15, sizeof(sts[0]->hFdCngDec->cna_cm_fx) / sizeof(sts[0]->hFdCngDec->cna_cm_fx[0])); - floatToFixed_arr(&hCPE->hStereoCng->cm[0], &hCPE->hStereoCng->cm_fx[0], Q15, sizeof(hCPE->hStereoCng->cm_fx) / sizeof(hCPE->hStereoCng->cm_fx[0])); - //floatToFixed_arr(&sts[0]->hFdCngDec->cna_g_state[0], &sts[0]->hFdCngDec->cna_g_state_fx[0], Q15, sizeof(sts[0]->hFdCngDec->cna_g_state_fx) / sizeof(sts[0]->hFdCngDec->cna_g_state_fx[0])); + scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_res_cod_mem_fx ) ); + hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft; } +#endif stereo_dft_dec_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); - { - // sts[0]->hFdCngDec->cna_rescale_fact = fixedToFloat(sts[0]->hFdCngDec->cna_rescale_fact_fx, 15); - fixedToFloat_arrL(&sts[0]->hFdCngDec->smoothed_psd_fx[0], &sts[0]->hFdCngDec->smoothed_psd[0], sts[0]->hFdCngDec->q_smoothed_psd, sizeof(sts[0]->hFdCngDec->smoothed_psd_fx) / sizeof(sts[0]->hFdCngDec->smoothed_psd_fx[0])); - fixedToFloat_arrL(&DFT_fx[0][0], &DFT[0][0], hCPE->hStereoDft->q_dft , sizeof(DFT) / sizeof(DFT[0][0])); - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - hCPE->hStereoDft->hb_nrg_subr[0] = ((float)hCPE->hStereoDft->hb_nrg_subr_fx[0] * ((float)(1 << hCPE->hStereoDft->q_hb_nrg_subr))); - } - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_fx) / sizeof(hCPE->hStereoDft->hb_nrg_fx[0]); ii++) - { - hCPE->hStereoDft->hb_nrg[ii] = ((float)hCPE->hStereoDft->hb_nrg_fx[ii] * ((float)(1 << hCPE->hStereoDft->q_hb_nrg))); - } - //fixedToFloat_arr(&sts[0]->hFdCngDec->cna_cm_fx[0], &sts[0]->hFdCngDec->cna_cm[0], Q15, sizeof(sts[0]->hFdCngDec->cna_cm_fx) / sizeof(sts[0]->hFdCngDec->cna_cm_fx[0])); - fixedToFloat_arr(&hCPE->hStereoCng->cm_fx[0], &hCPE->hStereoCng->cm[0], Q15, sizeof(hCPE->hStereoCng->cm_fx) / sizeof(hCPE->hStereoCng->cm_fx[0])); - //fixedToFloat_arr(&sts[0]->hFdCngDec->cna_g_state_fx[0], &sts[0]->hFdCngDec->cna_g_state[0], Q15, sizeof(sts[0]->hFdCngDec->cna_g_state_fx) / sizeof(sts[0]->hFdCngDec->cna_g_state_fx[0])); - fixedToFloat_arrL(&hCPE->hStereoDft->td_gain_fx[0], &hCPE->hStereoDft->td_gain[0], Q15, sizeof(hCPE->hStereoDft->td_gain_fx) / sizeof(hCPE->hStereoDft->td_gain_fx[0])); - fixedToFloat_arrL(&hCPE->hStereoDft->res_cod_mem_fx[0], &hCPE->hStereoDft->res_cod_mem[0], hCPE->hStereoDft->q_dft, sizeof(hCPE->hStereoDft->res_cod_mem_fx) / sizeof(hCPE->hStereoDft->res_cod_mem_fx[0])); - } +#if 1 + scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q16, hCPE->hStereoDft->q_res_cod_mem_fx ) ); + hCPE->hStereoDft->q_res_cod_mem_fx = Q16; +#endif } - /* synthesis iFFT */ FOR( n = 0; n < hCPE->nchan_out; n++ ) { -#ifndef IVAS_FLOAT_FIXED - stereo_dft_dec_synthesize( hCPE, DFT, n, output_flt[n], output_frame ); -#else + Scale_sig32( output[n], L_FRAME48k, sub( hCPE->hStereoDft->q_dft, Q11 ) ); + scale_sig32( hCPE->output_mem_fx[n], NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); hCPE->q_output_mem_fx[n] = hCPE->hStereoDft->q_dft; - //hCPE->lt_es_em_fx = floatToFixed(hCPE->lt_es_em, Q15); - floatToFixed_arrL(&DFT[n][0], &DFT_fx[n][0],hCPE->hStereoDft->q_dft, sizeof(DFT[n]) / sizeof(DFT[0][0])); - floatToFixed_arrL(&hCPE->output_mem[n][0], &hCPE->output_mem_fx[n][0], hCPE->hStereoDft->q_dft, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS )); - stereo_dft_dec_synthesize_fx( hCPE, DFT_fx, n, output[n], output_frame ); - fixedToFloat_arrL(&hCPE->output_mem_fx[n][0], &hCPE->output_mem[n][0], hCPE->hStereoDft->q_dft, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&DFT_fx[n][0], &DFT[n][0],hCPE->hStereoDft->q_dft, sizeof(DFT_fx[n]) / sizeof(DFT_fx[0][0])); - //hCPE->lt_es_em = fixedToFloat(hCPE->lt_es_em_fx, Q15); -#endif + move16(); } -#if 0 - //delete below - for (int j = 0; j < output_frame; j++) + /* synthesis iFFT */ + FOR( n = 0; n < hCPE->nchan_out; n++ ) { - output[0][j] = (Word32)(output_flt[0][j] * (1 << *q_output)); - output[1][j] = (Word32)(output_flt[1][j] * (1 << *q_output)); - outputHB_fx[0][j] = (Word32)(outputHB[0][j] * (1 << *q_output)); - outputHB_fx[1][j] = (Word32)(outputHB[1][j] * (1 << *q_output)); + stereo_dft_dec_synthesize_fx( hCPE, DFT_fx, n, output[n], output_frame ); } -#else - //delete below - for (int j = 0; j < output_frame; j++) + + // delete below + FOR( n = 0; n < hCPE->nchan_out; n++ ) { - output_flt[0][j] = ((float)output[0][j] / (1 << hCPE->hStereoDft->q_dft)); - output_flt[1][j] = ((float)output[1][j] / (1 << hCPE->hStereoDft->q_dft)); - output[0][j] = L_shl(output[0][j], sub(*q_output, hCPE->hStereoDft->q_dft)); - output[1][j] = L_shl(output[1][j], sub(*q_output, hCPE->hStereoDft->q_dft)); - outputHB_fx[0][j] = (Word32)(outputHB[0][j] * (1 << *q_output)); - outputHB_fx[1][j] = (Word32)(outputHB[1][j] * (1 << *q_output)); + Scale_sig32( output[n], L_FRAME48k, sub( Q11, hCPE->hStereoDft->q_dft ) ); + scale_sig32( hCPE->output_mem_fx[n], NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); + hCPE->q_output_mem_fx[n] = Q11; + move16(); } -#endif } ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { + test(); IF( NE_16( hCPE->last_element_mode, IVAS_CPE_TD ) && sts[0]->tdm_LRTD_flag ) { hCPE->hStereoTD->tdm_last_ratio_idx = tdm_ratio_idx; + move16(); } /* TD stereo upmixing */ - stereo_tdm_combine_fx(hCPE, output[0], output[1], output_frame, 0, tdm_ratio_idx); + stereo_tdm_combine_fx( hCPE, output[0], output[1], output_frame, 0, tdm_ratio_idx ); IF( sts[0]->tdm_LRTD_flag ) { - stereo_tdm_combine_fx(hCPE, outputHB_fx[0], outputHB_fx[1], output_frame, 0, tdm_ratio_idx); + stereo_tdm_combine_fx( hCPE, outputHB_fx[0], outputHB_fx[1], output_frame, 0, tdm_ratio_idx ); } hCPE->hStereoCng->last_tdm_idx = hCPE->hStereoTD->tdm_last_ratio_idx; + move16(); hCPE->hStereoTD->tdm_last_ratio_idx = tdm_ratio_idx; + move16(); IF( EQ_16( hCPE->nchan_out, 1 ) ) { @@ -1153,6 +768,7 @@ ivas_error ivas_cpe_dec_fx( FOR( i = 0; i < output_frame; i++ ) { output[0][i] = L_shr( L_add( output[0][i], output[1][i] ), 1 ); + move32(); } } } @@ -1160,15 +776,15 @@ ivas_error ivas_cpe_dec_fx( /*----------------------------------------------------------------* * Update parameters for stereo CNA *----------------------------------------------------------------*/ - //Delete below - IF(hCPE->hStereoDft != NULL) + // Delete below + IF( hCPE->hStereoDft != NULL ) { - Word16 q_td_gain = Q_factor_arr(hCPE->hStereoDft->td_gain, STEREO_DFT_CORE_HIST_MAX); - floatToFixed_arrL(hCPE->hStereoDft->td_gain, hCPE->hStereoDft->td_gain_fx, q_td_gain, STEREO_DFT_CORE_HIST_MAX); // Checking this. + //Word16 q_td_gain = Q_factor_arr( hCPE->hStereoDft->td_gain, STEREO_DFT_CORE_HIST_MAX ); + //floatToFixed_arrL( hCPE->hStereoDft->td_gain, hCPE->hStereoDft->td_gain_fx, q_td_gain, STEREO_DFT_CORE_HIST_MAX ); // Checking this. } //////Till here - //stereo_cna_update_params( hCPE, output_flt, output_frame, tdm_ratio_idx ); + // stereo_cna_update_params( hCPE, output_flt, output_frame, tdm_ratio_idx ); stereo_cna_update_params_fx( hCPE, output, output_frame, tdm_ratio_idx ); /*----------------------------------------------------------------* @@ -1177,155 +793,13 @@ ivas_error ivas_cpe_dec_fx( IF( !st_ivas->sba_dirac_stereo_flag ) { - // Delete below - Word16 output_q = OUTPUT_Q; - FOR( Word32 n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << output_q ) ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << output_q ) ); - } - } - } - IF( hCPE->hCoreCoder[n] != NULL ) - { - IF( hCPE->hCoreCoder[n]->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << output_q ) ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << output_q ) ); - } - } - - //FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); k++ ) - //{ - // hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[k] = (Word32) ( hCPE->hCoreCoder[n]->prev_synth_buffer[k] * ( 1 << output_q ) ); - //} - //FOR( Word32 k = 0; k < HQ_DELTA_MAX * HQ_DELAY_COMP; k++ ) - //{ - // hCPE->hCoreCoder[n]->delay_buf_out32_fx[k] = (Word32) ( hCPE->hCoreCoder[n]->delay_buf_out[k] * ( 1 << output_q ) ); - //} - IF( hCPE->hCoreCoder[n]->hTcxDec != NULL ) - { - FOR( Word32 k = 0; k < 111; k++ ) - { - //hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] = (Word32) ( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] * ( 1 << output_q ) ); - } - } - } - - IF( hCPE->output_mem[n] != NULL ) - { - FOR( Word32 k = 0; k < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->output_mem_fx[n][k] = (Word32) ( hCPE->output_mem[n][k] * ( 1 << output_q ) ); - } - } - IF( hCPE->input_mem[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB_fx[n][ind] = (Word32) ( hCPE->input_mem_LB[n][ind] * ( 1 << output_q ) ); - } - } - - //FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth_fx[n][k] = (Word32) ( hCPE->prev_hb_synth[n][k] * ( 1 << output_q ) ); - //} - FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth_fx[n][k] = (Word32) ( hCPE->prev_synth[n][k] * ( 1 << output_q ) ); - } - } - //till here - - synchro_synthesis_fx( ivas_total_brate, hCPE, output, output_frame, 0 ); - - // delete the below - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << output_q ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << output_q ); - } - } - } - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->output_mem[n] != NULL ) - { - FOR( Word32 k = 0; k < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->output_mem[n][k] = (float) hCPE->output_mem_fx[n][k] / ( 1u << 11 ); - } - } - IF( hCPE->hCoreCoder[n] != NULL ) - { - IF( hCPE->hCoreCoder[n]->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << output_q ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << output_q ); - } - } - //FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); k++ ) - //{ - // hCPE->hCoreCoder[n]->prev_synth_buffer[k] = (float) hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[k] / ( 1 << output_q ); - //} - //FOR( Word32 k = 0; k < HQ_DELTA_MAX * HQ_DELAY_COMP; k++ ) - //{ - // hCPE->hCoreCoder[n]->delay_buf_out[k] = (float) hCPE->hCoreCoder[n]->delay_buf_out32_fx[k] / ( 1 << output_q ); - //} - IF( hCPE->hCoreCoder[n]->hTcxDec != NULL ) - { - FOR( Word32 k = 0; k < 111; k++ ) - { - //hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] = (float) hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] / ( 1 << output_q ); - } - } - } - IF( hCPE->input_mem[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB[n][ind] = ( (float) hCPE->input_mem_LB_fx[n][ind] / ( 1 << output_q ) ); - } - } - //FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth[n][k] = (float) hCPE->prev_hb_synth_fx[n][k] / ( 1 << output_q ); - //} - FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth[n][k] = (float) hCPE->prev_synth_fx[n][k] / ( 1 << output_q ); - } - } - // till here + synchro_synthesis_fx( ivas_total_brate, hCPE, output, output_frame, 0 ); } + test(); + test(); + test(); + test(); IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->nchan_out, 1 ) && ( EQ_16( is_DTXrate( ivas_total_brate ), 0 ) || ( EQ_16( is_DTXrate( ivas_total_brate ), 1 ) && EQ_16( is_DTXrate( st_ivas->hDecoderConfig->last_ivas_total_brate ), 0 ) ) ) ) { applyDmxMdctStereo_fx( hCPE, output, output_frame ); @@ -1335,7 +809,7 @@ ivas_error ivas_cpe_dec_fx( * IC-BWE: output LB and HB mix in ACELP mode *----------------------------------------------------------------*/ - stereo_icBWE_decproc_fx(hCPE, output, outputHB_fx, last_core, last_bwidth, output_frame, *q_output); + stereo_icBWE_decproc_fx( hCPE, output, outputHB_fx, last_core, last_bwidth, output_frame, *q_output ); smooth_dft2td_transition_fx( hCPE, output, output_frame ); @@ -1343,13 +817,13 @@ ivas_error ivas_cpe_dec_fx( * Temporal ICA, stereo adjustment and upmix *----------------------------------------------------------------*/ - stereo_tca_dec_fx(hCPE, output, output_frame); + stereo_tca_dec_fx( hCPE, output, output_frame ); - //delete below - IF(hCPE->hStereoDft != NULL) + // delete below + IF( hCPE->hStereoDft != NULL ) { - Word16 q_td_gain = Q_factor_arr(hCPE->hStereoDft->td_gain, STEREO_DFT_CORE_HIST_MAX); - fixedToFloat_arrL(hCPE->hStereoDft->td_gain_fx, hCPE->hStereoDft->td_gain, q_td_gain, STEREO_DFT_CORE_HIST_MAX); // Checking this. + //Word16 q_td_gain = Q_factor_arr( hCPE->hStereoDft->td_gain, STEREO_DFT_CORE_HIST_MAX ); + //fixedToFloat_arrL( hCPE->hStereoDft->td_gain_fx, hCPE->hStereoDft->td_gain, q_td_gain, STEREO_DFT_CORE_HIST_MAX ); // Checking this. } /*----------------------------------------------------------------* @@ -1357,13 +831,17 @@ ivas_error ivas_cpe_dec_fx( *----------------------------------------------------------------*/ hCPE->last_element_brate = hCPE->element_brate; + move32(); hCPE->last_element_mode = hCPE->element_mode; + move32(); - IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { hCPE->element_brate = element_brate_ref; + move32(); } + test(); IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) || EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { stereo_cng_dec_update( hCPE, ivas_total_brate ); @@ -1372,10 +850,6 @@ ivas_error ivas_cpe_dec_fx( st_ivas->BER_detect = s_or( st_ivas->BER_detect, sts[0]->BER_detect ); st_ivas->BER_detect = s_or( st_ivas->BER_detect, sts[1]->BER_detect ); -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - free( output_flt[0] ); - free( output_flt[1] ); -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED pop_wmops(); return error; @@ -1464,14 +938,6 @@ ivas_error create_cpe_dec( hCPE->nchan_out = 1; } -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - //set_f( hCPE->prev_hb_synth[n], 0, NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - set_f( hCPE->prev_synth[n], 0, NS2SA( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ) ); - } -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED - FOR( n = 0; n < CPE_CHANNELS; n++ ) { set32_fx( hCPE->prev_hb_synth_fx[n], 0, NS2SA_fx2( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); @@ -1489,20 +955,6 @@ ivas_error create_cpe_dec( IF( EQ_16( (Word16) st_ivas->ivas_format, STEREO_FORMAT ) || EQ_16( (Word16) st_ivas->ivas_format, MASA_FORMAT ) || EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) || ( EQ_16( (Word16) st_ivas->ivas_format, MC_FORMAT ) && EQ_16( (Word16) st_ivas->mc_mode, MC_MODE_MCMASA ) ) || st_ivas->sba_dirac_stereo_flag ) { -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( ( hCPE->input_mem[i] = (float *) malloc( sizeof( float ) * NS2SA_fx2( output_Fs, STEREO_DFT32MS_OVL_NS ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); - } - set_zero( hCPE->input_mem[i], NS2SA_fx2( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - - IF( ( hCPE->input_mem_LB[i] = (float *) malloc( sizeof( float ) * STEREO_DFT32MS_OVL_16k ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); - } - set_zero( hCPE->input_mem_LB[i], STEREO_DFT32MS_OVL_16k ); -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( ( hCPE->input_mem_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * NS2SA_fx2( output_Fs, STEREO_DFT32MS_OVL_NS ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); @@ -1517,13 +969,6 @@ ivas_error create_cpe_dec( IF( EQ_16( i, 0 ) ) { -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( ( hCPE->input_mem_BPF[0] = (float *) malloc( sizeof( float ) * STEREO_DFT32MS_OVL_16k ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); - } - set_zero( hCPE->input_mem_BPF[0], STEREO_DFT32MS_OVL_16k ); -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED IF( ( hCPE->input_mem_BPF_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * STEREO_DFT32MS_OVL_16k ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); @@ -1531,20 +976,12 @@ ivas_error create_cpe_dec( set32_fx( hCPE->input_mem_BPF_fx[0], 0, STEREO_DFT32MS_OVL_16k ); } -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( ( hCPE->output_mem[i] = (float *) malloc( sizeof( float ) * NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); - } - set_zero( hCPE->output_mem[i], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( ( hCPE->output_mem_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * NS2SA_fx2( output_Fs, STEREO_DFT32MS_OVL_NS ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT stereo memory\n" ) ); } set32_fx( hCPE->output_mem_fx[i], 0, NS2SA_fx2( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - hCPE->q_output_mem_fx[i] = 0; + hCPE->q_output_mem_fx[i] = Q11; IF( LT_16( i, hCPE->nchan_out ) ) { IF( ( hCPE->prev_synth_chs_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * NS2SA_fx2( output_Fs, FRAME_SIZE_NS ) ) ) == NULL ) @@ -1569,15 +1006,6 @@ ivas_error create_cpe_dec( hCPE->output_mem_fx[i] = NULL; hCPE->q_output_mem_fx[i] = 0; hCPE->prev_synth_chs_fx[i] = NULL; -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - hCPE->input_mem[i] = NULL; - hCPE->input_mem_LB[i] = NULL; - if ( i == 0 ) - { - hCPE->input_mem_BPF[0] = NULL; - } - hCPE->output_mem[i] = NULL; -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED } } @@ -1620,10 +1048,17 @@ ivas_error create_cpe_dec( IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) || ( st_ivas->sba_dirac_stereo_flag && EQ_16( hCPE->cpe_id, 0 ) ) ) { +#ifdef IVAS_FLOAT_FIXED + IF( ( error = stereo_dft_dec_create_fx( &( hCPE->hStereoDft ), hCPE->element_brate, output_Fs, st_ivas->sba_dirac_stereo_flag, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } +#else IF( ( error = stereo_dft_dec_create( &( hCPE->hStereoDft ), hCPE->element_brate, output_Fs, st_ivas->sba_dirac_stereo_flag, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) { return error; } +#endif } /*-----------------------------------------------------------------* @@ -1744,7 +1179,7 @@ ivas_error create_cpe_dec( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Stereo CNG\n" ) ); } - stereo_cng_init_dec( hCPE->hStereoCng, &hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize ); + stereo_cng_init_dec_fx( hCPE->hStereoCng, &hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->frameSize ); } st_ivas->hCPE[cpe_id] = hCPE; @@ -1815,16 +1250,10 @@ void destroy_cpe_dec( hCPE->hStereoICBWE = NULL; } - IF( hCPE->input_mem_LB[0] != NULL ) + IF( hCPE->input_mem_LB_fx[0] != NULL ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) { - free( hCPE->input_mem_LB[n] ); - hCPE->input_mem_LB[n] = NULL; - free( hCPE->input_mem[n] ); - hCPE->input_mem[n] = NULL; - free( hCPE->output_mem[n] ); - hCPE->output_mem[n] = NULL; #ifdef IVAS_FLOAT_FIXED free( hCPE->input_mem_LB_fx[n] ); hCPE->input_mem_LB_fx[n] = NULL; @@ -1840,8 +1269,6 @@ void destroy_cpe_dec( hCPE->prev_synth_chs_fx[n] = NULL; } } - free( hCPE->input_mem_BPF[0] ); - hCPE->input_mem_BPF[0] = NULL; #ifdef IVAS_FLOAT_FIXED free( hCPE->input_mem_BPF_fx[0] ); hCPE->input_mem_BPF_fx[0] = NULL; @@ -1877,9 +1304,11 @@ static void read_stereo_mode_and_bwidth_fx( * BFI or NO_DATA frame: Use stereo parameters from last (active) frame *-----------------------------------------------------------------*/ + test(); IF( st_ivas->bfi || LT_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) { hCPE->element_mode = hCPE->last_element_mode; + move16(); } /*-----------------------------------------------------------------* @@ -1892,41 +1321,46 @@ static void read_stereo_mode_and_bwidth_fx( { case SID_DFT_STEREO: hCPE->element_mode = IVAS_CPE_DFT; + move16(); /* Read CNG type */ - hCPE->hCoreCoder[0]->cng_type = get_next_indice( hCPE->hCoreCoder[0], 1 ); + hCPE->hCoreCoder[0]->cng_type = get_next_indice_fx( hCPE->hCoreCoder[0], 1 ); /* Read BW information in SID */ - hCPE->hCoreCoder[0]->bwidth = get_next_indice( hCPE->hCoreCoder[0], 2 ); + hCPE->hCoreCoder[0]->bwidth = get_next_indice_fx( hCPE->hCoreCoder[0], 2 ); BREAK; case SID_MDCT_STEREO: /* 2TC SBA DTX also uses MDCT-Stereo DTX */ case SID_SBA_2TC: hCPE->element_mode = IVAS_CPE_MDCT; + move16(); BREAK; case SID_SBA_1TC: assert( !"Forbidden value for SID format in CPE (SBA 1TC), should have already been adressed earlier" ); BREAK; case SID_MASA_1TC: hCPE->element_mode = IVAS_SCE; + move16(); BREAK; case SID_MASA_2TC: /* 2TC MASA DTX uses MDCT or DFT based core */ IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { hCPE->element_mode = IVAS_CPE_DFT; + move16(); } IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { /* Read CNG type */ - hCPE->hCoreCoder[0]->cng_type = get_next_indice( hCPE->hCoreCoder[0], 1 ); + hCPE->hCoreCoder[0]->cng_type = get_next_indice_fx( hCPE->hCoreCoder[0], 1 ); /* Read BW information in SID */ - hCPE->hCoreCoder[0]->bwidth = get_next_indice( hCPE->hCoreCoder[0], 2 ); + hCPE->hCoreCoder[0]->bwidth = get_next_indice_fx( hCPE->hCoreCoder[0], 2 ); } BREAK; default: /* this is what has been done for all modes previously, may need adaptation in the future */ hCPE->element_mode = hCPE->last_element_mode; + move16(); BREAK; } } @@ -1938,35 +1372,42 @@ static void read_stereo_mode_and_bwidth_fx( ELSE { sts = hCPE->hCoreCoder; + test(); IF( st_ivas->hMCT && NE_16( hCPE->cpe_id, 0 ) ) { sts[0]->bwidth = st_ivas->hCPE[0]->hCoreCoder[0]->bwidth; + move16(); sts[1]->bwidth = st_ivas->hCPE[0]->hCoreCoder[0]->bwidth; + move16(); } ELSE { /* read stereo technology info */ + test(); IF( LT_32( hCPE->element_brate, MIN_BRATE_MDCT_STEREO ) && st_ivas->hMCT == NULL ) { - hCPE->element_mode = add( get_next_indice( sts[0], NBITS_ELEMENT_MODE ), IVAS_CPE_DFT ); + hCPE->element_mode = add( get_next_indice_fx( sts[0], NBITS_ELEMENT_MODE ), IVAS_CPE_DFT ); } ELSE { hCPE->element_mode = IVAS_CPE_MDCT; + move16(); } /* read the bandwidth */ IF( LT_32( hCPE->element_brate, MIN_BRATE_FB_STEREO ) ) { /* WB and SWB are supported */ - sts[0]->bwidth = add( get_next_indice( sts[0], 1 ), WB ); + sts[0]->bwidth = add( get_next_indice_fx( sts[0], 1 ), WB ); sts[1]->bwidth = sts[0]->bwidth; + move16(); } ELSE { /* WB, SWB and FB are supported */ - sts[0]->bwidth = get_next_indice( sts[0], NBITS_BWIDTH ); + sts[0]->bwidth = get_next_indice_fx( sts[0], NBITS_BWIDTH ); sts[1]->bwidth = sts[0]->bwidth; + move16(); } } } @@ -1988,30 +1429,38 @@ static void stereo_mode_combined_format_dec_fx( { Word32 element_brate_ref; - IF( EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { element_brate_ref = hCPE->element_brate; + move32(); - IF( EQ_16( (Word16) st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && ( ( EQ_16( st_ivas->nchan_ism, 3 ) && EQ_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_96k ) ) || ( EQ_16( st_ivas->nchan_ism, 4 ) && EQ_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_128k ) ) ) ) { IF( !st_ivas->bfi ) { /* read OMASA stereo mode signalling */ - IF( get_next_indice( hCPE->hCoreCoder[0], NBITS_ELEMENT_MODE ) ) + IF( get_next_indice_fx( hCPE->hCoreCoder[0], NBITS_ELEMENT_MODE ) ) { hCPE->element_mode = IVAS_CPE_MDCT; + move16(); } ELSE { hCPE->element_mode = IVAS_CPE_DFT; + move16(); } } IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { hCPE->element_brate = IVAS_64k; + move32(); hCPE->brate_surplus = L_sub( hCPE->brate_surplus, L_sub( hCPE->element_brate, element_brate_ref ) ); } } diff --git a/lib_dec/ivas_decision_matrix_dec.c b/lib_dec/ivas_decision_matrix_dec.c index 3e6b18cdcf409da1907b42350bd4c26a352483bc..9477675909409ba1225df795af51951b136c0d3a 100644 --- a/lib_dec/ivas_decision_matrix_dec.c +++ b/lib_dec/ivas_decision_matrix_dec.c @@ -53,7 +53,7 @@ static Word16 get_next_index_4_by_15[16] = 0, 2184, 4369, 6553, 8738, 10922, 13107, 15291, 17476, 19660, 21845, 24029, 26214, 28398, 30583, 32767 }; #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void ivas_decision_matrix_dec( Decoder_State *st, /* i/o: decoder state structure */ int16_t *sharpFlag, /* o : formant sharpening flag */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index fff08a3a15e9e2719bb45403647de51ac0092fb1..2594011d3ebdc5b6ce0427c43c17cb92e6fe1597 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -185,7 +185,7 @@ static ivas_error ivas_dirac_rend_config_fx( /*Todo: remove float code*/ float *proto_frame_f_old; #ifdef IVAS_FLOAT_FIXED - Word16 *proto_frame_f_old_fx; + Word32 *proto_frame_f_old_fx; #endif Word16 proto_signal_decorr_on_old; uint16_t i, j, k; @@ -641,6 +641,7 @@ static ivas_error ivas_dirac_rend_config_fx( } } set32_fx( hDirACRend->hoa_encoder_fx, 0, nchan_out_woLFE * hDirACRend->num_outputs_diff ); + hDirACRend->hoa_encoder_len = nchan_out_woLFE * hDirACRend->num_outputs_diff; compute_hoa_encoder_mtx_fx( ls_azimuth_fx, ls_elevation_fx, hDirACRend->hoa_encoder_fx, hDirACRend->num_outputs_diff, hDirACRend->hOutSetup.ambisonics_order ); FOR( i = 0; i < nchan_out_woLFE * hDirACRend->num_outputs_diff; i++ ) @@ -708,7 +709,7 @@ static ivas_error ivas_dirac_rend_config_fx( free( st_ivas->hoa_dec_mtx ); st_ivas->hoa_dec_mtx = NULL; } - IF( ( error = ivas_sba_get_hoa_dec_matrix( hDirACRend->hOutSetup, &st_ivas->hoa_dec_mtx, hDirACRend->hOutSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_sba_get_hoa_dec_matrix_fx( hDirACRend->hOutSetup, &st_ivas->hoa_dec_mtx, hDirACRend->hOutSetup.ambisonics_order ) ) != IVAS_ERR_OK ) { return error; } @@ -731,7 +732,7 @@ static ivas_error ivas_dirac_rend_config_fx( hDirACRend->proto_signal_decorr_on = 0; } - IF( ( EQ_16( flag_config, DIRAC_OPEN && hDirACRend->proto_signal_decorr_on ) ) || ( EQ_16( flag_config, DIRAC_RECONFIGURE ) && ( hDirACRend->proto_signal_decorr_on && !proto_signal_decorr_on_old ) ) ) + IF( ( EQ_16( flag_config, DIRAC_OPEN) && hDirACRend->proto_signal_decorr_on ) || ( EQ_16( flag_config, DIRAC_RECONFIGURE ) && ( hDirACRend->proto_signal_decorr_on && !proto_signal_decorr_on_old ) ) ) { #ifdef IVAS_FLOAT_FIXED FOR( int ii = 0; ii < st_ivas->hSpatParamRendCom->num_freq_bands; ii++ ) @@ -812,20 +813,24 @@ static ivas_error ivas_dirac_rend_config_fx( IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - /*TODO : remove float code*/ +#if 1 /*TODO : remove float code*/ + IF( EQ_16( flag_config, DIRAC_RECONFIGURE ) && hDirACRend->proto_frame_f ) + { + free( hDirACRend->proto_frame_f ); + } + hDirACRend->proto_frame_f = NULL; +#endif IF( EQ_16( flag_config, DIRAC_RECONFIGURE ) && hDirACRend->proto_frame_f_fx ) { free( hDirACRend->proto_frame_f_fx ); - free( hDirACRend->proto_frame_f ); } hDirACRend->proto_frame_f_fx = NULL; - hDirACRend->proto_frame_f = NULL; } ELSE { IF( EQ_16( flag_config, DIRAC_OPEN ) || ( EQ_16( flag_config, DIRAC_RECONFIGURE ) && hDirACRend->proto_frame_f_fx == NULL ) ) { - IF( ( hDirACRend->proto_frame_f_fx = (Word16 *) malloc( sizeof( Word16 ) * 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands ) ) == NULL ) + 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" ) ); } @@ -834,11 +839,12 @@ static ivas_error ivas_dirac_rend_config_fx( { proto_frame_f_old_fx = hDirACRend->proto_frame_f_fx; free( proto_frame_f_old_fx ); - IF( ( hDirACRend->proto_frame_f_fx = (Word16 *) malloc( sizeof( Word16 ) * 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands ) ) == NULL ) + 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; #ifdef TRUE /*Todo : to remove float code*/ if ( flag_config == DIRAC_OPEN || ( flag_config == DIRAC_RECONFIGURE && hDirACRend->proto_frame_f == NULL ) ) @@ -873,21 +879,21 @@ static ivas_error ivas_dirac_rend_config_fx( { FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { - IF( ( hDirACRend->buffer_intensity_real_fx[i][j] = (Word16 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ) ) ) == NULL ) + IF( ( hDirACRend->buffer_intensity_real_fx[i][j] = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } - set16_fx( hDirACRend->buffer_intensity_real_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( hDirACRend->buffer_intensity_real_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); } } IF( hDirACRend->buffer_energy_fx == NULL ) { - IF( ( hDirACRend->buffer_energy_fx = (Word16 *) malloc( DIRAC_NO_COL_AVG_DIFF * CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ) ) ) == NULL ) + IF( ( hDirACRend->buffer_energy_fx = (Word32 *) malloc( DIRAC_NO_COL_AVG_DIFF * CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } } - set16_fx( hDirACRend->buffer_energy_fx, 0, DIRAC_NO_COL_AVG_DIFF * CLDFB_NO_CHANNELS_MAX ); + set32_fx( hDirACRend->buffer_energy_fx, 0, DIRAC_NO_COL_AVG_DIFF * CLDFB_NO_CHANNELS_MAX ); #ifdef TRUE for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { @@ -1605,7 +1611,7 @@ static ivas_error ivas_dirac_rend_config( * Open or reconfigure decoder DirAC/MASA handle *-------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -ivas_error ivas_dirac_dec_config( +ivas_error ivas_dirac_dec_config_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const DIRAC_CONFIG_FLAG flag_config_inp /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ ) @@ -2021,12 +2027,12 @@ void ivas_dirac_dec_close_fx( } #endif /*------------------------------------------------------------------------- - * ivas_dirac_dec_read_BS() + * ivas_dirac_dec_read_BS_fx() * * Read DirAC parameters from the bitstream *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -void ivas_dirac_dec_read_BS( +void ivas_dirac_dec_read_BS_fx( const Word32 ivas_total_brate, /* i : IVAS total bitrate */ Decoder_State *st, /* i/o: decoder state structure */ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ @@ -3387,7 +3393,7 @@ void ivas_dirac_dec_set_md_map_fx( * DirAC decoding renderer process *------------------------------------------------------------------------*/ -void ivas_dirac_dec_render( +void ivas_dirac_dec_render_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const Word16 nchan_transport, /* i : number of transport channels */ const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ @@ -3440,7 +3446,7 @@ void ivas_dirac_dec_render( FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { - ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL ); + ivas_dirac_dec_render_sf_fx( st_ivas, output_f_local, nchan_transport, NULL, NULL ); n_samples_sf = i_mult( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->slot_size ); @@ -3565,13 +3571,14 @@ void ivas_dirac_dec_render( } #endif +#ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- - * ivas_dirac_dec_render_sf() + * ivas_dirac_dec_render_sf_fx() * * DirAC decoding renderer process *------------------------------------------------------------------------*/ -void ivas_dirac_dec_render_sf( +void ivas_dirac_dec_render_sf_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ const int16_t nchan_transport, /* i : number of transport channels */ @@ -3592,11 +3599,11 @@ void ivas_dirac_dec_render_sf( float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - int16_t index, num_freq_bands; + int16_t index = 0, num_freq_bands = 0; /* local copies of azi, ele, diffuseness */ - int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; - int16_t elevation[CLDFB_NO_CHANNELS_MAX]; + Word16 azimuth[CLDFB_NO_CHANNELS_MAX]; + Word16 elevation[CLDFB_NO_CHANNELS_MAX]; float diffuseness_vector[CLDFB_NO_CHANNELS_MAX]; #ifdef IVAS_FLOAT_FIXED Word32 diffuseness_vector_fx[CLDFB_NO_CHANNELS_MAX]; @@ -3615,15 +3622,18 @@ void ivas_dirac_dec_render_sf( Word32 pppQMfFrame_ts_im_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_RealBuffer_fx[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_ImagBuffer_fx[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; set_zero_fx(surCohRatio_fx, CLDFB_NO_CHANNELS_MAX); - Word16 q_cldfb, q_temp_cldfb;; - Word32 proto_frame_f_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX]; + Word16 q_cldfb, q_temp_cldfb = 0; + //Word32 proto_frame_f_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX]; + Word32 proto_direct_buffer_f_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX]; Word32 proto_power_smooth_fx[2 * CLDFB_NO_CHANNELS_MAX * MAX_OUTPUT_CHANNELS]; Word32 reference_power_fix[5 * CLDFB_NO_CHANNELS_MAX]; - Word32 onset_filter_subframe_fix[2 * MAX_OUTPUT_CHANNELS]; + Word32 onset_filter_subframe_fix[2 * CLDFB_NO_CHANNELS_MAX]; Word32 proto_diffuse_buffer_f_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX]; - set_zero_fx( &proto_frame_f_fx[0], 2 * MAX_OUTPUT_CHANNELS * CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ); + //set_zero_fx( &proto_frame_f_fx[0], 2 * MAX_OUTPUT_CHANNELS * CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &proto_direct_buffer_f_fx[0], 2 * CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX * MAX_OUTPUT_CHANNELS ); set_zero_fx( &proto_power_smooth_fx[0], 2 * CLDFB_NO_CHANNELS_MAX * MAX_OUTPUT_CHANNELS ); set_zero_fx( &reference_power_fix[0], 5 * CLDFB_NO_CHANNELS_MAX ); @@ -3665,6 +3675,7 @@ void ivas_dirac_dec_render_sf( IF( EQ_16( hDirAC->hConfig->dec_param_estim, FALSE ) ) { mvr2r( hSpatParamRendCom->diffuseness_vector[hSpatParamRendCom->render_to_md_map[hSpatParamRendCom->subframes_rendered]], diffuseness_vector, hSpatParamRendCom->num_freq_bands ); + //Copy32( hSpatParamRendCom->diffuseness_vector_fx[hSpatParamRendCom->render_to_md_map[hSpatParamRendCom->subframes_rendered]], diffuseness_vector_fx, hSpatParamRendCom->num_freq_bands ); floatToFixed_arrL32( diffuseness_vector, hSpatParamRendCom->diffuseness_vector_fx[hSpatParamRendCom->render_to_md_map[hSpatParamRendCom->subframes_rendered]], Q30, hSpatParamRendCom->num_freq_bands ); md_idx = hSpatParamRendCom->render_to_md_map[hSpatParamRendCom->subframes_rendered]; } @@ -3743,7 +3754,8 @@ void ivas_dirac_dec_render_sf( { st_ivas->hMasa->hMasaLfeSynth->transportEneSmooth_fx = floatToFixed_32( st_ivas->hMasa->hMasaLfeSynth->transportEneSmooth, st_ivas->hMasa->hMasaLfeSynth->transportEneSmooth_q ); st_ivas->hMasa->hMasaLfeSynth->protoLfeEneSmooth_fx = floatToFixed_32( st_ivas->hMasa->hMasaLfeSynth->protoLfeEneSmooth, st_ivas->hMasa->hMasaLfeSynth->protoLfeEneSmooth_q ); - st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_fx = floatToFixed_32( st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth, st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_q ); + f2me( st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth, &st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_fx, &st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_q ); + st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_q = sub( 31, st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_q ); st_ivas->hMasa->hMasaLfeSynth->targetEneTransSmooth_fx = floatToFixed_32( st_ivas->hMasa->hMasaLfeSynth->targetEneTransSmooth, st_ivas->hMasa->hMasaLfeSynth->targetEneTransSmooth_q ); } @@ -3782,17 +3794,17 @@ void ivas_dirac_dec_render_sf( ELSE { floatToFixed_arrL32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, proto_power_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, i_mult( 2, hSpatParamRendCom->num_freq_bands ) ); - IF(hDirACRend->masa_stereo_type_detect) - { - IF(hDirACRend->masa_stereo_type_detect->subtract_target_ratio_db == -INFINITY) - { - hDirACRend->masa_stereo_type_detect->subtract_target_ratio_db_fx = MIN_32; - } - ELSE - { - hDirACRend->masa_stereo_type_detect->subtract_target_ratio_db_fx = floatToFixed(hDirACRend->masa_stereo_type_detect->subtract_target_ratio_db, Q21); - } - } + IF( hDirACRend->masa_stereo_type_detect ) + { + IF( hDirACRend->masa_stereo_type_detect->subtract_target_ratio_db == -INFINITY ) + { + hDirACRend->masa_stereo_type_detect->subtract_target_ratio_db_fx = MIN_32; + } + ELSE + { + hDirACRend->masa_stereo_type_detect->subtract_target_ratio_db_fx = floatToFixed( hDirACRend->masa_stereo_type_detect->subtract_target_ratio_db, Q21 ); + } + } } BREAK; case 1: @@ -3800,6 +3812,23 @@ void ivas_dirac_dec_render_sf( BREAK; } } + IF( EQ_16( hDirAC->hConfig->dec_param_estim, TRUE ) ) + { + //Word16 val = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + FOR( i = 0; i < 32; i++ ) + { + Word16 exp1 = 0, exp2 = 0, exp3 = 0; + f2me_buf( hDirACRend->buffer_intensity_real[0][i], hDirACRend->buffer_intensity_real_fx[0][i], &exp1, hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + f2me_buf( hDirACRend->buffer_intensity_real[1][i], hDirACRend->buffer_intensity_real_fx[1][i], &exp2, hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + f2me_buf( hDirACRend->buffer_intensity_real[2][i], hDirACRend->buffer_intensity_real_fx[2][i], &exp3, hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + hDirACRend->q_buffer_intensity_real[i] = sub( 31, s_max( s_max( exp1, exp2 ), exp3 ) ); + scale_sig32( hDirACRend->buffer_intensity_real_fx[0][i], hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band], sub( hDirACRend->q_buffer_intensity_real[i], sub( 31, exp1 ) ) ); + scale_sig32( hDirACRend->buffer_intensity_real_fx[1][i], hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band], sub( hDirACRend->q_buffer_intensity_real[i], sub( 31, exp2 ) ) ); + scale_sig32( hDirACRend->buffer_intensity_real_fx[2][i], hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band], sub( hDirACRend->q_buffer_intensity_real[i], sub( 31, exp3 ) ) ); + f2me_buf( &hDirACRend->buffer_energy[i * hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]], &hDirACRend->buffer_energy_fx[i * hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]], &hDirACRend->q_buffer_energy[i], hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + hDirACRend->q_buffer_energy[i] = sub( 31, hDirACRend->q_buffer_energy[i] ); + } + } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// hodirac_flag = ivas_get_hodirac_flag_fx( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); @@ -4060,7 +4089,7 @@ void ivas_dirac_dec_render_sf( Word16 Q_input = Q11; move16(); q_temp_cldfb = Q11; - generate_masking_noise_dirac_fx( st->hFdCngDec->hFdCngCom, + generate_masking_noise_dirac_ivas_fx( st->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], st_ivas->hTcBuffer->tc_fx[1], Cldfb_RealBuffer_fx[1][0], @@ -4117,7 +4146,7 @@ void ivas_dirac_dec_render_sf( } ELSE IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { - protoSignalComputation2_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, proto_frame_f_fx, + protoSignalComputation2_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, hDirACRend->proto_frame_f_fx, &hDirACRend->proto_frame_f_q, proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, @@ -4137,7 +4166,7 @@ void ivas_dirac_dec_render_sf( case 6: case 4: protoSignalComputation4_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, - proto_frame_f_fx, + hDirACRend->proto_frame_f_fx, &hDirACRend->proto_frame_f_q, proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, @@ -4152,7 +4181,7 @@ void ivas_dirac_dec_render_sf( hDirACRend->sba_map_tc, q_cldfb ); BREAK; case 2: - protoSignalComputation2_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, proto_frame_f_fx, + protoSignalComputation2_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, hDirACRend->proto_frame_f_fx, &hDirACRend->proto_frame_f_q, proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, @@ -4168,7 +4197,7 @@ void ivas_dirac_dec_render_sf( BREAK; case 1: protoSignalComputation1_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, - proto_frame_f_fx, + hDirACRend->proto_frame_f_fx, &hDirACRend->proto_frame_f_q, proto_direct_buffer_f_fx, &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, @@ -4185,6 +4214,54 @@ void ivas_dirac_dec_render_sf( } } + /*-----------------------------------------------------------------* + * Compute DirAC parameters at decoder side + *-----------------------------------------------------------------*/ + IF( EQ_16( hDirAC->hConfig->dec_param_estim, TRUE ) ) + { + Copy( &hSpatParamRendCom->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], sub( hSpatParamRendCom->num_freq_bands, hDirAC->hConfig->enc_param_start_band ) ); + Copy( &hSpatParamRendCom->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], sub( hSpatParamRendCom->num_freq_bands, hDirAC->hConfig->enc_param_start_band ) ); + IF( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && EQ_16( st_ivas->hCombinedOrientationData->shd_rot_max_order, 0 ) ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + move16(); + rotateAziEle_DirAC_fx( azimuth, elevation, num_freq_bands, hSpatParamRendCom->num_freq_bands, p_Rmat_fx ); + } + + /*hDirACRend->index_buffer_intensity = ( hDirACRend->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1 */ + IF( EQ_16( hDirACRend->index_buffer_intensity, 0 ) ) + { + hDirACRend->index_buffer_intensity = 1; + } + ELSE + { + hDirACRend->index_buffer_intensity = add( sub( hDirACRend->index_buffer_intensity, i_mult( idiv1616( hDirACRend->index_buffer_intensity, DIRAC_NO_COL_AVG_DIFF ), DIRAC_NO_COL_AVG_DIFF ) ), 1 ); /* averaging_length = 32 */ + } + + index = hDirACRend->index_buffer_intensity; + move16(); + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + move16(); + + computeIntensityVector_dec_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, + q_cldfb, num_freq_bands, + hDirACRend->buffer_intensity_real_fx[0][sub( index, 1 )], + hDirACRend->buffer_intensity_real_fx[1][sub( index, 1 )], + hDirACRend->buffer_intensity_real_fx[2][sub( index, 1 )], + &hDirACRend->q_buffer_intensity_real[sub( index, 1 )] ); + + computeDirectionAngles_fx( hDirACRend->buffer_intensity_real_fx[0][sub( index, 1 )], + hDirACRend->buffer_intensity_real_fx[1][sub( index, 1 )], + hDirACRend->buffer_intensity_real_fx[2][sub( index, 1 )], + hDirACRend->q_buffer_intensity_real[sub( index, 1 )], + num_freq_bands, azimuth, elevation ); + + Copy32( reference_power_fix, &( hDirACRend->buffer_energy_fx[i_mult( sub( index, 1 ), num_freq_bands )] ), num_freq_bands ); + hDirACRend->q_buffer_energy[sub( index, 1 )] = DirAC_mem.reference_power_q; + move16(); + + computeDiffuseness_fixed( hDirACRend->buffer_intensity_real_fx, hDirACRend->buffer_energy_fx, num_freq_bands, hSpatParamRendCom->diffuseness_vector_fx[md_idx], hDirACRend->q_buffer_intensity_real, hDirACRend->q_buffer_energy, &hSpatParamRendCom->q_diffuseness_vector ); + } ////////////////////////////////////////////// to be removed /////////////////////////////////////////////////////////////// IF( EQ_16( hDirAC->hConfig->dec_param_estim, FALSE ) && EQ_16( slot_idx, 0 ) ) { @@ -4250,7 +4327,7 @@ void ivas_dirac_dec_render_sf( fixedToFloat_arrL32( Cldfb_ImagBuffer_fx[MAX_OUTPUT_CHANNELS - 1][slot_idx], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][slot_idx], Q6, CLDFB_NO_CHANNELS_MAX ); st_ivas->hMasa->hMasaLfeSynth->transportEneSmooth = fixedToFloat_32( st_ivas->hMasa->hMasaLfeSynth->transportEneSmooth_fx, st_ivas->hMasa->hMasaLfeSynth->transportEneSmooth_q ); st_ivas->hMasa->hMasaLfeSynth->protoLfeEneSmooth = fixedToFloat_32( st_ivas->hMasa->hMasaLfeSynth->protoLfeEneSmooth_fx, st_ivas->hMasa->hMasaLfeSynth->protoLfeEneSmooth_q ); - st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth = fixedToFloat_32( st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_fx, st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_q ); + st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth = me2f( st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_fx, sub( 31, st_ivas->hMasa->hMasaLfeSynth->targetEneLfeSmooth_q ) ); st_ivas->hMasa->hMasaLfeSynth->targetEneTransSmooth = fixedToFloat_32( st_ivas->hMasa->hMasaLfeSynth->targetEneTransSmooth_fx, st_ivas->hMasa->hMasaLfeSynth->targetEneTransSmooth_q ); } @@ -4275,7 +4352,7 @@ void ivas_dirac_dec_render_sf( { fixedToFloat_arrL32( proto_power_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, i_mult( 2, hSpatParamRendCom->num_freq_bands ) ); fixedToFloat_arrL32( &proto_direct_buffer_f_fx[i_mult( i_mult( i_mult( slot_idx, 2 ), hSpatParamRendCom->num_freq_bands ), 2 )], hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f + i_mult( i_mult( i_mult( slot_idx, 2 ), hSpatParamRendCom->num_freq_bands ), 2 ), hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, i_mult( 4, hSpatParamRendCom->num_freq_bands ) ); - fixedToFloat_arrL32( proto_frame_f_fx, hDirACRend->proto_frame_f, hDirACRend->proto_frame_f_q, i_mult( 6, hSpatParamRendCom->num_freq_bands ) ); + fixedToFloat_arrL32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f, hDirACRend->proto_frame_f_q, i_mult( 6, hSpatParamRendCom->num_freq_bands ) ); fixedToFloat_arrL32( reference_power_fix, reference_power, DirAC_mem.reference_power_q, hSpatParamRendCom->num_freq_bands ); IF( hDirACRend->masa_stereo_type_detect ) { @@ -4293,7 +4370,7 @@ void ivas_dirac_dec_render_sf( offset = i_mult( i_mult( slot_idx, 2 ), i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff ) ); fixedToFloat_arrL32( proto_power_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff ) ); fixedToFloat_arrL32( &proto_direct_buffer_f_fx[offset], &hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f[offset], hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, i_mult( 2, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff ) ) ); - fixedToFloat_arrL32( proto_frame_f_fx, hDirACRend->proto_frame_f, hDirACRend->proto_frame_f_q, i_mult( 2, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff ) ) ); + fixedToFloat_arrL32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f, hDirACRend->proto_frame_f_q, i_mult( 2, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff ) ) ); fixedToFloat_arrL32( reference_power_fix, reference_power, DirAC_mem.reference_power_q, hSpatParamRendCom->num_freq_bands ); BREAK; case 2: @@ -4311,18 +4388,25 @@ void ivas_dirac_dec_render_sf( hDirACRend->masa_stereo_type_detect->subtract_power_y = fixedToFloat_32( hDirACRend->masa_stereo_type_detect->subtract_power_y_fx, hDirACRend->masa_stereo_type_detect->q_subtract_power_y ); } } - fixedToFloat_arrL32( proto_frame_f_fx, hDirACRend->proto_frame_f, hDirACRend->proto_frame_f_q, i_mult( 6, hSpatParamRendCom->num_freq_bands ) ); + fixedToFloat_arrL32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f, hDirACRend->proto_frame_f_q, i_mult( 6, hSpatParamRendCom->num_freq_bands ) ); fixedToFloat_arrL32( reference_power_fix, reference_power, DirAC_mem.reference_power_q, hSpatParamRendCom->num_freq_bands ); BREAK; case 1: fixedToFloat_arrL32( proto_power_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hSpatParamRendCom->num_freq_bands ); fixedToFloat_arrL32( &proto_direct_buffer_f_fx[i_mult( slot_idx, i_mult( 2, hSpatParamRendCom->num_freq_bands ) )], hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f + i_mult( slot_idx, i_mult( 2, hSpatParamRendCom->num_freq_bands ) ), hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, i_mult( 2, hSpatParamRendCom->num_freq_bands ) ); - fixedToFloat_arrL32( proto_frame_f_fx, hDirACRend->proto_frame_f, hDirACRend->proto_frame_f_q, i_mult( 2, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_diff ) ) ); + fixedToFloat_arrL32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f, hDirACRend->proto_frame_f_q, i_mult( 2, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_diff ) ) ); fixedToFloat_arrL32( reference_power_fix, reference_power, DirAC_mem.reference_power_q, hSpatParamRendCom->num_freq_bands ); BREAK; } } - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + IF( EQ_16( hDirAC->hConfig->dec_param_estim, TRUE ) ) + { + fixedToFloat_arrL32( hDirACRend->buffer_intensity_real_fx[0][index - 1], hDirACRend->buffer_intensity_real[0][index - 1], hDirACRend->q_buffer_intensity_real[index - 1], hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + fixedToFloat_arrL32( hDirACRend->buffer_intensity_real_fx[1][index - 1], hDirACRend->buffer_intensity_real[1][index - 1], hDirACRend->q_buffer_intensity_real[index - 1], hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + fixedToFloat_arrL32( hDirACRend->buffer_intensity_real_fx[2][index - 1], hDirACRend->buffer_intensity_real[2][index - 1], hDirACRend->q_buffer_intensity_real[index - 1], hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + fixedToFloat_arrL32( hSpatParamRendCom->diffuseness_vector_fx[md_idx], hSpatParamRendCom->diffuseness_vector[md_idx], hSpatParamRendCom->q_diffuseness_vector, hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + fixedToFloat_arrL32( &hDirACRend->buffer_energy_fx[( index - 1 ) * num_freq_bands], &hDirACRend->buffer_energy[( index - 1 ) * num_freq_bands], hDirACRend->q_buffer_energy[index - 1], hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ); + } #else float dirEne; float surCohEner; @@ -4814,7 +4898,6 @@ void ivas_dirac_dec_render_sf( return; } } -#endif /*-----------------------------------------------------------------* * Compute DirAC parameters at decoder side @@ -4854,7 +4937,7 @@ void ivas_dirac_dec_render_sf( computeDiffuseness( hDirACRend->buffer_intensity_real, hDirACRend->buffer_energy, num_freq_bands, hSpatParamRendCom->diffuseness_vector[md_idx] ); } - +#endif /*-----------------------------------------------------------------* * frequency domain decorrelation @@ -4905,8 +4988,11 @@ void ivas_dirac_dec_render_sf( hDirACRend->proto_frame_dec_f = DirAC_mem.frame_dec_f; p_onset_filter = onset_filter; #ifdef IVAS_FLOAT_FIXED - floatToFixed_arrL( onset_filter, onset_filter_fx, Q30, hSpatParamRendCom->num_freq_bands ); + hDirACRend->proto_frame_dec_f_fx = DirAC_mem.frame_dec_f_fx; + hDirACRend->proto_frame_dec_f_q = DirAC_mem.frame_dec_f_q; + hDirACRend->proto_frame_dec_f_len = DirAC_mem.frame_dec_f_len; p_onset_filter_fx = onset_filter_fx; + floatToFixed_arrL(onset_filter, onset_filter_fx, Q30, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff); #endif } } @@ -4927,6 +5013,9 @@ void ivas_dirac_dec_render_sf( hDirACRend->proto_frame_dec_f = hDirACRend->proto_frame_f; p_onset_filter = NULL; #ifdef IVAS_FLOAT_FIXED + hDirACRend->proto_frame_dec_f_fx = hDirACRend->proto_frame_f_fx; + hDirACRend->proto_frame_dec_f_len = hDirACRend->proto_frame_f_len; + hDirACRend->proto_frame_dec_f_q = hDirACRend->proto_frame_f_q; p_onset_filter_fx = NULL; #endif } @@ -4939,10 +5028,270 @@ void ivas_dirac_dec_render_sf( if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) { /*Compute diffuse prototypes*/ +#ifdef IVAS_FLOAT_FIXED + /* Float to fixed */ + if (hDirACRend->h_output_synthesis_psd_params.max_band_decorr != 0) + { + f2me_buf(hDirACRend->proto_frame_dec_f, hDirACRend->proto_frame_dec_f_fx, &hDirACRend->proto_frame_dec_f_q, hDirACRend->proto_frame_dec_f_len); + hDirACRend->proto_frame_dec_f_q = 31 - hDirACRend->proto_frame_dec_f_q; + DIRAC_OUTPUT_SYNTHESIS_STATE *state = &(hDirACRend->h_output_synthesis_psd_state); + f2me_buf(state->proto_power_diff_smooth, state->proto_power_diff_smooth_fx, &state->proto_power_diff_smooth_q, state->proto_power_diff_smooth_len); + state->proto_power_diff_smooth_q = 31 - state->proto_power_diff_smooth_q; + Word16 diffuse_start = slot_idx * 2 * hDirACRend->h_output_synthesis_psd_params.max_band_decorr * hDirACRend->hOutSetup.nchan_out_woLFE; + state->proto_diffuse_buffer_f_q = 31; + f2me_buf(state->proto_diffuse_buffer_f, state->proto_diffuse_buffer_f_fx, &state->proto_diffuse_buffer_f_q, diffuse_start); + state->proto_diffuse_buffer_f_q = 31 - state->proto_diffuse_buffer_f_q; + } + ivas_dirac_dec_compute_diffuse_proto_fx( hDirACRend, hSpatParamRendCom->num_freq_bands, slot_idx ); + /* Fixed to float */ + if (hDirACRend->h_output_synthesis_psd_params.max_band_decorr != 0) + { + DIRAC_OUTPUT_SYNTHESIS_STATE *state = &(hDirACRend->h_output_synthesis_psd_state); + me2f_buf(state->proto_power_diff_smooth_fx, + 31 - state->proto_power_diff_smooth_q, + state->proto_power_diff_smooth, + state->proto_power_diff_smooth_len); + me2f_buf(state->proto_diffuse_buffer_f_fx, + 31 - state->proto_diffuse_buffer_f_q, + state->proto_diffuse_buffer_f, + state->proto_diffuse_buffer_f_len); + } +#else ivas_dirac_dec_compute_diffuse_proto( hDirACRend, hSpatParamRendCom->num_freq_bands, slot_idx ); +#endif } /*Compute PSDs*/ +#ifdef IVAS_FLOAT_FIXED +#if 1 // TO BE REMOVED + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; + DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; + + h_dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + h_dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + + Word16 num_channels_dir = hDirACRend->num_outputs_dir; + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) + { + num_channels_dir = hDirACRend->hOutSetup.nchan_out_woLFE; + } + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac_flag ) + { + IF( EQ_16( hDirACRend->panningConf, DIRAC_PANNING_VBAP ) ) + { + IF( EQ_16( hSpatParamRendCom->numParametricDirections, 2 ) ) + { + floatToFixed_arr( hDirACRend->diffuse_response_function, hDirACRend->diffuse_response_function_fx, Q15, hDirACRend->num_outputs_dir ); + floatToFixed_arrL( hSpatParamRendCom->energy_ratio1[md_idx], hSpatParamRendCom->energy_ratio1_fx[md_idx], Q30, hSpatParamRendCom->num_freq_bands ); + floatToFixed_arrL( hSpatParamRendCom->energy_ratio2[md_idx], hSpatParamRendCom->energy_ratio2_fx[md_idx], Q30, hSpatParamRendCom->num_freq_bands ); + } + } + } + + if ( hDirAC->hConfig->dec_param_estim == FALSE && hodirac_flag ) + { + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + floatToFixed_arrL( hSpatParamRendCom->energy_ratio1[md_idx], hSpatParamRendCom->energy_ratio1_fx[md_idx], Q30, hSpatParamRendCom->num_freq_bands ); + floatToFixed_arrL( hSpatParamRendCom->energy_ratio2[md_idx], hSpatParamRendCom->energy_ratio2_fx[md_idx], Q30, hSpatParamRendCom->num_freq_bands ); + } + } + else if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + IF( EQ_16( hDirACRend->panningConf, DIRAC_PANNING_VBAP ) ) + { + IF( EQ_16( hSpatParamRendCom->numParametricDirections, 2 ) ) + { + floatToFixed_arr( hDirACRend->diffuse_response_function, hDirACRend->diffuse_response_function_fx, Q15, hDirACRend->num_outputs_dir ); + floatToFixed_arrL( hSpatParamRendCom->energy_ratio1[md_idx], hSpatParamRendCom->energy_ratio1_fx[md_idx], Q30, hSpatParamRendCom->num_freq_bands ); + floatToFixed_arrL( hSpatParamRendCom->energy_ratio2[md_idx], hSpatParamRendCom->energy_ratio2_fx[md_idx], Q30, hSpatParamRendCom->num_freq_bands ); + } + } + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + floatToFixed_arrL32( reference_power, reference_power_fix, DirAC_mem.reference_power_q, hSpatParamRendCom->num_freq_bands * (min( 4, nchan_transport ) + 1)); + } + else + { + + } + } + + if ( h_dirac_output_synthesis_params->use_onset_filters && (hDirAC->hConfig->dec_param_estim != TRUE && hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD)) + { + h_dirac_output_synthesis_state->diffuse_power_factor_q = Q31; + floatToFixed_arrL( h_dirac_output_synthesis_state->diffuse_power_factor, h_dirac_output_synthesis_state->diffuse_power_factor_fx, h_dirac_output_synthesis_state->diffuse_power_factor_q, h_dirac_output_synthesis_params->max_band_decorr ); + + h_dirac_output_synthesis_state->diffuse_responses_square_q = Q31; + floatToFixed_arrL( h_dirac_output_synthesis_state->diffuse_responses_square, h_dirac_output_synthesis_state->diffuse_responses_square_fx, h_dirac_output_synthesis_state->diffuse_responses_square_q, num_channels_dir ); + + h_dirac_output_synthesis_state->q_cy_auto_diff_smooth = L_get_q_buf( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + floatToFixed_arrL( h_dirac_output_synthesis_state->cy_auto_diff_smooth, h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + + floatToFixed_arrL(hDirACRend->stack_mem.onset_filter, p_onset_filter_fx, Q30, ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) ? hDirACRend->num_outputs_diff * hSpatParamRendCom->num_freq_bands : 2 * hSpatParamRendCom->num_freq_bands ); + } + + if ( hDirAC->hConfig->dec_param_estim == TRUE && hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD) + { + h_dirac_output_synthesis_state->direct_power_factor_q = Q31; + floatToFixed_arrL( h_dirac_output_synthesis_state->direct_power_factor, h_dirac_output_synthesis_state->direct_power_factor_fx, h_dirac_output_synthesis_state->direct_power_factor_q, hSpatParamRendCom->num_freq_bands ); + + h_dirac_output_synthesis_state->q_cy_auto_dir_smooth = L_get_q_buf( h_dirac_output_synthesis_state->cy_auto_dir_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + floatToFixed_arrL( h_dirac_output_synthesis_state->cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_auto_dir_smooth_fx, h_dirac_output_synthesis_state->q_cy_auto_dir_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + + h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = L_get_q_buf( h_dirac_output_synthesis_state->cy_cross_dir_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + floatToFixed_arrL( h_dirac_output_synthesis_state->cy_cross_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + + h_dirac_output_synthesis_state->direct_responses_q = Q31; + floatToFixed_arrL( h_dirac_output_synthesis_state->direct_responses, h_dirac_output_synthesis_state->direct_responses_fx, h_dirac_output_synthesis_state->direct_responses_q, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + + h_dirac_output_synthesis_state->direct_responses_square_q = Q31; + floatToFixed_arrL( h_dirac_output_synthesis_state->direct_responses_square, h_dirac_output_synthesis_state->direct_responses_square_fx, h_dirac_output_synthesis_state->direct_responses_square_q, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + + h_dirac_output_synthesis_state->diffuse_power_factor_q = Q31; + floatToFixed_arrL( h_dirac_output_synthesis_state->diffuse_power_factor, h_dirac_output_synthesis_state->diffuse_power_factor_fx, h_dirac_output_synthesis_state->diffuse_power_factor_q, hSpatParamRendCom->num_freq_bands ); + + h_dirac_output_synthesis_state->q_cy_auto_diff_smooth = L_get_q_buf( h_dirac_output_synthesis_state->cy_auto_diff_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + floatToFixed_arrL( h_dirac_output_synthesis_state->cy_auto_diff_smooth, h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + + h_dirac_output_synthesis_state->diffuse_responses_square_q = Q31; + floatToFixed_arrL( h_dirac_output_synthesis_state->diffuse_responses_square, h_dirac_output_synthesis_state->diffuse_responses_square_fx, h_dirac_output_synthesis_state->diffuse_responses_square_q, num_channels_dir ); + } +#endif + IF ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) + { + ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fix, + DirAC_mem.reference_power_q, + p_onset_filter_fx, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector_fx[md_idx], + hSpatParamRendCom->q_diffuseness_vector, + hSpatParamRendCom, + hDirACRend, + st_ivas->hCombinedOrientationData->shd_rot_max_order, + p_Rmat_fx, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + } + ELSE + { + ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fix, + DirAC_mem.reference_power_q, + p_onset_filter_fx, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector_fx[md_idx], + hSpatParamRendCom->q_diffuseness_vector, + hSpatParamRendCom, + hDirACRend, + 0, + 0, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + } + +#if 1 + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac_flag ) + { + IF( st_ivas->hMasa == NULL && EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) + { + fixedToFloat_arrL( hDirACRend->h_output_synthesis_psd_state.direct_responses_fx, hDirACRend->h_output_synthesis_psd_state.direct_responses, hDirACRend->h_output_synthesis_psd_state.direct_responses_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); + + IF( hodirac_flag ) + { + fixedToFloat_arrL( &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir )], &hDirACRend->h_output_synthesis_psd_state.direct_responses[i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir )], hDirACRend->h_output_synthesis_psd_state.direct_responses_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); + } + } + ELSE + { + fixedToFloat_arrL( hDirACRend->h_output_synthesis_psd_state.direct_responses_fx, hDirACRend->h_output_synthesis_psd_state.direct_responses, hDirACRend->h_output_synthesis_psd_state.direct_responses_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); + IF( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + fixedToFloat_arrL( hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx, hDirACRend->h_output_synthesis_psd_state.direct_responses_square, hDirACRend->h_output_synthesis_psd_state.direct_responses_square_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); + } + } + } + if ( hDirAC->hConfig->dec_param_estim == FALSE && hodirac_flag ) + { + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + fixedToFloat_arrL(h_dirac_output_synthesis_state->direct_power_factor_fx, h_dirac_output_synthesis_state->direct_power_factor, h_dirac_output_synthesis_state->direct_power_factor_q, 2*hSpatParamRendCom->num_freq_bands); + fixedToFloat_arrL(h_dirac_output_synthesis_state->diffuse_power_factor_fx, h_dirac_output_synthesis_state->diffuse_power_factor, h_dirac_output_synthesis_state->diffuse_power_factor_q, 2*hSpatParamRendCom->num_freq_bands); + } + else + { + FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + hDirACRend->h_output_synthesis_psd_state.direct_power_factor[i] = me2f( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i], 31 - hDirACRend->h_output_synthesis_psd_state.direct_power_factor_q ); + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor[i] = me2f( hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx[i], 31 -hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_q ); + } + } + } + else if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + IF( st_ivas->hMasa == NULL && EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) + { + fixedToFloat_arrL( hDirACRend->h_output_synthesis_psd_state.direct_responses_fx, hDirACRend->h_output_synthesis_psd_state.direct_responses, hDirACRend->h_output_synthesis_psd_state.direct_responses_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); + + IF( hodirac_flag ) + { + fixedToFloat_arrL( &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir )], &hDirACRend->h_output_synthesis_psd_state.direct_responses[i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir )], hDirACRend->h_output_synthesis_psd_state.direct_responses_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); + } + } + ELSE + { + fixedToFloat_arrL( hDirACRend->h_output_synthesis_psd_state.direct_responses_fx, hDirACRend->h_output_synthesis_psd_state.direct_responses, hDirACRend->h_output_synthesis_psd_state.direct_responses_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); + IF( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + fixedToFloat_arrL( hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx, hDirACRend->h_output_synthesis_psd_state.direct_responses_square, hDirACRend->h_output_synthesis_psd_state.direct_responses_square_q, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); + } + } + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + hDirACRend->h_output_synthesis_psd_state.direct_power_factor[i] = me2f( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i], 31 - h_dirac_output_synthesis_state->direct_power_factor_q ); + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor[i] = me2f( hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx[i], 31 - h_dirac_output_synthesis_state->diffuse_power_factor_q ); + } + fixedToFloat_arrL( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, h_dirac_output_synthesis_state->cy_cross_dir_smooth, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, (num_channels_dir) * hSpatParamRendCom->num_freq_bands ); + } + else + { + + FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + hDirACRend->h_output_synthesis_psd_state.direct_power_factor[i] = fix_to_float( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i], hDirACRend->h_output_synthesis_psd_state.direct_power_factor_q ); + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor[i] = fix_to_float( hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx[i], hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_q ); + } + + } + } + + if ( h_dirac_output_synthesis_params->use_onset_filters && (hDirAC->hConfig->dec_param_estim != TRUE && hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD)) + { + fixedToFloat_arrL( h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, hDirACRend->num_outputs_diff * hSpatParamRendCom->num_freq_bands ); + } + + if ( hDirAC->hConfig->dec_param_estim == TRUE && hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD) + { + fixedToFloat_arrL( h_dirac_output_synthesis_state->cy_auto_dir_smooth_fx, h_dirac_output_synthesis_state->cy_auto_dir_smooth, h_dirac_output_synthesis_state->q_cy_auto_dir_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + fixedToFloat_arrL( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, h_dirac_output_synthesis_state->cy_cross_dir_smooth, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + fixedToFloat_arrL( h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, num_channels_dir * hSpatParamRendCom->num_freq_bands ); + } +#endif +#else if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) { ivas_dirac_dec_output_synthesis_process_slot( reference_power, @@ -4979,7 +5328,7 @@ void ivas_dirac_dec_render_sf( hodirac_flag, hDirAC->hConfig->dec_param_estim ); } - +#endif if ( hDirAC->hConfig->dec_param_estim ) { float fac = 1.0f / (float) hSpatParamRendCom->subframe_nbslots[subframe_idx]; @@ -5186,26 +5535,1323 @@ void ivas_dirac_dec_render_sf( index_slot = slot_idx_start_cldfb_synth; - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) +#ifdef IVAS_FLOAT_FIXED + //////////////////////////////////////////////// FLOAT TO FIXED ///////////////////////////////////////////// + for (int idx1 = 0; idx1 < MAX_OUTPUT_CHANNELS; idx1++) + { + for (int idx2 = 0; idx2 < MAX_PARAM_SPATIAL_SUBFRAMES; idx2++) + { + for (int idx3 = 0; idx3 < CLDFB_NO_CHANNELS_MAX; idx3++) + { + Cldfb_RealBuffer_fx[idx1][idx2][idx3] = floatToFixed(Cldfb_RealBuffer[idx1][idx2][idx3], Q6); + Cldfb_ImagBuffer_fx[idx1][idx2][idx3] = floatToFixed(Cldfb_ImagBuffer[idx1][idx2][idx3], Q6); + + } + } + } + + Word32 output_buf_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + if (st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) + { + // Float to fixed + for (i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++) + { + floatToFixed_arrL(output_f[i], output_buf_fx[i], Q11, L_FRAME48k); + } + } + else if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) + { + /* output_f not being used here. */ + } + else + { + Word16 outchannels = add(hDirACRend->hOutSetup.nchan_out_woLFE, hDirACRend->hOutSetup.num_lfe); + + IF(hDirACRend->hOutSetup.separateChannelEnabled && (hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_2 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_4 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1_4 || + (hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found))) + { + outchannels = add(outchannels, 1); + } + + for (i = 0; i < outchannels; i++) + { + floatToFixed_arrL(output_f[i], output_buf_fx[i], Q11, L_FRAME48k); + } + } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#endif + +#ifdef IVAS_FLOAT_FIXED + IF( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { /* render objects in combined format onto the CICP19 channels for BINAURAL_ROOM_IR */ - if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + IF ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { - int16_t in_ch; - for ( in_ch = 0; in_ch < st_ivas->nchan_ism; in_ch++ ) + Word16 in_ch; + FOR ( in_ch = 0; in_ch < st_ivas->nchan_ism; in_ch++ ) { - int16_t j, k, j2, l; - int16_t num_objects, nchan_out_woLFE, lfe_index; - int16_t az1, el1; - int16_t n_slots_to_render; - int16_t n_samples_to_render; - int16_t interp_offset; - float gain, prev_gain; + Word16 j, k, j2, l; + Word16 num_objects, nchan_out_woLFE, lfe_index; + Word16 az1, el1; + Word16 n_slots_to_render; + Word16 n_samples_to_render; + Word16 interp_offset; + + Word32 gain_fx, prev_gain_fx; num_objects = st_ivas->nchan_ism; + move16(); nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + move16(); n_slots_to_render = st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; - n_samples_to_render = hSpatParamRendCom->num_freq_bands * n_slots_to_render; + move16(); + n_samples_to_render = imult1616( hSpatParamRendCom->num_freq_bands, n_slots_to_render ); + interp_offset = st_ivas->hTcBuffer->n_samples_rendered; + move16(); + + IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) + { + ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator_fx ); + interp_offset = 0; + move16(); + } + 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[0] == 1 ) + { + Word16 az_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, Q22 ) ); + Word16 el_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, Q22 ) ); + Word32 az1_32, el1_32; + rotateAziEle_fixed( az_q0, el_q0, &az1_32, &el1_32, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); + az1 = extract_h( az1_32 ); + el1 = extract_h( el1_32 ); + + IF( st_ivas->hEFAPdata != NULL ) + { + const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 + const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 + efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azi_fx, ele_fx, EFAP_MODE_EFAP ); + } + } + + lfe_index = 0; + move16(); + for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + { + 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++; + } + gain_fx = st_ivas->hIsmRendererData->gains_fx[i][j]; + prev_gain_fx = st_ivas->hIsmRendererData->prev_gains_fx[i][j]; + IF( L_abs( gain_fx ) > 0 || L_abs( prev_gain_fx ) > 0 ) + { + Word32 *tc_re_fx, *tc_im_fx; + Word16 *w1_fx, w2_fx; + w1_fx = &st_ivas->hIsmRendererData->interpolator_fx[interp_offset]; + tc_re_fx = pppQMfFrame_ts_re_fx[nchan_transport + i][0]; + tc_im_fx = pppQMfFrame_ts_im_fx[nchan_transport + i][0]; + FOR( k = 0; k < n_slots_to_render; k++ ) + { + Word32 g_fx; + w2_fx = sub( MAX16B, *w1_fx ); + g_fx = L_add( Mpy_32_16_1( gain_fx, *w1_fx ), Mpy_32_16_1( prev_gain_fx, w2_fx ) ); + FOR( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) + { + Word32 tmp; + tmp = Mpy_32_32( g_fx, *tc_re_fx ); + Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = L_add( Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], tmp ); + tc_re_fx++; + tmp = Mpy_32_32( g_fx, *tc_im_fx ); + Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = L_add( Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], tmp ); + tc_re_fx++; + } + w1_fx += hSpatParamRendCom->num_freq_bands; + } + } + /* update here only in case of head rotation */ + IF( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + st_ivas->hIsmRendererData->prev_gains_fx[i][j] = gain_fx; + } + } + } + } + } + + /* Perform binaural rendering */ + Word16 input_q = Q6; + ivas_binRenderer_fx( st_ivas->hBinRenderer, + st_ivas->hCombinedOrientationData, + hSpatParamRendCom->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, + Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, &input_q ); + + FOR ( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) + { + FOR ( Word16 idx2 = 0; idx2 < MAX_PARAM_SPATIAL_SUBFRAMES; idx2++ ) + { + Scale_sig32(Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, Q6 - input_q ); + Scale_sig32(Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, Q6 - input_q ); + } + } + + /* Inverse CLDFB*/ + FOR ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#if 1 // TODOD: remove float to fixed + st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q_factor_arrL( st_ivas->cldfbSynDec[ch]->cldfb_state, st_ivas->cldfbSynDec[ch]->p_filter_length ); + floatToFixed_arrL( st_ivas->cldfbSynDec[ch]->cldfb_state, st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->Q_cldfb_state, st_ivas->cldfbSynDec[ch]->p_filter_length ); +#endif + Word32 *synth_fx = &output_buf_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands]; + + Word32 *RealBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *ImagBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; + FOR ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[ch][i]; + ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[ch][i]; + } + + scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( Q6 - 1, st_ivas->cldfbSynDec[ch]->Q_cldfb_state ) ); + st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q6 - 1; + move16(); + + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, synth_fx, hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + + Word16 no_col = st_ivas->cldfbSynDec[ch]->no_col, no_channels = st_ivas->cldfbSynDec[ch]->no_channels; + Word16 samplesToProcess = hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx]; + IF( GT_16( samplesToProcess, -1 ) ) + { + no_col = s_min( no_col, ( samplesToProcess + st_ivas->cldfbSynDec[ch]->no_channels - 1 ) / st_ivas->cldfbSynDec[ch]->no_channels ); + } + Word16 synth_len = imult1616( no_col, no_channels ); + + scale_sig32( synth_fx, synth_len, Q11 - ( Q6 - 1 ) ); + +#if 1 // TODOD: remove Fixed to float + fixedToFloat_arrL( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_state, st_ivas->cldfbSynDec[ch]->Q_cldfb_state, st_ivas->cldfbSynDec[ch]->p_filter_length ); + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + fixedToFloat_arrL( Cldfb_RealBuffer_Binaural_fx[ch][i], Cldfb_RealBuffer_Binaural[ch][i], CLDFB_NO_CHANNELS_MAX, Q6 ); + fixedToFloat_arrL( Cldfb_ImagBuffer_Binaural_fx[ch][i], Cldfb_ImagBuffer_Binaural[ch][i], CLDFB_NO_CHANNELS_MAX, Q6 ); + } +#endif + } + } + ELSE IF( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + for ( ch = 0; ch < hDirACRend->hOutSetup.nchan_out_woLFE; ch++ ) + { + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + Copy32( Cldfb_RealBuffer_fx[ch][slot_idx], pppQMfFrame_ts_re_fx[ch][slot_idx], hSpatParamRendCom->num_freq_bands ); // Q6 + Copy32( Cldfb_ImagBuffer_fx[ch][slot_idx], pppQMfFrame_ts_im_fx[ch][slot_idx], hSpatParamRendCom->num_freq_bands ); // Q6 + } + } + } + ELSE + { + Word32 *RealBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *ImagBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 outchannels; + + idx_in = 0; + move16(); + idx_lfe = 0; + move16(); + + outchannels = add( hDirACRend->hOutSetup.nchan_out_woLFE, hDirACRend->hOutSetup.num_lfe ); + + IF ( hDirACRend->hOutSetup.separateChannelEnabled && ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_2 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_4 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1_4 || + ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) ) + { + outchannels = add(outchannels, 1); + } + + IF( hDirACRend->hOutSetup.separateChannelEnabled && hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + Word32 tmp_separated_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 tmp_lfe_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + const Word16 subframe_start_sample = imult1616( index_slot, hSpatParamRendCom->num_freq_bands ); + const Word16 num_samples_subframe = imult1616( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + + /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ + Copy32( &( output_buf_fx[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated_fx, num_samples_subframe ); + Copy32( &( output_buf_fx[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe_fx, num_samples_subframe ); + FOR( ch = 0; ch < outchannels; ch++ ) + { + IF( ( hDirACRend->hOutSetup.num_lfe > 0 ) && ( EQ_16( hDirACRend->hOutSetup.index_lfe[idx_lfe], ch ) ) ) + { + /* Move the LFE channel to the correct place */ + Copy32( tmp_lfe_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe ); + + IF( LT_16( idx_lfe, sub( hDirACRend->hOutSetup.num_lfe, 1 ) ) ) + { + idx_lfe = add( idx_lfe, 1 ); + } + } + ELSE IF( ( st_ivas->hLsSetupCustom->separate_ch_found ) && EQ_16( hDirACRend->hOutSetup.separateChannelIndex, ch ) ) + { + /* Move the separated channel to the correct place. Thus, the separated channel is + * combined with the synthesized channels here when there is a matching channel. */ + Copy32( tmp_separated_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe ); + } + ELSE + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer_fx[i] = Cldfb_RealBuffer_fx[idx_in][i]; + ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[idx_in][i]; + } + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] ); + + IF( !st_ivas->hLsSetupCustom->separate_ch_found ) + { + /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel + * is combined with the synthesized channels here when there is no matching channel. */ + v_multc_acc_32_16( tmp_separated_fx, st_ivas->hLsSetupCustom->separate_ch_gains_fx[idx_in], &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe ); + } + + idx_in = add( idx_in, 1 ); + } + } + } + ELSE + { + FOR ( ch = 0; ch < outchannels; ch++ ) + { + IF ( ( hDirACRend->hOutSetup.num_lfe > 0 ) && ( EQ_16( hDirACRend->hOutSetup.index_lfe[idx_lfe], ch ) ) ) + { + IF(st_ivas->mc_mode == MC_MODE_MCMASA && !hDirACRend->hOutSetup.separateChannelEnabled) + { + FOR(i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++) + { + RealBuffer_fx[i] = Cldfb_RealBuffer_fx[MAX_OUTPUT_CHANNELS - 1][i]; + ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[MAX_OUTPUT_CHANNELS - 1][i]; + } + Word16 cldfbSynIdx = hDirACRend->hOutSetup.nchan_out_woLFE + idx_lfe; + +#if 1 // TODO: remove float to fixed code + st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state = Q_factor_arrL(st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state, st_ivas->cldfbSynDec[cldfbSynIdx]->p_filter_length); + floatToFixed_arrL(st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state, st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state_fx, st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state, st_ivas->cldfbSynDec[cldfbSynIdx]->p_filter_length); +#endif + Word16 samplesToProcess = hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx]; + Word32 *p_out = &(output_buf_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands]); + + scale_sig32(st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state_fx, st_ivas->cldfbSynDec[cldfbSynIdx]->p_filter_length, sub(Q6 - 1, st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state)); + st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state = Q6 - 1; + + cldfbSynthesis_ivas_fx(RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, st_ivas->cldfbSynDec[cldfbSynIdx]); + + // Calculating length of output + Word16 no_col = st_ivas->cldfbSynDec[cldfbSynIdx]->no_col, no_channels = st_ivas->cldfbSynDec[cldfbSynIdx]->no_channels; + IF(GT_16(samplesToProcess, -1)) + { + no_col = s_min(no_col, (samplesToProcess + st_ivas->cldfbSynDec[cldfbSynIdx]->no_channels - 1) / st_ivas->cldfbSynDec[cldfbSynIdx]->no_channels); + } + Word16 synth_len = imult1616(no_col, no_channels); + + scale_sig32(p_out, synth_len, (Q11 - (Q6 - 1))); +#if 1 // TODO: remove fixed to float code + fixedToFloat_arrL(st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state_fx, st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state, st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state, st_ivas->cldfbSynDec[cldfbSynIdx]->p_filter_length); +#endif + } + ELSE IF( st_ivas->mc_mode == MC_MODE_MCMASA && hDirACRend->hOutSetup.separateChannelEnabled ) + { + /* LFE has been synthesized in the time domain, do nothing. */ + } + ELSE + { + set32_fx( &( output_buf_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), 0, imult1616( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->num_freq_bands ) ); + } + IF( LT_16( idx_lfe, sub( hDirACRend->hOutSetup.num_lfe, 1 ) ) ) + { + idx_lfe = add( idx_lfe, 1 ); + } + } + ELSE IF ( ( hDirACRend->hOutSetup.separateChannelEnabled ) && EQ_16( hDirACRend->hOutSetup.separateChannelIndex, ch ) ) + { + /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated + * channel is combined with the synthesized channels here. */ + } + ELSE + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + +#if 1 // TODO: remove float to fixed code + st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = Q_factor_arrL(st_ivas->cldfbSynDec[idx_in]->cldfb_state, st_ivas->cldfbSynDec[idx_in]->p_filter_length); + floatToFixed_arrL(st_ivas->cldfbSynDec[idx_in]->cldfb_state, st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state, st_ivas->cldfbSynDec[idx_in]->p_filter_length); +#endif + Word32 *p_out = &( output_buf_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ); + Word16 samplesToProcess, out_len; + FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer_fx[i] = Cldfb_RealBuffer_fx[idx_in][i]; // Q6 + ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[idx_in][i]; // Q6 + } + samplesToProcess = imult1616( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + + // Calculating length of processed output + Word16 no_col = st_ivas->cldfbSynDec[idx_in]->no_col, no_channels = st_ivas->cldfbSynDec[idx_in]->no_channels; + IF(GT_16(samplesToProcess, -1)) + { + no_col = s_min(no_col, (samplesToProcess + st_ivas->cldfbSynDec[idx_in]->no_channels - 1) / st_ivas->cldfbSynDec[idx_in]->no_channels); + } + out_len = imult1616(no_col, no_channels); + + // Scaling cldfb_state to Q6-1 + scale_sig32(st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, sub(Q6 - 1, st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state)); + st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = Q6 - 1; + move16(); + + // Scaling the output to Q10 + scale_sig32(output_buf_fx[ch], samplesToProcess + index_slot * hSpatParamRendCom->num_freq_bands, Q10 - Q11 ); + + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, st_ivas->cldfbSynDec[idx_in] ); + + // Scaling output from Q6-1 to Q10 + scale_sig32(p_out, out_len, (Q10 - (Q6 - 1))); + +#if 1 /* TODO: remove fixed to float */ + fixedToFloat_arrL(st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->cldfb_state, st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state, st_ivas->cldfbSynDec[idx_in]->p_filter_length); +#endif + idx_in = add( idx_in, 1 ); + } + } + } + } + + hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); + +#else + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* render objects in combined format onto the CICP19 channels for BINAURAL_ROOM_IR */ + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + int16_t in_ch; + for ( in_ch = 0; in_ch < st_ivas->nchan_ism; in_ch++ ) + { + int16_t j, k, j2, l; + int16_t num_objects, nchan_out_woLFE, lfe_index; + int16_t az1, el1; + int16_t n_slots_to_render; + int16_t n_samples_to_render; + int16_t interp_offset; + + float gain, prev_gain; + + num_objects = st_ivas->nchan_ism; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + n_slots_to_render = st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; + n_samples_to_render = hSpatParamRendCom->num_freq_bands * n_slots_to_render; + interp_offset = st_ivas->hTcBuffer->n_samples_rendered; + + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) + { + ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator_fx ); + + interp_offset = 0; + } + 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[0] == 1 ) + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &az1, &el1, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], az1, el1, EFAP_MODE_EFAP ); + } + } + + lfe_index = 0; + 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 ) ) + { + ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; + } + gain = st_ivas->hIsmRendererData->gains[i][j]; + prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; + if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) + { + float *tc_re, *tc_im; + float *w1, w2; + w1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; + tc_re = pppQMfFrame_ts_re[nchan_transport + i][0]; + tc_im = pppQMfFrame_ts_im[nchan_transport + i][0]; + for ( k = 0; k < n_slots_to_render; k++ ) + { + float g; + w2 = 1.0f - *w1; + g = ( *w1 * gain + w2 * prev_gain ); + + for ( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) + { + Cldfb_RealBuffer[j2][0][k * hSpatParamRendCom->num_freq_bands + l] += g * *( tc_re++ ); + Cldfb_ImagBuffer[j2][0][k * hSpatParamRendCom->num_freq_bands + l] += g * *( tc_im++ ); + } + w1 += hSpatParamRendCom->num_freq_bands; + } + } + /* update here only in case of head rotation */ + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + st_ivas->hIsmRendererData->prev_gains[i][j] = gain; + } + } + } + } + } + + /* Perform binaural rendering */ + ivas_binRenderer( st_ivas->hBinRenderer, + st_ivas->hCombinedOrientationData, + hSpatParamRendCom->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + + /* Inverse CLDFB*/ + for (ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + for (i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++) + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } + cldfbSynthesis_ivas( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + for ( ch = 0; ch < hDirACRend->hOutSetup.nchan_out_woLFE; ch++ ) + { + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hSpatParamRendCom->num_freq_bands ); + mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hSpatParamRendCom->num_freq_bands ); + } + } + } + else + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t outchannels; + + idx_in = 0; + idx_lfe = 0; + + outchannels = hDirACRend->hOutSetup.nchan_out_woLFE + hDirACRend->hOutSetup.num_lfe; + + if ( hDirACRend->hOutSetup.separateChannelEnabled && ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_2 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_4 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1_4 || + ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) ) + { + outchannels++; + } + + if ( hDirACRend->hOutSetup.separateChannelEnabled && hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + const int16_t subframe_start_sample = index_slot * hSpatParamRendCom->num_freq_bands; + const int16_t num_samples_subframe = hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx]; + + /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ + mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe ); + mvr2r( &( output_f[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe, num_samples_subframe ); + for ( ch = 0; ch < outchannels; ch++ ) + { + if ( ( hDirACRend->hOutSetup.num_lfe > 0 ) && ( hDirACRend->hOutSetup.index_lfe[idx_lfe] == ch ) ) + { + /* Move the LFE channel to the correct place */ + mvr2r( tmp_lfe, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + + if ( idx_lfe < ( hDirACRend->hOutSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ( st_ivas->hLsSetupCustom->separate_ch_found ) && ( hDirACRend->hOutSetup.separateChannelIndex == ch ) ) + { + /* Move the separated channel to the correct place. Thus, the separated channel is + * combined with the synthesized channels here when there is a matching channel. */ + mvr2r( tmp_separated, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + } + else + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis_ivas( RealBuffer, ImagBuffer, &( output_f[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] ); + + if ( !st_ivas->hLsSetupCustom->separate_ch_found ) + { + /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel + * is combined with the synthesized channels here when there is no matching channel. */ + v_multc_acc( tmp_separated, st_ivas->hLsSetupCustom->separate_ch_gains[idx_in], &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + } + + idx_in++; + } + } + } + else + { + for ( ch = 0; ch < outchannels; ch++ ) + { + if ( ( hDirACRend->hOutSetup.num_lfe > 0 ) && ( hDirACRend->hOutSetup.index_lfe[idx_lfe] == ch ) ) + { + if (st_ivas->mc_mode == MC_MODE_MCMASA && !hDirACRend->hOutSetup.separateChannelEnabled) + { + for (i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++) + { + RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i]; + } + cldfbSynthesis_ivas( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[hDirACRend->hOutSetup.nchan_out_woLFE + idx_lfe] ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirACRend->hOutSetup.separateChannelEnabled ) + { + /* LFE has been synthesized in the time domain, do nothing. */ + } + else + { + set_zero( &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands ); + } + if ( idx_lfe < ( hDirACRend->hOutSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ( hDirACRend->hOutSetup.separateChannelEnabled ) && ( hDirACRend->hOutSetup.separateChannelIndex == ch ) ) + { + /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated + * channel is combined with the synthesized channels here. */ + } + else + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis_ivas( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[idx_in] ); + idx_in++; + } + } + } + } + + hSpatParamRendCom->slots_rendered += hSpatParamRendCom->subframe_nbslots[subframe_idx]; + hSpatParamRendCom->subframes_rendered++; +#endif + +#ifdef IVAS_FLOAT_FIXED + /////////////////////////////////////////////////////// FIXED TO FLOAT ////////////////////////////////////////////////////////////////////////////////////////// + if (st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) + { + for (i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++) + { + fixedToFloat_arrL(output_buf_fx[i], output_f[i], Q11, index_slot * hSpatParamRendCom->num_freq_bands + hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx]); + } + } + else if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) + { + for (ch = 0; ch < hDirACRend->hOutSetup.nchan_out_woLFE; ch++) + { + for (slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++) + { + fixedToFloat_arrL(pppQMfFrame_ts_re_fx[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], Q6, hSpatParamRendCom->num_freq_bands); + fixedToFloat_arrL(pppQMfFrame_ts_im_fx[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], Q6, hSpatParamRendCom->num_freq_bands); + } + } + } + else + { + Word16 outchannels = add(hDirACRend->hOutSetup.nchan_out_woLFE, hDirACRend->hOutSetup.num_lfe); + + IF(hDirACRend->hOutSetup.separateChannelEnabled && (hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_2 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_5_1_4 || + hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_7_1_4 || + (hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found))) + { + outchannels = add(outchannels, 1); + } + if (!hDirACRend->hOutSetup.separateChannelEnabled || hDirACRend->hOutSetup.output_config != IVAS_AUDIO_CONFIG_LS_CUSTOM) + { + Word16 tmp_lfe_idx = 0; + for (ch = 0; ch < outchannels; ch++) + { + //fixedToFloat_arrL(output_buf_fx[i], output_f[i], Q11, index_slot * hSpatParamRendCom->num_freq_bands + hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx]); + IF((hDirACRend->hOutSetup.num_lfe > 0) && (EQ_16(hDirACRend->hOutSetup.index_lfe[tmp_lfe_idx], ch))) + { + IF(st_ivas->mc_mode == MC_MODE_MCMASA && !hDirACRend->hOutSetup.separateChannelEnabled) + { + // Fixed to float + fixedToFloat_arrL(output_buf_fx[ch], output_f[ch], Q11, hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands + index_slot * hSpatParamRendCom->num_freq_bands); + } + ELSE IF(st_ivas->mc_mode == MC_MODE_MCMASA && hDirACRend->hOutSetup.separateChannelEnabled) + { + /* LFE has been synthesized in the time domain, do nothing. */ + } + ELSE + { + // Float to fixed. + fixedToFloat_arrL(output_buf_fx[ch], output_f[ch], Q11, hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands + index_slot * hSpatParamRendCom->num_freq_bands); + } + IF(LT_16(tmp_lfe_idx, sub(hDirACRend->hOutSetup.num_lfe, 1))) + { + tmp_lfe_idx = add(tmp_lfe_idx, 1); + } + } + ELSE IF((hDirACRend->hOutSetup.separateChannelEnabled) && EQ_16(hDirACRend->hOutSetup.separateChannelIndex, ch)) + { + /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated + * channel is combined with the synthesized channels here. */ + } + ELSE + { + // Fixed to float + fixedToFloat_arrL(output_buf_fx[ch], output_f[ch], Q10, hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx] + index_slot * hSpatParamRendCom->num_freq_bands); + } + } + } + else + { + /* NOTE: according to line coverage report this part is not being hit by any test case. Not adding fixed to float conversion here. */ + } + } + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#endif + + pop_wmops(); + + return; +} +#else +/*------------------------------------------------------------------------- + * ivas_dirac_dec_render_sf() + * + * DirAC decoding renderer process + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] ) +{ + int16_t i, ch, idx_in, idx_lfe; + DIRAC_DEC_HANDLE hDirAC; + DIRAC_REND_HANDLE hDirACRend; + float dirEne; + float surCohEner; + float surCohRatio[CLDFB_NO_CHANNELS_MAX]; + int16_t subframe_idx; + int16_t slot_idx, index_slot; + int16_t hodirac_flag; + float *p_Rmat; + int16_t slot_idx_start, slot_idx_start_cldfb_synth, md_idx; + + /*CLDFB: last output channels reserved to LFT for CICPx*/ + float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Temp[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Temp[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + int16_t index, num_freq_bands; + + /* local copies of azi, ele, diffuseness */ + int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; + int16_t elevation[CLDFB_NO_CHANNELS_MAX]; + float diffuseness_vector[CLDFB_NO_CHANNELS_MAX]; + + DIRAC_DEC_STACK_MEM DirAC_mem; + float *reference_power, *reference_power_smooth; + float *onset_filter, *onset_filter_subframe, *p_onset_filter = NULL; + uint16_t coherence_flag; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + push_wmops( "ivas_dirac_dec_render" ); + + /* Initialize aux buffers */ + hDirAC = st_ivas->hDirAC; + hDirACRend = st_ivas->hDirACRend; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + + DirAC_mem = hDirACRend->stack_mem; + + reference_power = DirAC_mem.reference_power; + reference_power_smooth = ( DirAC_mem.reference_power == NULL ) ? NULL : DirAC_mem.reference_power + hSpatParamRendCom->num_freq_bands; + onset_filter = DirAC_mem.onset_filter; + onset_filter_subframe = ( DirAC_mem.onset_filter == NULL ) ? NULL : DirAC_mem.onset_filter + hSpatParamRendCom->num_freq_bands; + + hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); + if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) + { + coherence_flag = st_ivas->hQMetaData->coherence_flag; + } + else + { + coherence_flag = 0; + } + + + /* Subframe loop */ + slot_idx_start = hSpatParamRendCom->slots_rendered; + slot_idx_start_cldfb_synth = 0; + + subframe_idx = hSpatParamRendCom->subframes_rendered; + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + md_idx = hSpatParamRendCom->render_to_md_map[subframe_idx]; + } + else + { + md_idx = hSpatParamRendCom->render_to_md_map[slot_idx_start]; + } + + /* copy parameters into local buffers*/ + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + mvs2s( hSpatParamRendCom->azimuth[hSpatParamRendCom->render_to_md_map[subframe_idx]], azimuth, hSpatParamRendCom->num_freq_bands ); + mvs2s( hSpatParamRendCom->elevation[hSpatParamRendCom->render_to_md_map[subframe_idx]], elevation, hSpatParamRendCom->num_freq_bands ); + mvr2r( hSpatParamRendCom->diffuseness_vector[hSpatParamRendCom->render_to_md_map[subframe_idx]], diffuseness_vector, hSpatParamRendCom->num_freq_bands ); + } + else + { + set_zero( diffuseness_vector, hSpatParamRendCom->num_freq_bands ); + } + + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_zero( reference_power_smooth, hSpatParamRendCom->num_freq_bands ); + } + else + { + set_zero( onset_filter_subframe, hSpatParamRendCom->num_freq_bands ); + } + + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] ) + { + p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx][0][0]; + if ( st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hSpatParamRendCom->num_freq_bands, p_Rmat ); + } + } + } + else + { + p_Rmat = 0; + } + + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + /* compute response */ + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_power_factors( hSpatParamRendCom->num_freq_bands, + diffuseness_vector, + hDirACRend->h_output_synthesis_psd_params.max_band_decorr, + hDirACRend->h_output_synthesis_psd_state.direct_power_factor, + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor ); + + if ( coherence_flag ) + { + for ( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + dirEne = hDirACRend->h_output_synthesis_psd_state.direct_power_factor[i]; + surCohEner = hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor[i] * hSpatParamRendCom->surroundingCoherence[md_idx][i]; + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; + hDirACRend->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; + + surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner ); + } + } + else + { + set_zero( surCohRatio, hSpatParamRendCom->num_freq_bands ); + } + } + else + { + ivas_dirac_dec_compute_gain_factors( hSpatParamRendCom->num_freq_bands, + hSpatParamRendCom->diffuseness_vector[md_idx], + hDirACRend->h_output_synthesis_psd_params.max_band_decorr, + hDirACRend->h_output_synthesis_psd_state.direct_power_factor, + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor ); + + if ( coherence_flag ) + { + for ( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + surCohRatio[i] = hSpatParamRendCom->surroundingCoherence[md_idx][i]; + } + } + else + { + set_zero( surCohRatio, hSpatParamRendCom->num_freq_bands ); + } + } + + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 1 ) + { + ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + st_ivas->hMasa == NULL ? NULL : st_ivas->hMasa->data.band_mapping, + st_ivas->hMasaIsmData, + azimuth, + elevation, + md_idx, + surCohRatio, + st_ivas->hCombinedOrientationData->shd_rot_max_order, + p_Rmat, + hodirac_flag ); + } + else + { + ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + st_ivas->hMasa == NULL ? NULL : st_ivas->hMasa->data.band_mapping, + st_ivas->hMasaIsmData, + azimuth, + elevation, + md_idx, + surCohRatio, + 0, + NULL, + hodirac_flag ); + } + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 ) + { + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts_ivas( &( st_ivas->hTcBuffer->tc[hDirACRend->sba_map_tc[ch]][hSpatParamRendCom->num_freq_bands * index_slot] ), + Cldfb_RealBuffer_Temp[ch][slot_idx], + Cldfb_ImagBuffer_Temp[ch][slot_idx], + hSpatParamRendCom->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); + } + } + + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + { + ivas_omasa_preProcessStereoTransportsForMovedObjects( st_ivas, Cldfb_RealBuffer_Temp, Cldfb_ImagBuffer_Temp, hSpatParamRendCom->num_freq_bands, subframe_idx ); + } + } + + for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + md_idx = hSpatParamRendCom->render_to_md_map[index_slot]; + } + else + { + md_idx = hSpatParamRendCom->render_to_md_map[subframe_idx]; + } + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + mvr2r( pppQMfFrame_ts_re[ch][slot_idx], Cldfb_RealBuffer[ch][0], hSpatParamRendCom->num_freq_bands ); + mvr2r( pppQMfFrame_ts_im[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hSpatParamRendCom->num_freq_bands ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 ) + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + mvr2r( Cldfb_RealBuffer_Temp[ch][slot_idx], Cldfb_RealBuffer[ch][0], hSpatParamRendCom->num_freq_bands ); + mvr2r( Cldfb_ImagBuffer_Temp[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hSpatParamRendCom->num_freq_bands ); + } + } + else + { + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts_ivas( &( st_ivas->hTcBuffer->tc[hDirACRend->sba_map_tc[ch]][hSpatParamRendCom->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hSpatParamRendCom->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); + } + } + + /* CNG in DirAC, extra CLDFB ana for CNA*/ + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && !( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + + generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom, + st_ivas->cldfbAnaDec[1], + st_ivas->hTcBuffer->tc[1], + Cldfb_RealBuffer[1][0], + Cldfb_ImagBuffer[1][0], + index_slot, + st->cna_dirac_flag && st->flag_cna, + ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == FD_CNG && st->cng_sba_flag ); + } + + /* LFE synthesis */ + if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirACRend->hOutSetup.separateChannelEnabled && !( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && hDirACRend->hOutSetup.num_lfe == 0 ) ) + { + ivas_lfe_synth_with_cldfb( st_ivas->hMasa->hMasaLfeSynth, + Cldfb_RealBuffer, Cldfb_ImagBuffer, + Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], + slot_idx, + md_idx, + nchan_transport ); + } + + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) + { + protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f, + reference_power, slot_idx, nchan_transport, + hDirACRend->num_outputs_diff, + hSpatParamRendCom->num_freq_bands, + p_Rmat ); + } + else + { + protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f, + reference_power, slot_idx, nchan_transport, + hDirACRend->num_outputs_diff, + hSpatParamRendCom->num_freq_bands, + 0 ); + } + } + else if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirACRend->proto_frame_f, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, + 0, slot_idx, hSpatParamRendCom->num_freq_bands, hDirACRend->masa_stereo_type_detect ); + } + else + { + switch ( nchan_transport ) + { + case 11: + case 8: + case 6: + case 4: + protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->proto_frame_f, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, hDirACRend->num_outputs_diff, + hSpatParamRendCom->num_freq_bands, + hDirACRend->hoa_decoder, + nchan_transport, + hDirACRend->sba_map_tc ); + break; + case 2: + protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->proto_frame_f, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, + hDirACRend->hOutSetup.is_loudspeaker_setup, + slot_idx, + hSpatParamRendCom->num_freq_bands, + hDirACRend->masa_stereo_type_detect ); + break; + case 1: + protoSignalComputation1( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->proto_frame_f, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, + hDirACRend->num_protos_diff, + hSpatParamRendCom->num_freq_bands ); + break; + default: + return; + } + } + + + /*-----------------------------------------------------------------* + * Compute DirAC parameters at decoder side + *-----------------------------------------------------------------*/ + + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + mvs2s( &hSpatParamRendCom->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hSpatParamRendCom->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); + mvs2s( &hSpatParamRendCom->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hSpatParamRendCom->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); + if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hSpatParamRendCom->num_freq_bands, p_Rmat ); + } + + hDirACRend->index_buffer_intensity = ( hDirACRend->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + + index = hDirACRend->index_buffer_intensity; + + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + + computeIntensityVector_dec( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + num_freq_bands, + hDirACRend->buffer_intensity_real[0][index - 1], + hDirACRend->buffer_intensity_real[1][index - 1], + hDirACRend->buffer_intensity_real[2][index - 1] ); + + computeDirectionAngles( hDirACRend->buffer_intensity_real[0][index - 1], + hDirACRend->buffer_intensity_real[1][index - 1], + hDirACRend->buffer_intensity_real[2][index - 1], + num_freq_bands, + azimuth, + elevation ); + + mvr2r( reference_power, &( hDirACRend->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hDirACRend->buffer_intensity_real, hDirACRend->buffer_energy, num_freq_bands, hSpatParamRendCom->diffuseness_vector[md_idx] ); + } + + + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ + + if ( hDirACRend->proto_signal_decorr_on == 1 ) + { + /* decorrelate prototype frame */ + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_decorr_process( hSpatParamRendCom->num_freq_bands, + hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->synthesisConf, + nchan_transport, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->proto_index_diff, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff + 2 * hSpatParamRendCom->num_freq_bands * min( 4, nchan_transport ), + onset_filter, + hDirACRend->h_freq_domain_decorr_ap_params, + hDirACRend->h_freq_domain_decorr_ap_state ); + + v_multc( onset_filter, 0.25f, onset_filter, hSpatParamRendCom->num_freq_bands ); + v_add( onset_filter, onset_filter_subframe, onset_filter_subframe, hSpatParamRendCom->num_freq_bands ); + p_onset_filter = onset_filter_subframe; + } + else + { + ivas_dirac_dec_decorr_process( hSpatParamRendCom->num_freq_bands, + hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->synthesisConf, + nchan_transport, + hDirACRend->proto_frame_f, + hDirACRend->num_protos_diff, + hDirACRend->proto_index_diff, + DirAC_mem.frame_dec_f, + onset_filter, + hDirACRend->h_freq_domain_decorr_ap_params, + hDirACRend->h_freq_domain_decorr_ap_state ); + + hDirACRend->proto_frame_dec_f = DirAC_mem.frame_dec_f; + p_onset_filter = onset_filter; + } + } + else + { + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_f( onset_filter_subframe, 1.f, hSpatParamRendCom->num_freq_bands ); + p_onset_filter = onset_filter_subframe; + } + else + { + /* no frequency domain decorrelation: use prototype frame */ + hDirACRend->proto_frame_dec_f = hDirACRend->proto_frame_f; + p_onset_filter = NULL; + } + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + /*Compute diffuse prototypes*/ + ivas_dirac_dec_compute_diffuse_proto( hDirACRend, hSpatParamRendCom->num_freq_bands, slot_idx ); + } + + /*Compute PSDs*/ + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector[md_idx], + hSpatParamRendCom, + hDirACRend, + st_ivas->hCombinedOrientationData->shd_rot_max_order, + p_Rmat, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + } + else + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector[md_idx], + hSpatParamRendCom, + hDirACRend, + 0, + 0, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + } + + if ( hDirAC->hConfig->dec_param_estim ) + { + float fac = 1.0f / (float) hSpatParamRendCom->subframe_nbslots[subframe_idx]; + v_multc_acc( hSpatParamRendCom->diffuseness_vector[md_idx], fac, diffuseness_vector, hSpatParamRendCom->num_freq_bands ); + } + + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + v_add( reference_power, reference_power_smooth, reference_power_smooth, hSpatParamRendCom->num_freq_bands ); + } + } + + ivas_dirac_dec_output_synthesis_get_interpolator( &hDirACRend->h_output_synthesis_psd_params, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + + + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hSpatParamRendCom, + hDirACRend, + nchan_transport, + hSpatParamRendCom->subframe_nbslots[subframe_idx], + p_onset_filter, + diffuseness_vector, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + } + else + { + /* Determine encoding quality based additional smoothing factor */ + float qualityBasedSmFactor = 1.0f; + + if ( st_ivas->hMasa != NULL ) + { + qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; + qualityBasedSmFactor *= qualityBasedSmFactor; + } + + ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hSpatParamRendCom, + hDirACRend, + hSpatParamRendCom->subframe_nbslots[subframe_idx], + diffuseness_vector, + reference_power_smooth, + qualityBasedSmFactor, + hDirAC->hConfig->enc_param_start_band ); + } + + /*-----------------------------------------------------------------* + * CLDFB synthesis (and binaural rendering) + *-----------------------------------------------------------------*/ + + index_slot = slot_idx_start_cldfb_synth; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* render objects in combined format onto the CICP19 channels for BINAURAL_ROOM_IR */ + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + int16_t in_ch; + for ( in_ch = 0; in_ch < st_ivas->nchan_ism; in_ch++ ) + { + int16_t j, k, j2, l; + int16_t num_objects, nchan_out_woLFE, lfe_index; + int16_t az1, el1; + int16_t n_slots_to_render; + int16_t n_samples_to_render; + int16_t interp_offset; + float gain, prev_gain; + + num_objects = st_ivas->nchan_ism; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + n_slots_to_render = st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; + n_samples_to_render = hSpatParamRendCom->num_freq_bands * n_slots_to_render; interp_offset = st_ivas->hTcBuffer->n_samples_rendered; if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) @@ -5222,13 +6868,7 @@ void ivas_dirac_dec_render_sf( rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &az1, &el1, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); if ( st_ivas->hEFAPdata != NULL ) { -#ifdef IVAS_FLOAT_FIXED - float gains[MAX_OUTPUT_CHANNELS]; - fixedToFloat_arrL(st_ivas->hIsmRendererData->gains_fx[i], gains, Q30, MAX_OUTPUT_CHANNELS); - efap_determine_gains( st_ivas->hEFAPdata, gains, az1, el1, EFAP_MODE_EFAP ); -#else efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], az1, el1, EFAP_MODE_EFAP ); -#endif } } @@ -5240,24 +6880,14 @@ void ivas_dirac_dec_render_sf( ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; } -#ifdef IVAS_FLOAT_FIXED - gain = fix_to_float( st_ivas->hIsmRendererData->gains_fx[i][j], Q30 ); - prev_gain = fix_to_float( st_ivas->hIsmRendererData->prev_gains_fx[i][j], Q30 ); -#else gain = st_ivas->hIsmRendererData->gains[i][j]; prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; -#endif if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) { float *tc_re, *tc_im; float *w1, w2; -#ifdef IVAS_FLOAT_FIXED - Word16 *w1_fx; - w1_fx = &st_ivas->hIsmRendererData->interpolator_fx[interp_offset]; -#else w1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; -#endif tc_re = pppQMfFrame_ts_re[nchan_transport + i][0]; tc_im = pppQMfFrame_ts_im[nchan_transport + i][0]; @@ -5265,35 +6895,22 @@ void ivas_dirac_dec_render_sf( { float g; -#ifdef IVAS_FLOAT_FIXED - w2 = 1.0f - fix16_to_float(*w1_fx, Q15); - g = ( fix16_to_float(*w1_fx, Q15) * gain + w2 * prev_gain ); -#else w2 = 1.0f - *w1; - g = (*w1 * gain + w2 * prev_gain); -#endif + g = ( *w1 * gain + w2 * prev_gain ); for ( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) { Cldfb_RealBuffer[j2][0][k * hSpatParamRendCom->num_freq_bands + l] += g * *( tc_re++ ); Cldfb_ImagBuffer[j2][0][k * hSpatParamRendCom->num_freq_bands + l] += g * *( tc_im++ ); } -#ifdef IVAS_FLOAT_FIXED - w1_fx += hSpatParamRendCom->num_freq_bands; -#else w1 += hSpatParamRendCom->num_freq_bands; -#endif } } /* update here only in case of head rotation */ if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) { -#ifdef IVAS_FLOAT_FIXED - st_ivas->hIsmRendererData->prev_gains_fx[i][j] = float_to_fix(gain, Q30); -#else st_ivas->hIsmRendererData->prev_gains[i][j] = gain; -#endif } } } @@ -5460,3 +7077,4 @@ void ivas_dirac_dec_render_sf( return; } +#endif \ No newline at end of file diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index d86071d93ee3d48e19d802b3d795de319e9ee795..a4b34f908ad698394aeb5dea78bd91aaaeedff90 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -54,6 +54,8 @@ #include "ivas_prot_fx.h" #endif +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED + /*-------------------------------------------------------------------* * ivas_dirac_dec_output_synthesis_cov_open() @@ -144,6 +146,42 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open_fx( h_dirac_output_synthesis_state->mixing_matrix_res_fx[idx] = NULL; } + if ((h_dirac_output_synthesis_state->cx_old_e = (Word16 *)malloc(CLDFB_NO_CHANNELS_MAX * sizeof(Word16))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n")); + } + if ((h_dirac_output_synthesis_state->cy_old_e = (Word16 *)malloc(CLDFB_NO_CHANNELS_MAX * sizeof(Word16))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n")); + } + + set16_fx(h_dirac_output_synthesis_state->cx_old_e, 0, CLDFB_NO_CHANNELS_MAX); + set16_fx(h_dirac_output_synthesis_state->cy_old_e, 0, CLDFB_NO_CHANNELS_MAX); + + if ((h_dirac_output_synthesis_state->mixing_matrix_res_exp = (Word16 *)malloc(CLDFB_NO_CHANNELS_MAX * sizeof(Word16))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n")); + } + set16_fx(h_dirac_output_synthesis_state->mixing_matrix_res_exp, 0, CLDFB_NO_CHANNELS_MAX); + + if ((h_dirac_output_synthesis_state->mixing_matrix_res_old_exp = (Word16 *)malloc(CLDFB_NO_CHANNELS_MAX * sizeof(Word16))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n")); + } + set16_fx(h_dirac_output_synthesis_state->mixing_matrix_res_old_exp, 0, CLDFB_NO_CHANNELS_MAX); + + if ((h_dirac_output_synthesis_state->mixing_matrix_exp = (Word16 *)malloc(CLDFB_NO_CHANNELS_MAX * sizeof(Word16))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n")); + } + set16_fx(h_dirac_output_synthesis_state->mixing_matrix_exp, 0, CLDFB_NO_CHANNELS_MAX); + + if ((h_dirac_output_synthesis_state->mixing_matrix_old_exp = (Word16 *)malloc(CLDFB_NO_CHANNELS_MAX * sizeof(Word16))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n")); + } + set16_fx(h_dirac_output_synthesis_state->mixing_matrix_old_exp, 0, CLDFB_NO_CHANNELS_MAX); + /*-----------------------------------------------------------------* * prepare processing parameters *-----------------------------------------------------------------*/ @@ -435,6 +473,11 @@ void ivas_dirac_dec_output_synthesis_cov_init_fx( set_zero_fx( h_dirac_output_synthesis_state->mixing_matrix_res_fx[idx], nchan_out * nchan_out ); } + + set16_fx(h_dirac_output_synthesis_state->mixing_matrix_old_exp, 0, CLDFB_NO_CHANNELS_MAX); + set16_fx(h_dirac_output_synthesis_state->mixing_matrix_exp, 0, CLDFB_NO_CHANNELS_MAX); + set16_fx(h_dirac_output_synthesis_state->mixing_matrix_res_old_exp, 0, CLDFB_NO_CHANNELS_MAX); + set16_fx(h_dirac_output_synthesis_state->mixing_matrix_res_exp, 0, CLDFB_NO_CHANNELS_MAX); #if 1/*TODO: To be removed :Floating point initializations*/ FOR ( idx = 0; idx < n_param_bands; idx++ ) { @@ -492,7 +535,7 @@ void ivas_dirac_dec_output_synthesis_cov_init( *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -void ivas_dirac_dec_output_synthesis_cov_close( +void ivas_dirac_dec_output_synthesis_cov_close_fx( DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i : handle for the covariance synthesis parameters */ DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state /* i/o: handle for the covariance synthesis state */ ) @@ -524,6 +567,18 @@ void ivas_dirac_dec_output_synthesis_cov_close( h_dirac_output_synthesis_params->proto_matrix_fx = NULL; } + + IF(h_dirac_output_synthesis_state->cx_old_e != NULL) + { + free(h_dirac_output_synthesis_state->cx_old_e); + h_dirac_output_synthesis_state->cx_old_e = NULL; + } + IF(h_dirac_output_synthesis_state->cy_old_e != NULL) + { + free(h_dirac_output_synthesis_state->cy_old_e); + h_dirac_output_synthesis_state->cy_old_e = NULL; + } + /* free cov buffers */ FOR ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { @@ -563,6 +618,30 @@ void ivas_dirac_dec_output_synthesis_cov_close( h_dirac_output_synthesis_state->mixing_matrix_res_fx[idx] = NULL; } } + + IF(h_dirac_output_synthesis_state->mixing_matrix_old_exp != NULL) + { + free(h_dirac_output_synthesis_state->mixing_matrix_old_exp); + h_dirac_output_synthesis_state->mixing_matrix_old_exp= NULL; + } + + IF(h_dirac_output_synthesis_state->mixing_matrix_res_old_exp != NULL) + { + free(h_dirac_output_synthesis_state->mixing_matrix_res_old_exp ); + h_dirac_output_synthesis_state->mixing_matrix_res_old_exp = NULL; + } + + IF(h_dirac_output_synthesis_state->mixing_matrix_exp != NULL) + { + free(h_dirac_output_synthesis_state->mixing_matrix_exp); + h_dirac_output_synthesis_state->mixing_matrix_exp = NULL; + } + + IF(h_dirac_output_synthesis_state->mixing_matrix_res_exp != NULL) + { + free(h_dirac_output_synthesis_state->mixing_matrix_res_exp); + h_dirac_output_synthesis_state->mixing_matrix_res_exp = NULL; + } #if 1/*TODO: To be removed later(floating point dealloc)*/ /* free interpolator */ IF ( h_dirac_output_synthesis_params->interpolator != NULL ) @@ -1057,7 +1136,176 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( return; } +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( + Word32 *Cldfb_RealBuffer_in_fx, + Word32 *Cldfb_ImagBuffer_in_fx, + Word32 Cldfb_RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + Word32 Cldfb_ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ + Word32 *mixing_matrix_fx[], /* i : parameter band wise mixing matrices (direct part) */ + Word16 *mixing_matrix_e, /* i : parameter band wise mixing matrices (direct part) */ + Word32 *mixing_matrix_res_fx[], /* i : parameter band wise mixing matrices (residual part) */ + Word16 *mixing_matrix_res_e, /* i : parameter band wise mixing matrices (residual part) */ + const UWord16 slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const UWord16 slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const Word16 nX, /* i : number of input channels */ + const Word16 nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ +) +{ + Word16 param_band_idx, band, ch_idx; + Word16 have_residual; + Word16 brange[2]; + DIRAC_OUTPUT_SYNTHESIS_COV_STATE h_synthesis_state = hParamMC->h_output_synthesis_cov_state; + + Word32 mixing_matrix_smooth_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word16 mixing_matrix_smooth_e; + Word32 mixing_matrix_res_smooth_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 mixing_matrix_res_smooth_e; + Word32 mixing_matrix_buffer_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 mixing_matrix_buffer_e; + Word32 input_f_real_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 input_f_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 output_f_real_fx[MAX_CICP_CHANNELS]; + Word32 output_f_imag_fx[MAX_CICP_CHANNELS]; + Word16 output_f_real_e; + Word16 output_f_imag_e; + Word32 diff_f_real_fx[MAX_CICP_CHANNELS]; + Word32 diff_f_imag_fx[MAX_CICP_CHANNELS]; + Word16 diff_f_real_e; + Word16 diff_f_imag_e; + + set_zero_fx( input_f_real_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero_fx( input_f_imag_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero_fx( output_f_real_fx, MAX_CICP_CHANNELS ); + set_zero_fx( output_f_imag_fx, MAX_CICP_CHANNELS ); + set_zero_fx( diff_f_real_fx, MAX_CICP_CHANNELS ); + set_zero_fx( diff_f_imag_fx, MAX_CICP_CHANNELS ); + + FOR ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + /* final mixing */ + have_residual = 0; + move16(); + brange[0] = hParamMC->band_grouping[param_band_idx]; + move16(); + brange[1] = hParamMC->band_grouping[param_band_idx + 1]; + move16(); + + IF ( brange[0] < hParamMC->h_output_synthesis_params.max_band_decorr ) + { + have_residual = 1; + move16(); + } + + v_multc_fixed(mixing_matrix_fx[param_band_idx], L_deposit_h(hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot]), mixing_matrix_smooth_fx, nY * nX); + mixing_matrix_smooth_e = mixing_matrix_e[param_band_idx]; // interpolator is W16 + move16(); + + v_multc_fixed(h_synthesis_state.mixing_matrix_old_fx[param_band_idx], L_sub( ONE_IN_Q31, L_deposit_h(hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot] ) ), mixing_matrix_buffer_fx, nY * nX); + mixing_matrix_buffer_e = h_synthesis_state.mixing_matrix_old_exp[param_band_idx]; // interpolator is W16 + + v_add_fixed_me(mixing_matrix_smooth_fx, mixing_matrix_smooth_e, mixing_matrix_buffer_fx, mixing_matrix_buffer_e, mixing_matrix_smooth_fx, &mixing_matrix_smooth_e, nY * nX, 0); + + IF ( have_residual ) + { + /* residual mixing matrix interpolation*/ + + v_multc_fixed(mixing_matrix_res_fx[param_band_idx], L_deposit_h(hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot]), mixing_matrix_res_smooth_fx, nY * nY ); + mixing_matrix_res_smooth_e = mixing_matrix_res_e[param_band_idx] ; // interpolator is W16 + + set_zero_fx(mixing_matrix_buffer_fx, nY * nY); + v_multc_fixed(h_synthesis_state.mixing_matrix_res_old_fx[param_band_idx], L_sub( ONE_IN_Q31, L_deposit_h( hParamMC->h_output_synthesis_params.interpolator_fx[slot_idx_tot]) ), mixing_matrix_buffer_fx, nY * nY); + mixing_matrix_buffer_e = h_synthesis_state.mixing_matrix_res_old_exp[param_band_idx]; // interpolator is W16 + + + v_add_fixed_me(mixing_matrix_res_smooth_fx, mixing_matrix_res_smooth_e, mixing_matrix_buffer_fx, mixing_matrix_buffer_e, mixing_matrix_res_smooth_fx, &mixing_matrix_res_smooth_e, nY * nY, 0); + } + + + + FOR ( band = brange[0]; band < brange[1]; band++ ) + { + assert( band >= 0 ); + + IF ( have_residual ) + { + /* collect diffuse prototypes */ + assert( band < hParamMC->h_output_synthesis_params.max_band_decorr ); + FOR ( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + diff_f_real_fx[ch_idx] = Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band]; // Q6 + move32(); + diff_f_imag_fx[ch_idx] = Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band]; + move32(); + } + + /* apply residual mixing */ + + matrix_product_fx( mixing_matrix_res_smooth_fx, nY, nY, 0, diff_f_real_fx, nY, 1, 0, output_f_real_fx ); + output_f_real_e = add( mixing_matrix_res_smooth_e, 25 ); + scale_sig32(output_f_real_fx, nY, 6 - (31 - output_f_real_e) ); + + + matrix_product_fx(mixing_matrix_res_smooth_fx, nY, nY, 0, diff_f_imag_fx, nY, 1, 0, output_f_imag_fx); + output_f_imag_e = mixing_matrix_res_smooth_e + 25; + scale_sig32(output_f_imag_fx, nY, 6 - (31 - output_f_imag_e) ); + + FOR ( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = output_f_real_fx[ch_idx]; // Q6 + move32(); + Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = output_f_imag_fx[ch_idx]; + move32(); + } + } + ELSE + { + FOR ( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = 0; + move32(); + Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = 0; + move32(); + } + } + + /* collect input signals, still in cldfb buffers */ + FOR ( ch_idx = 0; ch_idx < nX; ch_idx++ ) + { + + input_f_real_fx[ch_idx] = Cldfb_RealBuffer_in_fx[ch_idx * hParamMC->num_freq_bands + band]; // Q6 + move32(); + input_f_imag_fx[ch_idx] = Cldfb_ImagBuffer_in_fx[ch_idx * hParamMC->num_freq_bands + band]; + move32(); + + } + + /* apply mixing matrix */ + + matrix_product_fx(mixing_matrix_smooth_fx, nY, nX, 0, input_f_real_fx, nX, 1, 0, output_f_real_fx); + output_f_real_e = add( mixing_matrix_smooth_e, 25 ); + scale_sig32(output_f_real_fx, MAX_CICP_CHANNELS, sub( 6, sub(31, output_f_real_e) ) ); + + + matrix_product_fx(mixing_matrix_smooth_fx, nY, nX, 0, input_f_imag_fx, nX, 1, 0, output_f_imag_fx); + output_f_imag_e = add( mixing_matrix_smooth_e, 25 ); + scale_sig32(output_f_imag_fx, MAX_CICP_CHANNELS, sub( 6, sub( 31, output_f_imag_e ) ) ); + + /* collect output */ + FOR ( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add(Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band], output_f_real_fx[ch_idx] ); + Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add(Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band], output_f_imag_fx[ch_idx] ); + + } + } + } + + return; +} +#endif /*-------------------------------------------------------------------* * computeMixingMatrices() * @@ -1099,21 +1347,7 @@ int16_t computeMixingMatrices( float mat_mult_buffer1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; float mat_mult_buffer2[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; float mat_mult_buffer3[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; -#ifdef IVAS_FLOAT_FIXED - Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; - Word32 mat_mult_buffer1_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word32 mat_mult_buffer2_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word32 Cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; - Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; - Word16 mat_mult_buffer1_fx_e; - Word16 Cx_fx_e; - Word16 Cy_fx_e; - Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; - Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; -#endif push_wmops( "dirac_cov_mix_mat" ); set_zero( svd_s_buffer, MAX_OUTPUT_CHANNELS ); @@ -1129,16 +1363,9 @@ int16_t computeMixingMatrices( *-----------------------------------------------------------------*/ /* Processing the SVD */ -#ifdef IVAS_FLOAT_FIXED - f2me_buf( Cy, Cy_fx, &Cy_fx_e, lengthCy * lengthCy ); - mat2svdMat_fx( Cy_fx, svd_in_buffer_fx, lengthCy, lengthCy, 0 ); - FOR ( Word32 g = 0; g < lengthCy; g++ ) - { - me2f_buf( ( svd_in_buffer_fx[g] ), Cy_fx_e, ( svd_in_buffer[g] ), lengthCy ); - } -#else + mat2svdMat( Cy, svd_in_buffer, lengthCy, lengthCy, 0 ); -#endif + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); /* Computing Ky */ @@ -1156,16 +1383,7 @@ int16_t computeMixingMatrices( /* Processing the SVD */ -#ifdef IVAS_FLOAT_FIXED - f2me_buf( Cx, Cx_fx, &Cx_fx_e, lengthCx * lengthCx ); - mat2svdMat_fx( Cx_fx, svd_in_buffer_fx, lengthCx, lengthCx, 0 ); - FOR ( Word32 g = 0; g < lengthCx; g++ ) - { - me2f_buf( ( svd_in_buffer_fx[g] ), Cx_fx_e, ( svd_in_buffer[g] ), lengthCx ); - } -#else mat2svdMat( Cx, svd_in_buffer, lengthCx, lengthCx, 0 ); -#endif svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCx ); @@ -1219,43 +1437,7 @@ int16_t computeMixingMatrices( /* Computing Q*Cx*Q' */ matrix_product( Q, lengthCy, lengthCx, 0, Cx, lengthCx, lengthCx, 0, Q_Cx ); -#ifdef IVAS_FLOAT_FIXED - Word32 Q_Cx_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word32 Q_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; - Word32 Cy_hat_diag_fx[MAX_OUTPUT_CHANNELS]; - Word16 Q_Cx_e, Q_e, Cy_hat_diag_e; - Word16 guard_bits = find_guarded_bits_fx( lengthCx + 1 ); - - f2me_buf( Q_Cx, Q_Cx_fx, &Q_Cx_e, lengthCy * lengthCx ); - f2me_buf( Q, Q_fx, &Q_e, lengthCy * lengthCx ); - - for ( i = 0; i < lengthCy * lengthCx; ++i ) - { - if ( Q_Cx_e > Q_e ) - { - Q_fx[i] = L_shr( Q_fx[i], guard_bits ); - } - else - { - Q_Cx_fx[i] = L_shr( Q_Cx_fx[i], guard_bits ); - } - } - - if ( Q_Cx_e > Q_e ) - { - Q_e += guard_bits; - } - else - { - Q_Cx_e += guard_bits; - } - - matrix_product_diag_fx( Q_Cx_fx, Q_Cx_e, lengthCy, lengthCx, 0, Q_fx, Q_e, lengthCy, lengthCx, 1, Cy_hat_diag_fx, &Cy_hat_diag_e ); - - me2f_buf( Cy_hat_diag_fx, Cy_hat_diag_e, Cy_hat_diag, lengthCy ); -#else matrix_product_diag( Q_Cx, lengthCy, lengthCx, 0, Q, lengthCy, lengthCx, 1, Cy_hat_diag ); -#endif /* Computing Cy_hat_diag */ for ( i = 0; i < lengthCy; ++i ) @@ -1285,34 +1467,14 @@ int16_t computeMixingMatrices( /* Computing the input matrix Kx'*Q'*G_hat'*Ky */ matrix_product( Kx, lengthCx, lengthCx, 1, Q, lengthCy, lengthCx, 1, mat_mult_buffer1 ); -#ifdef IVAS_FLOAT_FIXED - Word32 G_hat_fx[MAX_OUTPUT_CHANNELS]; - Word16 mat_mult_buffer1_e, mat_mult_buffer2_e, G_hat_e; - f2me_buf( mat_mult_buffer1, mat_mult_buffer1_fx, &mat_mult_buffer1_e, lengthCx * lengthCy); - f2me_buf( G_hat, G_hat_fx, &G_hat_e, lengthCy); - - matrix_diag_product_fx( mat_mult_buffer1_fx, mat_mult_buffer1_e, lengthCx, lengthCy, 0, G_hat_fx, G_hat_e, lengthCy, mat_mult_buffer2_fx, &mat_mult_buffer2_e ); - - me2f_buf( mat_mult_buffer2_fx, mat_mult_buffer2_e, mat_mult_buffer2, lengthCx * lengthCy); -#else matrix_diag_product( mat_mult_buffer1, lengthCx, lengthCy, 0, G_hat, lengthCy, mat_mult_buffer2 ); -#endif + matrix_product( mat_mult_buffer2, lengthCx, lengthCy, 0, Ky, lengthCy, lengthCy, 0, mat_mult_buffer1 ); if ( lengthCx < lengthCy ) { -#ifdef IVAS_FLOAT_FIXED - f2me_buf( mat_mult_buffer1, mat_mult_buffer1_fx, &mat_mult_buffer1_fx_e, lengthCx * lengthCy ); - mat2svdMat_fx( mat_mult_buffer1_fx, svd_in_buffer_fx, lengthCx, lengthCy, 1 ); - FOR ( Word32 g = 0; g < lengthCy; g++ ) - { - me2f_buf( ( svd_in_buffer_fx[g] ), mat_mult_buffer1_fx_e, ( svd_in_buffer[g] ), lengthCx ); - } -#else mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, lengthCy, 1 ); -#endif - nL = lengthCy; nC = lengthCx; @@ -1320,18 +1482,8 @@ int16_t computeMixingMatrices( } else { -#ifdef IVAS_FLOAT_FIXED - f2me_buf( mat_mult_buffer1, mat_mult_buffer1_fx, &mat_mult_buffer1_fx_e, lengthCx * lengthCy ); - mat2svdMat_fx( mat_mult_buffer1_fx, svd_in_buffer_fx, lengthCx, lengthCy, 0 ); - FOR ( Word32 g = 0; g < lengthCx; g++ ) - { - me2f_buf( ( svd_in_buffer_fx[g] ), mat_mult_buffer1_fx_e, ( svd_in_buffer[g] ), lengthCy ); - } -#else - mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, lengthCy, 0 ); -#endif - + mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, lengthCy, 0 ); nL = lengthCx; nC = lengthCy; @@ -1343,53 +1495,9 @@ int16_t computeMixingMatrices( /* can be skipped: lambda is always column-truncated identity matrix, so this operation just truncates V to num_input_channel columns */ -#ifdef IVAS_FLOAT_FIXED - Word16 min_q = -1; - FOR ( Word32 g = 0; g < lengthCy; g++ ) - { - f2me_buf( svd_v_buffer[g], svd_v_buffer_fx[g], &svd_v_buffer_fx_e[g], lengthCx ); - IF ( svd_v_buffer_fx_e[g] > min_q) - { - min_q = svd_v_buffer_fx_e[g]; - } - } - - FOR ( Word32 g = 0; g < lengthCy; g++ ) - { - FOR ( Word32 h = 0; h < lengthCx; h++ ) - { - svd_v_buffer_fx[g][h] = L_shr( svd_v_buffer_fx[g][h], min_q - svd_v_buffer_fx_e[g] ); - } - } - svd_v_buffer_fx_e[0] = min_q; - - min_q = -1; - FOR ( Word32 g = 0; g < lengthCx; g++ ) - { - f2me_buf( svd_u_buffer[g], svd_u_buffer_fx[g], &svd_u_buffer_fx_e[g], lengthCx ); - IF ( svd_u_buffer_fx_e[g] > min_q ) - { - min_q = svd_u_buffer_fx_e[g]; - } - } - - FOR ( Word32 g = 0; g < lengthCx; g++ ) - { - FOR ( Word32 h = 0; h < lengthCx; h++ ) - { - svd_u_buffer_fx[g][h] = L_shr( svd_u_buffer_fx[g][h], min_q - svd_u_buffer_fx_e[g] ); - } - } - svd_u_buffer_fx_e[0] = min_q; - svdMat2mat_fx( svd_v_buffer_fx, mat_mult_buffer1_fx, lengthCy, lengthCx ); - svdMat2mat_fx( svd_u_buffer_fx, mat_mult_buffer2_fx, lengthCx, lengthCx ); - me2f_buf( mat_mult_buffer1_fx, svd_v_buffer_fx_e[0], mat_mult_buffer1, lengthCy * lengthCx ); - me2f_buf( mat_mult_buffer2_fx, svd_u_buffer_fx_e[0], mat_mult_buffer2, lengthCx * lengthCx ); -#else svdMat2mat( svd_v_buffer, mat_mult_buffer1, lengthCy, lengthCx ); svdMat2mat( svd_u_buffer, mat_mult_buffer2, lengthCx, lengthCx ); -#endif matrix_product( mat_mult_buffer1, lengthCy, lengthCx, 0, mat_mult_buffer2, lengthCx, lengthCx, 1, @@ -1453,86 +1561,950 @@ int16_t computeMixingMatrices( } } -#ifdef IVAS_FLOAT_FIXED - Word32 adj_fx[MAX_OUTPUT_CHANNELS]; - Word32 mixing_matrix_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word32 mat_mult_buffer3_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word16 adj_e, mixing_matrix_e, mat_mult_buffer3_e; - - f2me_buf( adj, adj_fx, &adj_e, lengthCy ); - f2me_buf( mixing_matrix, mixing_matrix_fx, &mixing_matrix_e, lengthCy * lengthCx ); - diag_matrix_product_fx( adj_fx, adj_e, lengthCy, mixing_matrix_fx, mixing_matrix_e, lengthCy, lengthCx, 0, mat_mult_buffer3_fx, &mat_mult_buffer3_e ); + diag_matrix_product( adj, lengthCy, mixing_matrix, lengthCy, lengthCx, 0, mat_mult_buffer3 ); + mvr2r( mat_mult_buffer3, mixing_matrix, lengthCy * lengthCx ); + } + pop_wmops(); + + return out; +} + + + +#ifdef IVAS_FLOAT_FIXED +Word16 computeMixingMatrices_fx( + const Word16 num_inputs, /* i : number of input channels */ + const Word16 num_outputs, /* i : number of output channels */ + const Word32 *Cx, /* i : input channel covariance matrix */ + Word16 Cx_e, + const Word32 *Cy, /* i : target covariance matrix */ + Word16 Cy_e, + const Word32 *Q, /* i : prototype matrix (usually a upmix matrix) */ + Word16 Q_fx_e, + const Word16 energy_compensation_flag, /* i : flag indicating that the energy compensation should be performed (i.e. no residual mixing matrix will follow) */ + const Word32 reg_Sx_fx, /* i : regularization factor for the input channel singular values */ + Word16 reg_Sx_e, + const Word32 reg_ghat_fx, /* i : regularization factor for the normalization matrix */ + Word16 reg_ghat_e, + Word32 *mixing_matrix_fx, /* o : resulting mixing matrix */ + Word16 *mixing_matrix_out_e, + Word32 *Cr_fx, /* o : residual covariance matrix */ + Word16 *Cr_e +) +{ + int16_t i, j; + int16_t out = EXIT_SUCCESS; + int16_t nL, nC; + int16_t lengthCx = num_inputs; + int16_t lengthCy = num_outputs; + float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_s_buffer[MAX_OUTPUT_CHANNELS]; + float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + Word32 mat_mult_buffer1_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + Word32 mat_mult_buffer2_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 Cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + + //Word16 mat_mult_buffer1_fx_e; + Word16 Cx_fx_e; + Word16 Cy_fx_e; + Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; + Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; + + Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS]; + Word16 svd_s_buffer_e[MAX_OUTPUT_CHANNELS]; + Word16 svd_s_buffer_fx_e; + + + Word32 limit_fx; + Word16 limit_e; + + Word32 L_tmp; + Word16 tmp_e, tmp, exp; + + Word32 Ky_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + Word32 Kx_fx[MAX_TRANSPORT_CHANNELS * MAX_TRANSPORT_CHANNELS]; + + Word16 Kx_fx_e[MAX_TRANSPORT_CHANNELS * MAX_TRANSPORT_CHANNELS]; + Word16 Ky_fx_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + + Word32 Kx_reg_inv_fx[MAX_TRANSPORT_CHANNELS * MAX_TRANSPORT_CHANNELS]; + Word16 Kx_reg_inv_e[MAX_TRANSPORT_CHANNELS * MAX_TRANSPORT_CHANNELS]; + + Word32 Q_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; + Word16 Q_e; + + Word32 Q_Cx_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + Word16 Q_Cx_e; + + Word32 Cy_hat_diag_fx[MAX_OUTPUT_CHANNELS]; + Word16 Cy_hat_diag_e; + Word16 Cy_hat_diag_buff_e[MAX_OUTPUT_CHANNELS]; + Word32 G_hat_fx[MAX_OUTPUT_CHANNELS]; + Word16 G_hat_buff_e[MAX_OUTPUT_CHANNELS]; + Word16 G_hat_e; + + Word16 mat_mult_buffer1_e, mat_mult_buffer2_e, mat_mult_buffer3_e; + + Word32 mat_mult_buffer3_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + + Word16 mixing_matrix_e; + + Word16 Cr_buff_e[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 Cr_fx_e; + + + Word32 adj_fx[MAX_OUTPUT_CHANNELS]; + Word16 adj_e[MAX_OUTPUT_CHANNELS]; + Word32 *adj_fx_p; + //Word32 adj_buff_fx[MAX_OUTPUT_CHANNELS]; + Word16 adj_fx_e; + + Word32 *Cr_p_fx, *Cy_tilde_p_fx, *Cy_p_fx; + push_wmops( "dirac_cov_mix_mat" ); + + + + set32_fx( svd_s_buffer_fx, 0, MAX_OUTPUT_CHANNELS ); + FOR ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + set32_fx( svd_in_buffer_fx[i], 0, MAX_OUTPUT_CHANNELS ); + set32_fx( svd_u_buffer_fx[i], 0, MAX_OUTPUT_CHANNELS ); + set32_fx( svd_v_buffer_fx[i], 0, MAX_OUTPUT_CHANNELS ); + } + + + Copy32(Q, Q_fx, lengthCy * lengthCx); + Copy32(Cx, Cx_fx, lengthCx * lengthCx); + Copy32(Cy, Cy_fx, lengthCy * lengthCy); + + Q_e = Q_fx_e; + move16(); + Cx_fx_e = Cx_e; + move16(); + Cy_fx_e = Cy_e; + move16(); + + + /*-----------------------------------------------------------------* + * Decomposition of Cy + *-----------------------------------------------------------------*/ + + /* Processing the SVD */ + + mat2svdMat_fx( Cy_fx, svd_in_buffer_fx, lengthCy, lengthCy, 0 ); + FOR ( Word32 g = 0; g < lengthCy; g++ ) + { + me2f_buf( ( svd_in_buffer_fx[g] ), Cy_fx_e, ( svd_in_buffer[g] ), lengthCy ); + } + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); + + f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); + FOR(Word32 g = 0; g < lengthCy; g++) + { + f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCy); + f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCy); + } + + /* Computing Ky */ + + + /* Computing Ky */ + FOR ( i = 0; i < lengthCy; ++i ) + { + FOR ( j = 0; j < lengthCy; ++j ) + { + tmp_e = svd_s_buffer_fx_e; + L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); + Ky_fx[i + j * lengthCy] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); + Ky_fx_e[i + j * lengthCy] = svd_u_buffer_fx_e[i] + tmp_e; + } + } + + exp = Ky_fx_e[0]; + FOR (i = 1; i < lengthCy * lengthCy; i++) + { + IF (exp < Ky_fx_e[i]) + exp = Ky_fx_e[i]; + } + + FOR (i = 0; i < lengthCy * lengthCy; i++) + { + Ky_fx[i] = L_shr(Ky_fx[i], exp - Ky_fx_e[i]); + Ky_fx_e[i] = exp; + } + + + /*-----------------------------------------------------------------* + * Decomposition of Cx + *-----------------------------------------------------------------*/ + + /* Processing the SVD */ + + mat2svdMat_fx( Cx_fx, svd_in_buffer_fx, lengthCx, lengthCx, 0 ); + FOR ( Word32 g = 0; g < lengthCx; g++ ) + { + me2f_buf( ( svd_in_buffer_fx[g] ), Cx_fx_e, ( svd_in_buffer[g] ), lengthCx ); + } + + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCx ); + f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCx); + FOR(Word32 g = 0; g < lengthCy; g++) + { + f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCx); + f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCx); + } + + + + FOR ( i = 0; i < lengthCx; ++i ) + { + FOR ( j = 0; j < lengthCx; ++j ) + { + tmp_e = svd_s_buffer_fx_e; + L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); + Kx_fx[i + j * lengthCx] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); + Kx_fx_e[i + j * lengthCx] = svd_u_buffer_fx_e[i] + tmp_e; + } + } + + exp = Kx_fx_e[0]; + FOR (i = 1; i < lengthCx * lengthCx; i++) + { + IF (exp < Kx_fx_e[i]) + exp = Kx_fx_e[i]; + } + + FOR (i = 0; i < lengthCx * lengthCx; i++) + { + Kx_fx[i] = L_shr(Kx_fx[i], exp - Kx_fx_e[i]); + Kx_fx_e[i] = exp; + move16(); + } + + + FOR ( i = 0; i < lengthCx; ++i ) + { + tmp_e = svd_s_buffer_fx_e; + move16(); + svd_s_buffer_fx[i] = Sqrt32(svd_s_buffer_fx[i], &tmp_e); + svd_s_buffer_e[i] = tmp_e; + move16(); + } + + // making the Q common + Word16 max = svd_s_buffer_e[0]; + FOR (i = 1; i < lengthCx; i++) + { + IF (max < svd_s_buffer_e[i]) + { + max = svd_s_buffer_e[i]; + move16(); + } + } + + FOR (i = 0; i < lengthCx; i++) + { + svd_s_buffer_fx[i] = L_shr(svd_s_buffer_fx[i], (max - svd_s_buffer_e[i] )); + } + svd_s_buffer_fx_e = max; + move16(); + + + /*-----------------------------------------------------------------* + * Regularization of Sx + *-----------------------------------------------------------------*/ + + maximum_l( svd_s_buffer_fx, lengthCx, &limit_fx ); + limit_e = svd_s_buffer_fx_e; + move16(); + + L_tmp = Mpy_32_32(limit_fx, reg_Sx_fx); + limit_e = limit_e + reg_Sx_e; + limit_fx = L_add( L_tmp, EPSILON_FX ); + + FOR ( i = 0; i < lengthCx; ++i ) + { + svd_s_buffer_e[i] = svd_s_buffer_fx_e; + IF (BASOP_Util_Cmp_Mant32Exp(svd_s_buffer_fx[i], svd_s_buffer_fx_e, limit_fx, limit_e) < 0) + { + svd_s_buffer_fx[i] = limit_fx; + svd_s_buffer_e[i] = limit_e; + } + } + + + + limit_fx = 0; + move32(); + limit_e = 0; + move16(); + + + /*-----------------------------------------------------------------* + * regularized Kx-1 + *-----------------------------------------------------------------*/ + + FOR ( i = 0; i < lengthCx; ++i ) + { + Word16 scale, reg_fac_fx; + reg_fac_fx = BASOP_Util_Divide3232_Scale(1, svd_s_buffer_fx[i], &scale); + scale = scale + (31 - svd_s_buffer_e[i]); + FOR ( j = 0; j < lengthCx; ++j ) + { + Kx_reg_inv_fx[i + j * lengthCx] = Mpy_32_16_1(svd_u_buffer_fx[j][i], reg_fac_fx ); + Kx_reg_inv_e[i + j * lengthCx] = svd_u_buffer_fx_e[j] + scale; + } + } + + exp = Kx_reg_inv_e[0]; + move16(); + FOR(i = 0; i < lengthCx * lengthCx; i++) + { + IF (exp < Kx_reg_inv_e[i]) + exp = Kx_reg_inv_e[i]; + move16(); + } + + FOR(i = 0; i < lengthCx * lengthCx; i++) + { + Kx_reg_inv_fx[i] = L_shr(Kx_reg_inv_fx[i], exp - Kx_reg_inv_e[i]); + Kx_reg_inv_e[i] = exp; + move16(); + } + + /*-----------------------------------------------------------------* + * normalization matrix G hat + *-----------------------------------------------------------------*/ + + /* Computing Q*Cx*Q' */ + + matrix_product_fx( Q_fx, lengthCy, lengthCx, 0, Cx_fx, lengthCx, lengthCx, 0, Q_Cx_fx ); + Q_Cx_e = Q_e + Cx_fx_e; + + + Word16 guard_bits = find_guarded_bits_fx( lengthCx + 1 ); + + FOR ( i = 0; i < lengthCy * lengthCx; ++i ) + { + IF ( Q_Cx_e > Q_e ) + { + Q_fx[i] = L_shr( Q_fx[i], guard_bits ); + } + ELSE + { + Q_Cx_fx[i] = L_shr( Q_Cx_fx[i], guard_bits ); + } + } + + IF ( Q_Cx_e > Q_e ) + { + Q_e += guard_bits; + } + ELSE + { + Q_Cx_e += guard_bits; + } + + matrix_product_diag_fx( Q_Cx_fx, Q_Cx_e, lengthCy, lengthCx, 0, Q_fx, Q_e, lengthCy, lengthCx, 1, Cy_hat_diag_fx, &Cy_hat_diag_e ); + + + FOR ( i = 0; i < lengthCy; ++i ) + { + IF (BASOP_Util_Cmp_Mant32Exp(Cy_hat_diag_fx[i], Cy_hat_diag_e, limit_fx, limit_e) > 0) + { + limit_fx = Cy_hat_diag_fx[i]; + move32(); + limit_e = Cy_hat_diag_e; + move16(); + } + + L_tmp = Mpy_32_32(limit_fx, reg_ghat_fx); + limit_fx = L_add(L_tmp, EPSILON_FX); + limit_e = limit_e + reg_ghat_e; + } + + + FOR ( i = 0; i < lengthCy; ++i ) + { + Cy_hat_diag_buff_e[i] = Cy_hat_diag_e; + move16(); + IF ( BASOP_Util_Cmp_Mant32Exp(limit_fx, limit_e, Cy_hat_diag_fx[i], Cy_hat_diag_buff_e[i] ) > 0 ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ + { + Cy_hat_diag_fx[i] = limit_fx; + move32(); + Cy_hat_diag_buff_e[i] = limit_e; + move16(); + } + + tmp = BASOP_Util_Divide3232_Scale(Cy_fx[i + i * lengthCy], Cy_hat_diag_fx[i], &exp); + exp = exp + ( Cy_fx_e - Cy_hat_diag_buff_e[i] ); + L_tmp = Sqrt32(L_deposit_h(tmp), &exp); + G_hat_fx[i] = L_tmp; + move32(); + G_hat_buff_e[i] = exp; + move16(); + } + + exp = G_hat_buff_e[0]; + move16(); + FOR (i = 1; i < lengthCy; i++) + { + IF (exp < G_hat_buff_e[i]) + exp = G_hat_buff_e[i]; + } + + FOR (i = 0; i < lengthCy; i++) + { + G_hat_fx[i] = L_shr(G_hat_fx[i], exp - G_hat_buff_e[i]); + } + + G_hat_e = exp; + move16(); + + /*-----------------------------------------------------------------* + * Formulate optimal P + *-----------------------------------------------------------------*/ + + /* Computing the input matrix Kx'*Q'*G_hat'*Ky */ + + matrix_product_fx(Kx_fx, lengthCx, lengthCx, 1, Q_fx, lengthCy, lengthCx, 1, mat_mult_buffer1_fx); + mat_mult_buffer1_e = Kx_fx_e[0] + Q_e; + + + matrix_diag_product_fx( mat_mult_buffer1_fx, mat_mult_buffer1_e, lengthCx, lengthCy, 0, G_hat_fx, G_hat_e, lengthCy, mat_mult_buffer2_fx, &mat_mult_buffer2_e ); + + matrix_product_fx( mat_mult_buffer2_fx, lengthCx, lengthCy, 0, Ky_fx, lengthCy, lengthCy, 0, mat_mult_buffer1_fx ); + mat_mult_buffer1_e = mat_mult_buffer2_e + Ky_fx_e[0]; + + + IF ( lengthCx < lengthCy ) + { + mat2svdMat_fx( mat_mult_buffer1_fx, svd_in_buffer_fx, lengthCx, lengthCy, 1 ); + +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED + FOR ( Word32 g = 0; g < lengthCy; g++ ) + { + me2f_buf( ( svd_in_buffer_fx[g] ), mat_mult_buffer1_e, ( svd_in_buffer[g] ), lengthCx ); + } + + nL = lengthCy; + move16(); + nC = lengthCx; + move16(); + + svd( svd_in_buffer, svd_v_buffer, svd_s_buffer, svd_u_buffer, nL, nC ); +#endif + } + ELSE + { + mat2svdMat_fx( mat_mult_buffer1_fx, svd_in_buffer_fx, lengthCx, lengthCy, 0 ); + +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED + FOR ( Word32 g = 0; g < lengthCx; g++ ) + { + me2f_buf( ( svd_in_buffer_fx[g] ), mat_mult_buffer1_e, ( svd_in_buffer[g] ), lengthCy ); + } + + nL = lengthCx; + move16(); + nC = lengthCy; + move16(); + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, nL, nC ); +#endif + } + + /* Actually Processing P */ + + /* can be skipped: lambda is always column-truncated identity matrix, so this operation just + truncates V to num_input_channel columns */ + + Word16 min_q = -1; + move16(); + FOR ( Word32 g = 0; g < lengthCy; g++ ) + { + f2me_buf( svd_v_buffer[g], svd_v_buffer_fx[g], &svd_v_buffer_fx_e[g], lengthCx ); + IF ( svd_v_buffer_fx_e[g] > min_q) + { + min_q = svd_v_buffer_fx_e[g]; + } + } + + FOR ( Word32 g = 0; g < lengthCy; g++ ) + { + FOR ( Word32 h = 0; h < lengthCx; h++ ) + { + svd_v_buffer_fx[g][h] = L_shr( svd_v_buffer_fx[g][h], min_q - svd_v_buffer_fx_e[g] ); + } + } + svd_v_buffer_fx_e[0] = min_q; + move16(); + + min_q = -1; + move16(); + FOR ( Word32 g = 0; g < lengthCx; g++ ) + { + f2me_buf( svd_u_buffer[g], svd_u_buffer_fx[g], &svd_u_buffer_fx_e[g], lengthCx ); + IF ( svd_u_buffer_fx_e[g] > min_q ) + { + min_q = svd_u_buffer_fx_e[g]; + move16(); + } + } + + FOR ( Word32 g = 0; g < lengthCx; g++ ) + { + FOR ( Word32 h = 0; h < lengthCx; h++ ) + { + svd_u_buffer_fx[g][h] = L_shr( svd_u_buffer_fx[g][h], min_q - svd_u_buffer_fx_e[g] ); + } + } + svd_u_buffer_fx_e[0] = min_q; + move16(); + svdMat2mat_fx( svd_v_buffer_fx, mat_mult_buffer1_fx, lengthCy, lengthCx ); + svdMat2mat_fx( svd_u_buffer_fx, mat_mult_buffer2_fx, lengthCx, lengthCx ); + + mat_mult_buffer1_e = svd_v_buffer_fx_e[0]; + mat_mult_buffer2_e = svd_u_buffer_fx_e[0]; + + guard_bits = find_guarded_bits_fx(lengthCx + 1); + FOR(i = 0; i < lengthCx * lengthCy; ++i) + { + IF(mat_mult_buffer1_e > mat_mult_buffer1_e) + { + mat_mult_buffer1_fx[i] = L_shr(mat_mult_buffer1_fx[i], guard_bits); + } + ELSE + { + mat_mult_buffer2_fx[i] = L_shr(mat_mult_buffer2_fx[i], guard_bits); + } + } + + IF(mat_mult_buffer1_e > mat_mult_buffer2_e ) + { + mat_mult_buffer2_e += guard_bits; + } + ELSE + { + mat_mult_buffer1_e += guard_bits; + } + + matrix_product_fx( mat_mult_buffer1_fx, lengthCy, lengthCx, 0, + mat_mult_buffer2_fx, lengthCx, lengthCx, 1, + mat_mult_buffer3_fx ); + mat_mult_buffer3_e = mat_mult_buffer1_e + mat_mult_buffer2_e; + + /************************ Formulate M **********************/ + + matrix_product_fx( Ky_fx, lengthCy, lengthCy, 0, mat_mult_buffer3_fx, lengthCy, lengthCx, 0, mat_mult_buffer1_fx); + mat_mult_buffer1_e = Ky_fx_e[0] + mat_mult_buffer3_e; + + + matrix_product_fx( mat_mult_buffer1_fx, lengthCy, lengthCx, 0, Kx_reg_inv_fx, lengthCx, lengthCx, 0, mixing_matrix_fx ); + mixing_matrix_e = Kx_reg_inv_e[0] + mat_mult_buffer1_e; + + + /*-----------------------------------------------------------------* + * Formulate Cr + *-----------------------------------------------------------------*/ + + /* Compute Cy_tilde = M*Cx*M' */ + + + matrix_product_fx( mixing_matrix_fx, lengthCy, lengthCx, 0, Cx_fx, lengthCx, lengthCx, 0, mat_mult_buffer1_fx ); + mat_mult_buffer1_e = mixing_matrix_e + Cx_fx_e; + + matrix_product_fx( mat_mult_buffer1_fx, lengthCy, lengthCx, 0, mixing_matrix_fx, lengthCy, lengthCx, 1, mat_mult_buffer2_fx ); + mat_mult_buffer2_e = mat_mult_buffer1_e + mixing_matrix_e; + + Cr_p_fx = Cr_fx; + Cy_p_fx = Cy_fx; + Cy_tilde_p_fx = mat_mult_buffer2_fx; + exp = s_max(Cy_fx_e, mat_mult_buffer2_e); + FOR ( i = 0; i < lengthCy * lengthCy; i++) + { + Cy_fx[i] = L_shr(Cy_p_fx[i], exp - Cy_fx_e); + Cy_tilde_p_fx[i] = L_shr(Cy_tilde_p_fx[i], exp - mat_mult_buffer2_e); + } + Cy_fx_e = exp; + move16(); + mat_mult_buffer2_e = exp; + move16(); + FOR(i = 0; i < lengthCy; ++i) + { + FOR(j = 0; j < lengthCy; ++j) + { + + *(Cr_p_fx++) = *(Cy_p_fx++) - *(Cy_tilde_p_fx++); + } + + /* Avoid Meaningless negative main diagonal elements */ + Cr_buff_e[i + i * lengthCy] = exp; + IF(BASOP_Util_Cmp_Mant32Exp(Cr_fx[i + i * lengthCy], exp, 0, 0) < 0) + { + Cr_fx[i + i * lengthCy] = 0; + move16(); + Cr_buff_e[i + i * lengthCy] = 0; + move16(); + } + } + + Cr_fx_e = exp; + move16(); + + /*-----------------------------------------------------------------* + * Energy Compensation + *-----------------------------------------------------------------*/ + + IF ( energy_compensation_flag == 1 ) + { + adj_fx_p = svd_s_buffer_fx; + Cy_tilde_p_fx = mat_mult_buffer2_fx; + + FOR ( i = 0; i < lengthCy; ++i ) + { + /* Avoid correction for very small energies, + main diagonal elements of Cy_tilde_p may be negative */ + IF (BASOP_Util_Cmp_Mant32Exp(Cy_tilde_p_fx[i + i * lengthCy], mat_mult_buffer2_e, 0, 0) < 0) + { + adj_fx_p[i] = 1073741824; + move32(); + adj_e[i] = 1; + move16(); + } + ELSE + { + tmp = BASOP_Util_Divide3232_Scale(Cy_fx[i + lengthCy * i], L_add( Cy_tilde_p_fx[i + i * lengthCy], EPSILON_FX ), &exp); + exp = exp + (Cy_fx_e - mat_mult_buffer2_e); + L_tmp = L_deposit_h(tmp); + L_tmp = Sqrt32(L_tmp, &exp); + adj_fx_p[i] = L_tmp; + move32(); + adj_e[i] = exp; + move16(); + } + + IF (BASOP_Util_Cmp_Mant32Exp(adj_fx_p[i], adj_e[i], 1073741824, 3) > 0) + { + adj_fx_p[i] = 1073741824; + move32(); + adj_e[i] = 3; + move16(); + } + } + + exp = adj_e[0]; + FOR (i = 1; i < lengthCy; i++) + { + IF (exp < adj_e[i]) + exp = adj_e[i]; + } + + FOR (i = 0; i < lengthCy; i++) + { + adj_fx[i] = L_shr(adj_fx_p[i], exp - adj_e[i]); + } + adj_fx_e = exp; + move16(); + + diag_matrix_product_fx( adj_fx, adj_fx_e, lengthCy, mixing_matrix_fx, mixing_matrix_e, lengthCy, lengthCx, 0, mat_mult_buffer3_fx, &mat_mult_buffer3_e ); + + Copy32(mat_mult_buffer3_fx, mixing_matrix_fx, lengthCx * lengthCy); + mixing_matrix_e = mat_mult_buffer3_e; + move16(); + } + + *mixing_matrix_out_e = mixing_matrix_e; + move16(); + *Cr_e = Cr_fx_e; + move16(); + pop_wmops(); + + return out; +} +#endif + +/*-------------------------------------------------------------------* + * computeMixingMatricesResidual() + * + * compute a residual mixing matrix using the covariance synthesis approach + *-------------------------------------------------------------------*/ + +int16_t computeMixingMatricesResidual( + const int16_t num_outputs, /* i : number of output channels */ + const float *Cx, /* i : vector containing the diagonal diffuse prototype covariance */ + const float *Cy, /* i : matrix containing the missing cov (Cr from computeMixingMatrices()) */ + const float reg_Sx, /* i : regularization factor for the input channel singular values */ + const float reg_ghat, /* i : regularization factor for the normalization matrix */ + float *mixing_matrix /* o : resulting residual mixing matrix */ +) +{ + int16_t i, j; + int16_t out = EXIT_SUCCESS; + int16_t lengthCx = num_outputs; + int16_t lengthCy = num_outputs; + float *adj; + float limit; + float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float svd_s_buffer[MAX_OUTPUT_CHANNELS]; + float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; + float Kx[MAX_OUTPUT_CHANNELS]; + float Ky[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float Kx_reg_inv[MAX_OUTPUT_CHANNELS]; + float Cy_hat_diag[MAX_OUTPUT_CHANNELS]; + float G_hat[MAX_OUTPUT_CHANNELS]; + float Cy_tilde[MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer2[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + float mat_mult_buffer3[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + + push_wmops( "dirac_cov_mix_mat_r" ); + + /*-----------------------------------------------------------------* + * Decomposition of Cy + *-----------------------------------------------------------------*/ + + /* Processing the SVD */ + + /* linear array to svd buffer */ + mat2svdMat( Cy, svd_in_buffer, lengthCy, lengthCy, 0 ); + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); + + /* Computing Ky */ + for ( i = 0; i < lengthCy; ++i ) + { + for ( j = 0; j < lengthCy; ++j ) + { + Ky[i + j * lengthCy] = svd_u_buffer[i][j] * sqrtf( svd_s_buffer[j] ); + } + } + + /*-----------------------------------------------------------------* + * Decomposition of Cx + *-----------------------------------------------------------------*/ + + /* Processing the SVD of Cx*/ + /* Cx is a diagonal matrix, so SVD would lead to the sorted diagonal as S and u + * would be just indicating the sorting index, so go straight to Kx as the + * square root of the diagonal of Cx */ + + /* Computing Kx */ + for ( i = 0; i < lengthCx; ++i ) + { + Kx[i] = sqrtf( Cx[i] ); + } + + /*-----------------------------------------------------------------* + * Regularization of Sx + *-----------------------------------------------------------------*/ + + maximum( Kx, lengthCx, &limit ); + limit = limit * reg_Sx + EPSILON; + + for ( i = 0; i < lengthCx; ++i ) + { + float reg_fac = ( 1.0f / ( ( Kx[i] > limit ) ? Kx[i] : limit ) ); + Kx_reg_inv[i] = reg_fac; + } + + limit = 0.0f; + + /*-----------------------------------------------------------------* + * regularized Kx-1 + *-----------------------------------------------------------------*/ + + /*-----------------------------------------------------------------* + * normalization matrix G hat + *-----------------------------------------------------------------*/ + + /* Computing Cy_hat_diag */ + mvr2r( Cx, Cy_hat_diag, num_outputs ); + + for ( i = 0; i < lengthCy; ++i ) + { + if ( Cy_hat_diag[i] > limit ) + { + limit = Cy_hat_diag[i]; + } + } + + limit = limit * reg_ghat + EPSILON; + + /* Computing G_hat */ + for ( i = 0; i < lengthCy; ++i ) + { + if ( limit > Cy_hat_diag[i] ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ + { + Cy_hat_diag[i] = limit; + } + G_hat[i] = sqrtf( Cy[i + i * lengthCy] / Cy_hat_diag[i] ); + } + + /*-----------------------------------------------------------------* + * Formulate optimal P + *-----------------------------------------------------------------*/ + + for ( i = 0; i < num_outputs; i++ ) + { + Kx[i] *= G_hat[i]; + } + + for ( i = 0; i < num_outputs; i++ ) + { + float fac = Kx[i]; + + for ( j = 0; j < num_outputs; j++ ) + { + mat_mult_buffer1[i + j * num_outputs] = Ky[i + j * num_outputs] * fac; + } + } + + mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, lengthCy, 0 ); + + svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCy ); + + /* Actually Processing P */ + + svdMat2mat( svd_v_buffer, mat_mult_buffer1, lengthCy, lengthCx ); + svdMat2mat( svd_u_buffer, mat_mult_buffer2, lengthCx, lengthCx ); + + matrix_product( mat_mult_buffer1, lengthCy, lengthCx, 0, + mat_mult_buffer2, lengthCx, lengthCx, 1, + mat_mult_buffer3 ); + + /*-----------------------------------------------------------------* + * Formulate M + *-----------------------------------------------------------------*/ + + matrix_product( Ky, lengthCy, lengthCy, 0, mat_mult_buffer3, lengthCy, lengthCx, 0, mat_mult_buffer1 ); + + for ( i = 0; i < num_outputs; i++ ) + { + float fac = Kx_reg_inv[i]; + + for ( j = 0; j < num_outputs; j++ ) + { + mixing_matrix[j + i * num_outputs] = mat_mult_buffer1[j + i * num_outputs] * fac; + } + } - me2f_buf( mat_mult_buffer3_fx, mat_mult_buffer3_e, mat_mult_buffer3, lengthCx * lengthCy ); -#else - diag_matrix_product( adj, lengthCy, mixing_matrix, lengthCy, lengthCx, 0, mat_mult_buffer3 ); -#endif + /*-----------------------------------------------------------------* + * Formulate Cr + *-----------------------------------------------------------------*/ - mvr2r( mat_mult_buffer3, mixing_matrix, lengthCy * lengthCx ); + /* Compute Cy_tilde = M*Cx*M' */ + matrix_diag_product( mixing_matrix, lengthCy, lengthCx, 0, Cx, lengthCx, mat_mult_buffer1 ); + matrix_product_diag( mat_mult_buffer1, lengthCy, lengthCx, 0, mixing_matrix, lengthCy, lengthCx, 1, Cy_tilde ); + + /*-----------------------------------------------------------------* + * Energy Compensation + *-----------------------------------------------------------------*/ + + adj = svd_s_buffer; + + for ( i = 0; i < lengthCy; ++i ) + { + adj[i] = sqrtf( Cy[i + lengthCy * i] / ( Cy_tilde[i] + EPSILON ) ); + if ( adj[i] > 4.0f ) + { + adj[i] = 4.0f; + } } + + diag_matrix_product( adj, lengthCy, mixing_matrix, lengthCy, lengthCx, 0, mat_mult_buffer3 ); + + mvr2r( mat_mult_buffer3, mixing_matrix, lengthCy * lengthCx ); + pop_wmops(); return out; } - -/*-------------------------------------------------------------------* - * computeMixingMatricesResidual() - * - * compute a residual mixing matrix using the covariance synthesis approach - *-------------------------------------------------------------------*/ - -int16_t computeMixingMatricesResidual( - const int16_t num_outputs, /* i : number of output channels */ - const float *Cx, /* i : vector containing the diagonal diffuse prototype covariance */ - const float *Cy, /* i : matrix containing the missing cov (Cr from computeMixingMatrices()) */ - const float reg_Sx, /* i : regularization factor for the input channel singular values */ - const float reg_ghat, /* i : regularization factor for the normalization matrix */ - float *mixing_matrix /* o : resulting residual mixing matrix */ +#ifdef IVAS_FLOAT_FIXED +Word16 computeMixingMatricesResidual_fx( + const Word32 num_outputs, /* i : number of output channels */ + const Word32 *Cx_fx, /* i : vector containing the diagonal diffuse prototype covariance */ + const Word16 Cx_e, + const Word32 *Cy_fx, /* i : matrix containing the missing cov (Cr from computeMixingMatrices()) */ + const Word16 Cy_fx_e, + const Word32 reg_Sx_fx, /* i : regularization factor for the input channel singular values */ + const Word16 reg_Sx_e, + const Word32 reg_ghat_fx, /* i : regularization factor for the normalization matrix */ + const Word16 reg_ghat_e, + Word32 *mixing_matrix_fx, /* o : resulting residual mixing matrix */ + Word16 *mixing_matrix_ret_e ) { - int16_t i, j; - int16_t out = EXIT_SUCCESS; - int16_t lengthCx = num_outputs; - int16_t lengthCy = num_outputs; - float *adj; - float limit; + Word16 i, j; + Word16 out = EXIT_SUCCESS; + Word16 lengthCx = extract_l(num_outputs); + Word16 lengthCy = extract_l(num_outputs); + +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_s_buffer[MAX_OUTPUT_CHANNELS]; float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; - float Kx[MAX_OUTPUT_CHANNELS]; - float Ky[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - float Kx_reg_inv[MAX_OUTPUT_CHANNELS]; - float Cy_hat_diag[MAX_OUTPUT_CHANNELS]; - float G_hat[MAX_OUTPUT_CHANNELS]; - float Cy_tilde[MAX_OUTPUT_CHANNELS]; - float mat_mult_buffer1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - float mat_mult_buffer2[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - float mat_mult_buffer3[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; -#ifdef IVAS_FLOAT_FIXED +#endif + Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer2_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word32 Cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; - Word16 mat_mult_buffer1_fx_e; - Word16 Cy_fx_e; Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; -#endif + + Word16 mat_mult_buffer1_buff_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + push_wmops( "dirac_cov_mix_mat_r" ); -#ifdef IVAS_FLOAT_FIXED - Word32 mixing_matrix_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word32 Cx_fx[MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer1_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 adj_fx[MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer3_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - Word16 mixing_matrix_e, Cx_e, mat_mult_buffer1_e, adj_e, mat_mult_buffer3_e; -#endif + Word16 mixing_matrix_e = 0, mat_mult_buffer1_e, adj_e, mat_mult_buffer3_e, mat_mult_buffer2_e; + + Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS]; + Word16 svd_s_buffer_fx_e; + Word32 L_tmp; + Word16 tmp_e; + Word16 tmp, scale; + Word32 div_tmp; + Word16 exp; + + Word32 Kx_fx[MAX_OUTPUT_CHANNELS]; + Word16 Ky_fx_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + Word32 Ky_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; + Word16 Kx_fx_e[MAX_OUTPUT_CHANNELS]; + + Word32 limit_fx; + Word16 limit_e; + + Word32 Kx_reg_inv_fx[MAX_OUTPUT_CHANNELS]; + Word16 Kx_reg_inv_e[MAX_OUTPUT_CHANNELS], Kx_reg_inv_fx_e; + + Word32 Cy_hat_diag_fx[MAX_OUTPUT_CHANNELS]; + Word16 Cy_hat_diag_e; + + Word16 Cy_hat_diag_fx_e[MAX_OUTPUT_CHANNELS]; + Word32 G_hat_fx[MAX_OUTPUT_CHANNELS]; + Word16 G_hat_e[MAX_OUTPUT_CHANNELS]; + + Word32 *adj_fx_p; + Word16 adj_buff_e[MAX_OUTPUT_CHANNELS]; + + Word32 Cy_tilde_fx[MAX_OUTPUT_CHANNELS]; + Word16 Cy_tilde_e; /*-----------------------------------------------------------------* * Decomposition of Cy @@ -1541,30 +2513,49 @@ int16_t computeMixingMatricesResidual( /* Processing the SVD */ /* linear array to svd buffer */ -#ifdef IVAS_FLOAT_FIXED - f2me_buf( Cy, Cy_fx, &Cy_fx_e, lengthCy * lengthCy ); mat2svdMat_fx( Cy_fx, svd_in_buffer_fx, lengthCy, lengthCy, 0 ); +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED FOR ( Word32 g = 0; g < lengthCy; g++ ) { me2f_buf( ( svd_in_buffer_fx[g] ), Cy_fx_e, ( svd_in_buffer[g] ), lengthCy ); } -#else - mat2svdMat( Cy, svd_in_buffer, lengthCy, lengthCy, 0 ); -#endif - - svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); + svd(svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy); + f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); + FOR(Word32 g = 0; g < lengthCy; g++) + { + f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCy); + f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCy); + } +#endif /* Computing Ky */ - for ( i = 0; i < lengthCy; ++i ) + FOR ( i = 0; i < lengthCy; ++i ) { - for ( j = 0; j < lengthCy; ++j ) + FOR ( j = 0; j < lengthCy; ++j ) { - Ky[i + j * lengthCy] = svd_u_buffer[i][j] * sqrtf( svd_s_buffer[j] ); + tmp_e = svd_s_buffer_fx_e; + L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); + Ky_fx[i + j * lengthCy] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); + Ky_fx_e[i + j * lengthCy] = svd_u_buffer_fx_e[i] + tmp_e; } } + exp = Ky_fx_e[0]; + FOR (i = 1; i < lengthCy * lengthCy; i++) + { + IF (exp < Ky_fx_e[i]) + exp = Ky_fx_e[i]; + } + + FOR (i = 0; i < lengthCy * lengthCy; i++) + { + Ky_fx[i] = L_shr(Ky_fx[i], exp - Ky_fx_e[i]); + Ky_fx_e[i] = exp; + move16(); + } + /*-----------------------------------------------------------------* * Decomposition of Cx *-----------------------------------------------------------------*/ @@ -1575,25 +2566,86 @@ int16_t computeMixingMatricesResidual( * square root of the diagonal of Cx */ /* Computing Kx */ - for ( i = 0; i < lengthCx; ++i ) + + FOR ( i = 0; i < lengthCx; ++i ) { - Kx[i] = sqrtf( Cx[i] ); + exp = Cx_e; + move16(); + Kx_fx[i] = Sqrt32(Cx_fx[i], &exp); + Kx_fx_e[i] = exp; + move16(); + } + + exp = Kx_fx_e[0]; + FOR (i = 1; i < lengthCx; i++) + { + IF (exp < Kx_fx_e[i]) + exp = Kx_fx_e[i]; + } + + FOR (i = 0; i < lengthCx; i++) + { + Kx_fx[i] = L_shr(Kx_fx[i], exp - Kx_fx_e[i]); + Kx_fx_e[i] = exp; + move16(); } + /*-----------------------------------------------------------------* * Regularization of Sx *-----------------------------------------------------------------*/ - maximum( Kx, lengthCx, &limit ); - limit = limit * reg_Sx + EPSILON; + maximum_l( Kx_fx, lengthCx, &limit_fx ); + limit_e = Kx_fx_e[0]; + move16(); - for ( i = 0; i < lengthCx; ++i ) + L_tmp = Mpy_32_32(limit_fx, reg_Sx_fx); + L_tmp = L_add(L_tmp, EPSILLON_FX); + limit_fx = L_tmp; + move16(); + limit_e = limit_e + reg_Sx_e; + + FOR ( i = 0; i < lengthCx; ++i ) { - float reg_fac = ( 1.0f / ( ( Kx[i] > limit ) ? Kx[i] : limit ) ); - Kx_reg_inv[i] = reg_fac; + IF (BASOP_Util_Cmp_Mant32Exp(Kx_fx[i], Kx_fx_e[0], limit_fx, limit_e) > 0) + { + div_tmp = Kx_fx[i]; + exp = Kx_fx_e[0]; + move16(); + } + ELSE + { + div_tmp = limit_fx; + exp = limit_e; + move16(); + } + tmp = BASOP_Util_Divide3232_Scale(1073741824, div_tmp, &scale); + scale = scale + ( 1 - exp ); + + Kx_reg_inv_fx[i] = L_deposit_h( tmp); + Kx_reg_inv_e[i] = scale; + move16(); } - limit = 0.0f; + exp = Kx_reg_inv_e[0]; + FOR (i = 1; i < lengthCx; i++) + { + IF (exp < Kx_reg_inv_e[i]) + exp = Kx_reg_inv_e[i]; + } + + FOR (i = 0; i < lengthCx; i++) + { + Kx_reg_inv_fx[i] = L_shr(Kx_reg_inv_fx[i], exp - Kx_reg_inv_e[i]); + } + Kx_reg_inv_fx_e = exp; + move16(); + + + limit_fx = 0; + move32(); + limit_e = 0; + move16(); /*-----------------------------------------------------------------* * regularized Kx-1 @@ -1604,65 +2656,92 @@ int16_t computeMixingMatricesResidual( *-----------------------------------------------------------------*/ /* Computing Cy_hat_diag */ - mvr2r( Cx, Cy_hat_diag, num_outputs ); + Copy32(Cx_fx, Cy_hat_diag_fx, extract_l(num_outputs)); + Cy_hat_diag_e = Cx_e; - for ( i = 0; i < lengthCy; ++i ) + FOR ( i = 0; i < lengthCy; ++i ) { - if ( Cy_hat_diag[i] > limit ) + IF ( BASOP_Util_Cmp_Mant32Exp(Cy_hat_diag_fx[i], Cy_hat_diag_e, limit_fx, limit_e ) > 0 ) { - limit = Cy_hat_diag[i]; + limit_fx = Cy_hat_diag_fx[i]; + move32(); + limit_e = Cy_hat_diag_e; + move16(); } } - limit = limit * reg_ghat + EPSILON; - + L_tmp = Mpy_32_32(limit_fx, reg_ghat_fx); + limit_fx = L_add(L_tmp, EPSILON_FX); + limit_e = limit_e + reg_ghat_e; + /* Computing G_hat */ - for ( i = 0; i < lengthCy; ++i ) + FOR ( i = 0; i < lengthCy; ++i ) { - if ( limit > Cy_hat_diag[i] ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ + Cy_hat_diag_fx_e[i] = Cy_hat_diag_e; + IF ( BASOP_Util_Cmp_Mant32Exp(limit_fx, limit_e, Cy_hat_diag_fx[i], Cy_hat_diag_e ) > 0 ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ { - Cy_hat_diag[i] = limit; + Cy_hat_diag_fx[i] = limit_fx; + move32(); + Cy_hat_diag_fx_e[i] = limit_e; + move16(); } - G_hat[i] = sqrtf( Cy[i + i * lengthCy] / Cy_hat_diag[i] ); + tmp = BASOP_Util_Divide3232_Scale(Cy_fx[i + i * lengthCy], Cy_hat_diag_fx[i], &scale ); + scale = scale + (Cy_fx_e - Cy_hat_diag_fx_e[i]); + L_tmp = Sqrt32(L_deposit_h(tmp), &scale); + + G_hat_fx[i] = L_tmp; + move32(); + G_hat_e[i] = scale; + move16(); } /*-----------------------------------------------------------------* * Formulate optimal P *-----------------------------------------------------------------*/ - for ( i = 0; i < num_outputs; i++ ) + FOR ( i = 0; i < num_outputs; i++ ) { - Kx[i] *= G_hat[i]; + L_tmp = Mpy_32_32( Kx_fx[i], G_hat_fx[i] ); + Kx_fx[i] = L_tmp; + Kx_fx_e[i] = Kx_fx_e[i] + G_hat_e[i]; } - for ( i = 0; i < num_outputs; i++ ) + FOR ( i = 0; i < num_outputs; i++ ) { - float fac = Kx[i]; + Word32 fac_fx = Kx_fx[i]; - for ( j = 0; j < num_outputs; j++ ) + FOR ( j = 0; j < num_outputs; j++ ) { - mat_mult_buffer1[i + j * num_outputs] = Ky[i + j * num_outputs] * fac; + L_tmp = Mpy_32_32(Ky_fx[i + j * num_outputs], fac_fx); + mat_mult_buffer1_fx[i + j * num_outputs] = L_tmp; + mat_mult_buffer1_buff_e[i + j * num_outputs] = extract_l(L_add( Ky_fx_e[i + j * num_outputs], Kx_fx_e[i] )); } } -#ifdef IVAS_FLOAT_FIXED - f2me_buf( mat_mult_buffer1, mat_mult_buffer1_fx, &mat_mult_buffer1_fx_e, lengthCx * lengthCy ); + mat_mult_buffer1_e = mat_mult_buffer1_buff_e[0]; + move16(); + FOR (i = 1; i < num_outputs * num_outputs; i++) + { + IF (mat_mult_buffer1_e < mat_mult_buffer1_buff_e[i]) + mat_mult_buffer1_e = mat_mult_buffer1_buff_e[i]; + } + + FOR (i = 0; i < num_outputs * num_outputs; i++) + { + mat_mult_buffer1_fx[i] = L_shr(mat_mult_buffer1_fx[i], mat_mult_buffer1_e - mat_mult_buffer1_buff_e[i]); + } + mat2svdMat_fx( mat_mult_buffer1_fx, svd_in_buffer_fx, lengthCx, lengthCy, 0 ); FOR ( Word32 g = 0; g < lengthCx; g++ ) { - me2f_buf( ( svd_in_buffer_fx[g] ), mat_mult_buffer1_fx_e, ( svd_in_buffer[g] ), lengthCy ); + me2f_buf( ( svd_in_buffer_fx[g] ), mat_mult_buffer1_e, ( svd_in_buffer[g] ), lengthCy ); } -#else - mat2svdMat( mat_mult_buffer1, svd_in_buffer, lengthCx, lengthCy, 0 ); -#endif - +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED svd( svd_in_buffer, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCy ); /* Actually Processing P */ - -#ifdef IVAS_FLOAT_FIXED Word16 min_q = -1; FOR ( Word32 g = 0; g < lengthCy; g++ ) { @@ -1683,12 +2762,14 @@ int16_t computeMixingMatricesResidual( svd_v_buffer_fx_e[0] = min_q; min_q = -1; + move16(); FOR ( Word32 g = 0; g < lengthCx; g++ ) { f2me_buf( svd_u_buffer[g], svd_u_buffer_fx[g], &svd_u_buffer_fx_e[g], lengthCx ); IF ( svd_u_buffer_fx_e[g] > min_q ) { min_q = svd_u_buffer_fx_e[g]; + move16(); } } @@ -1700,33 +2781,58 @@ int16_t computeMixingMatricesResidual( } } svd_u_buffer_fx_e[0] = min_q; - + move16(); +#endif svdMat2mat_fx( svd_v_buffer_fx, mat_mult_buffer1_fx, lengthCy, lengthCx ); svdMat2mat_fx( svd_u_buffer_fx, mat_mult_buffer2_fx, lengthCx, lengthCx ); + mat_mult_buffer2_e = svd_u_buffer_fx_e[0]; + move16(); + mat_mult_buffer1_e = svd_v_buffer_fx_e[0]; + move16(); - me2f_buf( mat_mult_buffer1_fx, svd_v_buffer_fx_e[0], mat_mult_buffer1, lengthCy * lengthCx ); - me2f_buf( mat_mult_buffer2_fx, svd_u_buffer_fx_e[0], mat_mult_buffer2, lengthCx * lengthCx ); -#else - svdMat2mat( svd_v_buffer, mat_mult_buffer1, lengthCy, lengthCx ); - svdMat2mat( svd_u_buffer, mat_mult_buffer2, lengthCx, lengthCx ); -#endif - matrix_product( mat_mult_buffer1, lengthCy, lengthCx, 0, - mat_mult_buffer2, lengthCx, lengthCx, 1, - mat_mult_buffer3 ); + Word16 guard_bits = find_guarded_bits_fx( lengthCx + 1 ); + + FOR ( i = 0; i < lengthCy * lengthCx; ++i ) + { + IF ( mat_mult_buffer1_e > mat_mult_buffer2_e ) + { + mat_mult_buffer2_fx[i] = L_shr(mat_mult_buffer2_fx[i], guard_bits ); + } + ELSE + { + mat_mult_buffer1_fx[i] = L_shr(mat_mult_buffer1_fx[i], guard_bits ); + } + } + + IF ( mat_mult_buffer1_e > mat_mult_buffer2_e ) + { + mat_mult_buffer2_e += guard_bits; + } + ELSE + { + mat_mult_buffer1_e += guard_bits; + } + matrix_product_fx( mat_mult_buffer1_fx, lengthCy, lengthCx, 0, + mat_mult_buffer2_fx, lengthCx, lengthCx, 1, + mat_mult_buffer3_fx ); + mat_mult_buffer3_e = svd_v_buffer_fx_e[0] + svd_u_buffer_fx_e[0]; /*-----------------------------------------------------------------* * Formulate M *-----------------------------------------------------------------*/ - matrix_product( Ky, lengthCy, lengthCy, 0, mat_mult_buffer3, lengthCy, lengthCx, 0, mat_mult_buffer1 ); + matrix_product_fx( Ky_fx, lengthCy, lengthCy, 0, mat_mult_buffer3_fx, lengthCy, lengthCx, 0, mat_mult_buffer1_fx ); + mat_mult_buffer1_e = Ky_fx_e[0] + mat_mult_buffer3_e; - for ( i = 0; i < num_outputs; i++ ) + FOR ( i = 0; i < num_outputs; i++ ) { - float fac = Kx_reg_inv[i]; + Word32 fac_fx = Kx_reg_inv_fx[i]; - for ( j = 0; j < num_outputs; j++ ) + FOR ( j = 0; j < num_outputs; j++ ) { - mixing_matrix[j + i * num_outputs] = mat_mult_buffer1[j + i * num_outputs] * fac; + L_tmp = Mpy_32_32( mat_mult_buffer1_fx[j + i * num_outputs], fac_fx ); + mixing_matrix_fx[j + i * num_outputs] = L_tmp; + mixing_matrix_e = mat_mult_buffer1_e + Kx_reg_inv_fx_e; } } @@ -1735,79 +2841,80 @@ int16_t computeMixingMatricesResidual( *-----------------------------------------------------------------*/ /* Compute Cy_tilde = M*Cx*M' */ -#ifdef IVAS_FLOAT_FIXED - Word32 Cy_tilde_fx[MAX_OUTPUT_CHANNELS]; - Word16 Cy_tilde_e; - - f2me_buf( mixing_matrix, mixing_matrix_fx, &mixing_matrix_e, lengthCy * lengthCx ); - f2me_buf( Cx, Cx_fx, &Cx_e, lengthCx ); matrix_diag_product_fx( mixing_matrix_fx, mixing_matrix_e, lengthCy, lengthCx, 0, Cx_fx, Cx_e, lengthCx, mat_mult_buffer1_fx, &mat_mult_buffer1_e ); - Word16 guard_bits = find_guarded_bits_fx( lengthCx + 1 ); + guard_bits = find_guarded_bits_fx( lengthCx + 1 ); - for ( i = 0; i < lengthCy * lengthCx; ++i ) + FOR ( i = 0; i < lengthCy * lengthCx; ++i ) { - if ( mat_mult_buffer1_e > mixing_matrix_e ) + IF ( mat_mult_buffer1_e > mixing_matrix_e ) { mixing_matrix_fx[i] = L_shr( mixing_matrix_fx[i], guard_bits ); } - else + ELSE { mat_mult_buffer1_fx[i] = L_shr( mat_mult_buffer1_fx[i], guard_bits ); } } - if ( mat_mult_buffer1_e > mixing_matrix_e ) + IF ( mat_mult_buffer1_e > mixing_matrix_e ) { mixing_matrix_e += guard_bits; } - else + ELSE { mat_mult_buffer1_e += guard_bits; } matrix_product_diag_fx( mat_mult_buffer1_fx, mat_mult_buffer1_e, lengthCy, lengthCx, 0, mixing_matrix_fx, mixing_matrix_e, lengthCy, lengthCx, 1, Cy_tilde_fx, &Cy_tilde_e ); - me2f_buf( Cy_tilde_fx, Cy_tilde_e, Cy_tilde, lengthCy ); -#else - matrix_diag_product( mixing_matrix, lengthCy, lengthCx, 0, Cx, lengthCx, mat_mult_buffer1 ); - matrix_product_diag( mat_mult_buffer1, lengthCy, lengthCx, 0, mixing_matrix, lengthCy, lengthCx, 1, Cy_tilde ); -#endif - - /*-----------------------------------------------------------------* * Energy Compensation *-----------------------------------------------------------------*/ - adj = svd_s_buffer; + adj_fx_p = svd_s_buffer_fx; - for ( i = 0; i < lengthCy; ++i ) + FOR ( i = 0; i < lengthCy; ++i ) { - adj[i] = sqrtf( Cy[i + lengthCy * i] / ( Cy_tilde[i] + EPSILON ) ); - if ( adj[i] > 4.0f ) + tmp = BASOP_Util_Divide3232_Scale(Cy_fx[i + lengthCy * i], L_add(Cy_tilde_fx[i], EPSILON_FX), &scale); + scale = scale + ( Cy_fx_e - Cy_tilde_e ); + adj_fx_p[i] = Sqrt32(L_deposit_h(tmp), &scale ); + adj_buff_e[i] = scale; + IF ( BASOP_Util_Cmp_Mant32Exp( adj_fx_p[i], scale, 1073741824, 3 ) > 0 ) { - adj[i] = 4.0f; + adj_fx_p[i] = 1073741824; + move32(); + adj_buff_e[i] = 3; + move16(); } } -#ifdef IVAS_FLOAT_FIXED - f2me_buf( adj, adj_fx, &adj_e, lengthCy ); - f2me_buf( mixing_matrix, mixing_matrix_fx, &mixing_matrix_e, lengthCy * lengthCx ); + adj_e = adj_buff_e[0]; - diag_matrix_product_fx( adj_fx, adj_e, lengthCy, mixing_matrix_fx, mixing_matrix_e, lengthCy, lengthCx, 0, mat_mult_buffer3_fx, &mat_mult_buffer3_e ); + FOR (i = 1; i < lengthCy; i++) + { + IF (adj_e < adj_buff_e[i]) + adj_e = adj_buff_e[i]; + } - me2f_buf( mat_mult_buffer3_fx, mat_mult_buffer3_e, mat_mult_buffer3, lengthCx * lengthCy ); -#else - diag_matrix_product( adj, lengthCy, mixing_matrix, lengthCy, lengthCx, 0, mat_mult_buffer3 ); -#endif - mvr2r( mat_mult_buffer3, mixing_matrix, lengthCy * lengthCx ); + FOR (i = 0; i < lengthCy; i++) + { + adj_fx[i] = L_shr(adj_fx_p[i], adj_e - adj_buff_e[i]); + } + + diag_matrix_product_fx( adj_fx, adj_e, lengthCy, mixing_matrix_fx, mixing_matrix_e, lengthCy, lengthCx, 0, mat_mult_buffer3_fx, &mat_mult_buffer3_e ); + Copy32(mat_mult_buffer3_fx, mixing_matrix_fx, lengthCy * lengthCx); + *mixing_matrix_ret_e = mat_mult_buffer3_e; + move16(); pop_wmops(); return out; } +#endif + /*-------------------------------------------------------------------* diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 3ec9035a7939e1f377186c0f336a1f97fd0a2eae..c27587e1b3872938a7162dbe4c7d401d0231e6f7 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -70,6 +70,43 @@ ivas_error ivas_dec_setup( Word16 *data /* o : output synthesis signal */ ) { +#ifdef IVAS_FLOAT_FIXED/*TODO:To be removed later*/ + RENDER_CONFIG_DATA *hRendCfg = st_ivas->hRenderConfig; + HRTFS_CREND_HANDLE hSetOfHRTF = st_ivas->hSetOfHRTF; + IF( hSetOfHRTF ) + { + hSetOfHRTF->hHRTF_brir_combined->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_brir_combined->latency_s, 31 ); + hSetOfHRTF->hHRTF_hrir_foa->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_foa->latency_s, 31 ); + hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_combined->latency_s, 31 ); + hSetOfHRTF->hHRTF_hrir_hoa3->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_hoa3->latency_s, 31 ); + hSetOfHRTF->hHRTF_hrir_hoa2->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_hoa2->latency_s, 31 ); + } + IF( hRendCfg ) + { + hRendCfg->roomAcoustics.acousticPreDelay_fx = floatToFixed( hRendCfg->roomAcoustics.acousticPreDelay, 27 ); + FOR( int i = 0; i < 60; i++ ) + { + hRendCfg->roomAcoustics.pFc_input_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pFc_input[i] * ONE_IN_Q16 ); + hRendCfg->roomAcoustics.pAcoustic_rt60_fx[i] = (Word32) ( ( hRendCfg->roomAcoustics.pAcoustic_rt60[i] ) * ONE_IN_Q26 ); + hRendCfg->roomAcoustics.pAcoustic_dsr_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pAcoustic_dsr[i] * ONE_IN_Q30 ); + } + + hRendCfg->roomAcoustics.inputPreDelay_fx = (Word32) ( hRendCfg->roomAcoustics.inputPreDelay * ONE_IN_Q27 ); + hRendCfg->roomAcoustics.dimensions.x_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.x * 4194304 ); // Q10.22, min value:1, max :999.0 + hRendCfg->roomAcoustics.dimensions.y_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.y * 4194304 ); // Q10.22 + hRendCfg->roomAcoustics.dimensions.z_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.z * 4194304 ); // Q10.22 + + + FOR( int ii = 0; ii < 6; ii++ ) + { + hRendCfg->roomAcoustics.AbsCoeff_fx[ii] = (Word32) ( hRendCfg->roomAcoustics.AbsCoeff[ii] * 1073741824 ); // Q2.30 min :0 max 1 + } + + hRendCfg->roomAcoustics.ListenerOrigin.x_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.x * 4194304 ); //( 2147483648 >> 2 ); + hRendCfg->roomAcoustics.ListenerOrigin.y_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.y * ( 4194304 ) ); + hRendCfg->roomAcoustics.ListenerOrigin.z_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.z * ( 4194304 ) ); + } +#endif Word16 k, idx, num_bits_read; Word16 nchan_ism, element_mode_flag; Decoder_State *st; @@ -121,7 +158,11 @@ ivas_error ivas_dec_setup( st_ivas->nchan_ism = nchan_ism; +#ifdef IVAS_FLOAT_FIXED + IF ( ( error = ivas_ism_dec_config_fx( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else IF ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -141,7 +182,11 @@ ivas_error ivas_dec_setup( 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 )) { +#ifndef IVAS_FLOAT_FIXED IF ( ( error = ivas_sba_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else + IF ( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -185,6 +230,86 @@ ivas_error ivas_dec_setup( { #ifdef IVAS_FLOAT_FIXED + Word16 n_samples_granularity; + + n_samples_granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + DECODER_TC_BUFFER_HANDLE hTcBuffer; + hTcBuffer = st_ivas->hTcBuffer; + DECODER_CONFIG_HANDLE hDecoderConfig=NULL; + Word16 numch_out_dirac=0; + SPAR_DEC_HANDLE hSpar = NULL; + Word16 numch_in, numch_out, num_md_sub_frames; + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + { + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + IF( LT_16( n_samples_granularity, st_ivas->hTcBuffer->n_samples_granularity ) ) + { + + IF( st_ivas->hCombinedOrientationData ) + FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < 3; ind2++ ) + { + st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32) ( st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * ( 1 << 15 ) ); + } + } + if ( st_ivas->hSbaIsmData ) + { + for ( Word16 ch_idx = 0; ch_idx < st_ivas->hSbaIsmData->delayBuffer_nchan; ch_idx++ ) + { + floatToFixed_arr32( st_ivas->hSbaIsmData->delayBuffer[ch_idx], st_ivas->hSbaIsmData->delayBuffer_fx[ch_idx], Q11, st_ivas->hSbaIsmData->delayBuffer_size ); + } + } + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + hDecoderConfig = st_ivas->hDecoderConfig; + numch_out_dirac = hDecoderConfig->nchan_out; + IF( hSpar ) + { + numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; + numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + 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 ); + for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + } + } + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + for ( Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + } + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i], Q11 ); + } + } + } + } + Word16 n_tc; + if ( st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + n_tc = st_ivas->nchan_ism; + else + n_tc = st_ivas->hTcBuffer->nchan_transport_internal; + for ( int ch = 0; ch < n_tc; ch++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k ); + } + } + } + } + IF ( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) #else IF ( ( error = ivas_masa_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) @@ -192,6 +317,43 @@ ivas_error ivas_dec_setup( { return error; } +#ifdef IVAS_FLOAT_FIXED + //local flt2fix: to be removed + if (hTcBuffer->tc_buffer) + fixedToFloat_arrL(hTcBuffer->tc_buffer_fx, hTcBuffer->tc_buffer, Q11, hTcBuffer->tc_buff_len); + IF(hSpar) + { + numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + FOR(Word16 in_ch = 0; in_ch < numch_in; in_ch++) + { + FOR(Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ((float)(st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i]) / (1LL << (Q11))); /*Rounding off*/ + } + } + // fix2float (to be cleaned) + 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)))) + { + fixedToFloat_arr(hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS); + FOR(Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++) + { + fixedToFloat_arrL(hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1); + } + } + // fix2float end + FOR(Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++) + { + IF(st_ivas->cldfbSynDec[out_ch]) + { + FOR(Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ((float)(st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i]) / (float)(1LL << (Q11))); + } + } + } + } + //local fix2flt end +#endif } } ELSE @@ -235,7 +397,7 @@ ivas_error ivas_dec_setup( } //////////////////////////////////////////////////////////////// - IF( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, Q_cldfbSynDec, &num_src, SrcInd, data ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ) != IVAS_ERR_OK ) { return error; } @@ -269,9 +431,6 @@ ivas_error ivas_dec_setup( Src_p->SrcSpatial_p->DirAtten.ConeInnerAngle = 360.0f; Src_p->SrcSpatial_p->DirAtten.ConeOuterAngle = 360.0f; Src_p->SrcSpatial_p->DirAtten.ConeOuterGain = 1.0f; - Src_p->SrcSpatial_p->DistAtten.RefDist = 1.0f; - Src_p->SrcSpatial_p->DistAtten.MaxDist = 15.75f; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ - Src_p->SrcSpatial_p->DistAtten.RollOffFactor = 1.0f; 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 ); @@ -376,7 +535,7 @@ ivas_error ivas_dec_setup( } //////////////////////////////////////////////////////////////// - IF( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, Q_cldfbSynDec, &num_src, SrcInd, data ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ) != IVAS_ERR_OK ) { return error; } @@ -410,9 +569,6 @@ ivas_error ivas_dec_setup( Src_p->SrcSpatial_p->DirAtten.ConeInnerAngle = 360.0f; Src_p->SrcSpatial_p->DirAtten.ConeOuterAngle = 360.0f; Src_p->SrcSpatial_p->DirAtten.ConeOuterGain = 1.0f; - Src_p->SrcSpatial_p->DistAtten.RefDist = 1.0f; - Src_p->SrcSpatial_p->DistAtten.MaxDist = 15.75f; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ - Src_p->SrcSpatial_p->DistAtten.RollOffFactor = 1.0f; 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 ); @@ -488,7 +644,11 @@ ivas_error ivas_dec_setup( IF ( GT_16(st_ivas->ini_frame, 0) && NE_32(ivas_total_brate, st_ivas->last_active_ivas_total_brate )) { +#ifndef IVAS_FLOAT_FIXED IF ( ( error = ivas_sba_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else + IF ( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -615,7 +775,11 @@ ivas_error ivas_dec_setup( st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; } +#ifndef IVAS_FLOAT_FIXED IF ( ( error = ivas_sba_dec_reconfigure( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else + IF ( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -661,7 +825,11 @@ ivas_error ivas_dec_setup( last_ism_mode = st_ivas->ism_mode; } +#ifdef IVAS_FLOAT_FIXED + IF ( ( error = ivas_ism_dec_config_fx( st_ivas, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -680,7 +848,11 @@ ivas_error ivas_dec_setup( return IVAS_ERROR( error, "Sanity checks failed" ); } +#ifdef IVAS_FLOAT_FIXED + IF ( ( error = ivas_init_decoder_fx( st_ivas ) ) != IVAS_ERR_OK ) +#else IF ( ( error = ivas_init_decoder( st_ivas ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -703,6 +875,14 @@ ivas_error ivas_dec_setup( st->total_brate = ACELP_8k00; /* only temporary initialization - this is needed for get_next_indice() in the frame following NO_DATA frame */ } +#ifdef IVAS_FLOAT_FIXED/*Cleanup changes: fixed to float*/ + IF( st_ivas->hCrendWrapper != NULL ) + { + st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe = fixedToFloat( st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe_fx, 14 ); + st_ivas->hCrendWrapper->hHrtfCrend->latency_s = fixedToFloat( st_ivas->hCrendWrapper->hHrtfCrend->latency_s_fx, 31 ); + fixedToFloat_arr( st_ivas->hCrendWrapper->hHrtfCrend->inv_diffuse_weight_fx, st_ivas->hCrendWrapper->hHrtfCrend->inv_diffuse_weight, 15, 16 ); + } +#endif return error; } @@ -980,7 +1160,7 @@ ivas_error ivas_init_decoder_front( { set_zero((st_ivas->hLsSetupCustom)->ls_azimuth, MAX_OUTPUT_CHANNELS ); set_zero((st_ivas->hLsSetupCustom)->ls_elevation, MAX_OUTPUT_CHANNELS ); - set_f( ( st_ivas->hLsSetupCustom )->separate_ch_gains, 0.0f, MAX_OUTPUT_CHANNELS ); + //set_f( ( st_ivas->hLsSetupCustom )->separate_ch_gains, 0.0f, MAX_OUTPUT_CHANNELS ); } ELSE #else @@ -995,13 +1175,13 @@ ivas_error ivas_init_decoder_front( * Allocate and initialize Head-Tracking handle *--------------------------------------------------------------------*/ - IF ( st_ivas->hDecoderConfig->Opt_Headrotation ) +#ifdef IVAS_FLOAT_FIXED + IF( st_ivas->hDecoderConfig->Opt_Headrotation ) { - IF ( ( error = ivas_headTrack_open( &( st_ivas->hHeadTrackData ) ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_headTrack_open_fx( &( st_ivas->hHeadTrackData ) ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED error = ivas_orient_trk_SetTrackingType_fx( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ); IF( ( error ) != IVAS_ERR_OK ) { @@ -1009,7 +1189,13 @@ ivas_error ivas_init_decoder_front( } } #else - IF ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK ) + IF( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + IF( ( error = ivas_headTrack_open( &( st_ivas->hHeadTrackData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + IF( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK ) { return error; } @@ -1045,24 +1231,44 @@ ivas_error ivas_init_decoder_front( IF ( st_ivas->hDecoderConfig->Opt_HRTF_binary ) { - IF ( ( error = ivas_HRTF_binary_open( &( st_ivas->hHrtfTD ) ) ) != IVAS_ERR_OK ) +#ifdef IVAS_FLOAT_FIXED + IF( ( 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 ) { return error; } - IF ( ( error = ivas_HRTF_CRend_binary_open( &( st_ivas->hSetOfHRTF ) ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_HRTF_binary_open( &( st_ivas->hHrtfTD ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_HRTF_CRend_binary_open( &( st_ivas->hSetOfHRTF ) ) ) != IVAS_ERR_OK ) { return error; } +#endif IF ( ( error = ivas_HRTF_fastconv_binary_open( &st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) { return error; } - IF ( ( error = ivas_HRTF_parambin_binary_open( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } +#else + if ( ( error = ivas_HRTF_parambin_binary_open( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) { return error; } +#endif } /*-------------------------------------------------------------------* @@ -1077,10 +1283,18 @@ ivas_error ivas_init_decoder_front( return error; } +#ifdef IVAS_FLOAT_FIXED + IF((error = ivas_render_config_init_from_rom_fx(&st_ivas->hRenderConfig)) != IVAS_ERR_OK) + { + return error; + } +#endif + /*FLOAT CODE*/ IF ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig ) ) != IVAS_ERR_OK ) { return error; } + /*---------*/ } return error; @@ -1092,8 +1306,8 @@ ivas_error ivas_init_decoder_front( * * Initialize IVAS decoder state structure *-------------------------------------------------------------------*/ - -ivas_error ivas_init_decoder( +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_init_decoder_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { @@ -1173,22 +1387,15 @@ ivas_error ivas_init_decoder( IF ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) { -#ifdef IVAS_FLOAT_FIXED ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); -#else - ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); - - ivas_mcmasa_set_separate_channel_mode( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); -#endif } ivas_renderer_select( st_ivas ); IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { -#ifdef IVAS_FLOAT_FIXED FOR(int ind = 0; ind < MAX_OUTPUT_CHANNELS; ind++) { st_ivas->hLsSetupCustom->ls_azimuth_fx[ind] = (Word32)(st_ivas->hLsSetupCustom->ls_azimuth[ind] * (1 << 22)); @@ -1203,9 +1410,6 @@ ivas_error ivas_init_decoder( } ELSE -#else - IF ( ( error = ivas_ls_custom_output_init( st_ivas ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1215,11 +1419,7 @@ ivas_error ivas_init_decoder( IF ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) { -#ifdef IVAS_FLOAT_FIXED ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); -#else - ivas_mcmasa_set_separate_channel_mode( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); -#endif IF ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.separateChannelEnabled ) { @@ -1281,7 +1481,11 @@ ivas_error ivas_init_decoder( /* init EFAP for custom LS output and set hTransSetup */ IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { - IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth, st_ivas->hOutSetup.ls_elevation, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + /*float2fix block: to be removed*/ + floatToFixed_arrL( (float *) st_ivas->hOutSetup.ls_azimuth, (Word32 *) st_ivas->hOutSetup.ls_azimuth_fx, Q22, st_ivas->hOutSetup.nchan_out_woLFE ); + floatToFixed_arrL( (float *) st_ivas->hOutSetup.ls_elevation, (Word32 *) st_ivas->hOutSetup.ls_elevation_fx, Q22, st_ivas->hOutSetup.nchan_out_woLFE ); + /*float2fix block end*/ + 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 ) { return error; } @@ -1309,7 +1513,7 @@ ivas_error ivas_init_decoder( } } - IF ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nSCE, element_brate_tmp ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nSCE, element_brate_tmp ) ) != IVAS_ERR_OK ) { return error; } @@ -1347,14 +1551,18 @@ ivas_error ivas_init_decoder( return error; } - IF ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + IF ( ( 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 ) { - IF ( ( error = ivas_sba_get_hoa_dec_matrix( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + /*float2fix block: to be removed*/ + floatToFixed_arrL((float *)st_ivas->hOutSetup.ls_azimuth, (Word32 *)st_ivas->hOutSetup.ls_azimuth_fx, Q22, st_ivas->hIntSetup.ambisonics_order); + floatToFixed_arrL((float *)st_ivas->hOutSetup.ls_elevation, (Word32 *)st_ivas->hOutSetup.ls_elevation_fx, Q22, st_ivas->hIntSetup.ambisonics_order); + /*float2fix end*/ + 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 ) { return error; } @@ -1367,7 +1575,7 @@ ivas_error ivas_init_decoder( 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 ) { - IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) { return error; } @@ -1448,18 +1656,14 @@ ivas_error ivas_init_decoder( return error; } -#ifdef IVAS_FLOAT_FIXED IF ( ( error = ivas_masa_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) -#else - IF ( ( error = ivas_masa_dec_open( st_ivas ) ) != IVAS_ERR_OK ) -#endif { 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 ) { - IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) { return error; } @@ -1504,14 +1708,18 @@ ivas_error ivas_init_decoder( return error; } - IF ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + IF ( ( 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 ) { - IF ( ( error = ivas_sba_get_hoa_dec_matrix( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + /*float2fix block: to be removed*/ + floatToFixed_arrL((float *)st_ivas->hOutSetup.ls_azimuth, (Word32 *)st_ivas->hOutSetup.ls_azimuth_fx, Q22, st_ivas->hIntSetup.ambisonics_order); + floatToFixed_arrL((float *)st_ivas->hOutSetup.ls_elevation, (Word32 *)st_ivas->hOutSetup.ls_elevation_fx, Q22, st_ivas->hIntSetup.ambisonics_order); + /*float2fix end*/ + 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 ) { return error; } @@ -1524,7 +1732,7 @@ ivas_error ivas_init_decoder( 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 ) { - IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) { return error; } @@ -1599,12 +1807,12 @@ ivas_error ivas_init_decoder( IF ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { - IF ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + IF ( ( 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( st_ivas ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_osba_data_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } @@ -1643,7 +1851,7 @@ ivas_error ivas_init_decoder( reset_indices_dec( st_ivas->hSCE[0]->hCoreCoder[0] ); - IF ( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) { return error; } @@ -1666,17 +1874,13 @@ ivas_error ivas_init_decoder( reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); } - IF ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) { return error; } } -#ifdef IVAS_FLOAT_FIXED IF ( ( error = ivas_masa_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) -#else - IF ( ( error = ivas_masa_dec_open( st_ivas ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1688,7 +1892,7 @@ ivas_error ivas_init_decoder( 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 ) { - IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) { return error; } @@ -1711,7 +1915,11 @@ ivas_error ivas_init_decoder( /* init EFAP for custom LS setup */ IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { - IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + /*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 ) { return error; } @@ -1746,7 +1954,11 @@ ivas_error ivas_init_decoder( /* init EFAP for custom LS setup */ IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { - IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + /*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 ) { return error; } @@ -1786,16 +1998,71 @@ ivas_error ivas_init_decoder( /* init EFAP for custom LS setup */ IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { - IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + /*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 ) { return error; } } - +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_param_mc_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1/*Fixed to float conversions*/ + PARAM_MC_DEC_HANDLE hParamMC; + hParamMC = st_ivas->hParamMC; + Word16 nchan_out_transport, nchan_out_cov; + MC_LS_SETUP mc_ls_setup; + Word16 nchan_transport; + mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_ls_setup ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else + { + nchan_out_cov = nchan_out_transport; + } + if ( hParamMC ) + { + fixedToFloat_arr( hParamMC->icc_q_fx, hParamMC->icc_q, Q15, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + fixedToFloat_arr( hParamMC->icld_q_fx, hParamMC->icld_q, Q8, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + fixedToFloat_arr( hParamMC->h_output_synthesis_params.interpolator_fx, hParamMC->h_output_synthesis_params.interpolator, 15, DEFAULT_JBM_CLDFB_TIMESLOTS ); + fixedToFloat_arrL( hParamMC->h_output_synthesis_params.proto_matrix_fx, hParamMC->h_output_synthesis_params.proto_matrix, 26, nchan_transport * nchan_out_cov ); + FOR( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) + { + fixedToFloat_arrL( hParamMC->diff_proto_info->proto_fac_fx[i], hParamMC->diff_proto_info->proto_fac[i], 26, hParamMC->diff_proto_info->num_source_chan_diff[i] ); + } + //if ( st_ivas->hLsSetUpConversion ) + //{ + // for ( k = 0; k < nchan_transport; k++ ) + // { + // for ( i = 0; i < nchan_out_cov; i++ ) + // { + // st_ivas->hLsSetUpConversion->dmxMtx[k][i] = fixedToFloat( st_ivas->hLsSetUpConversion->dmxMtx_fx[k][i], Q30 ); + // } + // } + //} + fixedToFloat_arrL( hParamMC->proto_matrix_int_fx, hParamMC->proto_matrix_int, Q31, nchan_out_transport * nchan_transport ); + //if ( hParamMC->ls_conv_dmx_matrix ) + // fixedToFloat_arrL( hParamMC->ls_conv_dmx_matrix_fx, hParamMC->ls_conv_dmx_matrix, Q30, nchan_out_transport * nchan_out_cov ); + if ( hParamMC->hoa_encoder_fx ) + fixedToFloat_arrL( hParamMC->hoa_encoder_fx, hParamMC->hoa_encoder, Q29, st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS ); + } +#endif // 1 +#else IF ( ( error = ivas_param_mc_dec_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif FOR ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { @@ -1822,22 +2089,15 @@ ivas_error ivas_init_decoder( { Word32 brate_sce, brate_cpe; -#ifdef IVAS_FLOAT_FIXED ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); -#else - ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); -#endif IF ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED IF ( ( error = ivas_masa_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) -#else - IF ( ( error = ivas_masa_dec_open( st_ivas ) ) != IVAS_ERR_OK ) -#endif + { return error; } @@ -1846,7 +2106,7 @@ ivas_error ivas_init_decoder( IF ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) { - IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) { return error; } @@ -1858,7 +2118,26 @@ ivas_error ivas_init_decoder( IF ( st_ivas->hVBAPdata == NULL ) { /* Distribute signal to all channels if VBAP is not properly initialized. */ - set_f( st_ivas->hLsSetupCustom->separate_ch_gains, inv_sqrt( st_ivas->hLsSetupCustom->num_spk ), st_ivas->hLsSetupCustom->num_spk ); + Word16 inv_sqr, sqr, exp = 15, exp_sqr; + IF(EQ_16(st_ivas->hLsSetupCustom->num_spk, 1)) + { + inv_sqr = 32767; + } + 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)) + { + inv_sqr = shr(inv_sqr, exp); + } + ELSE + { + inv_sqr = shl(inv_sqr, exp); + } + } + set16_fx( st_ivas->hLsSetupCustom->separate_ch_gains_fx, inv_sqr, st_ivas->hLsSetupCustom->num_spk ); } ELSE { @@ -1869,11 +2148,8 @@ ivas_error ivas_init_decoder( } } -#ifdef IVAS_FLOAT_FIXED + ivas_mcmasa_split_brate_fx( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); -#else - ivas_mcmasa_split_brate( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); -#endif FOR ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { @@ -1931,42 +2207,24 @@ ivas_error ivas_init_decoder( IF ( GT_16(n, 0 )) { - IF ( ( st_ivas->mem_hp20_out = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } -#ifdef IVAS_FLOAT_FIXED IF( ( st_ivas->mem_hp20_out_fx = (Word32 **) malloc( n * sizeof(Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); } -#endif // IVAS_FLOAT_FIXED } ELSE { - st_ivas->mem_hp20_out = NULL; -#ifdef IVAS_FLOAT_FIXED st_ivas->mem_hp20_out_fx = NULL; -#endif // IVAS_FLOAT_FIXED } FOR ( i = 0; i < n; i++ ) { - IF ( ( st_ivas->mem_hp20_out[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_out[i], 0.0f, L_HP20_MEM ); -#ifdef IVAS_FLOAT_FIXED - - IF((st_ivas->mem_hp20_out_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_out_fx[i], 0, L_HP20_MEM + 2); -#endif // IVAS_FLOAT_FIXED + IF((st_ivas->mem_hp20_out_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_out_fx[i], 0, L_HP20_MEM + 2); } /*-------------------------------------------------------------------* @@ -1975,8 +2233,7 @@ ivas_error ivas_init_decoder( IF ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { - - IF ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_binRenderer_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } @@ -2007,41 +2264,28 @@ ivas_error ivas_init_decoder( IF ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - IF ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_reverb_open( &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 ); -#ifdef IVAS_FLOAT_FIXED + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); -#else - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); -#endif // IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED + 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 ) -#else - IF ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) -#endif { return error; } } ELSE IF( st_ivas->renderer_type == RENDERER_MC ) { -#ifdef IVAS_FLOAT_FIXED IF( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } -#else - IF( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } ELSE IF ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) { @@ -2054,7 +2298,7 @@ ivas_error ivas_init_decoder( { 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 ) ) { - IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + 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 ) { return error; } @@ -2066,23 +2310,24 @@ ivas_error ivas_init_decoder( return error; } +#if 1 /*Cleanup changes: fixed to float*/ + IF(st_ivas->hCrendWrapper!=NULL && st_ivas->hCrendWrapper->hHrtfCrend != NULL ) + { + st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe = fixedToFloat( st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe_fx, 14 ); + st_ivas->hCrendWrapper->hHrtfCrend->latency_s = fixedToFloat( st_ivas->hCrendWrapper->hHrtfCrend->latency_s_fx, 31 ); + fixedToFloat_arr( st_ivas->hCrendWrapper->hHrtfCrend->inv_diffuse_weight_fx, st_ivas->hCrendWrapper->hHrtfCrend->inv_diffuse_weight, 15, 16 ); + } +#endif st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; IF ( ( st_ivas->ivas_format == MC_FORMAT ) && ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) { granularity = NS2SA( output_Fs, CLDFB_SLOT_NS ); -#ifdef IVAS_FLOAT_FIXED n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); -#else - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); -#endif // IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED + 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 ) -#else - IF ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, MC_PARAMUPMIX_MAX_INPUT_CHANS, MC_PARAMUPMIX_MAX_INPUT_CHANS, granularity ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -2091,17 +2336,9 @@ ivas_error ivas_init_decoder( { granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); -#ifdef IVAS_FLOAT_FIXED n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); -#else - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); -#endif -#ifdef IVAS_FLOAT_FIXED 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 ) -#else - IF ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -2147,17 +2384,10 @@ ivas_error ivas_init_decoder( 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->ivas_format == SBA_ISM_FORMAT ) @@ -2194,21 +2424,14 @@ ivas_error ivas_init_decoder( } } -#ifdef IVAS_FLOAT_FIXED IF( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) -#else - IF( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) -#endif // IVAS_FLOAT_FIXED { return error; } set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); - set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); -#ifdef IVAS_FLOAT_FIXED - set32_fx(st_ivas->hLFE->prevsynth_buf_fx,0, LFE_PLC_BUFLEN); - set32_fx(st_ivas->hLFE->prior_out_buffer_fx,0, L_FRAME48k); -#endif // IVAS_FLOAT_FIXED + set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); + set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); } @@ -2216,11 +2439,1164 @@ ivas_error ivas_init_decoder( * CLDFB handles for rendering *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); -#else - ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); -#endif // IVAS_FLOAT_FIXED + + 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 ) + { + return error; + } + } + FOR ( ; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + 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 ) + { + return error; + } + } + FOR ( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* 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 ) + { +#ifdef IVAS_FLOAT_FIXED +#if 1 + Word16 Q_cldfbSynDec = Q11; + FOR( i = 0; i < 16; i++ ) + { + IF( st_ivas->cldfbAnaDec[i] ) + floatToFixed_arrL( st_ivas->cldfbAnaDec[i]->cldfb_state, st_ivas->cldfbAnaDec[i]->cldfb_state_fx, 11, sub( st_ivas->cldfbAnaDec[i]->p_filter_length, st_ivas->cldfbAnaDec[i]->no_channels ) ); + } + IF( st_ivas->hSpar ) + { + st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q = Q_factor_arr( st_ivas->hSpar->hFbMixer->cldfb_cross_fade, 16 ); + floatToFixed_arr( st_ivas->hSpar->hFbMixer->cldfb_cross_fade, st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q, 16 ); + } + IF( st_ivas->cldfbSynDec[0] ) + { + floatToFixed_arrL( st_ivas->cldfbSynDec[0]->cldfb_state, st_ivas->cldfbSynDec[0]->cldfb_state_fx, Q_cldfbSynDec, sub( st_ivas->cldfbSynDec[0]->p_filter_length, st_ivas->cldfbSynDec[0]->no_channels ) ); + } +#endif + 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 + 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 + FOR( i = 0; i < 16; i++ ) + { + IF( st_ivas->cldfbAnaDec[i] ) + fixedToFloat_arrL( st_ivas->cldfbAnaDec[i]->cldfb_state_fx, st_ivas->cldfbAnaDec[i]->cldfb_state, 11, sub( st_ivas->cldfbAnaDec[i]->p_filter_length, st_ivas->cldfbAnaDec[i]->no_channels ) ); + } + IF( st_ivas->cldfbSynDec[0] ) + { + fixedToFloat_arrL( st_ivas->cldfbSynDec[0]->cldfb_state_fx, st_ivas->cldfbSynDec[0]->cldfb_state, Q_cldfbSynDec, sub( st_ivas->cldfbAnaDec[i]->p_filter_length, st_ivas->cldfbAnaDec[i]->no_channels ) ); + } + 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 ); + } +#endif +#else + ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); +#endif + } + + /*-----------------------------------------------------------------* + * Allocate and initialize limiter struct + *-----------------------------------------------------------------*/ + + IF ( ( error = ivas_limiter_open( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize JBM struct + buffer + *-----------------------------------------------------------------*/ + + IF ( st_ivas->hTcBuffer == NULL ) + + { + /* 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 ) + { + return error; + } + } + + 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 ) + { + return error; + } + } + + IF ( st_ivas->hJbmMetadata == NULL ) + { + IF ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + IF ( ( error = ivas_jbm_dec_metadata_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /*-----------------------------------------------------------------* + * 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 ); + + 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 */ + IF ( ( st_ivas->p_output_f[n] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + set_zero(st_ivas->p_output_f[n], 48000 / FRAMES_PER_SEC); + IF ( ( st_ivas->p_output_fx[n] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + set32_fx(st_ivas->p_output_fx[n], 0, 48000 / FRAMES_PER_SEC); + + + } + + FOR ( ; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + st_ivas->p_output_f[n] = NULL; + st_ivas->p_output_fx[n] = NULL; + } + + + return error; +} +#else +ivas_error ivas_init_decoder( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i, n, k; + Word16 sce_id, cpe_id; + Word16 numCldfbAnalyses, numCldfbSyntheses; + Word16 granularity, n_channels_transport_jbm; + Word32 output_Fs, ivas_total_brate; + Word32 binauralization_delay_ns; + AUDIO_CONFIG output_config; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + Word32 ism_total_brate; + + error = IVAS_ERR_OK; + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + hDecoderConfig = st_ivas->hDecoderConfig; + output_config = hDecoderConfig->output_config; + ivas_total_brate = hDecoderConfig->ivas_total_brate; + + hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + st_ivas->last_active_ivas_total_brate = ivas_total_brate; + + /*-----------------------------------------------------------------* + * Set number of output channels for EXTERNAL output config. + *-----------------------------------------------------------------*/ + + IF ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + IF ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); + hDecoderConfig->nchan_out += st_ivas->nchan_ism; + } + ELSE IF ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + hDecoderConfig->nchan_out = st_ivas->nchan_transport + st_ivas->nchan_ism; + } + ELSE IF ( !( st_ivas->ism_mode == ISM_MODE_PARAM ) ) + { + hDecoderConfig->nchan_out = st_ivas->nchan_transport; + } + + st_ivas->hOutSetup.nchan_out_woLFE = hDecoderConfig->nchan_out; + } + + /*-----------------------------------------------------------------* + * Set output and intern setup & renderer selection + *-----------------------------------------------------------------*/ + + st_ivas->intern_config = output_config; + + ivas_output_init( &( st_ivas->hOutSetup ), output_config ); + + IF ( st_ivas->ivas_format == SBA_ISM_FORMAT && output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_7_1_4; + st_ivas->hOutSetup.output_config = st_ivas->intern_config; + 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 ) + { + st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_HOA3; + st_ivas->hOutSetup.output_config = IVAS_AUDIO_CONFIG_HOA3; + st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); + } + + /* Only initialize transport setup if it is used */ + IF ( 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 ) + { + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + ivas_mcmasa_set_separate_channel_mode( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); + } + + ivas_renderer_select( st_ivas ); + + IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + IF ( ( error = ivas_ls_custom_output_init( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + + IF ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_mcmasa_set_separate_channel_mode( &( 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 ) + { + st_ivas->hLsSetupCustom->separate_ch_found = 0; + IF ( 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 ( st_ivas->hOutSetup.ls_azimuth[i] == 0.0f && st_ivas->hOutSetup.ls_elevation[i] == 0.0f ) + { + st_ivas->hIntSetup.separateChannelIndex = i; + st_ivas->hLsSetupCustom->separate_ch_found = 1; + BREAK; + } + } + } + } + } + + + /*-----------------------------------------------------------------* + * Allocate and initialize SCE/CPE and other handles + *-----------------------------------------------------------------*/ + + IF ( 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; + + IF ( ( 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 ) + { + st_ivas->nchan_transport = CPE_CHANNELS; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_STEREO; + + st_ivas->nSCE = 0; + st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ + cpe_id = 0; + + IF ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + + /* init EFAP for custom LS output and set hTransSetup */ + IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth, st_ivas->hOutSetup.ls_elevation, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_output_init( &( st_ivas->hTransSetup ), IVAS_AUDIO_CONFIG_STEREO ); + } + } + ELSE IF ( 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; + + IF ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + st_ivas->nSCE = MAX_PARAM_ISM_WAVE; + + IF ( ( error = ivas_param_ism_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF ( ( error = ivas_ism_metadata_dec_create( 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 ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + + st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; + } + + st_ivas->hISMDTX.sce_id_dtx = 0; + + IF ( 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; + } + else if ( st_ivas->ism_mode == ISM_MODE_DISC ) + { + for ( sce_id = 0; sce_id < st_ivas->nSCE; ++sce_id ) + { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = 2 + sce_id; + } + } + } + ELSE IF ( st_ivas->ivas_format == SBA_FORMAT ) + { + IF ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->hOutSetup.is_loudspeaker_setup ) + { + IF ( ( error = ivas_sba_get_hoa_dec_matrix( 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 ) + { + 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 ) + { + IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + } + 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 ); + IF ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + + 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; + } + + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( 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 ); + } + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + 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 ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + 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 ) + { + return error; + } + + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* 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 ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + IF ( st_ivas->nCPE > 1 ) + { + IF ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF ( 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; + IF ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( ( error = ivas_masa_dec_open( 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 ) + { + IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != 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, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + 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 ) + { + return error; + } + + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + Word32 temp_brate[MAX_SCE]; + st_ivas->ism_extmeta_active = -1; + st_ivas->ism_extmeta_cnt = 0; + + 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 ) + { + return error; + } + + IF ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->hOutSetup.is_loudspeaker_setup ) + { + IF ( ( error = ivas_sba_get_hoa_dec_matrix( 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 ) + { + 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 ) + { + IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + } + 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 ); + IF ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + + 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; + } + + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( 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 ); + } + + 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 ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + IF ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->nchan_ism + 1 ) >> 1; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + + 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 ) + { + return error; + } + + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* 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 ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + IF ( st_ivas->nCPE > 1 ) + { + IF ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + IF ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( ( error = ivas_osba_data_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + st_ivas->ism_extmeta_active = -1; + st_ivas->ism_extmeta_cnt = 0; + + IF ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + k = 0; + ism_total_brate = 0; + WHILE ( LT_16(k, SIZE_IVAS_BRATE_TBL) && NE_32(ivas_total_brate, ivas_brate_tbl[k] )) + { + k++; + } + + IF ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + /* one separated object */ + st_ivas->nSCE = 1; + + ism_total_brate = sep_object_brate[k - 2][0]; + IF ( ( 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( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + Word32 temp_brate[MAX_SCE]; + st_ivas->nSCE = st_ivas->nchan_ism; /* number of objects */ + + 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]; + + IF ( ( error = create_sce_dec( st_ivas, sce_id, temp_brate[sce_id] ) ) != IVAS_ERR_OK ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + IF ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF ( ( error = ivas_masa_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( ( error = ivas_omasa_data_open( 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 ) + { + IF ( ( error = ivas_dirac_dec_config( 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 ) + { + return error; + } + + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[0]->hCoreCoder[n] ); + } + } + ELSE IF ( st_ivas->ivas_format == MC_FORMAT ) + { + IF ( st_ivas->mc_mode == MC_MODE_MCT ) + { + /* init EFAP for custom LS setup */ + IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); + st_ivas->nSCE = 0; + st_ivas->nCPE = st_ivas->nchan_transport / CPE_CHANNELS; + + st_ivas->element_mode_init = IVAS_CPE_MDCT; + + 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 ) + { + return error; + } + + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + /* init EFAP for custom LS setup */ + IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, 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; + + IF ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->element_mode_init = IVAS_CPE_MDCT; + + 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 ) + { + return error; + } + + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* init EFAP for custom LS setup */ + IF ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF ( ( error = ivas_param_mc_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + 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 ) + { + return error; + } + + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF ( GT_16(st_ivas->nCPE, 1 )) + { + IF ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + ELSE IF ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + Word32 brate_sce, brate_cpe; + + ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + IF ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( ( error = ivas_masa_dec_open( 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 ) + { + IF ( ( error = ivas_dirac_dec_config( 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 ) + { + /* 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. */ + set_f( st_ivas->hLsSetupCustom->separate_ch_gains, inv_sqrt( st_ivas->hLsSetupCustom->num_spk ), st_ivas->hLsSetupCustom->num_spk ); + } + ELSE + { + vbap_determine_gains( st_ivas->hVBAPdata, st_ivas->hLsSetupCustom->separate_ch_gains, 0, 0, 0 ); + } + } + + ivas_mcmasa_split_brate( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); + + 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 ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + 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 ) + { + return error; + } + + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* 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 ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + /* 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 ) ) ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; + st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; + } + } + } + + + /*-----------------------------------------------------------------* + * Allocate and initialize HP20 filter memories + *-----------------------------------------------------------------*/ + + /* set number of output channels used for synthesis/decoding */ + n = getNumChanSynthesis( st_ivas ); + + IF ( GT_16(n, 0 )) + { + IF ( ( st_ivas->mem_hp20_out = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + } + ELSE + { + st_ivas->mem_hp20_out = NULL; + } + + FOR ( i = 0; i < n; i++ ) + { + IF ( ( st_ivas->mem_hp20_out[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_out[i], 0.0f, L_HP20_MEM ); + } + + /*-------------------------------------------------------------------* + * 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( 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 ) ) + { + IF ( st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + IF ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + IF ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + IF ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, 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 ); + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + IF ( ( error = ivas_jbm_dec_tc_buffer_open( 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 ) + { + IF ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + IF ( ( 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 ) + { + 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 ) ) + { + IF ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, 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 ) + { + return error; + } + + st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + + IF ( ( st_ivas->ivas_format == MC_FORMAT ) && ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + { + granularity = NS2SA( output_Fs, CLDFB_SLOT_NS ); + + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + IF ( ( error = ivas_jbm_dec_tc_buffer_open( 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; + } + } + ELSE + { + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + IF ( ( error = ivas_jbm_dec_tc_buffer_open( 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 ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + /* Allocate TD renderer for the objects in DISC mode */ + IF ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + IF ( ( 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 ) ) + { + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + IF ( ( 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( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + IF ( 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 ) + { + /* Allocate TD renderer for the objects in DISC mode */ + IF ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /*-----------------------------------------------------------------* + * 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 ) + { + binauralization_delay_ns = st_ivas->binaural_latency_ns; + IF ( st_ivas->hBinRenderer != NULL ) + { + IF ( st_ivas->hBinRenderer->render_lfe ) + { + { + /* Account for filterbank delay */ + binauralization_delay_ns += IVAS_FB_DEC_DELAY_NS; + } + } + ELSE + { + binauralization_delay_ns = 0; + } + } + + IF ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) + { + return error; + } + + set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); + set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); + } + + /*-----------------------------------------------------------------* + * CLDFB handles for rendering + *-----------------------------------------------------------------*/ + + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); FOR ( i = 0; i < numCldfbAnalyses; i++ ) { @@ -2269,17 +3645,9 @@ ivas_error ivas_init_decoder( { /* no module has yet open the TC buffer, open a default one */ -#ifdef IVAS_FLOAT_FIXED - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); -#else n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); -#endif -#ifdef IVAS_FLOAT_FIXED - 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 ) -#else IF ( ( error = ivas_jbm_dec_tc_buffer_open( 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 ) -#endif { return error; } @@ -2288,11 +3656,7 @@ ivas_error ivas_init_decoder( IF ( st_ivas->hTcBuffer == NULL ) { /* we need the handle anyway, but without the buffer*/ -#ifdef IVAS_FLOAT_FIXED - IF ( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ) != IVAS_ERR_OK ) -#else IF ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -2312,9 +3676,6 @@ ivas_error ivas_init_decoder( /*-----------------------------------------------------------------* * Allocate floating-point output audio buffers *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED - st_ivas->p_out_len = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); -#endif // IVAS_FLOAT_FIXED FOR ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) { @@ -2323,29 +3684,17 @@ ivas_error ivas_init_decoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - set_zero(st_ivas->p_output_f[n], 48000 / FRAMES_PER_SEC); - IF ( ( st_ivas->p_output_fx[n] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); - } - set32_fx(st_ivas->p_output_fx[n], 0, 48000 / FRAMES_PER_SEC); - -#endif } FOR ( ; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) { st_ivas->p_output_f[n] = NULL; -#ifdef IVAS_FLOAT_FIXED - st_ivas->p_output_fx[n] = NULL; -#endif } return error; } - +#endif /*------------------------------------------------------------------------- * destroy_core_dec() @@ -2358,7 +3707,14 @@ void destroy_core_dec( ) { #ifdef IVAS_FLOAT_FIXED - destroy_cldfb_decoder_ivas_fx( hCoreCoder ); + IF( EQ_16( hCoreCoder->element_mode, EVS_MONO ) ) + { + destroy_cldfb_decoder_fx( hCoreCoder ); + } + ELSE + { + destroy_cldfb_decoder_ivas_fx( hCoreCoder ); + } #else destroy_cldfb_decoder_flt( hCoreCoder ); #endif // IVAS_FLOAT_FIXED @@ -2528,7 +3884,7 @@ void ivas_initialize_handles_dec( } st_ivas->bit_stream = NULL; - st_ivas->mem_hp20_out = NULL; + //st_ivas->mem_hp20_out = NULL; #ifdef IVAS_FLOAT_FIXED st_ivas->mem_hp20_out_fx = NULL; #endif // IVAS_FLOAT_FIXED @@ -2588,7 +3944,7 @@ void ivas_initialize_handles_dec( { st_ivas->p_output_f[i] = NULL; #ifdef IVAS_FLOAT_FIXED - st_ivas->p_output_f[i] = NULL; + st_ivas->p_output_fx[i] = NULL; #endif } @@ -2733,7 +4089,11 @@ void ivas_destroy_dec( ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); /* Parametric MC handle */ +#ifdef IVAS_FLOAT_FIXED + ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); +#else ivas_param_mc_dec_close( &st_ivas->hParamMC ); +#endif /* EFAP handle */ efap_free_data( &st_ivas->hEFAPdata ); @@ -2777,7 +4137,11 @@ void ivas_destroy_dec( ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); /* OSBA structure */ +#ifdef IVAS_FLOAT_FIXED + ivas_osba_data_close_fx( &st_ivas->hSbaIsmData ); +#else ivas_osba_data_close( &st_ivas->hSbaIsmData ); +#endif /* OMASA structure */ ivas_omasa_data_close( &st_ivas->hMasaIsmData ); @@ -2794,26 +4158,48 @@ void ivas_destroy_dec( /* Time Domain binaural renderer handle */ IF ( st_ivas->hBinRendererTd != NULL ) { +#ifdef IVAS_FLOAT_FIXED + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); +#else ivas_td_binaural_close( &st_ivas->hBinRendererTd ); +#endif } ELSE IF ( st_ivas->hHrtfTD != NULL ) { BSplineModelEvalDealloc( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); - +#ifdef IVAS_FLOAT_FIXED + BSplineModelEvalDealloc_fx( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); +#endif +#ifdef IVAS_FLOAT_FIXED + ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD ); +#else ivas_HRTF_binary_close( &st_ivas->hHrtfTD ); +#endif } /* CRend binaural renderer handle */ +#ifdef IVAS_FLOAT_FIXED + ivas_HRTF_CRend_binary_close_fx( &st_ivas->hSetOfHRTF ); +#else ivas_HRTF_CRend_binary_close( &st_ivas->hSetOfHRTF ); +#endif /* Fastconv HRTF memories */ ivas_binaural_hrtf_close( &st_ivas->hHrtfFastConv ); +#ifdef IVAS_FLOAT_FIXED + /* Fastconv HRTF filters */ + ivas_HRTF_fastconv_binary_close_fx( &st_ivas->hHrtfFastConv ); + + /* Parametric binauralizer HRTF filters */ + ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); +#else /* Fastconv HRTF filters */ ivas_HRTF_fastconv_binary_close( &st_ivas->hHrtfFastConv ); /* Parametric binauralizer HRTF filters */ - ivas_HRTF_parambin_binary_close( &st_ivas->hHrtfParambin ); + ivas_HRTF_parambin_binary_close(&st_ivas->hHrtfParambin); +#endif /* Config. Renderer */ ivas_render_config_close( &( st_ivas->hRenderConfig ) ); diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index d6560e17b4860c81d7bf16047391fa58453eafff..2028e6cf8d45f709872d77e77e06ca81e57f53c3 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -41,6 +41,7 @@ #include "ivas_prot_fx.h" #include "prot_fx2.h" #endif // IVAS_FLOAT_FIXED +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED /*-------------------------------------------------------------------------* * ivas_ism_bitrate_switching_dec() @@ -198,7 +199,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } IF ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - IF ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_reverb_open( &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; } @@ -293,8 +294,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( * CLDFB instances *-----------------------------------------------------------------*/ - Word16 Q_cldfbSynDec = Q21; - IF ( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ,Q_cldfbSynDec) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) { return error; } @@ -376,7 +376,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( return error; } #endif - +#ifdef IVAS_FLOAT_FIXED static ivas_error ivas_ism_bitrate_switching_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nchan_transport_old, /* i : last number of transport channels */ @@ -405,23 +405,11 @@ static ivas_error ivas_ism_bitrate_switching_dec( /* temporarily set the ism mode back to the old one, otherwise this can give wrong results*/ ism_mode = st_ivas->ism_mode; st_ivas->ism_mode = last_ism_mode; -#ifdef IVAS_FLOAT_FIXED ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); -#else - ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); -#endif // IVAS_FLOAT_FIXED st_ivas->ism_mode = ism_mode; -#ifdef IVAS_FLOAT_FIXED nchan_out_buff_old = ivas_get_nchan_buffers_dec_ivas_fx( st_ivas, -1, -1 ); -#else - nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); -#endif // IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED 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 ) -#else - if ( ( error = ivas_ism_config( 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 ) -#endif { return error; } @@ -432,32 +420,23 @@ static ivas_error ivas_ism_bitrate_switching_dec( * Allocate, initialize, and configure SCE/CPE/MCT handles *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED 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 ) { return error; } -#else - if ( ( error = ivas_corecoder_dec_reconfig( 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; - } -#endif // IVAS_FLOAT_FIXED /*-----------------------------------------------------------------* * HP20 memories *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED if ( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_transport_old ) ) != IVAS_ERR_OK ) { return error; } -#endif // IVAS_FLOAT_FIXED - if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_transport_old ) ) != IVAS_ERR_OK ) - { - return error; - } + //if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_transport_old ) ) != IVAS_ERR_OK ) + //{ + // return error; + //} /* save old IntSetup, might be needed for JBM flushing...*/ intern_config_old = st_ivas->intern_config; @@ -492,26 +471,14 @@ static ivas_error ivas_ism_bitrate_switching_dec( /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv render what still fits in the new granularity */ -#ifdef IVAS_FLOAT_FIXED tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs ); -#else - tc_granularity_new = ivas_jbm_dec_get_render_granularity_flt( st_ivas->renderer_type, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs ); -#endif if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { -#ifdef IVAS_FLOAT_FIXED + #if 1 /*Float to fixed conversion*/ DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) - { - if ( st_ivas->hIsmMetaData[ind1] ) - { - st_ivas->hIsmMetaData[ind1]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind1]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->elevation * ( 1 << 22 ) ); - } - } IF( st_ivas->hCombinedOrientationData ) FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) { @@ -533,7 +500,7 @@ static ivas_error ivas_ism_bitrate_switching_dec( nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); DECODER_CONFIG_HANDLE hDecoderConfig; hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_in, numch_out, num_md_sub_frames, q1 = 30, q2 = 30; + Word16 numch_in, numch_out, num_md_sub_frames; ; Word16 numch_out_dirac = hDecoderConfig->nchan_out; IF( hSpar ) @@ -541,30 +508,7 @@ static ivas_error ivas_ism_bitrate_switching_dec( numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; 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 ); - - for ( int l = 0; l < numch_out; l++ ) - { - for ( int j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - for ( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } - } - } - } + hSpar->hMdDec->Q_mixer_mat = Q30; for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) { for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) @@ -617,19 +561,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ } } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } - } // fix2float (to be cleaned) 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 ) ) ) ) { @@ -651,21 +582,8 @@ static ivas_error ivas_ism_bitrate_switching_dec( } } } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) - { - if ( st_ivas->hIsmMetaData[ind1] ) - { - st_ivas->hIsmMetaData[ind1]->azimuth = (float) ( st_ivas->hIsmMetaData[ind1]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind1]->elevation = (float) ( st_ivas->hIsmMetaData[ind1]->elevation_fx ) / (float) ( 1 << 22 ); - } - } #endif -#else - if ( ( error = ivas_jbm_dec_flush_renderer( 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; - } -#endif // IVAS_FLOAT_FIXED + } /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) @@ -701,7 +619,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( /* Open the TD Binaural renderer */ if ( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL ) { -#ifdef IVAS_FLOAT_FIXED #if 1 /*Cleanup changes: float to fixed */ Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; @@ -740,9 +657,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( Src_p->SrcSpatial_p->DirAtten.ConeInnerAngle = 360.0f; Src_p->SrcSpatial_p->DirAtten.ConeOuterAngle = 360.0f; Src_p->SrcSpatial_p->DirAtten.ConeOuterGain = 1.0f; - Src_p->SrcSpatial_p->DistAtten.RefDist = 1.0f; - Src_p->SrcSpatial_p->DistAtten.MaxDist = 15.75f; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ - Src_p->SrcSpatial_p->DistAtten.RollOffFactor = 1.0f; 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 ); @@ -773,15 +687,10 @@ static ivas_error ivas_ism_bitrate_switching_dec( SrcSpatial_p->DirAtten.ConeOuterGain = fix_to_float( SrcSpatial_p->DirAtten.ConeOuterGain_fx, Q30 ); } #endif -#else - if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif // IVAS_FLOAT_FIXED + if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_open( &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; } @@ -793,17 +702,10 @@ static ivas_error ivas_ism_bitrate_switching_dec( /* close the ISM renderer and reinitialize */ ivas_ism_renderer_close( &st_ivas->hIsmRendererData ); -#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->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) @@ -833,7 +735,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { -#ifdef IVAS_FLOAT_FIXED /* open the parametric binaural renderer */ if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) { @@ -850,15 +751,8 @@ static ivas_error ivas_ism_bitrate_switching_dec( } fixedToFloat_arrL(st_ivas->hHrtfParambin->parametricReverberationTimes_fx, st_ivas->hHrtfParambin->parametricReverberationTimes, 31, CLDFB_NO_CHANNELS_MAX ); fixedToFloat_arrL(st_ivas->hHrtfParambin->parametricReverberationEneCorrections_fx, st_ivas->hHrtfParambin->parametricReverberationEneCorrections, 31, CLDFB_NO_CHANNELS_MAX ); - fixedToFloat_arrL(st_ivas->hHrtfParambin->parametricEarlyPartEneCorrection_fx, st_ivas->hHrtfParambin->parametricEarlyPartEneCorrection, 31, CLDFB_NO_CHANNELS_MAX ); + fixedToFloat_arrL(st_ivas->hHrtfParambin->parametricEarlyPartEneCorrection_fx, st_ivas->hHrtfParambin->parametricEarlyPartEneCorrection, 28, CLDFB_NO_CHANNELS_MAX ); #endif -#else - if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) - { - return error; - } - -#endif // IVAS_FLOAT_FIXED IF ( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) { return error; @@ -867,11 +761,7 @@ static ivas_error ivas_ism_bitrate_switching_dec( /* Close the TD Binaural renderer */ if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { -#ifdef IVAS_FLOAT_FIXED ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); -#else - ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#endif // IVAS_FLOAT_FIXED st_ivas->hHrtfTD = NULL; if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) @@ -908,7 +798,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( * CLDFB instances *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED #if 1 /*Cleanup changes: float to fixed*/ Word16 i, Q_cldfbSynDec = 21; FOR( i = 0; i < 16; i++ ) @@ -927,7 +816,7 @@ static ivas_error ivas_ism_bitrate_switching_dec( floatToFixed_arrL( st_ivas->cldfbSynDec[0]->cldfb_state, st_ivas->cldfbSynDec[0]->cldfb_state_fx, Q_cldfbSynDec, sub( st_ivas->cldfbAnaDec[i]->p_filter_length, st_ivas->cldfbAnaDec[i]->no_channels ) ); } #endif - IF ( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ,Q_cldfbSynDec) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) { return error; } @@ -942,12 +831,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( fixedToFloat_arrL( st_ivas->cldfbSynDec[0]->cldfb_state_fx, st_ivas->cldfbSynDec[0]->cldfb_state, Q_cldfbSynDec, sub( st_ivas->cldfbAnaDec[i]->p_filter_length, st_ivas->cldfbAnaDec[i]->no_channels ) ); } #endif -#else - if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif // IVAS_FOAT_FIXED /*-----------------------------------------------------------------* * floating-point output audio buffers @@ -956,12 +839,10 @@ static ivas_error ivas_ism_bitrate_switching_dec( { nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); -#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 if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) { return error; @@ -1016,7 +897,309 @@ static ivas_error ivas_ism_bitrate_switching_dec( return error; } +#else +static ivas_error ivas_ism_bitrate_switching_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nchan_transport_old, /* i : last number of transport channels */ + const ISM_MODE last_ism_mode, /* i : last ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + int16_t *data /* o : output synthesis signal */ +) +{ + ivas_error error; + int32_t element_brate_tmp[MAX_NUM_OBJECTS]; + int16_t nSCE_old, nCPE_old; + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old, ism_mode; + TC_BUFFER_MODE tc_buffer_mode_new; + int16_t tc_nchan_tc_new; + int16_t tc_nchan_allocate_new; + int16_t tc_granularity_new; + int16_t nchan_out_buff, nchan_out_buff_old; + AUDIO_CONFIG intern_config_old; + IVAS_OUTPUT_SETUP hIntSetupOld; + RENDERER_TYPE renderer_type_old; + + error = IVAS_ERR_OK; + nCPE_old = st_ivas->nCPE; + nSCE_old = st_ivas->nSCE; + + /* temporarily set the ism mode back to the old one, otherwise this can give wrong results*/ + ism_mode = st_ivas->ism_mode; + st_ivas->ism_mode = last_ism_mode; + ivas_init_dec_get_num_cldfb_instances(st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old); + st_ivas->ism_mode = ism_mode; + nchan_out_buff_old = ivas_get_nchan_buffers_dec(st_ivas, -1, -1); + + if ((error = ivas_ism_config(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; + } + + st_ivas->nSCE = st_ivas->nchan_transport; + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + if ((error = ivas_corecoder_dec_reconfig(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; + } + + /*-----------------------------------------------------------------* + * HP20 memories + *-----------------------------------------------------------------*/ + + if ((error = ivas_hp20_dec_reconfig(st_ivas, nchan_transport_old)) != IVAS_ERR_OK) + { + return error; + } + + /* save old IntSetup, might be needed for JBM flushing...*/ + intern_config_old = st_ivas->intern_config; + hIntSetupOld = st_ivas->hIntSetup; + tc_granularity_new = 1; + renderer_type_old = st_ivas->renderer_type; + + /*-----------------------------------------------------------------* + * Initialize the needed renderer struct and destroy the unnecessary renderer struct + *-----------------------------------------------------------------*/ + + /* select the renderer */ + ivas_renderer_select(st_ivas); + + ivas_output_init(&(st_ivas->hIntSetup), st_ivas->intern_config); + + if ((st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC) && (st_ivas->ism_mode == ISM_MODE_DISC)) + { + ivas_output_init(&(st_ivas->hIntSetup), st_ivas->hDecoderConfig->output_config); + } + + { + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + if (last_ism_mode == ISM_MODE_PARAM && st_ivas->hSpatParamRendCom != NULL && (st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE)) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + mvs2s(st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS); + } + + /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity_flt(st_ivas->renderer_type, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs); + + if (tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity) + { + if ((error = ivas_jbm_dec_flush_renderer(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; + } + } + /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ + else if (tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity) + { + if ((error = ivas_jbm_dec_set_discard_samples(st_ivas)) != IVAS_ERR_OK) + { + return error; + } + } + } + + if (st_ivas->ism_mode != last_ism_mode) + { + /* EFAP handle */ + efap_free_data(&st_ivas->hEFAPdata); + } + + /*-----------------------------------------------------------------* + * Switching between ParamISM and DiscISM + *-----------------------------------------------------------------*/ + + /* switching from ParamISM to DiscISM */ + if (st_ivas->ism_mode == ISM_MODE_DISC && last_ism_mode == ISM_MODE_PARAM) + { + /* Deallocate the ParamISM struct */ + ivas_param_ism_dec_close(&(st_ivas->hParamIsmDec), &(st_ivas->hSpatParamRendCom), st_ivas->hDecoderConfig->output_config); + + if (st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL || 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 */ + if (st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL) + { + if ((error = ivas_td_binaural_open(st_ivas)) != IVAS_ERR_OK) + { + return error; + } + if (st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB) + { + if ((error = ivas_reverb_open(&st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs)) != IVAS_ERR_OK) + { + return error; + } + } + } + } + else + { + /* close the ISM renderer and reinitialize */ + ivas_ism_renderer_close(&st_ivas->hIsmRendererData); + + if ((error = ivas_ism_renderer_open(st_ivas)) != IVAS_ERR_OK) + { + return error; + } + } + if (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) + { + return error; + } + + st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + } + } + + /* switching from Discrete ISM to ParamISM */ + if (st_ivas->ism_mode == ISM_MODE_PARAM && last_ism_mode == ISM_MODE_DISC) + { + /* Allocate and initialize the ParamISM struct */ + if ((error = ivas_param_ism_dec_open(st_ivas)) != IVAS_ERR_OK) + { + return error; + } + + if (st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + /* open the parametric binaural renderer */ + if ((error = ivas_dirac_dec_binaural_copy_hrtfs(&st_ivas->hHrtfParambin)) != IVAS_ERR_OK) + { + return error; + } + + if ((error = ivas_dirac_dec_init_binaural_data(st_ivas, st_ivas->hHrtfParambin)) != IVAS_ERR_OK) + { + return error; + } + + /* Close the TD Binaural renderer */ + if (st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE) + { + ivas_td_binaural_close(&st_ivas->hBinRendererTd); + st_ivas->hHrtfTD = NULL; + + if (st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB) + { + ivas_reverb_close(&st_ivas->hReverb); + } + } + } + else + { + /* Close the ISM renderer */ + ivas_ism_renderer_close(&st_ivas->hIsmRendererData); + } + + if (st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR) + { + /* open the parametric binaural renderer */ + if ((error = ivas_dirac_dec_binaural_copy_hrtfs(&st_ivas->hHrtfParambin)) != IVAS_ERR_OK) + { + return error; + } + + if ((error = ivas_dirac_dec_init_binaural_data(st_ivas, st_ivas->hHrtfParambin)) != IVAS_ERR_OK) + { + return error; + } + + /* close the crend binaural renderer */ + ivas_rend_closeCrend(&(st_ivas->hCrendWrapper)); + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ((error = ivas_cldfb_dec_reconfig(st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old)) != IVAS_ERR_OK) + { + return error; + } + + /*-----------------------------------------------------------------* + * floating-point output audio buffers + *-----------------------------------------------------------------*/ + + { + nchan_out_buff = ivas_get_nchan_buffers_dec(st_ivas, -1, -1); + + if ((error = ivas_output_buff_dec(st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff)) != IVAS_ERR_OK) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * JBM TC buffers + *-----------------------------------------------------------------*/ + { + int16_t tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode(st_ivas); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels(st_ivas); + tc_nchan_allocate_new = tc_nchan_tc_new; + tc_nchan_full_new = tc_nchan_tc_new; + + if (st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC) + { + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + tc_nchan_full_new = tc_nchan_allocate_new; + } + + if (st_ivas->ism_mode == ISM_MODE_PARAM && (st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM)) + { + tc_nchan_full_new = 0; + } + + /* reconfigure buffer */ + if (hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || + hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new) + { + if ((error = ivas_jbm_dec_tc_buffer_reconfigure(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; + } + } + + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + if (st_ivas->hSpatParamRendCom != NULL) + { + st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + + mvs2s(st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS); + } + } + + return error; +} +#endif /*------------------------------------------------------------------------- * ivas_ism_dec_config() @@ -1026,7 +1209,7 @@ static ivas_error ivas_ism_bitrate_switching_dec( *-------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -ivas_error ivas_ism_dec_config( +ivas_error ivas_ism_dec_config_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const ISM_MODE last_ism_mode, /* i/o: last ISM mode */ UWord16 *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 319ddf6eef6d7bf95e36f29d46dae038d45d8f79..95f26554dfc4a2f9f84b1b0b92d6fb659efb5113 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -51,10 +51,13 @@ /*-----------------------------------------------------------------------* * Local functions *-----------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED +static void decode_angle_indices_fx( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, const int16_t non_diegetic_flag, int16_t *flag_abs_azimuth ); +static int16_t decode_radius_fx( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int16_t *flag_abs_radius ); +#else static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, const int16_t non_diegetic_flag, int16_t *flag_abs_azimuth ); - static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int16_t *flag_abs_radius ); +#endif /*-------------------------------------------------------------------------* @@ -74,6 +77,7 @@ static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int * * Smooth the metadata evolution *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void ism_metadata_smooth( ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ @@ -136,7 +140,7 @@ static void ism_metadata_smooth( return; } -#ifdef IVAS_FLOAT_FIXED +#else static void ism_metadata_smooth_fx( ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const Word32 ism_total_brate, /* i : ISms total bitrate */ @@ -205,7 +209,7 @@ static void ism_metadata_smooth_fx( * * decode and dequantize ISM metadata *-------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED 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 */ @@ -453,7 +457,11 @@ ivas_error ivas_ism_metadata_dec( if ( hIsmMetaData->non_diegetic_flag ) { /* Panning gain decoding */ +#ifdef IVAS_FLOAT_FIXED + decode_angle_indices_fx( st0, &( hIsmMetaData->position_angle ), hIsmMetaData->non_diegetic_flag, &flag_abs_position ); +#else decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMetaData->non_diegetic_flag, &flag_abs_position ); +#endif idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; idx_angle2 = 1 << ( ISM_ELEVATION_NBITS - 1 ); @@ -467,7 +475,11 @@ ivas_error ivas_ism_metadata_dec( } else { +#ifdef IVAS_FLOAT_FIXED + decode_angle_indices_fx( st0, &( hIsmMetaData->position_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_position ); +#else decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_position ); +#endif idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; idx_angle2 = hIsmMetaData->position_angle.last_angle2_idx; @@ -485,13 +497,21 @@ ivas_error ivas_ism_metadata_dec( /* radius/raw/pitch dequantization */ if ( ism_extmeta_bitstream ) { +#ifdef IVAS_FLOAT_FIXED + decode_angle_indices_fx( st0, &( hIsmMetaData->orientation_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_orientation ); +#else decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_orientation ); +#endif idx_angle1 = hIsmMetaData->orientation_angle.last_angle1_idx; idx_angle2 = hIsmMetaData->orientation_angle.last_angle2_idx; yaw = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); pitch = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); +#ifdef IVAS_FLOAT_FIXED + idx_radius = decode_radius_fx( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); +#else idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); +#endif radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA ); if ( *ism_extmeta_active == 1 ) { @@ -721,7 +741,7 @@ ivas_error ivas_ism_metadata_dec( return IVAS_ERR_OK; } -#ifdef IVAS_FLOAT_FIXED +#else ivas_error ivas_ism_metadata_dec_fx( const Word32 ism_total_brate, /* i : ISM total bitrate */ const Word16 nchan_ism, /* i : number of ISM channels */ @@ -969,7 +989,7 @@ ivas_error ivas_ism_metadata_dec_fx( IF ( hIsmMetaData->non_diegetic_flag ) { /* Panning gain decoding */ - decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMetaData->non_diegetic_flag, &flag_abs_position ); + decode_angle_indices_fx( st0, &( hIsmMetaData->position_angle ), hIsmMetaData->non_diegetic_flag, &flag_abs_position ); idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; idx_angle2 = 1 << ( ISM_ELEVATION_NBITS - 1 ); @@ -983,7 +1003,7 @@ ivas_error ivas_ism_metadata_dec_fx( } ELSE { - decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_position ); + decode_angle_indices_fx( st0, &( hIsmMetaData->position_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_position ); idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; idx_angle2 = hIsmMetaData->position_angle.last_angle2_idx; @@ -1001,13 +1021,13 @@ ivas_error ivas_ism_metadata_dec_fx( /* radius/raw/pitch dequantization */ IF ( ism_extmeta_bitstream ) { - decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_orientation ); + decode_angle_indices_fx( st0, &( hIsmMetaData->orientation_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_orientation ); idx_angle1 = hIsmMetaData->orientation_angle.last_angle1_idx; idx_angle2 = hIsmMetaData->orientation_angle.last_angle2_idx; yaw_fx = ism_dequant_meta_fx( idx_angle1, ism_azimuth_borders_fx, (Word32)(ISM_Q_STEP * (1<<22)), (Word32)(ISM_Q_STEP_BORDER * (1<<22)), 1 << ISM_AZIMUTH_NBITS ); pitch_fx = ism_dequant_meta_fx( idx_angle2, ism_elevation_borders_fx, (Word32)(ISM_Q_STEP * (1<<22)), (Word32)(ISM_Q_STEP_BORDER * (1<<22)), 1 << ISM_ELEVATION_NBITS ); - idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); + idx_radius = decode_radius_fx( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); radius_fx = usdequant_fx( idx_radius, (Word16)(ISM_RADIUS_MIN * (1 << 9)) , (Word16)(ISM_RADIUS_DELTA * (1 << 9)) ); IF ( *ism_extmeta_active == 1 ) { @@ -1233,7 +1253,7 @@ ivas_error ivas_ism_metadata_dec_fx( *-------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -ivas_error ivas_ism_metadata_dec_create( +ivas_error ivas_ism_metadata_dec_create_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 n_ISms, /* i : number of objects */ Word32 element_brate_tmp[] /* o : element bitrate per object */ @@ -1366,7 +1386,7 @@ ivas_error ivas_ism_metadata_dec_create( *-------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -static void decode_angle_indices( +static void decode_angle_indices_fx( DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ const Word16 non_diegetic_flag, /* i : Non diegetic flag */ @@ -1668,7 +1688,7 @@ static void decode_angle_indices( *-------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -static Word16 decode_radius( +static Word16 decode_radius_fx( DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ Word16 *last_radius_idx, /* i/o: last radius index */ Word16 *flag_abs_radius /* o : Radius encoding mode */ @@ -1792,7 +1812,7 @@ static int16_t decode_radius( return idx_radius; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * ivas_ism_metadata_sid_dec() * diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index e8ed168402448e798d8959584e1e3d34bcb6dcb4..eb6e5a174f64840eaef6e13c554266e6da8c3425 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -282,6 +282,87 @@ static void ivas_ism_get_proto_matrix( } #endif +#ifdef IVAS_FLOAT_FIXED +static void ivas_param_ism_collect_slot_fx( + PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ + Word32 *Cldfb_RealBuffer_in_fx, + Word16 exp_real, + Word32 *Cldfb_ImagBuffer_in_fx, + Word16 exp_imag, + const Word16 ch, + Word32 ref_power_fx[], + Word16 *exp_ref_power, + Word32 cx_diag_fx[][PARAM_ISM_MAX_DMX], + Word16 *exp_cx_diag ) +{ + Word16 band_idx, bin_idx; + Word16 brange[2]; + Word32 tmp_fx; + Word16 exp_tmp; + + /* loop over parameter bands to collect transport channel energies */ + + Word16 exp_ref_power_buf[CLDFB_NO_CHANNELS_MAX]; + Word16 exp_cx_diag_buf[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + 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(); + FOR( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + tmp_fx = 0; + exp_tmp = 0; + 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; + cx_diag_fx[bin_idx][ch] = BASOP_Util_Add_Mant32Exp( cx_diag_fx[bin_idx][ch], *exp_cx_diag, tmp_fx, exp_tmp, &exp_cx_diag_new ); + move32(); + ref_power_fx[bin_idx] = BASOP_Util_Add_Mant32Exp( ref_power_fx[bin_idx], *exp_ref_power, tmp_fx, exp_tmp, &exp_ref_power_new ); + move32(); + exp_cx_diag_buf[bin_idx][ch] = exp_cx_diag_new; + move16(); + exp_ref_power_buf[bin_idx] = exp_ref_power_new; + move16(); + } + } + + /*make common exponent*/ + Word16 max_exp_cx_diag = 0, max_exp_ref_power = 0; + Word16 a, b; + FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) + { + a = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + b = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + FOR( bin_idx = a; bin_idx < b; bin_idx++ ) + { + max_exp_cx_diag = s_max( max_exp_cx_diag, exp_cx_diag_buf[bin_idx][ch] ); + max_exp_ref_power = s_max( max_exp_ref_power, exp_ref_power_buf[bin_idx] ); + } + } + + + FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) + { + a = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + b = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + FOR( bin_idx = a; bin_idx < b; bin_idx++ ) + { + cx_diag_fx[bin_idx][ch] = L_shr( cx_diag_fx[bin_idx][ch], sub( max_exp_cx_diag, exp_cx_diag_buf[bin_idx][ch] ) ); + ref_power_fx[bin_idx] = L_shr( ref_power_fx[bin_idx], sub( max_exp_ref_power, exp_ref_power_buf[bin_idx] ) ); + } + } + + *exp_cx_diag = max_exp_cx_diag; + *exp_ref_power = max_exp_ref_power; + + return; +} +#endif static void ivas_param_ism_collect_slot( PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ @@ -291,7 +372,6 @@ static void ivas_param_ism_collect_slot( float ref_power[], float cx_diag[][PARAM_ISM_MAX_DMX] ) { - int16_t band_idx, bin_idx; int16_t brange[2]; float tmp; @@ -314,7 +394,6 @@ static void ivas_param_ism_collect_slot( return; } - static void ivas_param_ism_compute_mixing_matrix( const int16_t nchan_ism, /* i : number of ISM channels */ PARAM_ISM_DEC_HANDLE hParamIsmDec, /* i/o: decoder ParamISM handle */ @@ -786,7 +865,7 @@ static void ivas_param_ism_update_mixing_matrix( * * Open Param ISM handle *-------------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_param_ism_dec_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) @@ -902,7 +981,7 @@ ivas_error ivas_param_ism_dec_open( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) { /* Initialize efap handle */ - if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), hOutSetup.ls_azimuth, hOutSetup.ls_elevation, hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + 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 ) { return error; } @@ -1039,7 +1118,210 @@ ivas_error ivas_param_ism_dec_open( pop_wmops(); return error; } +#else +ivas_error ivas_param_ism_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t i; + PARAM_ISM_DEC_HANDLE hParamIsmDec; + IVAS_OUTPUT_SETUP hOutSetup; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + AUDIO_CONFIG output_config; + int32_t output_Fs; + ivas_error error; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_param_ism_dec_open" ); + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hParamIsmDec = (PARAM_ISM_DEC_HANDLE) malloc( sizeof( PARAM_ISM_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ParamISM\n" ) ); + } + + if ( ( hSpatParamRendCom = (SPAT_PARAM_REND_COMMON_DATA_HANDLE) malloc( sizeof( SPAT_PARAM_REND_COMMON_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + /* Assign memory to Param Object handle */ + if ( ( hParamIsmDec->hParamIsm = (PARAM_ISM_CONFIG_HANDLE) malloc( sizeof( PARAM_ISM_CONFIG_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ParamISM\n" ) ); + } + + if ( ( hParamIsmDec->hParamIsmRendering = (PARAM_ISM_RENDERING_HANDLE) malloc( sizeof( PARAM_ISM_RENDERING_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ParamISM Rendering handle\n" ) ); + } + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + + ivas_param_ism_config( hParamIsmDec->hParamIsm, st_ivas->nchan_ism ); + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + hSpatParamRendCom->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + 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; + hSpatParamRendCom->subframes_rendered = 0; + hSpatParamRendCom->slots_rendered = 0; + hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + + hParamIsmDec->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; + + for ( i = 0; i < ( hParamIsmDec->hParamIsm->nbands + 1 ); i++ ) + { + hParamIsmDec->hParamIsm->band_grouping[i] = Param_ISM_band_grouping[i]; + + if ( hParamIsmDec->hParamIsm->band_grouping[i] > hSpatParamRendCom->num_freq_bands ) + { + hParamIsmDec->hParamIsm->band_grouping[i] = hSpatParamRendCom->num_freq_bands; + } + } + + /*-----------------------------------------------------------------* + * output setup + *-----------------------------------------------------------------*/ + /* hIntSetup and hOutSetup differs only for Binaural rendering */ + if ( 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; + st_ivas->hIntSetup.is_loudspeaker_setup = 1; + } + + hOutSetup = st_ivas->hIntSetup; + + if ( !( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + /* Initialize Param ISM Rendering handle */ + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + if ( ( error = ivas_param_ism_rendering_init( hParamIsmDec->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, MAX_JBM_CLDFB_TIMESLOTS, output_config ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( ( error = ivas_param_ism_rendering_init( hParamIsmDec->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + 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 ) ) + { + /* Initialize efap handle */ + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), hOutSetup.ls_azimuth, hOutSetup.ls_elevation, hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Azi and Ele values are transmitted once per frame per object */ + set_zero( hParamIsmDec->azimuth_values, MAX_NUM_OBJECTS ); + set_zero( hParamIsmDec->elevation_values, MAX_NUM_OBJECTS ); + + hSpatParamRendCom->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; + hSpatParamRendCom->dirac_bs_md_write_idx = 0; + hSpatParamRendCom->dirac_read_idx = 0; + + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->hISMDTX.dtx_flag = 0; + + st_ivas->hParamIsmDec = hParamIsmDec; + st_ivas->hSpatParamRendCom = hSpatParamRendCom; + + + if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) + { + int16_t nchan_transport = st_ivas->nchan_transport; + int16_t nchan_full = 0; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + nchan_full = nchan_transport; + hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } + else + { + int16_t n_slots_to_alloc; + if ( st_ivas->hDecoderConfig->Opt_tsm == 1 ) + { + n_slots_to_alloc = MAX_JBM_CLDFB_TIMESLOTS; + } + else + { + n_slots_to_alloc = CLDFB_SLOTS_PER_SUBFRAME * MAX_PARAM_SPATIAL_SUBFRAMES; + } + if ( ( hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( n_slots_to_alloc * nchan_transport * hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) ); + } + set_zero( hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc, n_slots_to_alloc * nchan_transport * hSpatParamRendCom->num_freq_bands ); + + if ( ( hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( n_slots_to_alloc * nchan_transport * hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) ); + } + set_zero( hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc, n_slots_to_alloc * nchan_transport * hSpatParamRendCom->num_freq_bands ); + } + + if ( st_ivas->hTcBuffer == NULL ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_open( 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; + } + } + } + else + { + hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + if ( st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; + if ( ( error = ivas_jbm_dec_tc_buffer_open( 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; + } + } + } + + pop_wmops(); + return error; +} +#endif /*-------------------------------------------------------------------------* * ivas_param_ism_dec_close() @@ -1539,7 +1821,7 @@ void ivas_ism_dec_digest_tc_fx( IF( st_ivas->intern_config == IVAS_AUDIO_CONFIG_STEREO ) { Word16 gains_fx[2]; - ivas_ism_get_stereo_gains_fx( (Word16) st_ivas->hIsmMetaData[i]->azimuth, (Word16) st_ivas->hIsmMetaData[i]->elevation, &gains_fx[0], &gains_fx[1] ); + 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(); st_ivas->hIsmRendererData->gains_fx[i][1] = L_shr( L_deposit_h( gains_fx[1] ), 1 ); @@ -1570,7 +1852,7 @@ void ivas_ism_dec_digest_tc_fx( { azimuth_fx = L_shl( azimuth_fx, Q22 ); elevation_fx = L_shl( elevation_fx, Q22 ); - efap_determine_gains_fixed( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); + efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); } } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || @@ -1760,7 +2042,7 @@ void ivas_param_ism_dec_digest_tc( { #ifdef IVAS_FLOAT_FIXED ivas_param_ism_dec_dequant_DOA_fx( hParamIsmDec, st_ivas->nchan_ism ); - for ( int i = 0; i < 11; i++ ) + for ( i = 0; i < 11; i++ ) { for ( int j = 0; j < 1; j++ ) { @@ -1771,7 +2053,7 @@ void ivas_param_ism_dec_digest_tc( } } ivas_param_ism_dec_dequant_powrat_fx( hParamIsmDec ); - for ( int i = 0; i < 11; i++ ) + for ( i = 0; i < 11; i++ ) { for ( int j = 0; j < 1; j++ ) { @@ -1798,7 +2080,7 @@ void ivas_param_ism_dec_digest_tc( #ifdef IVAS_FLOAT_FIXED FOR( i = 0; i < st_ivas->nchan_ism; i++ ) { - efap_determine_gains_fixed( st_ivas->hEFAPdata, direct_response_fx[i], hParamIsmDec->azimuth_values_fx[i], hParamIsmDec->elevation_values_fx[i], EFAP_MODE_EFAP ); + efap_determine_gains_fx( st_ivas->hEFAPdata, direct_response_fx[i], hParamIsmDec->azimuth_values_fx[i], hParamIsmDec->elevation_values_fx[i], EFAP_MODE_EFAP ); } FOR( i = 0; i < st_ivas->nchan_ism; i++ ) @@ -1883,8 +2165,38 @@ void ivas_param_ism_dec_digest_tc( mvr2r( RealBuffer, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); mvr2r( ImagBuffer, &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); } +#ifdef IVAS_FLOAT_FIXED + Word16 exp_real_tmp = 0, exp_imag_tmp = 0; + f2me_buf( &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &exp_real_tmp, hSpatParamRendCom->num_freq_bands ); + f2me_buf( &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &exp_imag_tmp, hSpatParamRendCom->num_freq_bands ); + Word32 ref_power_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 cx_diag_fx[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + Word16 exp_ref_power = 0, exp_cx_diag = 0; + f2me_buf( ref_power, ref_power_fx, &exp_ref_power, CLDFB_NO_CHANNELS_MAX ); + f2me_buf( (float *) cx_diag, (Word32 *) cx_diag_fx, &exp_cx_diag, CLDFB_NO_CHANNELS_MAX * PARAM_ISM_MAX_DMX ); + + 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], + exp_real_tmp, + &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], + exp_imag_tmp, + ch, + ref_power_fx, &exp_ref_power, cx_diag_fx, &exp_cx_diag ); + + FOR( int band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) + { + Word16 a = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + Word16 b = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + FOR( bin_idx = a; bin_idx < b; bin_idx++ ) + { - ivas_param_ism_collect_slot( hParamIsmDec, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], ch, ref_power, cx_diag ); + cx_diag[bin_idx][ch] = me2f( cx_diag_fx[bin_idx][ch], exp_cx_diag ); + ref_power[bin_idx] = me2f( ref_power_fx[bin_idx], exp_ref_power ); + } + } +#else + ivas_param_ism_collect_slot(hParamIsmDec, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], ch, ref_power, cx_diag); +#endif } } diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index f6a08c7e08fee7fcd23bea55557dfd8c7a74485d..1b45dbe78a782b155a86c047a698137500a3cc62 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -52,6 +52,7 @@ * Open struct for object rendering, reserve memory, and init values. *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_ism_renderer_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) @@ -111,7 +112,7 @@ ivas_error ivas_ism_renderer_open( return IVAS_ERR_OK; } -#ifdef IVAS_FLOAT_FIXED +#else ivas_error ivas_ism_renderer_open_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) @@ -128,7 +129,7 @@ ivas_error ivas_ism_renderer_open_fx( IF ( st_ivas->hIntSetup.is_loudspeaker_setup && st_ivas->hIntSetup.ls_azimuth != NULL && st_ivas->hIntSetup.ls_elevation != NULL && st_ivas->hEFAPdata == NULL ) { - IF ( ( error = efap_init_data_fixed( &( 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 ( ( 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; } @@ -227,7 +228,7 @@ void ivas_ism_renderer_close( * * Object rendering process *-------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_ism_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output_f[], /* i/o: core-coder transport channels/object output */ @@ -235,7 +236,10 @@ void ivas_ism_render_sf( ) { int16_t i, j, k, j2; - float *g1, g2, *tc; + float g2, *tc; +#ifndef IVAS_FLOAT_FIXED + float *g1; +#endif int16_t num_objects, nchan_out_woLFE, lfe_index; int16_t azimuth, elevation; int16_t tc_offset; @@ -288,7 +292,6 @@ void ivas_ism_render_sf( if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); - if ( st_ivas->hEFAPdata != NULL ) { #ifdef IVAS_FLOAT_FIXED @@ -355,7 +358,7 @@ void ivas_ism_render_sf( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_ism_render_sf_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word32 *output_fx[], /* i/o: core-coder transport channels/object output */ @@ -430,7 +433,7 @@ void ivas_ism_render_sf_fx( IF ( st_ivas->hEFAPdata != NULL ) { - efap_determine_gains_fixed( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], L_shl(azimuth, 22), L_shl(elevation, 22), EFAP_MODE_EFAP ); + efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], L_shl(azimuth, 22), L_shl(elevation, 22), EFAP_MODE_EFAP ); } } @@ -688,7 +691,7 @@ ivas_error ivas_omasa_separate_object_renderer_open( { st_ivas->hIsmRendererData->interpolator_fx[i] = div_s(i, interpolator_length); } - st_ivas->hIsmRendererData->interpolator_length = interpolator_length; + st_ivas->hIsmRendererData->interpolator_len = interpolator_length; move16(); st_ivas->hMasaIsmData->delayBuffer_size = (Word16) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); @@ -1061,13 +1064,13 @@ void ivas_omasa_separate_object_render_jbm_fx( FOR ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { n_samples_sf = i_mult(hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->slot_size); - IF ( n_samples_sf != hRendererData->interpolator_length ) + IF ( n_samples_sf != hRendererData->interpolator_len ) { FOR ( k = 0; k < n_samples_sf; k++ ) { hRendererData->interpolator_fx[k] = div_s( k, n_samples_sf ); } - hRendererData->interpolator_length = n_samples_sf; + hRendererData->interpolator_len = n_samples_sf; move16(); } diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index d761e1c72a801cc73fa0ae79d8a538613bfcef96..2e860b00df2d92a6803c84354b0365085ec943a6 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -61,7 +61,7 @@ static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const int16_t nSample static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] ); #ifdef IVAS_FLOAT_FIXED -static void ivas_jbm_dec_tc_buffer_playout_fx( Decoder_Struct *st_ivas, const UWord16 nSamplesAsked, UWord16 *nSamplesRendered, Word32 *output_fx[]); +static void ivas_jbm_dec_tc_buffer_playout_fx( Decoder_Struct *st_ivas, const UWord16 nSamplesAsked, UWord16 *nSamplesRendered, Word32 *output_fx[] ); #endif static void ivas_jbm_dec_copy_masa_meta_to_buffer( Decoder_Struct *st_ivas ); @@ -78,7 +78,7 @@ static Word16 ceil_fx16( Word16 inp, Word16 Q ); static Word16 ceil_fx16( Word16 inp, Word16 Q ) { Word16 ret = shr( inp, Q ); - IF( (inp & ( ( 1 << Q ) - 1 )) > 0 ) + IF( ( inp & ( ( 1 << Q ) - 1 ) ) > 0 ) { ret = ret + 1; } @@ -92,25 +92,27 @@ static Word16 ceil_fx16( Word16 inp, Word16 Q ) * Principal IVAS JBM decoder routine, decoding of metadata and transport channels *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_jbm_dec_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *data /* o : transport channel signals */ ) { - int16_t n, output_frame, nchan_out, i, j; - Decoder_State *st, **sts; /* used for bitstream handling */ - float *p_output[MAX_TRANSPORT_CHANNELS]; /* 'float' buffer for output synthesis */ + Word16 n, output_frame, nchan_out, i, j; + Decoder_State *st, **sts; /* used for bitstream handling */ + float *p_output[MAX_TRANSPORT_CHANNELS]; /* 'float' buffer for output synthesis */ #ifdef IVAS_FLOAT_FIXED - Word32 *p_output_fx[MAX_TRANSPORT_CHANNELS]; /* 'float' buffer for output synthesis */ + Word32 *p_output_fx[MAX_TRANSPORT_CHANNELS]; /* 'float' buffer for output synthesis */ #endif - int16_t nchan_remapped; - int16_t nb_bits_metadata[MAX_SCE + 1]; - int32_t output_Fs, ivas_total_brate; + Word16 nchan_remapped; + Word16 nb_bits_metadata[MAX_SCE + 1]; + Word32 output_Fs, ivas_total_brate; AUDIO_CONFIG output_config; ivas_error error; - int16_t num_md_sub_frames; - int32_t ism_total_brate; - + Word16 num_md_sub_frames; + Word32 ism_total_brate; + Word16 s; + MCT_DEC_HANDLE hMCT; CPE_DEC_HANDLE hCPE; SCE_DEC_HANDLE hSCE; @@ -125,31 +127,32 @@ ivas_error ivas_jbm_dec_tc( output_config = st_ivas->hDecoderConfig->output_config; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + output_frame = (Word16) ( output_Fs / FRAMES_PER_SEC ); - for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) + FOR( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) { +#if 1 // TODO: To be removed later p_output[n] = st_ivas->p_output_f[n]; - if ( p_output[n] != NULL ) + IF( p_output[n] != NULL ) { set_zero( p_output[n], L_FRAME48k ); } -#ifdef IVAS_FLOAT_FIXED +#endif p_output_fx[n] = st_ivas->p_output_fx[n]; - if ( p_output_fx[n] != NULL ) + IF( p_output_fx[n] != NULL ) { - set_l( p_output_fx[n], 0, L_FRAME48k ); + set32_fx( p_output_fx[n], 0, L_FRAME48k ); } -#endif } - if ( !st_ivas->hDecoderConfig->Opt_tsm ) + IF( EQ_16( st_ivas->hDecoderConfig->Opt_tsm, 0 ) ) { - for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) + FOR( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) { - st_ivas->hTcBuffer->tc[n] = st_ivas->p_output_f[n]; -#ifdef IVAS_FLOAT_FIXED st_ivas->hTcBuffer->tc_fx[n] = st_ivas->p_output_fx[n]; +#if 1 // TODO: To be removed later + st_ivas->hTcBuffer->tc[n] = st_ivas->p_output_f[n]; + floatToFixed_arrL( st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->tc_fx[n], Q11, L_FRAME48k ); #endif } } @@ -158,25 +161,17 @@ ivas_error ivas_jbm_dec_tc( * Decoding + pre-rendering *----------------------------------------------------------------*/ - if ( st_ivas->bfi && st_ivas->ini_frame == 0 ) + IF( NE_16( st_ivas->bfi, 0 ) && EQ_16( st_ivas->ini_frame, 0 ) ) { /* zero output when first frame(s) is lost */ - for ( n = 0; n < nchan_out; n++ ) - { - set_f( p_output[n], 0.0f, output_frame ); - } -#ifdef IVAS_FLOAT_FIXED - /* zero output when first frame(s) is lost */ - for ( n = 0; n < nchan_out; n++ ) + FOR( n = 0; n < nchan_out; n++ ) { - set_l( p_output_fx[n], 0, output_frame ); + set32_fx( p_output_fx[n], 0, output_frame ); } -#endif } - else if ( st_ivas->ivas_format == STEREO_FORMAT ) + ELSE IF( st_ivas->ivas_format == STEREO_FORMAT ) { st_ivas->hCPE[0]->element_brate = ivas_total_brate; -#ifdef IVAS_FLOAT_FIXED Word16 q_output = 11; set32_fx( &p_output_fx[0][0], 0, L_FRAME48k ); set32_fx( &p_output_fx[1][0], 0, L_FRAME48k ); @@ -186,137 +181,48 @@ ivas_error ivas_jbm_dec_tc( return error; } - for ( int k = 0; k < L_FRAME48k; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - p_output[1][k] = (float) p_output_fx[1][k] / ( 1 << q_output ); - } -#else - if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, 0 ) ) != IVAS_ERR_OK ) + IF( NE_16( q_output, Q11 ) ) { - return error; + Scale_sig32( p_output_fx[0], L_FRAME48k, sub( Q11, q_output ) ); + Scale_sig32( p_output_fx[1], L_FRAME48k, sub( Q11, q_output ) ); } -#endif // IVAS_FLOAT_FIXED /* HP filtering */ - for ( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ ) + FOR( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ ) { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < output_frame; i++ ) - { - p_output_fx[n][i] = (Word32) ( p_output[n][i] * ( 1 << 11 ) ); - } hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - for ( i = 0; i < output_frame; i++ ) - { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << 11 ); - } -#else - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); -#endif // IVAS_FLOAT_FIXED } - if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) + IF( st_ivas->renderer_type == RENDERER_MC && EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) { #ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx( st_ivas->nchan_transport ); + s = sub( Q16, Q11 ); + s = sub( s, find_guarded_bits_fx( st_ivas->nchan_transport ) ); FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) { - floatToFixed_arrL( p_output[i], p_output_fx[i], q, output_frame ); - } - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) - { - FOR( j = 0; j < st_ivas->nchan_transport; j++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); - } + Scale_sig32( p_output_fx[i], output_frame, s ); } ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, output_frame, p_output_fx, p_output_fx ); FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) { - fixedToFloat_arrL( p_output_fx[i], p_output[i], q, output_frame ); + Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); } -#else - ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); #endif } } - else if ( st_ivas->ivas_format == ISM_FORMAT ) + ELSE IF( st_ivas->ivas_format == ISM_FORMAT ) { /* Metadata decoding and configuration */ - if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) + IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) { -#ifdef IVAS_FLOAT_FIXED -#if 1 /*Cleanup changes: float to fixed*/ - FOR( Word16 ind = 0; ind < st_ivas->nchan_ism; ind++ ) - { - st_ivas->hIsmMetaData[ind]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_true_azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_true_azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_true_elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_true_elevation * ( 1 << 22 ) ); - } - //FOR( Word16 ind = 0; ind < st_ivas->nchan_transport; ind++ ) - //st_ivas->hSCE[ind]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx = (Word16) ( st_ivas->hSCE[ind]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_flt * 32767 ); - FOR( Word16 ch = 0; ch < st_ivas->nchan_ism; ch++ ) - { - st_ivas->hIsmMetaData[ch]->last_azimuth_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->last_azimuth, 22 ); - st_ivas->hIsmMetaData[ch]->last_elevation_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->last_elevation, 22 ); - } -#endif ivas_ism_dtx_dec_fx( st_ivas, nb_bits_metadata ); -#if 1 /*Cleanup changes: fixed to float*/ - FOR( Word16 ind = 0; ind < st_ivas->nchan_ism; ind++ ) - { - st_ivas->hIsmMetaData[ind]->azimuth = (float) ( st_ivas->hIsmMetaData[ind]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->elevation = (float) ( st_ivas->hIsmMetaData[ind]->elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_azimuth = (float) ( st_ivas->hIsmMetaData[ind]->last_azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_elevation = (float) ( st_ivas->hIsmMetaData[ind]->last_elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_true_azimuth = (float) ( st_ivas->hIsmMetaData[ind]->last_true_azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_true_elevation = (float) ( st_ivas->hIsmMetaData[ind]->last_true_elevation_fx ) / (float) ( 1 << 22 ); - } - //FOR( Word16 ind = 0; ind < st_ivas->nchan_transport; ind++ ) - //st_ivas->hSCE[ind]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_flt = (float) ( st_ivas->hSCE[ind]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx ) / 32767.f; - FOR( Word16 ch = 0; ch < st_ivas->nchan_ism; ch++ ) - { - st_ivas->hIsmMetaData[ch]->last_azimuth = fixedToFloat( st_ivas->hIsmMetaData[ch]->last_azimuth_fx, 22 ); - st_ivas->hIsmMetaData[ch]->last_elevation = fixedToFloat( st_ivas->hIsmMetaData[ch]->last_elevation_fx, 22 ); - } -#endif -#else - ivas_ism_dtx_dec( st_ivas, nb_bits_metadata ); -#endif // IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED set32_fx( p_output_fx[st_ivas->hISMDTX.sce_id_dtx], 0, L_FRAME48k ); - //for ( int k = 0; k < 45; k++ ) - //{ - // st_ivas->hSCE[st_ivas->hISMDTX.sce_id_dtx]->prev_hb_synth_fx[k] = (Word32) ( st_ivas->hSCE[st_ivas->hISMDTX.sce_id_dtx]->prev_hb_synth[k] * ONE_IN_Q11 ); - //} IF( ( error = ivas_sce_dec_fx( st_ivas, st_ivas->hISMDTX.sce_id_dtx, &p_output_fx[st_ivas->hISMDTX.sce_id_dtx], output_frame, nb_bits_metadata[st_ivas->hISMDTX.sce_id_dtx] ) ) != IVAS_ERR_OK ) { return error; } - for ( int k = 0; k < output_frame; k++ ) - { - p_output[st_ivas->hISMDTX.sce_id_dtx][k] = (float) p_output_fx[st_ivas->hISMDTX.sce_id_dtx][k] / ONE_IN_Q11; - } - for ( int k = 0; k < 96; k++ ) - { - //st_ivas->hSCE[st_ivas->hISMDTX.sce_id_dtx]->hCoreCoder[0]->prev_synth_buffer[k] = (float) st_ivas->hSCE[st_ivas->hISMDTX.sce_id_dtx]->hCoreCoder[0]->prev_synth_buffer32_fx[k] / ONE_IN_Q11; - //if ( k < 45 ) - // st_ivas->hSCE[st_ivas->hISMDTX.sce_id_dtx]->prev_hb_synth[k] = (float) st_ivas->hSCE[st_ivas->hISMDTX.sce_id_dtx]->prev_hb_synth_fx[k] / ONE_IN_Q11; - } -#else - /* decode dominant object first so the noise energy of the other objects can be limited */ - if ( ( error = ivas_sce_dec( st_ivas, st_ivas->hISMDTX.sce_id_dtx, &p_output[st_ivas->hISMDTX.sce_id_dtx], output_frame, nb_bits_metadata[st_ivas->hISMDTX.sce_id_dtx] ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif // IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED #if 1 @@ -346,205 +252,64 @@ ivas_error ivas_jbm_dec_tc( } } #endif -#else - ivas_ism_dtx_limit_noise_energy_for_near_silence( st_ivas->hSCE, st_ivas->hISMDTX.sce_id_dtx, st_ivas->nchan_transport ); #endif // IVAS_FLOAT_FIXED } - else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + ELSE IF( st_ivas->ism_mode == ISM_MODE_PARAM ) { - -#ifdef IVAS_FLOAT_FIXED - FOR( Word16 ind = 0; ind < st_ivas->nchan_ism; ind++ ) - { - st_ivas->hIsmMetaData[ind]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_true_azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_true_azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_true_elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_true_elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->radius_fx = (Word16) ( st_ivas->hIsmMetaData[ind]->radius * ( 1 << 9 ) ); - st_ivas->hIsmMetaData[ind]->yaw_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->yaw * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->pitch_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->pitch * ( 1 << 22 ) ); - } IF( ( error = ivas_ism_metadata_dec_fx( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hParamIsmDec->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) { return error; } - FOR( Word16 ind = 0; ind < st_ivas->nchan_ism; ind++ ) - { - st_ivas->hIsmMetaData[ind]->azimuth = (float) ( st_ivas->hIsmMetaData[ind]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->elevation = (float) ( st_ivas->hIsmMetaData[ind]->elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_azimuth = (float) ( st_ivas->hIsmMetaData[ind]->last_azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_elevation = (float) ( st_ivas->hIsmMetaData[ind]->last_elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_true_azimuth = (float) ( st_ivas->hIsmMetaData[ind]->last_true_azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_true_elevation = (float) ( st_ivas->hIsmMetaData[ind]->last_true_elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->radius = (float) ( st_ivas->hIsmMetaData[ind]->radius_fx ) / (float) ( 1 << 9 ); - st_ivas->hIsmMetaData[ind]->yaw = (float) ( st_ivas->hIsmMetaData[ind]->yaw_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->pitch = (float) ( st_ivas->hIsmMetaData[ind]->pitch_fx ) / (float) ( 1 << 22 ); - } -#else - if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hParamIsmDec->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } - else /* ISM_MODE_DISC */ + ELSE /* ISM_MODE_DISC */ { -#ifdef IVAS_FLOAT_FIXED - FOR( Word16 ind = 0; ind < st_ivas->nchan_ism; ind++ ) - { - st_ivas->hIsmMetaData[ind]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_true_azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_true_azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_true_elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_true_elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->radius_fx = (Word16) ( st_ivas->hIsmMetaData[ind]->radius * ( 1 << 9 ) ); - st_ivas->hIsmMetaData[ind]->yaw_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->yaw * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->pitch_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->pitch * ( 1 << 22 ) ); - } IF( ( error = ivas_ism_metadata_dec_fx( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), 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; } - FOR( Word16 ind = 0; ind < st_ivas->nchan_ism; ind++ ) - { - st_ivas->hIsmMetaData[ind]->azimuth = (float) ( st_ivas->hIsmMetaData[ind]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->elevation = (float) ( st_ivas->hIsmMetaData[ind]->elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_azimuth = (float) ( st_ivas->hIsmMetaData[ind]->last_azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_elevation = (float) ( st_ivas->hIsmMetaData[ind]->last_elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_true_azimuth = (float) ( st_ivas->hIsmMetaData[ind]->last_true_azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_true_elevation = (float) ( st_ivas->hIsmMetaData[ind]->last_true_elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->radius = (float) ( st_ivas->hIsmMetaData[ind]->radius_fx ) / (float) ( 1 << 9 ); - st_ivas->hIsmMetaData[ind]->yaw = (float) ( st_ivas->hIsmMetaData[ind]->yaw_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->pitch = (float) ( st_ivas->hIsmMetaData[ind]->pitch_fx ) / (float) ( 1 << 22 ); - } -#else - if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), 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; - } -#endif } - for ( n = 0; n < st_ivas->nchan_transport; n++ ) + FOR( n = 0; n < st_ivas->nchan_transport; n++ ) { /* for DTX frames, dominant object has already been decoded before */ - if ( !( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) && n == st_ivas->hISMDTX.sce_id_dtx ) ) + IF( !( ( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) && n == st_ivas->hISMDTX.sce_id_dtx ) ) { -#ifdef IVAS_FLOAT_FIXED set32_fx( p_output_fx[n], 0, L_FRAME48k ); - //for ( int k = 0; k < 45; k++ ) - //{ - // st_ivas->hSCE[n]->prev_hb_synth_fx[k] = (Word32) ( st_ivas->hSCE[n]->prev_hb_synth[k] * ONE_IN_Q11 ); - //} IF( ( error = ivas_sce_dec_fx( st_ivas, n, &p_output_fx[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) { return error; } - - for ( int k = 0; k < output_frame; k++ ) - { - p_output[n][k] = (float) p_output_fx[n][k] / ONE_IN_Q11; - } - for ( int k = 0; k < 96; k++ ) - { - //st_ivas->hSCE[n]->hCoreCoder[0]->prev_synth_buffer[k] = (float) st_ivas->hSCE[n]->hCoreCoder[0]->prev_synth_buffer32_fx[k] / ONE_IN_Q11; - //if ( k < 45 ) - // st_ivas->hSCE[n]->prev_hb_synth[k] = (float) st_ivas->hSCE[n]->prev_hb_synth_fx[k] / ONE_IN_Q11; - } -#else - if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif // IVAS_FLOAT_FIXED } /* HP filtering */ -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < output_frame; i++ ) - { - p_output_fx[n][i] = (Word32) ( p_output[n][i] * ( 1 << 11 ) ); - } hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - for ( i = 0; i < output_frame; i++ ) - { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << 11 ); - } -#else - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); -#endif // IVAS_FLOAT_FIXED } - if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + IF( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) { -#ifdef IVAS_FLOAT_FIXED - for ( int lp = 0; lp < 12; lp++ ) - { - if ( p_output[lp] != NULL ) - { - } - } - for ( int lp = 0; lp < 12; lp++ ) - { - if ( p_output[lp] != NULL ) - { - for ( int lp2 = 0; lp2 < output_frame; lp2++ ) - { - p_output_fx[lp][lp2] = (Word32) ( p_output[lp][lp2] * ( 1u << 11 ) ); - } - } - } ivas_mono_downmix_render_passive_fx( st_ivas, p_output_fx, output_frame ); - for ( int lp = 0; lp < 960; lp++ ) - { - p_output[0][lp] = (float) p_output_fx[0][lp] / ( 1u << 8 ); - } -#else - ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); -#endif + Scale_sig32( p_output_fx[0], L_FRAME48k, 3 ); } - else if ( 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( 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 ) ) { /* loudness correction */ -#ifdef IVAS_FLOAT_FIXED - for ( int lp = 0; lp < st_ivas->nchan_transport; lp++ ) - { - if ( p_output[lp] != NULL ) - { - } - } - Word16 Q_p_output = 31; - for ( i = 0; i < st_ivas->nchan_transport; i++ ) - { - Q_p_output = s_min( Q_p_output, Q_factor_arrL( p_output[i], output_frame ) ); - } - for ( i = 0; i < st_ivas->nchan_transport; i++ ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q_p_output, output_frame ); - } ivas_dirac_dec_binaural_sba_gain_fx( p_output_fx, st_ivas->nchan_transport, output_frame ); /*returns Q-1*/ - Q_p_output = Q_p_output - 1; - for ( i = 0; i < st_ivas->nchan_transport; i++ ) + + FOR( i = 0; i < st_ivas->nchan_transport; i++ ) { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q_p_output, output_frame ); + Scale_sig32( p_output_fx[i], output_frame, 1 ); } -#else - ivas_dirac_dec_binaural_sba_gain( p_output, st_ivas->nchan_transport, output_frame ); -#endif // IVAS_FLOAT_FIXED } } - else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + ELSE IF( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) { - set_s( nb_bits_metadata, 0, MAX_SCE ); + set16_fx( nb_bits_metadata, 0, MAX_SCE ); /* read parameters from the bitstream */ - if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL ) + IF( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; @@ -557,24 +322,7 @@ ivas_error ivas_jbm_dec_tc( st_ivas->hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio_fx[j] = float_to_fix16( st_ivas->hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio[j], Q14 ); } } - IF( st_ivas->hSpatParamRendCom != NULL ) - { - FOR( i = 0; i < st_ivas->hSpatParamRendCom->dirac_md_buffer_length; i++ ) - { - FOR( j = 0; j < st_ivas->hSpatParamRendCom->num_freq_bands; j++ ) - { - st_ivas->hSpatParamRendCom->diffuseness_vector_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->diffuseness_vector[i][j], 30 ); - st_ivas->hSpatParamRendCom->energy_ratio1_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->energy_ratio1[i][j], 30 ); - IF( EQ_16( st_ivas->hQMetaData->no_directions, 2 ) ) - { - st_ivas->hSpatParamRendCom->energy_ratio2_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->energy_ratio2[i][j], 30 ); - st_ivas->hSpatParamRendCom->spreadCoherence2_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->spreadCoherence2[i][j], 15 ); - } - st_ivas->hSpatParamRendCom->surroundingCoherence_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->surroundingCoherence[i][j], 15 ); - st_ivas->hSpatParamRendCom->spreadCoherence_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->spreadCoherence[i][j], 15 ); - } - } - } + // Float to fix conversion ends here. IF( ( error = ivas_masa_decode_fx( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) @@ -591,7 +339,7 @@ ivas_error ivas_jbm_dec_tc( { st_ivas->hSpatParamRendCom->energy_ratio1[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->energy_ratio1_fx[i][j], 30 ); st_ivas->hSpatParamRendCom->diffuseness_vector[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->diffuseness_vector_fx[i][j], 30 ); - IF( EQ_16( st_ivas->hQMetaData->no_directions, 2 ) ) + IF( EQ_32( st_ivas->hQMetaData->no_directions, 2 ) ) { st_ivas->hSpatParamRendCom->energy_ratio2[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->energy_ratio2_fx[i][j], 30 ); st_ivas->hSpatParamRendCom->spreadCoherence2[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->spreadCoherence2_fx[i][j], 15 ); @@ -601,18 +349,6 @@ ivas_error ivas_jbm_dec_tc( } } } - FOR( Word16 d = 0; d < max( st_ivas->hMasa->config.numberOfDirections, st_ivas->hQMetaData->no_directions ); d++ ) - { - FOR( j = 0; j < max( st_ivas->hMasa->config.numCodingBands, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); j++ ) - { - FOR( Word16 k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) - { - st_ivas->hQMetaData->q_direction[d].band_data[j].elevation[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].elevation_fx[k], Q22 ); - st_ivas->hQMetaData->q_direction[d].band_data[j].azimuth[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].azimuth_fx[k], Q22 ); - st_ivas->hQMetaData->q_direction[d].band_data[j].energy_ratio[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].energy_ratio_fx[k], Q30 ); - } - } - } st_ivas->hMasa->data.dir_decode_quality = fix16_to_float( st_ivas->hMasa->data.dir_decode_quality_fx, Q14 ); IF( st_ivas->hMasa->hMasaLfeSynth != NULL ) { @@ -635,61 +371,39 @@ ivas_error ivas_jbm_dec_tc( } } // Fixed to float conversion ends here. -#else - if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } #endif - if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + IF( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); } } - else if ( st_ivas->ivas_format == SBA_FORMAT ) + ELSE IF( st_ivas->ivas_format == SBA_FORMAT ) { -#ifdef IVAS_FLOAT_FIXED IF( ( error = ivas_spar_dec_fx( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } - if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + IF( EQ_16( st_ivas->nchan_transport, CPE_CHANNELS ) && GE_16( st_ivas->nCPE, 1 ) ) { st_ivas->hCPE[0]->brate_surplus = 0; + move32(); st_ivas->hCPE[0]->element_brate = ivas_total_brate; + move32(); } /* core-decoding of transport channels */ -#ifdef IVAS_FLOAT_FIXED - Word16 q_output = 11; - + Word16 q_output = Q11; IF( EQ_16( st_ivas->nSCE, 1 ) ) { set32_fx( p_output_fx[0], 0, L_FRAME48k ); - //for ( int k = 0; k < 45; k++ ) - //{ - // st_ivas->hSCE[0]->prev_hb_synth_fx[k] = (Word32) ( st_ivas->hSCE[0]->prev_hb_synth[k] * ( 1 << q_output ) ); - //} - IF( ( error = ivas_sce_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { return error; } - - for ( int k = 0; k < output_frame; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - } } ELSE IF( EQ_16( st_ivas->nCPE, 1 ) ) { @@ -701,44 +415,23 @@ ivas_error ivas_jbm_dec_tc( return error; } - for ( int k = 0; k < L_FRAME48k; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - p_output[1][k] = (float) p_output_fx[1][k] / ( 1 << q_output ); - } - } -#else - if ( st_ivas->nSCE == 1 ) - { - if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( st_ivas->nCPE == 1 ) - { - if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + IF( NE_16( q_output, Q11 ) ) { - return error; + Scale_sig32( p_output_fx[0], L_FRAME48k, sub( Q11, q_output ) ); + Scale_sig32( p_output_fx[1], L_FRAME48k, sub( Q11, q_output ) ); } } -#endif // IVAS_FLOAT_FIXED - else if ( st_ivas->nCPE > 1 ) + ELSE IF( GT_16( st_ivas->nCPE, 1 ) ) { #ifdef IVAS_FLOAT_FIXED #if 1 // Float to fix - + Word16 ch, nCPE, cpe_id; - Word16 k, l; - + Word16 l; + nCPE = st_ivas->nCPE; move16(); hMCT = st_ivas->hMCT; - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, L_FRAME48k ); - } FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { hCPE = st_ivas->hCPE[cpe_id]; @@ -748,39 +441,6 @@ ivas_error ivas_jbm_dec_tc( FOR( n = 0; n < CPE_CHANNELS; n++ ) { st = hCPE->hCoreCoder[n]; - IF( st->hTonalMDCTConc ) - { - - FOR( i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) - { - st->hTonalMDCTConc->scaleFactorsBackground_fx[i] = float_to_fix( st->hTonalMDCTConc->scaleFactorsBackground_flt[i], 15 ); - } - //st->hTonalMDCTConc->scf_fadeout = float_to_fix16( st->hTonalMDCTConc->scf_fadeout_flt, 15 ); - if ( hCPE->hCoreCoder[n]->bfi && st->tonal_mdct_plc_active ) - { - FOR( i = 0; i < FDNS_NPTS; i++ ) - { - f2me_16( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_float[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); - } - FOR( i = 0; i < 30; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phaseDiff_float[i]; - if ( pd >= PI2 ) - pd = fmodf( pd, PI2 ) - PI2; - st->hTonalMDCTConc->pTCI->phaseDiff[i] = (Word16) floatToFixed( pd, Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i]; - pd = fmodf( pd, PI2 ); - st->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i] = (Word16) ( pd * ( 1u << Q13 ) ); - } - } - //f2me( st->hTonalMDCTConc->last_block_nrg_flt, &st->hTonalMDCTConc->last_block_nrg, &st->hTonalMDCTConc->last_block_nrg_exp ); - } - // 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 ); - IF( sts[n]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { // u8bit to 16bit @@ -790,9 +450,6 @@ ivas_error ivas_jbm_dec_tc( } } - - IF( st->hTcxDec ) - f2me_16( st->hTcxDec->CngLevelBackgroundTrace_bfi, &st->hTcxDec->conCngLevelBackgroundTrace, &st->hTcxDec->conCngLevelBackgroundTrace_e ); if ( st->hTcxDec && st->hTcxDec->conLastFrameLevel_e < 0 ) { st->hTcxDec->conLastFrameLevel_e = 0; @@ -805,23 +462,6 @@ ivas_error ivas_jbm_dec_tc( st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; IF( st->hTcxDec ) st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - IF( st->hTcxDec ) - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB_fx[p] = (Word16) ( st->hTcxDec->old_excFB[p] * ( 1u << st->Q_exc ) ); - //} - IF( st->hFdCngDec && st->hFdCngDec->hFdCngCom ) - floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, 15, 17 ); - // st->stab_fac_fx = float_to_fix16(st->stab_fac, Q15); - - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32, q_output, L_FRAME48k ); - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32, q_output, TCXLTP_MAX_DELAY ); - //floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, Q11, 111 ); - } - - /*cldfb struct*/ /*------------------fix-to-fix-start---------------------*/ @@ -831,92 +471,8 @@ ivas_error ivas_jbm_dec_tc( hCPE->hCoreCoder[n]->hHQ_core->Q_old_postdec = 0; hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda = 0; } - /*-------------------cldfb-start-------------------------*/ - - floatToFixed_arrL( hCPE->hCoreCoder[n]->bpf_noise_buf_float, hCPE->hCoreCoder[n]->bpf_noise_buf_32, 11, L_FRAME_16k ); - if ( hCPE->hCoreCoder[n]->cldfbAna != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbAna->cldfb_state, hCPE->hCoreCoder[n]->cldfbAna->cldfb_state_fx, 10, hCPE->hCoreCoder[n]->cldfbAna->cldfb_size ); - } - if ( hCPE->hCoreCoder[n]->cldfbSyn != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state, hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state_fx, 4, hCPE->hCoreCoder[n]->cldfbSyn->p_filter_length ); - } - if ( hCPE->hCoreCoder[n]->cldfbBPF != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state_fx, 11, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_size ); - } - - - /*-------------------cldfb-end---------------------------*/ - - //floatToFixed_arr( sts[n]->prev_synth_buffer, hCPE->hCoreCoder[n]->prev_synth_buffer_fx, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); - } - - IF( hCPE->output_mem[0] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[0], hCPE->output_mem_fx[0], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - IF( hCPE->output_mem[1] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[1], hCPE->output_mem_fx[1], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q_output ) ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q_output ) ); - } - } - } - - IF( hCPE->input_mem_LB[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB_fx[n][ind] = (Word32) ( hCPE->input_mem_LB[n][ind] * ( 1 << q_output ) ); - } - } - - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth_fx[n][k] = (Word32) ( hCPE->prev_hb_synth[n][k] * ( 1 << q_output ) ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth_fx[n][k] = (Word32) ( hCPE->prev_synth[n][k] * ( 1 << q_output ) ); - } - } - } - - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->icld_q ) - floatToFixed_arr16( st_ivas->hParamMC->icld_q, st_ivas->hParamMC->icld_q_fx, 8, st_ivas->hParamMC->hMetadataPMC->num_parameter_bands * st_ivas->hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->ls_conv_dmx_matrix ) - floatToFixed_arr32( st_ivas->hParamMC->ls_conv_dmx_matrix, st_ivas->hParamMC->ls_conv_dmx_matrix_fx, 15, st_ivas->hDecoderConfig->nchan_out * ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) ); - IF( st_ivas->hLsSetUpConversion ) - FOR( Word16 chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) - { - FOR( Word16 chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx][chOutIdx] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx], 30 ); /*Q30*/ } } - - #endif // Float to fix if ( ( error = ivas_mct_dec_fx( st_ivas, p_output_fx, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { @@ -930,8 +486,6 @@ ivas_error ivas_jbm_dec_tc( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = hCPE->hCoreCoder[ch]; - st->hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat(st->hTcxLtpDec->tcxltp_gain, 15); - //st->hTcxDec->tcxltp_last_gain_unmodified_float = st->hTcxLtpDec->tcxltp_gain_float; IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { // 16bit to u8bit @@ -939,45 +493,6 @@ ivas_error ivas_jbm_dec_tc( { sts[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) sts[ch]->hIGFDec->infoTCXNoise_evs[l]; } - //IF( !sts[0]->bfi || ( sts[0]->bfi && sts[ch]->core != ACELP_CORE ) ) - //{ - // me2f_buf( sts[ch]->hIGFDec->virtualSpec, sts[ch]->hIGFDec->virtualSpec_e, sts[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - //} - } - IF( st->hTonalMDCTConc != NULL ) - { - //st->hTonalMDCTConc->scf_fadeout_flt = fixedToFloat( st->hTonalMDCTConc->scf_fadeout, 15 ); - //st->hTonalMDCTConc->last_block_nrg_flt = me2f( st->hTonalMDCTConc->last_block_nrg, st->hTonalMDCTConc->last_block_nrg_exp ); - if ( hCPE->hCoreCoder[ch]->bfi && st->tonal_mdct_plc_active ) - { - //st->hTonalMDCTConc->nFramesLost_float = fix16_to_float( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - } - - if ( sts[ch]->last_core != -1 && sts[ch]->nbLostCmpt == 1 ) - { - if ( !( sts[ch]->rf_flag && sts[ch]->use_partial_copy && ( sts[ch]->rf_frame_type == RF_TCXTD1 || sts[ch]->rf_frame_type == RF_TCXTD2 ) ) ) - { - IF( sts[ch]->hTonalMDCTConc != NULL && sts[ch]->last_core == TCX_20_CORE && sts[ch]->second_last_core == TCX_20_CORE && ( ( sts[ch]->old_fpitch <= L_shl( sts[ch]->L_frame, 15 ) ) || ( sts[ch]->hTcxDec->tcxltp_last_gain_unmodified <= 13107 /*0.4f*/ ) ) - /* it is fine to call the detection even if no ltp information - is available, meaning that st->old_fpitch == - st->tcxltp_second_last_pitch == st->L_frame */ - && ( sts[ch]->old_fpitch == sts[ch]->hTcxDec->tcxltp_second_last_pitch ) && !sts[ch]->last_tns_active && !sts[ch]->second_last_tns_active ) - { - - if ( sts[ch]->hTonalMDCTConc->pTCI->numIndexes < MAX_NUMBER_OF_IDX ) - { - FOR( i = 0; i < sts[ch]->hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phaseDiff_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phaseDiff[i], Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i], Q13 ); - } - } - } - } } } @@ -985,48 +500,14 @@ ivas_error ivas_jbm_dec_tc( { st = hCPE->hCoreCoder[n]; sts = hCPE->hCoreCoder; - IF( st->hTcxDec ) - st->hTcxDec->CngLevelBackgroundTrace_bfi = me2f_16( st->hTcxDec->conCngLevelBackgroundTrace, st->hTcxDec->conCngLevelBackgroundTrace_e ); - IF( st->hTonalMDCTConc && st->hTonalMDCTConc->lastPcmOut_float ) - fixedToFloat_arr( st->hTonalMDCTConc->lastPcmOut, st->hTonalMDCTConc->lastPcmOut_float, 0, st->hTonalMDCTConc->nSamples ); - IF( sts[0]->bfi == 0 && !st->hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) - fixedToFloat_arr( st->hTonalMDCTConc->secondLastPcmOut, st->hTonalMDCTConc->secondLastPcmOut_float, 0, st->hTonalMDCTConc->nSamples / 2 ); - fixedToFloat_arr( st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synthFB, st->Q_syn, st->hTcxDec->old_synth_lenFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); - fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, st->Q_syn, 1280 ); - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB[p] = (float) ( st->hTcxDec->old_excFB_fx[p] ) / ( 1u << st->Q_exc ); - //} - // st->preemph_fac_float = (float)st->preemph_fac / MAX_16; - // st->lp_gainc = (float)st->Mode2_lp_gainc / ONE_IN_Q16; - // st->lp_gainp = (float)st->Mode2_lp_gainp / ONE_IN_Q29; - // st->cummulative_damping_float = (float)st->cummulative_damping / MAX_16; - // st->old_enr_LP_float = (float)st->old_enr_LP / ONE_IN_Q3; - for ( int p = 0; p < st->L_frame / 2; p++ ) - { - st->hTcxDec->old_syn_Overl_float[p] = (float) st->hTcxDec->old_syn_Overl[p] * 2 * ( 1u << st->Q_syn ); - st->hTcxDec->syn_Overl_TDACFB_float[p] = (float) st->hTcxDec->syn_Overl_TDACFB[p] * 2 * (float) pow( 2, st->Q_syn ); - st->hTcxDec->syn_Overl_TDAC_float[p] = (float) st->hTcxDec->syn_Overl_TDAC[p] * 2 * (float) pow( 2, st->Q_syn ); - } + for ( int p = 0; p < 640; p++ ) { st->hHQ_core->old_outLB[p] = (float) st->hHQ_core->old_out_LB_fx[p] / ( 1u << st->Q_syn ); } - if ( !st->tcxonly ) - { - fixedToFloat_arr( st->p_bpf_noise_buf, st->p_bpf_noise_buf_float, 0, L_FRAME_16k ); - } - - fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->Q_syn, L_FRAME_MAX / 2 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->Q_syn, L_FRAME32k / 2 ); - st->hTcxDec->tcxltp_last_gain_unmodified_float = fix16_to_float( st->hTcxDec->tcxltp_last_gain_unmodified, Q15 ); - //st->hTcxDec->conceal_eof_gain_float = fix16_to_float( st->hTcxDec->conceal_eof_gain, Q14 ); - /*-------------------cldfb-start-------------------------*/ - /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ - if ( sts[n]->cldfbAna != NULL ) { fixedToFloat_arrL( sts[n]->cldfbAna->cldfb_state_fx, sts[n]->cldfbAna->cldfb_state, 10, sts[n]->cldfbAna->cldfb_state_length ); @@ -1064,80 +545,6 @@ ivas_error ivas_jbm_dec_tc( } /*------------------reset-code-end-----------------------*/ - - - for ( int p = 0; p < L_FRAME48k; p++ ) - { - - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); - } - } - } - if ( hCPE->hCoreCoder[n]->hTcxDec ) - { - for ( k = 0; k < 111; k++ ) - { - //hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] = (float) hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] / ( 1u << q_output ); - } - } - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - - if ( ( hCPE->hCoreCoder[n]->codec_mode == MODE1 && hCPE->hCoreCoder[n]->hTcxDec != NULL ) && ( ( hCPE->hCoreCoder[n]->core == ACELP_CORE && !( hCPE->hCoreCoder[n]->bfi == 1 && hCPE->hCoreCoder[n]->con_tcx == 1 ) ) || hCPE->hCoreCoder[n]->core == HQ_CORE ) ) - { - fixedToFloat_arr( hCPE->hCoreCoder[n]->hTcxDec->synth_history_fx, hCPE->hCoreCoder[n]->hTcxDec->synth_history, 0, output_frame ); - } - } - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); - } - } - } - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->output_mem[n] != NULL ) - { - FOR( k = 0; k < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->output_mem[n][k] = (float) hCPE->output_mem_fx[n][k] / ( 1u << 11 ); - } - } - //IF( hCPE->hCoreCoder[n] != NULL ) - //{ - // FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); k++ ) - // { - // hCPE->hCoreCoder[n]->prev_synth_buffer[k] = (float) hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[k] / ( 1 << q_output ); - // } - //} - IF( hCPE->input_mem[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB[n][ind] = ( (float) hCPE->input_mem_LB_fx[n][ind] / ( 1 << q_output ) ); - } - } - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth[n][k] = (float) hCPE->prev_hb_synth_fx[n][k] / ( 1 << q_output ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth[n][k] = (float) hCPE->prev_synth_fx[n][k] / ( 1 << q_output ); - } } } @@ -1152,7 +559,6 @@ ivas_error ivas_jbm_dec_tc( { IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->igf ) { - //me2f_buf( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_e, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); FOR( l = 0; l < IGF_START_MX; l++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise_evs[l]; @@ -1163,432 +569,160 @@ ivas_error ivas_jbm_dec_tc( } } - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) - me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) + //me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) + //me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, L_FRAME48k ); - } #endif // Fix to float -#else - if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } #endif } /* TCs remapping */ nchan_remapped = st_ivas->nchan_transport; - if ( st_ivas->sba_dirac_stereo_flag ) + IF( st_ivas->sba_dirac_stereo_flag ) { nchan_remapped = nchan_out; - IF ( EQ_16(st_ivas->ivas_format, SBA_FORMAT )) + IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) ) { #ifdef IVAS_FLOAT_FIXED - - num_md_sub_frames = ivas_get_spar_dec_md_num_subframes(st_ivas->sba_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate); #if 1 /*Float to Fixed changes */ FOR( i = 0; i < st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport; i++ ) { - FOR( j = 0; j < output_frame; j++ ) - { - p_output_fx[i][j] = (Word32) ( p_output[i][j] * ONE_IN_Q14 ); - } + Scale_sig32( p_output_fx[i], output_frame, sub( Q14, Q11 ) ); } SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; Word16 num_bands_out, nchan_transport; num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; nchan_out = nchan_transport; - Word16 b, i_ts, num_out_ch; + Word16 num_out_ch; num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; hSpar->hMdDec->Q_mixer_mat = 31; Word16 num_in_ch; num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_C_re_fx = s_min(Q_C_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_P_re_fx = s_min(Q_P_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min(Q_C_re_fx, Q_P_re_fx)); - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - } #endif ivas_agc_dec_process_fx( st_ivas->hSpar->hAgcDec, ( p_output_fx ), ( p_output_fx ), st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); - IF (st_ivas->hSpar->hPCA != NULL) - { - ivas_pca_dec_fx(st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, p_output_fx); - } - ivas_spar_dec_gen_umx_mat_fx(st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, num_md_sub_frames); - -#if 1 /*Fixed to float changes */ - FOR( i = 0; i < st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport; i++) - { - FOR( j = 0; j < output_frame; j++) - { - p_output[i][j] = (float)p_output_fx[i][j] / ONE_IN_Q11; - } - } - - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - st_ivas->hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat(st_ivas->hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], st_ivas->hSpar->hMdDec->Q_mixer_mat); - } - } - } - } -#endif -#else - ivas_agc_dec_process(st_ivas->hSpar->hAgcDec, p_output, p_output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame); - if ( st_ivas->hSpar->hPCA != NULL ) + IF( st_ivas->hSpar->hPCA != NULL ) { - ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, p_output ); + ivas_pca_dec_fx( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, p_output_fx ); } - ivas_spar_dec_gen_umx_mat(st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes(st_ivas->sba_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate)); + ivas_spar_dec_gen_umx_mat_fx( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes(st_ivas->sba_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate)); #endif } -#ifndef IVAS_FLOAT_FIXED - ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, st_ivas->ivas_format == MC_FORMAT ); -#else +#ifdef IVAS_FLOAT_FIXED { Word16 q; - float l_hb_nrg = 0.0, l_hb_nrg_subr = 0.0; - //static int frame_counter = 0; - //if ( frame_counter >= 200 ) - // frame_counter = frame_counter; float max_val = 0.0; - int i_max_val_psd, i_max_val_op; + int i_max_val_op; hCPE = st_ivas->hCPE[0]; hSCE = st_ivas->hSCE[0]; - for ( int ii = 0; ii < sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0] ); ii++ ) + i_max_val_op = (int) max_val; + s = 0; + FOR( i = 0; i < 2; i++ ) { - if ( max_val < fabs( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[ii] ) ) - { - max_val = (float) fabs( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[ii] ); - } - } - i_max_val_psd = (int) max_val; - for ( int ii = 0; ii < 2; ii++ ) - { - for ( int jj = 0; jj < ( 48000 / FRAMES_PER_SEC ); jj++ ) - { - if ( max_val < fabs( p_output[ii][jj] ) ) - { - max_val = (float) fabs( p_output[ii][jj] ); - } - } + s = s_min( s, L_norm_arr( p_output_fx[i], L_FRAME48k ) - 11 ) /* Guard bits */; } - i_max_val_op = (int)max_val; - hCPE->hStereoDft->q_dft = norm_l(i_max_val_op) - Q11; - IF(hCPE->hStereoDft->q_dft < 0) + FOR( i = 0; i < 2; i++ ) { - hCPE->hStereoDft->q_dft = 0; + Scale_sig32( p_output_fx[i], L_FRAME48k, s ); } - ELSE IF (hCPE->hStereoDft->q_dft > Q11) + hCPE->hStereoDft->q_dft = Q11 + s; + IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) { - hCPE->hStereoDft->q_dft = Q11; - } - st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd = norm_l(i_max_val_psd) - Q9; - IF (EQ_16(hCPE->hStereoDft->first_frame, 1)) - { - //hCPE->q_prev_synth_fx = hCPE->hStereoDft->q_dft; - hCPE->hStereoDft->q_smoothed_nrg = Q6;//hCPE->hStereoDft->q_dft; + hCPE->hStereoDft->q_smoothed_nrg = Q6; // hCPE->hStereoDft->q_dft; hCPE->hStereoDft->q_ap_delay_mem_fx = hCPE->hStereoDft->q_dft; } - // st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact_fx = (Word16)floatToFixed(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact, 15); - floatToFixed_arrL(&st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0], st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd, sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx) / sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0])); - //floatToFixed_arrL(&hCPE->prev_hb_synth[0][0], &hCPE->prev_hb_synth_fx[0][0], hCPE->hStereoDft->q_dft, sizeof(hCPE->prev_hb_synth_fx) / sizeof(hCPE->prev_hb_synth_fx[0][0])); - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - if ( l_hb_nrg_subr < hCPE->hStereoDft->hb_nrg_subr[ii] ) - { - l_hb_nrg_subr = hCPE->hStereoDft->hb_nrg_subr[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg_subr = 0; - if ( l_hb_nrg_subr > (float) MAX_32 ) - { - int quotient = (int) ceil( l_hb_nrg_subr / (float) MAX_32 ); - hCPE->hStereoDft->q_hb_nrg_subr = Q31 - norm_l( quotient ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_subr_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_subr_fx[0] ); ii++ ) - { - hCPE->hStereoDft->hb_nrg_subr_fx[ii] = (Word32) ( hCPE->hStereoDft->hb_nrg_subr[ii] / ( (float) ( 1 << hCPE->hStereoDft->q_hb_nrg_subr ) ) ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) - { - if ( l_hb_nrg < hCPE->hStereoDft->hb_nrg[ii] ) - { - l_hb_nrg = hCPE->hStereoDft->hb_nrg[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg = 0; - if ( l_hb_nrg > (float) MAX_32 ) - { - int quotient = (int) ceil( l_hb_nrg / (float) MAX_32 ); - hCPE->hStereoDft->q_hb_nrg = Q31 - norm_l( quotient ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) - { - hCPE->hStereoDft->hb_nrg_fx[ii] = (Word32)(hCPE->hStereoDft->hb_nrg[ii] * ((float)(1 << hCPE->hStereoDft->q_hb_nrg))); - } - - //floatToFixed_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0] ) ); - IF( hCPE->hStereoCng != NULL ) - { - floatToFixed_arr( &hCPE->hStereoCng->cm[0], &hCPE->hStereoCng->cm_fx[0], Q15, sizeof( hCPE->hStereoCng->cm_fx ) / sizeof( hCPE->hStereoCng->cm_fx[0] ) ); - } - //floatToFixed_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0] ) ); - for ( int ii = 0; ii < 2; ii++ ) - { - floatToFixed_arrL( &p_output[ii][0], &p_output_fx[ii][0], hCPE->hStereoDft->q_dft, ( 48000 / FRAMES_PER_SEC ) ); - } q = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hCPE->input_mem_BPF[0][0], &hCPE->input_mem_BPF_fx[0][0], q, STEREO_DFT32MS_OVL_16k); - floatToFixed_arrL(&hCPE->input_mem[0][0], &hCPE->input_mem_fx[0][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - floatToFixed_arrL(&hCPE->input_mem_LB[0][0], &hCPE->input_mem_LB_fx[0][0], q, STEREO_DFT32MS_OVL_16k); - floatToFixed_arrL(&hCPE->input_mem[1][0], &hCPE->input_mem_fx[1][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - floatToFixed_arrL(&hCPE->input_mem_LB[1][0], &hCPE->input_mem_LB_fx[1][0], q, STEREO_DFT32MS_OVL_16k); - if (hSCE != NULL) - { - //floatToFixed_arrL(&hSCE->prev_hb_synth[0], &hSCE->prev_hb_synth_fx[0], hCPE->hStereoDft->q_dft, sizeof(hSCE->prev_hb_synth_fx) / sizeof(hSCE->prev_hb_synth_fx[0])); - //hSCE->q_prev_hb_synth_fx = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hSCE->save_hb_synth[0], &hSCE->save_hb_synth_fx[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - hSCE->q_save_hb_synth_fx = q; - floatToFixed_arrL(&hSCE->save_synth[0], &hSCE->save_synth_fx[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - hSCE->q_save_synth_fx = q; + scale_sig32(hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub(hCPE->hStereoDft->q_dft, Q11)); + FOR( i = 0; i < CPE_CHANNELS; ++i ) + { + scale_sig32( hCPE->input_mem_LB_fx[i], STEREO_DFT32MS_OVL_16k, sub( hCPE->hStereoDft->q_dft, Q11 ) ); + scale_sig32( hCPE->input_mem_fx[i], NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); } IF( hCPE->hCoreCoder[0] != NULL ) { - floatToFixed_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], q, L_FRAME32k); + floatToFixed_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], q, L_FRAME32k ); hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; - floatToFixed_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_out[0], &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], q, L_FRAME48k); - IF( (hCPE->hCoreCoder[0] != NULL) && (hCPE->hCoreCoder[0]->p_bpf_noise_buf_32 != NULL) ) - floatToFixed_arrL(&hCPE->hCoreCoder[0]->p_bpf_noise_buf_float[0], &hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[0], q, L_FRAME16k); + floatToFixed_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], q, L_FRAME48k ); } IF( hCPE->hStereoDft != NULL ) { - floatToFixed_arrL(&hCPE->hStereoDft->td_gain[0], &hCPE->hStereoDft->td_gain_fx[0], Q31, sizeof( hCPE->hStereoDft->td_gain_fx ) / sizeof( hCPE->hStereoDft->td_gain_fx[0] ) ); - floatToFixed_arrL(&hCPE->hStereoDft->ap_delay_mem[0], &hCPE->hStereoDft->ap_delay_mem_fx[0], q, NS2SA( 16000, DELAY_BWE_TOTAL_NS )); - floatToFixed_arrL(&hCPE->hStereoDft->buff_LBTCX_mem[0], &hCPE->hStereoDft->buff_LBTCX_mem_fx[0], q, NS2SA( 16000, STEREO_DFT32MS_OVL_NS )); - hCPE->hStereoDft->q_smooth_buf_fx = Q7; - floatToFixed_arrL(&hCPE->hStereoDft->smooth_buf[0][0], &hCPE->hStereoDft->smooth_buf_fx[0][0], hCPE->hStereoDft->q_smooth_buf_fx, sizeof(hCPE->hStereoDft->smooth_buf_fx) / sizeof(hCPE->hStereoDft->smooth_buf_fx[0][0])); - floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], Q31, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); + scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); + scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA( 16000, DELAY_BWE_TOTAL_NS ), sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); + hCPE->hStereoDft->q_ap_fade_mem_fx = hCPE->hStereoDft->q_dft; } - for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) + + IF( hSCE != NULL ) { - for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) - { - floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], - &st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], - Q31, - st_ivas->hSpar->hMdDec->mix_mat_dim_2); - } + Scale_sig32( &hSCE->save_hb_synth_fx[0], (Word16) ( hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC ), hCPE->hStereoDft->q_dft - hSCE->q_save_hb_synth_fx ); + hSCE->q_save_hb_synth_fx = hCPE->hStereoDft->q_dft; + Scale_sig32( &hSCE->save_synth_fx[0], (Word16) ( hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC ), hCPE->hStereoDft->q_dft - hSCE->q_save_synth_fx ); + hSCE->q_save_synth_fx = hCPE->hStereoDft->q_dft; } - //hCPE->lt_es_em_fx = floatToFixed(hCPE->lt_es_em, Q15); - for (int ii = 0; ii < CPE_CHANNELS; ii++) + st_ivas->hSpar->hMdDec->Q_mixer_mat = 30; + FOR( int ii = 0; ii < CPE_CHANNELS; ii++ ) { + scale_sig32( hCPE->output_mem_fx[ii], NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); hCPE->q_output_mem_fx[ii] = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hCPE->output_mem[ii][0], &hCPE->output_mem_fx[ii][0], hCPE->hStereoDft->q_dft, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS )); } - floatToFixed_arrL(&hCPE->prev_synth[0][0], &hCPE->prev_synth_fx[0][0], hCPE->q_prev_synth_fx, sizeof(hCPE->prev_synth) / sizeof(hCPE->prev_synth[0][0])); + Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx ) / sizeof( hCPE->prev_synth_fx[0][0] ), hCPE->q_prev_synth_fx - 11 ); ivas_sba_dirac_stereo_dec_fx( st_ivas, p_output_fx, output_frame, st_ivas->ivas_format == MC_FORMAT ); - fixedToFloat_arrL(&hCPE->prev_synth_fx[0][0], &hCPE->prev_synth[0][0], hCPE->q_prev_synth_fx, sizeof(hCPE->prev_synth) / sizeof(hCPE->prev_synth[0][0])); - // st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact = fixedToFloat( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact_fx, 15 ); - fixedToFloat_arrL( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0], st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0] ) ); - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_subr_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_subr_fx[0] ); ii++ ) - { - hCPE->hStereoDft->hb_nrg_subr[ii] = ((float)hCPE->hStereoDft->hb_nrg_subr_fx[ii] / ((float)(1 << hCPE->hStereoDft->q_hb_nrg_subr))); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) - { - hCPE->hStereoDft->hb_nrg[ii] = ( (float) hCPE->hStereoDft->hb_nrg_fx[ii] * ( (float) ( 1 << hCPE->hStereoDft->q_hb_nrg ) ) ); - } - //fixedToFloat_arr(&st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm[0], Q15, sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx) / sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0])); - //fixedToFloat_arrL(&hCPE->prev_hb_synth_fx[0][0], &hCPE->prev_hb_synth[0][0], hCPE->hStereoDft->q_dft, sizeof(hCPE->prev_hb_synth_fx) / sizeof(hCPE->prev_hb_synth_fx[0][0])); - IF (hCPE->hStereoCng != NULL) - { - fixedToFloat_arr( &hCPE->hStereoCng->cm_fx[0], &hCPE->hStereoCng->cm[0], Q15, sizeof( hCPE->hStereoCng->cm_fx ) / sizeof( hCPE->hStereoCng->cm_fx[0] ) ); - } - //fixedToFloat_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0] ) ); - for ( int ii = 0; ii < 2; ii++ ) + FOR( i = 0; i < 2; i++ ) { - fixedToFloat_arrL( &p_output_fx[ii][0], &p_output[ii][0], hCPE->hStereoDft->q_dft, ( 48000 / FRAMES_PER_SEC ) ); + Scale_sig32( p_output_fx[i], L_FRAME48k, negate( s ) ); } - fixedToFloat_arrL(&hCPE->input_mem_BPF_fx[0][0], &hCPE->input_mem_BPF[0][0], q, STEREO_DFT32MS_OVL_16k); - fixedToFloat_arrL(&hCPE->input_mem_fx[0][0], &hCPE->input_mem[0][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&hCPE->input_mem_LB_fx[0][0], &hCPE->input_mem_LB[0][0], q, STEREO_DFT32MS_OVL_16k); - fixedToFloat_arrL(&hCPE->input_mem_fx[1][0], &hCPE->input_mem[1][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&hCPE->input_mem_LB_fx[1][0], &hCPE->input_mem_LB[1][0], q, STEREO_DFT32MS_OVL_16k); - if (hSCE != NULL) + Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx ) / sizeof( hCPE->prev_synth_fx[0][0] ), 11 - hCPE->q_prev_synth_fx ); + + scale_sig32(hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub(Q11, hCPE->hStereoDft->q_dft)); + FOR( i = 0; i < CPE_CHANNELS; ++i ) { - //fixedToFloat_arrL(&hSCE->prev_hb_synth_fx[0], &hSCE->prev_hb_synth[0], hCPE->hStereoDft->q_dft, sizeof(hSCE->prev_hb_synth_fx) / sizeof(hSCE->prev_hb_synth_fx[0])); - fixedToFloat_arrL(&hSCE->save_synth_fx[0], &hSCE->save_synth[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - fixedToFloat_arrL(&hSCE->save_hb_synth_fx[0], &hSCE->save_hb_synth[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); + scale_sig32( hCPE->input_mem_LB_fx[i], STEREO_DFT32MS_OVL_16k, sub( Q11, hCPE->hStereoDft->q_dft ) ); + scale_sig32( hCPE->input_mem_fx[i], NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); } + IF( hCPE->hCoreCoder[0] != NULL ) { - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], q, L_FRAME32k); - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], q, L_FRAME48k); - IF( hCPE->hCoreCoder[0]->p_bpf_noise_buf_32 != NULL ) - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[0], &hCPE->hCoreCoder[0]->p_bpf_noise_buf_float[0], q, L_FRAME16k); + fixedToFloat_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], q, L_FRAME32k ); + fixedToFloat_arrL( &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], q, L_FRAME48k ); } IF( hCPE->hStereoDft != NULL ) { - fixedToFloat_arrL(&hCPE->hStereoDft->td_gain_fx[0], &hCPE->hStereoDft->td_gain[0], Q31, sizeof( hCPE->hStereoDft->td_gain_fx ) / sizeof( hCPE->hStereoDft->td_gain_fx[0] ) ); - fixedToFloat_arrL(&hCPE->hStereoDft->ap_delay_mem_fx[0], &hCPE->hStereoDft->ap_delay_mem[0], q, NS2SA( 16000, DELAY_BWE_TOTAL_NS )); - fixedToFloat_arrL(&hCPE->hStereoDft->buff_LBTCX_mem_fx[0], &hCPE->hStereoDft->buff_LBTCX_mem[0], q, NS2SA( 16000, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], Q31, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); - fixedToFloat_arrL(&hCPE->hStereoDft->smooth_buf_fx[0][0], &hCPE->hStereoDft->smooth_buf[0][0], hCPE->hStereoDft->q_smooth_buf_fx, sizeof(hCPE->hStereoDft->smooth_buf_fx) / sizeof(hCPE->hStereoDft->smooth_buf_fx[0][0])); - } - for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) - { - for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) - { - fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], - &st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], - Q31, - st_ivas->hSpar->hMdDec->mix_mat_dim_2); - } + scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); + scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA( 16000, DELAY_BWE_TOTAL_NS ), sub( Q11, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); + hCPE->hStereoDft->q_ap_fade_mem_fx = Q11; } - for (int ii = 0; ii < CPE_CHANNELS; ii++) + st_ivas->hSpar->hMdDec->Q_mixer_mat = 30; + for ( int ii = 0; ii < CPE_CHANNELS; ii++ ) { - fixedToFloat_arrL(&hCPE->output_mem_fx[ii][0], &hCPE->output_mem[ii][0], hCPE->hStereoDft->q_dft, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS )); + scale_sig32( hCPE->output_mem_fx[ii], NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); + hCPE->q_output_mem_fx[ii] = Q11; } - //hCPE->lt_es_em = fixedToFloat(hCPE->lt_es_em_fx, Q15); } #endif } - else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + ELSE IF( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) { nchan_remapped = 1; /* Only one channel transported */ } /* HP filtering */ - for ( n = 0; n < nchan_remapped; n++ ) + FOR( n = 0; n < nchan_remapped; n++ ) { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < output_frame; i++ ) - { - p_output_fx[n][i] = (Word32) ( p_output[n][i] * ( 1 << 11 ) ); - } hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - for ( i = 0; i < output_frame; i++ ) - { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << 11 ); - } -#else - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); -#endif // IVAS_FLOAT_FIXED } - if ( st_ivas->ivas_format == SBA_FORMAT ) + IF( st_ivas->ivas_format == SBA_FORMAT ) { -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 Q_sba = 31; - FOR( i = 2; i <= 3; i++ ) - { - Q_sba = s_min( Q_sba, Q_factor_arrL( p_output[i], output_frame ) ); - } - FOR( i = 2; i <= 3; i++ ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q_sba, output_frame ); - } -#endif nchan_remapped = ivas_sba_remapTCs_fx( p_output_fx, st_ivas, output_frame ); - FOR( i = 2; i <= 3; i++ ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q_sba, output_frame ); - } -#else - nchan_remapped = ivas_sba_remapTCs( p_output, st_ivas, output_frame ); -#endif // IVAS_FLOAT_FIXED - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + IF( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ); #ifdef IVAS_FLOAT_FIXED @@ -1600,220 +734,86 @@ ivas_error ivas_jbm_dec_tc( num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; nchan_out = nchan_transport; - FOR(ch = 0; ch < nchan_transport; ch++) + FOR( ch = 0; ch < nchan_transport; ch++ ) { - FOR(i = 0; i < output_frame; i++) - { - p_output_fx[ch][i] = floatToFixed(p_output[ch][i], Q_p_output); - } + Scale_sig32( p_output_fx[ch], output_frame, sub( Q_p_output, Q11 ) ); } - Word16 b, i_ts, num_out_ch; + Word16 num_out_ch; num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; hSpar->hMdDec->Q_mixer_mat = 31; Word16 num_in_ch; num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) +#endif + ivas_sba_mix_matrix_determiner_fx( st_ivas->hSpar, p_output_fx, st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); +#if 1 /*Fixed to float changes */ + FOR( Word16 c = 0; c < nchan_transport; c++ ) { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_C_re_fx = s_min(Q_C_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_P_re_fx = s_min(Q_P_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min(Q_C_re_fx, Q_P_re_fx)); - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - } -#endif - ivas_sba_mix_matrix_determiner_fx(st_ivas->hSpar, p_output_fx, st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames); -#if 1 /*Fixed to float changes */ - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat(hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - } - FOR(Word16 c = 0; c < nchan_transport; c++) - { - FOR(j = 0; j < output_frame; j++) - { - p_output[c][j] = (float)p_output_fx[c][j]; - } + Scale_sig32( p_output_fx[c], output_frame, 11 ); } #endif -#else - ivas_sba_mix_matrix_determiner( st_ivas->hSpar, p_output, st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); #endif } else if ( st_ivas->renderer_type != RENDERER_DISABLE ) - { + { #ifdef IVAS_FLOAT_FIXED Word16 size = st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport; - if (st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport == 3) - size += 1; + if ( st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport == 3 ) + size += 1; - FOR( i = 0; i < size; i++) + FOR( i = 0; i < size; i++ ) { - FOR( j = 0; j < output_frame; j++) - { - p_output_fx[i][j] = (Word32)(p_output[i][j] * ONE_IN_Q14); - } + Scale_sig32( p_output_fx[i], output_frame, sub( Q14, Q11 ) ); } ivas_spar_dec_agc_pca_fx( st_ivas, p_output_fx, output_frame ); - - FOR( i = 0; i < size; i++) - { - FOR( j = 0; j < output_frame; j++) - { - p_output[i][j] = (float)p_output_fx[i][j] / ONE_IN_Q11; - } - //dbgwrite_txt_flt(p_output[i], output_frame, "p_output.txt"); - } -#else - ivas_spar_dec_agc_pca(st_ivas, p_output, output_frame); #endif } } - if ( st_ivas->ivas_format == MASA_FORMAT ) + IF( st_ivas->ivas_format == MASA_FORMAT ) { #ifdef IVAS_FLOAT_FIXED Word16 q_shift = 0; - FOR( i = 0; i < 2; i++ ) - { - FOR( j = 0; j < output_frame; j++ ) - { - p_output_fx[i][j] = float_to_fix( p_output[i][j], Q11 ); - } - } ivas_masa_prerender_fx( st_ivas, p_output_fx, &q_shift, output_frame, nchan_remapped ); FOR( i = 0; i < 2; i++ ) { - FOR( j = 0; j < output_frame; j++ ) - { - p_output[i][j] = fix_to_float( p_output_fx[i][j], Q11 + q_shift ); - } + Scale_sig32( p_output_fx[i], output_frame, negate( q_shift ) ); } -#else - ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); #endif } - else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + ELSE IF( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { /* loudness correction */ -#ifdef IVAS_FLOAT_FIXED - - Word16 Q_p_output = 31; - for ( i = 0; i < st_ivas->nchan_transport; i++ ) - { - Q_p_output = s_min( Q_p_output, Q_factor_arrL( p_output[i], output_frame ) ); - } - for ( i = 0; i < st_ivas->nchan_transport; i++ ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q_p_output, output_frame ); - } - - ivas_dirac_dec_binaural_sba_gain_fx(p_output_fx, nchan_remapped, output_frame); + ivas_dirac_dec_binaural_sba_gain_fx( p_output_fx, nchan_remapped, output_frame ); - Q_p_output = Q_p_output - 1; - for ( i = 0; i < st_ivas->nchan_transport; i++) + FOR( i = 0; i < st_ivas->nchan_transport; i++ ) { - fixedToFloat_arrL(p_output_fx[i], p_output[i], Q_p_output, output_frame); + Scale_sig32( p_output_fx[i], output_frame, 1 ); } -#else - ivas_dirac_dec_binaural_sba_gain( p_output, nchan_remapped, output_frame ); -#endif - } } - else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + ELSE IF( st_ivas->ivas_format == MASA_ISM_FORMAT ) { - int16_t nchan_ism, nchan_transport_ism; - int16_t dirac_bs_md_write_idx; + Word16 nchan_ism, nchan_transport_ism; + Word16 dirac_bs_md_write_idx; - set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + set16_fx( nb_bits_metadata, 0, MAX_SCE + 1 ); /* Set the number of objects for the parametric rendering */ dirac_bs_md_write_idx = 0; - if ( st_ivas->hSpatParamRendCom != NULL ) + move16(); + IF( st_ivas->hSpatParamRendCom != NULL ) { st_ivas->hSpatParamRendCom->numIsmDirections = 0; - if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + move16(); + IF( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) { st_ivas->hSpatParamRendCom->numIsmDirections = st_ivas->nchan_ism; + move16(); } dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */ + move16(); } @@ -1822,11 +822,11 @@ ivas_error ivas_jbm_dec_tc( Word16 q_output = 11; // NOTE: the following is done to calculate the number of hIsmMetaData indices Word16 tmp_nchan_ism; - if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) - tmp_nchan_ism = 1; - else if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + IF( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + tmp_nchan_ism = 1; + ELSE IF( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) tmp_nchan_ism = 0; - else + ELSE tmp_nchan_ism = st_ivas->nchan_ism; ///////////////////////////////////// Float to fix conversion starts here. /////////////////////////////////// IF( st_ivas->hMasa->hMasaLfeSynth != NULL ) @@ -1836,43 +836,10 @@ ivas_error ivas_jbm_dec_tc( st_ivas->hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio_fx[j] = float_to_fix16( st_ivas->hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio[j], Q14 ); } } - IF( st_ivas->hSpatParamRendCom != NULL ) - { - FOR( i = 0; i < st_ivas->hSpatParamRendCom->dirac_md_buffer_length; i++ ) - { - FOR( j = 0; j < st_ivas->hSpatParamRendCom->num_freq_bands; j++ ) - { - st_ivas->hSpatParamRendCom->diffuseness_vector_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->diffuseness_vector[i][j], 30 ); - st_ivas->hSpatParamRendCom->energy_ratio1_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->energy_ratio1[i][j], 30 ); - IF( EQ_16( st_ivas->hQMetaData->no_directions, 2 ) ) - { - st_ivas->hSpatParamRendCom->energy_ratio2_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->energy_ratio2[i][j], 30 ); - st_ivas->hSpatParamRendCom->spreadCoherence2_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->spreadCoherence2[i][j], 15 ); - } - st_ivas->hSpatParamRendCom->surroundingCoherence_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->surroundingCoherence[i][j], 15 ); - st_ivas->hSpatParamRendCom->spreadCoherence_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->spreadCoherence[i][j], 15 ); - } - } - } - FOR( Word16 ind = 0; ind < tmp_nchan_ism; ind++ ) - { - st_ivas->hIsmMetaData[ind]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_true_azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_true_azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->last_true_elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->last_true_elevation * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->radius_fx = (Word16) ( st_ivas->hIsmMetaData[ind]->radius * ( 1 << 9 ) ); - st_ivas->hIsmMetaData[ind]->yaw_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->yaw * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind]->pitch_fx = (Word32) ( st_ivas->hIsmMetaData[ind]->pitch * ( 1 << 22 ) ); - } + FOR( n = 0; n < tmp_nchan_ism; n++ ) { set32_fx( p_output_fx[n], 0, L_FRAME48k ); - //FOR( int k = 0; k < 45; k++ ) - //{ - // st_ivas->hSCE[n]->prev_hb_synth_fx[k] = (Word32) ( st_ivas->hSCE[n]->prev_hb_synth[k] * ONE_IN_Q11 ); - //} } ///////////////////////////////////// Float to fix conversion ends here. /////////////////////////////////// @@ -1958,7 +925,7 @@ ivas_error ivas_jbm_dec_tc( { st_ivas->hSpatParamRendCom->energy_ratio1[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->energy_ratio1_fx[i][j], 30 ); st_ivas->hSpatParamRendCom->diffuseness_vector[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->diffuseness_vector_fx[i][j], 30 ); - IF( EQ_16( st_ivas->hQMetaData->no_directions, 2 ) ) + IF( EQ_32( st_ivas->hQMetaData->no_directions, 2 ) ) { st_ivas->hSpatParamRendCom->energy_ratio2[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->energy_ratio2_fx[i][j], 30 ); st_ivas->hSpatParamRendCom->spreadCoherence2[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->spreadCoherence2_fx[i][j], 15 ); @@ -1968,18 +935,6 @@ ivas_error ivas_jbm_dec_tc( } } } - FOR( Word16 d = 0; d < max( st_ivas->hMasa->config.numberOfDirections, st_ivas->hQMetaData->no_directions ); d++ ) - { - FOR( j = 0; j < max( st_ivas->hMasa->config.numCodingBands, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); j++ ) - { - FOR( Word16 k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) - { - st_ivas->hQMetaData->q_direction[d].band_data[j].elevation[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].elevation_fx[k], Q22 ); - st_ivas->hQMetaData->q_direction[d].band_data[j].azimuth[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].azimuth_fx[k], Q22 ); - st_ivas->hQMetaData->q_direction[d].band_data[j].energy_ratio[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].energy_ratio_fx[k], Q30 ); - } - } - } st_ivas->hMasa->data.dir_decode_quality = fix16_to_float( st_ivas->hMasa->data.dir_decode_quality_fx, Q14 ); IF( st_ivas->hMasa->hMasaLfeSynth != NULL ) { @@ -2001,111 +956,39 @@ ivas_error ivas_jbm_dec_tc( } } } - FOR( Word16 ind = 0; ind < tmp_nchan_ism; ind++ ) - { - st_ivas->hIsmMetaData[ind]->azimuth = (float) ( st_ivas->hIsmMetaData[ind]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->elevation = (float) ( st_ivas->hIsmMetaData[ind]->elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_azimuth = (float) ( st_ivas->hIsmMetaData[ind]->last_azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_elevation = (float) ( st_ivas->hIsmMetaData[ind]->last_elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_true_azimuth = (float) ( st_ivas->hIsmMetaData[ind]->last_true_azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->last_true_elevation = (float) ( st_ivas->hIsmMetaData[ind]->last_true_elevation_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->radius = (float) ( st_ivas->hIsmMetaData[ind]->radius_fx ) / (float) ( 1 << 9 ); - st_ivas->hIsmMetaData[ind]->yaw = (float) ( st_ivas->hIsmMetaData[ind]->yaw_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind]->pitch = (float) ( st_ivas->hIsmMetaData[ind]->pitch_fx ) / (float) ( 1 << 22 ); - } - FOR( n = 0; n < nchan_transport_ism; n++ ) - { - FOR( int k = 0; k < 96; k++ ) - { - //st_ivas->hSCE[n]->hCoreCoder[0]->prev_synth_buffer[k] = (float) st_ivas->hSCE[n]->hCoreCoder[0]->prev_synth_buffer32_fx[k] / ONE_IN_Q11; - //IF( k < 45 ) - // st_ivas->hSCE[n]->prev_hb_synth[k] = (float) st_ivas->hSCE[n]->prev_hb_synth_fx[k] / ONE_IN_Q11; - } - } - FOR( n = 0; n < s_max( getNumChanSynthesis( st_ivas ), nchan_transport_ism + st_ivas->nchan_transport ); n++ ) + IF( NE_16( output_q, Q11 ) ) { - FOR( i = 0; i < output_frame; i++ ) + FOR( n = 0; n < s_max( getNumChanSynthesis( st_ivas ), nchan_transport_ism + st_ivas->nchan_transport ); n++ ) { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << output_q ); + Scale_sig32( p_output_fx[n], output_frame, sub( Q11, output_q ) ); } } /////////////////////////////////// Fixed to float conversion ends here. /////////////////////////////////// -#else - /* MASA metadata decoding */ - if ( ( error = ivas_masa_decode( st_ivas, st_ivas->hCPE[0]->hCoreCoder[0], &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* Configuration of combined-format bit-budget distribution */ - ivas_set_surplus_brate_dec( st_ivas, &ism_total_brate ); - - st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream = &( st_ivas->bit_stream[( ism_total_brate / FRAMES_PER_SEC )] ); - - if ( ( error = ivas_omasa_ism_metadata_dec( st_ivas, ism_total_brate, &nchan_ism, &nchan_transport_ism, dirac_bs_md_write_idx, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* decode ISM channels */ - for ( n = 0; n < nchan_transport_ism; n++ ) - { - if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[st_ivas->nchan_transport + n], output_frame, nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - /* decode MASA channels */ - if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( st_ivas->hCPE[0]->nchan_out == 1 ) - { - mvr2r( p_output[0], p_output[1], output_frame ); /* Copy mono signal to stereo output channels */ - } - - /* HP filtering */ - for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) - { - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); - } - - if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) - { - ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); - } - else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) - { - /* sanity check in case of bitrate switching */ - if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); - } - ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); - - ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); - } #endif } - else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + ELSE IF( st_ivas->ivas_format == SBA_ISM_FORMAT ) { int16_t nchan_ism, sba_ch_idx; set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); nchan_ism = st_ivas->nchan_ism; - if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + IF( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { /* set ISM parameters and decode ISM metadata in OSBA format */ +#ifdef IVAS_FLOAT_FIXED + IF((error = ivas_osba_ism_metadata_dec_fx(st_ivas, ivas_total_brate, &nchan_ism, &nb_bits_metadata[1])) != IVAS_ERR_OK) + { + return error; + } +#else if ( ( error = ivas_osba_ism_metadata_dec( st_ivas, ivas_total_brate, &nchan_ism, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) { return error; } +#endif sba_ch_idx = st_ivas->nchan_ism; } - else + ELSE { nb_bits_metadata[1] += NO_BITS_MASA_ISM_NO_OBJ; sba_ch_idx = 0; @@ -2117,45 +1000,24 @@ ivas_error ivas_jbm_dec_tc( { return error; } -#else - if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) - { - return error; - } #endif - if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + IF( EQ_16( st_ivas->nchan_transport, CPE_CHANNELS ) && GE_16( st_ivas->nCPE, 1 ) ) { st_ivas->hCPE[0]->element_brate = ivas_total_brate; } /* core-decoding of transport channels */ -#ifdef IVAS_FLOAT_FIXED Word16 q_output = 11; IF( EQ_16( st_ivas->nSCE, 1 ) ) { set32_fx( p_output_fx[0], 0, L_FRAME48k ); - //for ( int k = 0; k < 45; k++ ) - //{ - // st_ivas->hSCE[0]->prev_hb_synth_fx[k] = (Word32) ( st_ivas->hSCE[0]->prev_hb_synth[k] * ( 1 << q_output ) ); - //} IF( ( error = ivas_sce_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) { return error; } - - for ( int k = 0; k < output_frame; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - } - for ( int k = 0; k < 96; k++ ) - { - //st_ivas->hSCE[0]->hCoreCoder[0]->prev_synth_buffer[k] = (float) st_ivas->hSCE[0]->hCoreCoder[0]->prev_synth_buffer32_fx[k] / ( 1 << q_output ); - //if ( k < 45 ) - // st_ivas->hSCE[0]->prev_hb_synth[k] = (float) st_ivas->hSCE[0]->prev_hb_synth_fx[k] / ( 1 << q_output ); - } } ELSE IF( EQ_16( st_ivas->nCPE, 1 ) ) { @@ -2165,43 +1027,22 @@ ivas_error ivas_jbm_dec_tc( return error; } - for ( int k = 0; k < output_frame; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - p_output[1][k] = (float) p_output_fx[1][k] / ( 1 << q_output ); - } - } -#else - if ( st_ivas->nSCE == 1 ) - { - if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( st_ivas->nCPE == 1 ) - { - if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + IF( NE_16( q_output, Q11 ) ) { - return error; + Scale_sig32( p_output_fx[0], output_frame, sub( Q11, q_output ) ); + Scale_sig32( p_output_fx[1], output_frame, sub( Q11, q_output ) ); } } -#endif // IVAS_FLOAT_FIXED - else if ( st_ivas->nCPE > 1 ) + ELSE IF( GT_16( st_ivas->nCPE, 1 ) ) { #ifdef IVAS_FLOAT_FIXED #if 1 // Float to fix Word16 ch, nCPE, cpe_id; - Word16 k, l; - + Word16 l; + nCPE = st_ivas->nCPE; move16(); hMCT = st_ivas->hMCT; - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, L_FRAME48k ); - } FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { hCPE = st_ivas->hCPE[cpe_id]; @@ -2211,53 +1052,14 @@ ivas_error ivas_jbm_dec_tc( FOR( n = 0; n < CPE_CHANNELS; n++ ) { st = hCPE->hCoreCoder[n]; - IF( st->hTonalMDCTConc ) - { - - FOR( i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) - { - st->hTonalMDCTConc->scaleFactorsBackground_fx[i] = float_to_fix( st->hTonalMDCTConc->scaleFactorsBackground_flt[i], 15 ); - } - //st->hTonalMDCTConc->scf_fadeout = float_to_fix16( st->hTonalMDCTConc->scf_fadeout_flt, 15 ); - if ( hCPE->hCoreCoder[n]->bfi && st->tonal_mdct_plc_active ) - { - FOR( i = 0; i < FDNS_NPTS; i++ ) - { - f2me_16( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_float[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); - } - FOR( i = 0; i < 30; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phaseDiff_float[i]; - if ( pd >= PI2 ) - pd = fmodf( pd, PI2 ) - PI2; - st->hTonalMDCTConc->pTCI->phaseDiff[i] = (Word16) floatToFixed( pd, Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i]; - pd = fmodf( pd, PI2 ); - st->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i] = (Word16) ( pd * ( 1u << Q13 ) ); - } - // st->hTonalMDCTConc->nFramesLost = float_to_fix16( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - //f2me( st->hTonalMDCTConc->last_block_nrg_flt, &st->hTonalMDCTConc->last_block_nrg, &st->hTonalMDCTConc->last_block_nrg_exp ); - } - // 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 ); IF( sts[n]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { - // sts[n]->Mode2_lp_gainp = floatToFixed( sts[n]->lp_gainp, Q16 ); - // u8bit to 16bit FOR( l = 0; l < IGF_START_MX; l++ ) { sts[n]->hIGFDec->infoTCXNoise_evs[l] = (Word16) sts[n]->hIGFDec->infoTCXNoise[l]; } } - - - IF( st->hTcxDec ) - f2me_16( st->hTcxDec->CngLevelBackgroundTrace_bfi, &st->hTcxDec->conCngLevelBackgroundTrace, &st->hTcxDec->conCngLevelBackgroundTrace_e ); if ( st->hTcxDec && st->hTcxDec->conLastFrameLevel_e < 0 ) { st->hTcxDec->conLastFrameLevel_e = 0; @@ -2270,24 +1072,6 @@ ivas_error ivas_jbm_dec_tc( st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; IF( st->hTcxDec ) st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - IF( st->hTcxDec ) - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB_fx[p] = (Word16) ( st->hTcxDec->old_excFB[p] * ( 1u << st->Q_exc ) ); - //} - IF( st->hFdCngDec && st->hFdCngDec->hFdCngCom ) - floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, 15, 17 ); - // st->stab_fac_fx = float_to_fix16(st->stab_fac, Q15); - - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32, q_output, L_FRAME48k ); - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32, q_output, TCXLTP_MAX_DELAY ); - //floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, Q11, 111 ); - } - - - /*cldfb struct*/ /*------------------fix-to-fix-start---------------------*/ /*core_switching_post_dec*/ @@ -2296,198 +1080,46 @@ ivas_error ivas_jbm_dec_tc( hCPE->hCoreCoder[n]->hHQ_core->Q_old_postdec = 0; hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda = 0; } + } + } - /*-------------------cldfb-start-------------------------*/ - floatToFixed_arrL( hCPE->hCoreCoder[n]->bpf_noise_buf_float, hCPE->hCoreCoder[n]->bpf_noise_buf_32, 11, L_FRAME_16k ); - if ( hCPE->hCoreCoder[n]->cldfbAna != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbAna->cldfb_state, hCPE->hCoreCoder[n]->cldfbAna->cldfb_state_fx, 10, hCPE->hCoreCoder[n]->cldfbAna->cldfb_size ); - } - if ( hCPE->hCoreCoder[n]->cldfbSyn != NULL ) +#endif // Float to fix + if ( ( error = ivas_mct_dec_fx( st_ivas, p_output_fx, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1 // Fix to float + FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + hCPE = st_ivas->hCPE[cpe_id]; + sts = hCPE->hCoreCoder; + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = hCPE->hCoreCoder[ch]; + IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state, hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state_fx, 4, hCPE->hCoreCoder[n]->cldfbSyn->p_filter_length ); + // 16bit to u8bit + FOR( l = 0; l < IGF_START_MX; l++ ) + { + sts[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) sts[ch]->hIGFDec->infoTCXNoise_evs[l]; + } } - if ( hCPE->hCoreCoder[n]->cldfbBPF != NULL ) + } + + FOR( n = 0; n < 2; n++ ) + { + st = hCPE->hCoreCoder[n]; + sts = hCPE->hCoreCoder; + + for ( int p = 0; p < 640; p++ ) { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state_fx, 11, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_size ); + st->hHQ_core->old_outLB[p] = (float) st->hHQ_core->old_out_LB_fx[p] / ( 1u << st->Q_syn ); } + /*-------------------cldfb-start-------------------------*/ - /*-------------------cldfb-end---------------------------*/ - - //floatToFixed_arr( sts[n]->prev_synth_buffer, hCPE->hCoreCoder[n]->prev_synth_buffer_fx, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); - } - - IF( hCPE->output_mem[0] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[0], hCPE->output_mem_fx[0], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - IF( hCPE->output_mem[1] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[1], hCPE->output_mem_fx[1], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q_output ) ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q_output ) ); - } - } - } - - IF( hCPE->input_mem_LB[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB_fx[n][ind] = (Word32) ( hCPE->input_mem_LB[n][ind] * ( 1 << q_output ) ); - } - } - - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth_fx[n][k] = (Word32) ( hCPE->prev_hb_synth[n][k] * ( 1 << q_output ) ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth_fx[n][k] = (Word32) ( hCPE->prev_synth[n][k] * ( 1 << q_output ) ); - } - } - } - - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->icld_q ) - floatToFixed_arr16( st_ivas->hParamMC->icld_q, st_ivas->hParamMC->icld_q_fx, 8, st_ivas->hParamMC->hMetadataPMC->num_parameter_bands * st_ivas->hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->ls_conv_dmx_matrix ) - floatToFixed_arr32( st_ivas->hParamMC->ls_conv_dmx_matrix, st_ivas->hParamMC->ls_conv_dmx_matrix_fx, 15, st_ivas->hDecoderConfig->nchan_out * ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) ); - IF( st_ivas->hLsSetUpConversion ) - FOR( Word16 chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) - { - FOR( Word16 chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx][chOutIdx] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx], 30 ); /*Q30*/ - } - } - - -#endif // Float to fix - if ( ( error = ivas_mct_dec_fx( st_ivas, p_output_fx, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) - { - return error; - } -#if 1 // Fix to float - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) - { - hCPE = st_ivas->hCPE[cpe_id]; - sts = hCPE->hCoreCoder; - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = hCPE->hCoreCoder[ch]; - st->hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat(st->hTcxLtpDec->tcxltp_gain, 15); - //st->hTcxDec->tcxltp_last_gain_unmodified_float = st->hTcxLtpDec->tcxltp_gain_float; - IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) - { - // 16bit to u8bit - FOR( l = 0; l < IGF_START_MX; l++ ) - { - sts[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) sts[ch]->hIGFDec->infoTCXNoise_evs[l]; - } - - //IF( !sts[0]->bfi || ( sts[0]->bfi && sts[ch]->core != ACELP_CORE ) ) - //{ - // me2f_buf( sts[ch]->hIGFDec->virtualSpec, sts[ch]->hIGFDec->virtualSpec_e, sts[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - //} - } - IF( st->hTonalMDCTConc != NULL ) - { - //st->hTonalMDCTConc->scf_fadeout_flt = fixedToFloat( st->hTonalMDCTConc->scf_fadeout, 15 ); - //st->hTonalMDCTConc->last_block_nrg_flt = me2f( st->hTonalMDCTConc->last_block_nrg, st->hTonalMDCTConc->last_block_nrg_exp ); - if ( hCPE->hCoreCoder[ch]->bfi && st->tonal_mdct_plc_active ) - { - //st->hTonalMDCTConc->nFramesLost_float = fix16_to_float( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - } - - if ( sts[ch]->last_core != -1 && sts[ch]->nbLostCmpt == 1 ) - { - if ( !( sts[ch]->rf_flag && sts[ch]->use_partial_copy && ( sts[ch]->rf_frame_type == RF_TCXTD1 || sts[ch]->rf_frame_type == RF_TCXTD2 ) ) ) - { - IF( sts[ch]->hTonalMDCTConc != NULL && sts[ch]->last_core == TCX_20_CORE && sts[ch]->second_last_core == TCX_20_CORE && ( ( sts[ch]->old_fpitch <= L_shl( sts[ch]->L_frame, 15 ) ) || ( sts[ch]->hTcxDec->tcxltp_last_gain_unmodified <= 13107 /*0.4f*/ ) ) - /* it is fine to call the detection even if no ltp information - is available, meaning that st->old_fpitch == - st->tcxltp_second_last_pitch == st->L_frame */ - && ( sts[ch]->old_fpitch == sts[ch]->hTcxDec->tcxltp_second_last_pitch ) && !sts[ch]->last_tns_active && !sts[ch]->second_last_tns_active ) - { - - if ( sts[ch]->hTonalMDCTConc->pTCI->numIndexes < MAX_NUMBER_OF_IDX ) - { - FOR( i = 0; i < sts[ch]->hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phaseDiff_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phaseDiff[i], Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i], Q13 ); - } - } - } - } - } - } - - FOR( n = 0; n < 2; n++ ) - { - st = hCPE->hCoreCoder[n]; - sts = hCPE->hCoreCoder; - IF( st->hTcxDec ) - st->hTcxDec->CngLevelBackgroundTrace_bfi = me2f_16( st->hTcxDec->conCngLevelBackgroundTrace, st->hTcxDec->conCngLevelBackgroundTrace_e ); - IF( st->hTonalMDCTConc && st->hTonalMDCTConc->lastPcmOut_float ) - fixedToFloat_arr( st->hTonalMDCTConc->lastPcmOut, st->hTonalMDCTConc->lastPcmOut_float, 0, st->hTonalMDCTConc->nSamples ); - IF( sts[0]->bfi == 0 && !st->hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) - fixedToFloat_arr( st->hTonalMDCTConc->secondLastPcmOut, st->hTonalMDCTConc->secondLastPcmOut_float, 0, st->hTonalMDCTConc->nSamples / 2 ); - fixedToFloat_arr( st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synthFB, st->Q_syn, st->hTcxDec->old_synth_lenFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); - fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, st->Q_syn, 1280 ); - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB[p] = (float) ( st->hTcxDec->old_excFB_fx[p] ) / ( 1u << st->Q_exc ); - //} - for ( int p = 0; p < st->L_frame / 2; p++ ) - { - st->hTcxDec->old_syn_Overl_float[p] = (float) st->hTcxDec->old_syn_Overl[p] * 2 * ( 1u << st->Q_syn ); - st->hTcxDec->syn_Overl_TDACFB_float[p] = (float) st->hTcxDec->syn_Overl_TDACFB[p] * 2 * (float) pow( 2, st->Q_syn ); - st->hTcxDec->syn_Overl_TDAC_float[p] = (float) st->hTcxDec->syn_Overl_TDAC[p] * 2 * (float) pow( 2, st->Q_syn ); - } - for ( int p = 0; p < 640; p++ ) - { - st->hHQ_core->old_outLB[p] = (float) st->hHQ_core->old_out_LB_fx[p] / ( 1u << st->Q_syn ); - } - - if ( !st->tcxonly ) - { - fixedToFloat_arr( st->p_bpf_noise_buf, st->p_bpf_noise_buf_float, 0, L_FRAME_16k ); - } - - fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->Q_syn, L_FRAME_MAX / 2 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->Q_syn, L_FRAME32k / 2 ); - st->hTcxDec->tcxltp_last_gain_unmodified_float = fix16_to_float( st->hTcxDec->tcxltp_last_gain_unmodified, Q15 ); - //st->hTcxDec->conceal_eof_gain_float = fix16_to_float( st->hTcxDec->conceal_eof_gain, Q14 ); - - /*-------------------cldfb-start-------------------------*/ - - /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ + /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ if ( sts[n]->cldfbAna != NULL ) { @@ -2523,79 +1155,6 @@ ivas_error ivas_jbm_dec_tc( sts[n]->hBWE_FD->prev_L_swb_norm = sts[n]->hBWE_FD->prev_L_swb_norm; sts[n]->hBWE_FD->prev_flag = sts[n]->hBWE_FD->prev_flag; } - - for ( int p = 0; p < L_FRAME48k; p++ ) - { - - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); - } - } - } - if ( hCPE->hCoreCoder[n]->hTcxDec ) - { - for ( k = 0; k < 111; k++ ) - { - //hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] = (float) hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] / ( 1u << q_output ); - } - } - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - - if ( ( hCPE->hCoreCoder[n]->codec_mode == MODE1 && hCPE->hCoreCoder[n]->hTcxDec != NULL ) && ( ( hCPE->hCoreCoder[n]->core == ACELP_CORE && !( hCPE->hCoreCoder[n]->bfi == 1 && hCPE->hCoreCoder[n]->con_tcx == 1 ) ) || hCPE->hCoreCoder[n]->core == HQ_CORE ) ) - { - fixedToFloat_arr( hCPE->hCoreCoder[n]->hTcxDec->synth_history_fx, hCPE->hCoreCoder[n]->hTcxDec->synth_history, 0, output_frame ); - } - } - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); - } - } - } - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->output_mem[n] != NULL ) - { - FOR( k = 0; k < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->output_mem[n][k] = (float) hCPE->output_mem_fx[n][k] / ( 1u << 11 ); - } - } - IF( hCPE->hCoreCoder[n] != NULL ) - { - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); k++ ) - { - //hCPE->hCoreCoder[n]->prev_synth_buffer[k] = (float) hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[k] / ( 1 << q_output ); - } - } - IF( hCPE->input_mem[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB[n][ind] = ( (float) hCPE->input_mem_LB_fx[n][ind] / ( 1 << q_output ) ); - } - } - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth[n][k] = (float) hCPE->prev_hb_synth_fx[n][k] / ( 1 << q_output ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth[n][k] = (float) hCPE->prev_synth_fx[n][k] / ( 1 << q_output ); - } } } @@ -2610,7 +1169,6 @@ ivas_error ivas_jbm_dec_tc( { IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->igf ) { - //me2f_buf( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_e, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); FOR( l = 0; l < IGF_START_MX; l++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise_evs[l]; @@ -2621,322 +1179,149 @@ ivas_error ivas_jbm_dec_tc( } } - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) - me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) + //me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) + //me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, L_FRAME48k ); - } #endif // Fix to float -#else - if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) - { - return error; - } #endif } if ( st_ivas->sba_dirac_stereo_flag ) { -#ifndef IVAS_FLOAT_FIXED - ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, &p_output[sba_ch_idx], &p_output[sba_ch_idx], st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); -#ifdef DUMPS_ENABLED - dbgwrite_txt( &p_output[sba_ch_idx], output_frame, "flt_ivas_agc_dec_process_output.txt", NULL ); -#endif // DUMPS_ENABLED -#else FOR( i = 0; i < st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport; i++ ) { - FOR( j = 0; j < output_frame; j++ ) - { - p_output_fx[i + sba_ch_idx][j] = (Word32) ( p_output[i + sba_ch_idx][j] * ONE_IN_Q14 ); - } + Scale_sig32( p_output_fx[i + sba_ch_idx], output_frame, sub( Q14, Q11 ) ); } - +#ifdef IVAS_FLOAT_FIXED +#if 1 /*Float to Fixed changes */ + SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; + Word16 num_bands_out, nchan_transport; + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + nchan_out = nchan_transport; + Word16 num_out_ch; + num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + hSpar->hMdDec->Q_mixer_mat = 31; + Word16 num_in_ch; + num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; +#endif ivas_agc_dec_process_fx( st_ivas->hSpar->hAgcDec, ( p_output_fx + sba_ch_idx ), ( p_output_fx + sba_ch_idx ), st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); - FOR( i = 0; i < st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport; i++ ) - { - FOR( j = 0; j < output_frame; j++ ) - { - p_output[i + sba_ch_idx][j] = (float) p_output_fx[i + sba_ch_idx][j] / ONE_IN_Q11; - } - } - -#ifdef DUMPS_ENABLED - dbgwrite_txt( &p_output[sba_ch_idx][0], output_frame, "fix_ivas_agc_dec_process_output.txt", NULL ); -#endif // DUMPS_ENABLED - -#endif // !IVAS_FLOAT_FIXED - - if ( st_ivas->hSpar->hPCA != NULL ) + IF( st_ivas->hSpar->hPCA != NULL ) { - ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, &p_output[sba_ch_idx] ); + ivas_pca_dec_fx( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, &p_output_fx[sba_ch_idx] ); } - ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, 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 ) ); - #ifndef IVAS_FLOAT_FIXED - ivas_sba_dirac_stereo_dec( st_ivas, &p_output[sba_ch_idx], output_frame, 0 ); + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, 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 ) ); #else + ivas_spar_dec_gen_umx_mat_fx( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, 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 ) ); +#endif +#endif +#ifdef IVAS_FLOAT_FIXED { Word16 q; - float l_hb_nrg = 0.0, l_hb_nrg_subr = 0.0; - static int frame_counter = 0; - if ( frame_counter >= 200 ) - frame_counter = frame_counter; - float max_val = 0.0; - int i_max_val_psd, i_max_val_op; hCPE = st_ivas->hCPE[0]; hSCE = st_ivas->hSCE[0]; - for ( int ii = 0; ii < sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0] ); ii++ ) - { - if ( max_val < fabs( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[ii] ) ) - { - max_val = (float) fabs( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[ii] ); - } - } - i_max_val_psd = (int) max_val; - for ( int ii = sba_ch_idx; ii < sba_ch_idx + 2; ii++ ) - { - for ( int jj = 0; jj < ( 48000 / FRAMES_PER_SEC ); jj++ ) - { - if ( max_val < fabs( p_output[ii][jj] ) ) - { - max_val = (float) fabs( p_output[ii][jj] ); - } - } - } - i_max_val_op = (int)max_val; - hCPE->hStereoDft->q_dft = norm_l(i_max_val_op) - Q11; - IF(hCPE->hStereoDft->q_dft < 0) + s = 0; + FOR( i = 0; i < 2; i++ ) { - hCPE->hStereoDft->q_dft = 0; + s = s_min( s, L_norm_arr( p_output_fx[sba_ch_idx + i], L_FRAME48k ) - 11 /* Guard bits */ ); } - ELSE IF (hCPE->hStereoDft->q_dft > Q11) + FOR( i = 0; i < 2; i++ ) { - hCPE->hStereoDft->q_dft = Q11; + Scale_sig32( p_output_fx[sba_ch_idx + i], L_FRAME48k, s ); } - st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd = norm_l(i_max_val_psd) - Q9; - IF (EQ_16(hCPE->hStereoDft->first_frame, 1)) + hCPE->hStereoDft->q_dft = Q11 + s; + IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) { - //hCPE->q_prev_synth_fx = hCPE->hStereoDft->q_dft; - hCPE->hStereoDft->q_smoothed_nrg = Q6;//hCPE->hStereoDft->q_dft; + hCPE->hStereoDft->q_smoothed_nrg = Q6; // hCPE->hStereoDft->q_dft; hCPE->hStereoDft->q_ap_delay_mem_fx = hCPE->hStereoDft->q_dft; } - // st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact_fx = (Word16)floatToFixed(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact, 15); - floatToFixed_arrL(&st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0], st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd, sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx) / sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0])); - //floatToFixed_arrL(&hCPE->prev_hb_synth[0][0], &hCPE->prev_hb_synth_fx[0][0], hCPE->hStereoDft->q_dft, sizeof(hCPE->prev_hb_synth_fx) / sizeof(hCPE->prev_hb_synth_fx[0][0])); - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - if ( l_hb_nrg_subr < hCPE->hStereoDft->hb_nrg_subr[ii] ) - { - l_hb_nrg_subr = hCPE->hStereoDft->hb_nrg_subr[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg_subr = 0; - if ( l_hb_nrg_subr > (float) MAX_32 ) - { - int quotient = (int) ceil( l_hb_nrg_subr / (float) MAX_32 ); - hCPE->hStereoDft->q_hb_nrg_subr = Q31 - norm_l( quotient ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_subr_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_subr_fx[0] ); ii++ ) - { - hCPE->hStereoDft->hb_nrg_subr_fx[ii] = (Word32) ( hCPE->hStereoDft->hb_nrg_subr[ii] / ( (float) ( 1 << hCPE->hStereoDft->q_hb_nrg_subr ) ) ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) - { - if ( l_hb_nrg < hCPE->hStereoDft->hb_nrg[ii] ) - { - l_hb_nrg = hCPE->hStereoDft->hb_nrg[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg = 0; - if ( l_hb_nrg > (float) MAX_32 ) - { - int quotient = (int) ceil( l_hb_nrg / (float) MAX_32 ); - hCPE->hStereoDft->q_hb_nrg = Q31 - norm_l( quotient ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) - { - hCPE->hStereoDft->hb_nrg_fx[ii] = (Word32)(hCPE->hStereoDft->hb_nrg[ii] * ((float)(1 << hCPE->hStereoDft->q_hb_nrg))); - } - - //floatToFixed_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0] ) ); - IF( hCPE->hStereoCng != NULL ) - { - floatToFixed_arr( &hCPE->hStereoCng->cm[0], &hCPE->hStereoCng->cm_fx[0], Q15, sizeof( hCPE->hStereoCng->cm_fx ) / sizeof( hCPE->hStereoCng->cm_fx[0] ) ); - } - //floatToFixed_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0] ) ); - for ( int ii = sba_ch_idx; ii < sba_ch_idx + 2; ii++ ) - { - floatToFixed_arrL( &p_output[ii][0], &p_output_fx[ii][0], hCPE->hStereoDft->q_dft, ( 48000 / FRAMES_PER_SEC ) ); - } q = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hCPE->input_mem_BPF[0][0], &hCPE->input_mem_BPF_fx[0][0], q, STEREO_DFT32MS_OVL_16k); - floatToFixed_arrL(&hCPE->input_mem[0][0], &hCPE->input_mem_fx[0][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - floatToFixed_arrL(&hCPE->input_mem_LB[0][0], &hCPE->input_mem_LB_fx[0][0], q, STEREO_DFT32MS_OVL_16k); - floatToFixed_arrL(&hCPE->input_mem[1][0], &hCPE->input_mem_fx[1][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - floatToFixed_arrL(&hCPE->input_mem_LB[1][0], &hCPE->input_mem_LB_fx[1][0], q, STEREO_DFT32MS_OVL_16k); - if (hSCE != NULL) - { - //floatToFixed_arrL(&hSCE->prev_hb_synth[0], &hSCE->prev_hb_synth_fx[0], hCPE->hStereoDft->q_dft, sizeof(hSCE->prev_hb_synth_fx) / sizeof(hSCE->prev_hb_synth_fx[0])); - //hSCE->q_prev_hb_synth_fx = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hSCE->save_hb_synth[0], &hSCE->save_hb_synth_fx[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - hSCE->q_save_hb_synth_fx = q; - floatToFixed_arrL(&hSCE->save_synth[0], &hSCE->save_synth_fx[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - hSCE->q_save_synth_fx = q; + scale_sig32( hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub( hCPE->hStereoDft->q_dft, Q11 ) ); + FOR( i = 0; i < CPE_CHANNELS; ++i ) + { + scale_sig32( hCPE->input_mem_LB_fx[i], STEREO_DFT32MS_OVL_16k, sub( hCPE->hStereoDft->q_dft, Q11 ) ); + scale_sig32( hCPE->input_mem_fx[i], NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); } IF( hCPE->hCoreCoder[0] != NULL ) { - floatToFixed_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], q, L_FRAME32k); + floatToFixed_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], q, L_FRAME32k ); hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; - floatToFixed_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_out[0], &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], q, L_FRAME48k); - IF( (hCPE->hCoreCoder[0] != NULL) && (hCPE->hCoreCoder[0]->p_bpf_noise_buf_32 != NULL) ) - floatToFixed_arrL(&hCPE->hCoreCoder[0]->p_bpf_noise_buf_float[0], &hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[0], q, L_FRAME16k); + floatToFixed_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], q, L_FRAME48k ); } IF( hCPE->hStereoDft != NULL ) { - floatToFixed_arrL(&hCPE->hStereoDft->td_gain[0], &hCPE->hStereoDft->td_gain_fx[0], Q31, sizeof( hCPE->hStereoDft->td_gain_fx ) / sizeof( hCPE->hStereoDft->td_gain_fx[0] ) ); - floatToFixed_arrL(&hCPE->hStereoDft->ap_delay_mem[0], &hCPE->hStereoDft->ap_delay_mem_fx[0], q, NS2SA( 16000, DELAY_BWE_TOTAL_NS )); - floatToFixed_arrL(&hCPE->hStereoDft->buff_LBTCX_mem[0], &hCPE->hStereoDft->buff_LBTCX_mem_fx[0], q, NS2SA( 16000, STEREO_DFT32MS_OVL_NS )); - hCPE->hStereoDft->q_smooth_buf_fx = Q7; - floatToFixed_arrL(&hCPE->hStereoDft->smooth_buf[0][0], &hCPE->hStereoDft->smooth_buf_fx[0][0], hCPE->hStereoDft->q_smooth_buf_fx, sizeof(hCPE->hStereoDft->smooth_buf_fx) / sizeof(hCPE->hStereoDft->smooth_buf_fx[0][0])); - floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], Q31, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); - } - for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) - { - for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) - { - floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], - &st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], - Q31, - st_ivas->hSpar->hMdDec->mix_mat_dim_2); - } - } - //hCPE->lt_es_em_fx = floatToFixed(hCPE->lt_es_em, Q15); - for (int ii = 0; ii < CPE_CHANNELS; ii++) - { - hCPE->q_output_mem_fx[ii] = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hCPE->output_mem[ii][0], &hCPE->output_mem_fx[ii][0], hCPE->hStereoDft->q_dft, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS )); + scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); + scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA( 16000, DELAY_BWE_TOTAL_NS ), sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); + hCPE->hStereoDft->q_ap_fade_mem_fx = hCPE->hStereoDft->q_dft; } - floatToFixed_arrL(&hCPE->prev_synth[0][0], &hCPE->prev_synth_fx[0][0], hCPE->q_prev_synth_fx, sizeof(hCPE->prev_synth) / sizeof(hCPE->prev_synth[0][0])); + st_ivas->hSpar->hMdDec->Q_mixer_mat = Q30; - ivas_sba_dirac_stereo_dec_fx( st_ivas, &p_output_fx[sba_ch_idx], output_frame, 0 ); - - fixedToFloat_arrL(&hCPE->prev_synth_fx[0][0], &hCPE->prev_synth[0][0], hCPE->q_prev_synth_fx, sizeof(hCPE->prev_synth) / sizeof(hCPE->prev_synth[0][0])); - // st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact = fixedToFloat( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact_fx, 15 ); - fixedToFloat_arrL( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0], st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0] ) ); - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_subr_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_subr_fx[0] ); ii++ ) - { - hCPE->hStereoDft->hb_nrg_subr[ii] = ((float)hCPE->hStereoDft->hb_nrg_subr_fx[ii] / ((float)(1 << hCPE->hStereoDft->q_hb_nrg_subr))); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) + IF( hSCE != NULL ) { - hCPE->hStereoDft->hb_nrg[ii] = ( (float) hCPE->hStereoDft->hb_nrg_fx[ii] * ( (float) ( 1 << hCPE->hStereoDft->q_hb_nrg ) ) ); + Scale_sig32( &hSCE->save_hb_synth_fx[0], (Word16) ( hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC ), hCPE->hStereoDft->q_dft - hSCE->q_save_hb_synth_fx ); + hSCE->q_save_hb_synth_fx = hCPE->hStereoDft->q_dft; + Scale_sig32( &hSCE->save_synth_fx[0], (Word16) ( hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC ), hCPE->hStereoDft->q_dft - hSCE->q_save_synth_fx ); + hSCE->q_save_synth_fx = hCPE->hStereoDft->q_dft; } - //fixedToFloat_arr(&st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm[0], Q15, sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx) / sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0])); - //fixedToFloat_arrL(&hCPE->prev_hb_synth_fx[0][0], &hCPE->prev_hb_synth[0][0], hCPE->hStereoDft->q_dft, sizeof(hCPE->prev_hb_synth_fx) / sizeof(hCPE->prev_hb_synth_fx[0][0])); - IF (hCPE->hStereoCng != NULL) + FOR( int ii = 0; ii < CPE_CHANNELS; ii++ ) { - fixedToFloat_arr( &hCPE->hStereoCng->cm_fx[0], &hCPE->hStereoCng->cm[0], Q15, sizeof( hCPE->hStereoCng->cm_fx ) / sizeof( hCPE->hStereoCng->cm_fx[0] ) ); + scale_sig32( hCPE->output_mem_fx[ii], NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); + hCPE->q_output_mem_fx[ii] = hCPE->hStereoDft->q_dft; } - //fixedToFloat_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0] ) ); - for ( int ii = sba_ch_idx; ii < sba_ch_idx + 2; ii++ ) + Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx) / sizeof(hCPE->prev_synth_fx[0][0]), hCPE->q_prev_synth_fx - 11); + ivas_sba_dirac_stereo_dec_fx(st_ivas, &p_output_fx[sba_ch_idx], output_frame, 0); + FOR(i = 0; i < 2; i++) { - fixedToFloat_arrL( &p_output_fx[ii][0], &p_output[ii][0], hCPE->hStereoDft->q_dft, ( 48000 / FRAMES_PER_SEC ) ); + Scale_sig32(p_output_fx[sba_ch_idx + i], L_FRAME48k, negate(s)); } - fixedToFloat_arrL(&hCPE->input_mem_BPF_fx[0][0], &hCPE->input_mem_BPF[0][0], q, STEREO_DFT32MS_OVL_16k); - fixedToFloat_arrL(&hCPE->input_mem_fx[0][0], &hCPE->input_mem[0][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&hCPE->input_mem_LB_fx[0][0], &hCPE->input_mem_LB[0][0], q, STEREO_DFT32MS_OVL_16k); - fixedToFloat_arrL(&hCPE->input_mem_fx[1][0], &hCPE->input_mem[1][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&hCPE->input_mem_LB_fx[1][0], &hCPE->input_mem_LB[1][0], q, STEREO_DFT32MS_OVL_16k); - if (hSCE != NULL) + + Scale_sig32(&hCPE->prev_synth_fx[0][0], sizeof(hCPE->prev_synth_fx) / sizeof(hCPE->prev_synth_fx[0][0] ), 11 - hCPE->q_prev_synth_fx ); + + scale_sig32( hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub( Q11, hCPE->hStereoDft->q_dft ) ); + FOR( i = 0; i < CPE_CHANNELS; ++i ) { - //fixedToFloat_arrL(&hSCE->prev_hb_synth_fx[0], &hSCE->prev_hb_synth[0], hCPE->hStereoDft->q_dft, sizeof(hSCE->prev_hb_synth_fx) / sizeof(hSCE->prev_hb_synth_fx[0])); - fixedToFloat_arrL(&hSCE->save_synth_fx[0], &hSCE->save_synth[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - fixedToFloat_arrL(&hSCE->save_hb_synth_fx[0], &hSCE->save_hb_synth[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); + scale_sig32( hCPE->input_mem_LB_fx[i], STEREO_DFT32MS_OVL_16k, sub( Q11, hCPE->hStereoDft->q_dft ) ); + scale_sig32( hCPE->input_mem_fx[i], NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); } + IF( hCPE->hCoreCoder[0] != NULL ) { - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], q, L_FRAME32k); - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], q, L_FRAME48k); - IF( hCPE->hCoreCoder[0]->p_bpf_noise_buf_32 != NULL ) - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[0], &hCPE->hCoreCoder[0]->p_bpf_noise_buf_float[0], q, L_FRAME16k); + fixedToFloat_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], q, L_FRAME32k ); + fixedToFloat_arrL( &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], q, L_FRAME48k ); } IF( hCPE->hStereoDft != NULL ) { - fixedToFloat_arrL( &hCPE->hStereoDft->td_gain_fx[0], &hCPE->hStereoDft->td_gain[0], Q31, sizeof( hCPE->hStereoDft->td_gain_fx ) / sizeof( hCPE->hStereoDft->td_gain_fx[0] ) ); - fixedToFloat_arrL(&hCPE->hStereoDft->ap_delay_mem_fx[0], &hCPE->hStereoDft->ap_delay_mem[0], q, NS2SA( 16000, DELAY_BWE_TOTAL_NS )); - fixedToFloat_arrL(&hCPE->hStereoDft->buff_LBTCX_mem_fx[0], &hCPE->hStereoDft->buff_LBTCX_mem[0], q, NS2SA( 16000, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], Q31, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); - fixedToFloat_arrL(&hCPE->hStereoDft->smooth_buf_fx[0][0], &hCPE->hStereoDft->smooth_buf[0][0], hCPE->hStereoDft->q_smooth_buf_fx, sizeof(hCPE->hStereoDft->smooth_buf_fx) / sizeof(hCPE->hStereoDft->smooth_buf_fx[0][0])); - } - for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) - { - for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) - { - fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], - &st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], - Q31, - st_ivas->hSpar->hMdDec->mix_mat_dim_2); - } + scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); + scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA( 16000, DELAY_BWE_TOTAL_NS ), sub( Q11, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); + hCPE->hStereoDft->q_ap_fade_mem_fx = Q11; } - for (int ii = 0; ii < CPE_CHANNELS; ii++) + st_ivas->hSpar->hMdDec->Q_mixer_mat = 30; + FOR (int ii = 0; ii < CPE_CHANNELS; ii++) { - fixedToFloat_arrL(&hCPE->output_mem_fx[ii][0], &hCPE->output_mem[ii][0], hCPE->hStereoDft->q_dft, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS )); + scale_sig32( hCPE->output_mem_fx[ii], NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); + hCPE->q_output_mem_fx[ii] = Q11; } - //hCPE->lt_es_em = fixedToFloat(hCPE->lt_es_em_fx, Q15); } #endif } /* HP filtering */ - for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + FOR( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < output_frame; i++ ) - { - p_output_fx[n][i] = (Word32) ( p_output[n][i] * ( 1 << 11 ) ); - } hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - for ( i = 0; i < output_frame; i++ ) - { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << 11 ); - } -#else - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); -#endif // IVAS_FLOAT_FIXED } - -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 Q_sba = 31; - FOR( i = sba_ch_idx + 2; i <= sba_ch_idx + 3; i++ ) - { - Q_sba = s_min( Q_sba, Q_factor_arrL( p_output[i], output_frame ) ); - } - FOR( i = sba_ch_idx + 2; i <= sba_ch_idx + 3; i++ ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q_sba, output_frame ); - } -#endif - nchan_remapped = ivas_sba_remapTCs_fx( &p_output_fx[sba_ch_idx], st_ivas, output_frame ); - FOR( i = sba_ch_idx + 2; i <= sba_ch_idx + 3; i++ ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q_sba, output_frame ); - } -#else - nchan_remapped = ivas_sba_remapTCs( &p_output[sba_ch_idx], st_ivas, output_frame ); -#endif - - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) - { - num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + + nchan_remapped = ivas_sba_remapTCs_fx( &p_output_fx[sba_ch_idx], st_ivas, output_frame ); + + IF( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); #ifdef IVAS_FLOAT_FIXED #if 1 @@ -2949,216 +1334,86 @@ ivas_error ivas_jbm_dec_tc( nchan_out = nchan_transport; FOR( ch = 0; ch < nchan_transport; ch++ ) { - FOR( i = 0; i < output_frame; i++ ) - { - p_output_fx[sba_ch_idx + ch][i] = floatToFixed( p_output[sba_ch_idx + ch][i], Q_p_output ); - } + Scale_sig32( p_output_fx[sba_ch_idx + ch], output_frame, sub( Q_p_output, Q11 ) ); } - Word16 b, i_ts, num_out_ch; + Word16 num_out_ch; num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; hSpar->hMdDec->Q_mixer_mat = 31; Word16 num_in_ch; num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < num_in_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L( hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] ) ); - } - } - } - } - FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < nchan_transport; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - Q_C_re_fx = s_min( Q_C_re_fx, Q_factor_L( hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] ) ); - } - } - } - } - FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = nchan_transport; j < num_out_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - Q_P_re_fx = s_min( Q_P_re_fx, Q_factor_L( hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] ) ); - } - } - } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min( Q_C_re_fx, Q_P_re_fx ) ); - FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < num_in_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed( hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat ); - } - } - } - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < nchan_transport; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed( hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat ); - } - } - } - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = nchan_transport; j < num_out_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed( hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat ); - } - } - } - } #endif - ivas_sba_mix_matrix_determiner_fx( st_ivas->hSpar, p_output_fx, st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames); -#if 1 /*Fixed to float changes */ - FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < num_in_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat( hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat ); - } - } - } - } + ivas_sba_mix_matrix_determiner_fx( st_ivas->hSpar, &p_output_fx[sba_ch_idx], st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); +#if 1 FOR( Word16 c = 0; c < nchan_transport; c++ ) { - FOR( j = 0; j < output_frame; j++ ) - { - p_output[sba_ch_idx + c][j] = (float) p_output_fx[c][j]; - } + Scale_sig32( p_output_fx[sba_ch_idx + c], output_frame, Q11 ); } #endif -#else - ivas_sba_mix_matrix_determiner( st_ivas->hSpar, &p_output[sba_ch_idx], st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); #endif // IVAS_FLOAT_FIXED } - else if ( st_ivas->renderer_type != RENDERER_DISABLE && !st_ivas->sba_dirac_stereo_flag ) + ELSE IF( st_ivas->renderer_type != RENDERER_DISABLE && NE_16( st_ivas->sba_dirac_stereo_flag, 0 ) ) { -#ifdef IVAS_FLOAT_FIXED Word16 size = st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport + sba_ch_idx; - if (size == 3) - size += 1; + IF( EQ_16( size, 3 ) ) + size += 1; - FOR( i = sba_ch_idx; i < size; i++) + FOR( i = sba_ch_idx; i < size; i++ ) { - FOR( j = 0; j < output_frame; j++) - { - p_output_fx[i][j] = (Word32)(p_output[i][j] * ONE_IN_Q14); - } + Scale_sig32( p_output_fx[i], output_frame, sub( Q14, Q11 ) ); } ivas_spar_dec_agc_pca_fx( st_ivas, &p_output_fx[sba_ch_idx], output_frame ); - - FOR( i = sba_ch_idx; i < size; i++) - { - FOR( j = 0; j < output_frame; j++) - { - p_output[i][j] = (float)p_output_fx[i][j] / ONE_IN_Q11; - } - } -#else - ivas_spar_dec_agc_pca(st_ivas, &p_output[sba_ch_idx], output_frame); -#endif } - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + IF( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { /* loudness correction */ - ivas_dirac_dec_binaural_sba_gain( &p_output[sba_ch_idx], nchan_remapped, output_frame ); - } - else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) - { #ifdef IVAS_FLOAT_FIXED - for ( int lp = 0; lp < 12; lp++ ) + ivas_dirac_dec_binaural_sba_gain_fx( &p_output_fx[sba_ch_idx], nchan_remapped, output_frame ); /*returns Q-1*/ + + FOR( i = 0; i < nchan_remapped; i++ ) { - if ( p_output[lp] != NULL ) - { - for ( int lp2 = 0; lp2 < output_frame; lp2++ ) - { - p_output_fx[lp][lp2] = (Word32) ( p_output[lp][lp2] * ( 1u << 11 ) ); - } - } + Scale_sig32( p_output_fx[i], output_frame, 1 ); } +#endif // IVAS_FLOAT_FIXED + } + ELSE IF( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { +#ifdef IVAS_FLOAT_FIXED ivas_mono_downmix_render_passive_fx( st_ivas, p_output_fx, output_frame ); - for ( int lp = 0; lp < 960; lp++ ) - { - p_output[0][lp] = (float) p_output_fx[0][lp] / ( 1u << 8 ); - } -#else - ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + Scale_sig32( p_output_fx[0], L_FRAME48k, sub( Q11, Q8 ) ); #endif /* add W */ - for ( n = 0; n < nchan_out; n++ ) + FOR( n = 0; n < nchan_out; n++ ) { - v_add( p_output[n], p_output[n + max( nchan_out, nchan_ism )], p_output[n], output_frame ); + v_add_32( p_output_fx[n], p_output_fx[n + max( nchan_out, nchan_ism )], p_output_fx[n], output_frame ); } } } - else if ( st_ivas->ivas_format == MC_FORMAT ) + ELSE IF( st_ivas->ivas_format == MC_FORMAT ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - if ( st_ivas->mc_mode == MC_MODE_MCT ) + IF( st_ivas->mc_mode == MC_MODE_MCT ) { /* LFE channel decoder */ #ifdef IVAS_FLOAT_FIXED - - ivas_lfe_dec_fx( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output_fx[LFE_CHANNEL] ); - for ( int p = 0; p < 960; p++ ) - { - p_output[LFE_CHANNEL][p] = (float) p_output_fx[LFE_CHANNEL][p] / ONE_IN_Q9; - } -#else - ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] ); + Scale_sig32( p_output_fx[LFE_CHANNEL], L_FRAME48k, sub( Q11, Q9 ) ); #endif // IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED #if 1 // Float to fix - + Word16 ch, nCPE, cpe_id; - Word16 q_output = 11, l, k; - + Word16 l; + nCPE = st_ivas->nCPE; move16(); hMCT = st_ivas->hMCT; - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, L_FRAME48k ); - } FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { hCPE = st_ivas->hCPE[cpe_id]; @@ -3168,59 +1423,19 @@ ivas_error ivas_jbm_dec_tc( FOR( n = 0; n < CPE_CHANNELS; n++ ) { st = hCPE->hCoreCoder[n]; - IF( st->hTonalMDCTConc ) - { - - FOR( i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) - { - st->hTonalMDCTConc->scaleFactorsBackground_fx[i] = float_to_fix( st->hTonalMDCTConc->scaleFactorsBackground_flt[i], 15 ); - } - //st->hTonalMDCTConc->scf_fadeout = float_to_fix16( st->hTonalMDCTConc->scf_fadeout_flt, 15 ); - if ( hCPE->hCoreCoder[n]->bfi && st->tonal_mdct_plc_active ) - { - FOR( i = 0; i < FDNS_NPTS; i++ ) - { - f2me_16( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_float[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); - } - FOR( i = 0; i < 30; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phaseDiff_float[i]; - if ( pd >= PI2 ) - pd = fmodf( pd, PI2 ) - PI2; - st->hTonalMDCTConc->pTCI->phaseDiff[i] = (Word16) floatToFixed( pd, Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i]; - pd = fmodf( pd, PI2 ); - st->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i] = (Word16) ( pd * ( 1u << Q13 ) ); - } - // st->hTonalMDCTConc->nFramesLost = float_to_fix16( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - //f2me( st->hTonalMDCTConc->last_block_nrg_flt, &st->hTonalMDCTConc->last_block_nrg, &st->hTonalMDCTConc->last_block_nrg_exp ); - } - // 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 ); IF( sts[n]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { - // sts[n]->Mode2_lp_gainp = floatToFixed( sts[n]->lp_gainp, Q16 ); // u8bit to 16bit FOR( l = 0; l < IGF_START_MX; l++ ) { sts[n]->hIGFDec->infoTCXNoise_evs[l] = (Word16) sts[n]->hIGFDec->infoTCXNoise[l]; } } - - - IF( st->hTcxDec ) - f2me_16( st->hTcxDec->CngLevelBackgroundTrace_bfi, &st->hTcxDec->conCngLevelBackgroundTrace, &st->hTcxDec->conCngLevelBackgroundTrace_e ); if ( st->hTcxDec && st->hTcxDec->conLastFrameLevel_e < 0 ) { st->hTcxDec->conLastFrameLevel_e = 0; } - IF( st->hTcxDec ) - //st->hTcxDec->conLastFrameLevel = (Word16) floatToFixed( st->hTcxDec->LastFrameLevel_bfi, 15 - st->hTcxDec->conLastFrameLevel_e ); if ( st->hTcxDec && st->hTcxDec->conNoiseLevelMemory_e[0] < 0 ) { set16_fx( st->hTcxDec->conNoiseLevelMemory_e, 0, PLC_MIN_STAT_BUFF_SIZE ); @@ -3229,23 +1444,6 @@ ivas_error ivas_jbm_dec_tc( st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; IF( st->hTcxDec ) st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - IF( st->hTcxDec ) - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB_fx[p] = (Word16) ( st->hTcxDec->old_excFB[p] * ( 1u << st->Q_exc ) ); - //} - IF( st->hFdCngDec && st->hFdCngDec->hFdCngCom ) - floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, 15, 17 ); - // st->stab_fac_fx = float_to_fix16(st->stab_fac, Q15); - - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32, q_output, L_FRAME48k ); - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32, q_output, TCXLTP_MAX_DELAY ); - //floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, Q11, 111 ); - } - - /*cldfb struct*/ /*------------------fix-to-fix-start---------------------*/ @@ -3255,95 +1453,10 @@ ivas_error ivas_jbm_dec_tc( hCPE->hCoreCoder[n]->hHQ_core->Q_old_postdec = 0; hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda = 0; } - - /*-------------------cldfb-start-------------------------*/ - - floatToFixed_arrL( hCPE->hCoreCoder[n]->bpf_noise_buf_float, hCPE->hCoreCoder[n]->bpf_noise_buf_32, 11, L_FRAME_16k ); - if ( hCPE->hCoreCoder[n]->cldfbAna != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbAna->cldfb_state, hCPE->hCoreCoder[n]->cldfbAna->cldfb_state_fx, 10, hCPE->hCoreCoder[n]->cldfbAna->cldfb_size ); - } - if ( hCPE->hCoreCoder[n]->cldfbSyn != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state, hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state_fx, 4, hCPE->hCoreCoder[n]->cldfbSyn->p_filter_length ); - } - if ( hCPE->hCoreCoder[n]->cldfbBPF != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state_fx, 11, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_size ); - } - - - /*-------------------cldfb-end---------------------------*/ - - //floatToFixed_arr( sts[n]->prev_synth_buffer, hCPE->hCoreCoder[n]->prev_synth_buffer_fx, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); - } - - IF( hCPE->output_mem[0] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[0], hCPE->output_mem_fx[0], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - IF( hCPE->output_mem[1] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[1], hCPE->output_mem_fx[1], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q_output ) ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q_output ) ); - } - } - } - - IF( hCPE->input_mem_LB[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB_fx[n][ind] = (Word32) ( hCPE->input_mem_LB[n][ind] * ( 1 << q_output ) ); - } - } - - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth_fx[n][k] = (Word32) ( hCPE->prev_hb_synth[n][k] * ( 1 << q_output ) ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth_fx[n][k] = (Word32) ( hCPE->prev_synth[n][k] * ( 1 << q_output ) ); - } - } - } - - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->icld_q ) - floatToFixed_arr16( st_ivas->hParamMC->icld_q, st_ivas->hParamMC->icld_q_fx, 8, st_ivas->hParamMC->hMetadataPMC->num_parameter_bands * st_ivas->hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->ls_conv_dmx_matrix ) - floatToFixed_arr32( st_ivas->hParamMC->ls_conv_dmx_matrix, st_ivas->hParamMC->ls_conv_dmx_matrix_fx, 15, st_ivas->hDecoderConfig->nchan_out * ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) ); - IF( st_ivas->hLsSetUpConversion ) - FOR( Word16 chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) - { - FOR( Word16 chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx][chOutIdx] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx], 30 ); /*Q30*/ } } - - #endif // Float to fix - if ( ( error = ivas_mct_dec_fx( st_ivas, p_output_fx, output_frame, 0 ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_mct_dec_fx( st_ivas, p_output_fx, output_frame, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -3355,8 +1468,6 @@ ivas_error ivas_jbm_dec_tc( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = hCPE->hCoreCoder[ch]; - st->hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat(st->hTcxLtpDec->tcxltp_gain, 15); - //st->hTcxDec->tcxltp_last_gain_unmodified_float = st->hTcxLtpDec->tcxltp_gain_float; IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { // 16bit to u8bit @@ -3364,46 +1475,6 @@ ivas_error ivas_jbm_dec_tc( { sts[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) sts[ch]->hIGFDec->infoTCXNoise_evs[l]; } - - //IF( !sts[0]->bfi || ( sts[0]->bfi && sts[ch]->core != ACELP_CORE ) ) - //{ - // me2f_buf( sts[ch]->hIGFDec->virtualSpec, sts[ch]->hIGFDec->virtualSpec_e, sts[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - //} - } - IF( st->hTonalMDCTConc != NULL ) - { - //st->hTonalMDCTConc->scf_fadeout_flt = fixedToFloat( st->hTonalMDCTConc->scf_fadeout, 15 ); - //st->hTonalMDCTConc->last_block_nrg_flt = me2f( st->hTonalMDCTConc->last_block_nrg, st->hTonalMDCTConc->last_block_nrg_exp ); - if ( hCPE->hCoreCoder[ch]->bfi && st->tonal_mdct_plc_active ) - { - //st->hTonalMDCTConc->nFramesLost_float = fix16_to_float( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - } - - if ( sts[ch]->last_core != -1 && sts[ch]->nbLostCmpt == 1 ) - { - if ( !( sts[ch]->rf_flag && sts[ch]->use_partial_copy && ( sts[ch]->rf_frame_type == RF_TCXTD1 || sts[ch]->rf_frame_type == RF_TCXTD2 ) ) ) - { - IF( sts[ch]->hTonalMDCTConc != NULL && sts[ch]->last_core == TCX_20_CORE && sts[ch]->second_last_core == TCX_20_CORE && ( ( sts[ch]->old_fpitch <= L_shl( sts[ch]->L_frame, 15 ) ) || ( sts[ch]->hTcxDec->tcxltp_last_gain_unmodified <= 13107 /*0.4f*/ ) ) - /* it is fine to call the detection even if no ltp information - is available, meaning that st->old_fpitch == - st->tcxltp_second_last_pitch == st->L_frame */ - && ( sts[ch]->old_fpitch == sts[ch]->hTcxDec->tcxltp_second_last_pitch ) && !sts[ch]->last_tns_active && !sts[ch]->second_last_tns_active ) - { - - if ( sts[ch]->hTonalMDCTConc->pTCI->numIndexes < MAX_NUMBER_OF_IDX ) - { - FOR( i = 0; i < sts[ch]->hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phaseDiff_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phaseDiff[i], Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i], Q13 ); - } - } - } - } } } @@ -3411,39 +1482,12 @@ ivas_error ivas_jbm_dec_tc( { st = hCPE->hCoreCoder[n]; sts = hCPE->hCoreCoder; - IF( st->hTcxDec ) - st->hTcxDec->CngLevelBackgroundTrace_bfi = me2f_16( st->hTcxDec->conCngLevelBackgroundTrace, st->hTcxDec->conCngLevelBackgroundTrace_e ); - IF( st->hTonalMDCTConc && st->hTonalMDCTConc->lastPcmOut_float ) - fixedToFloat_arr( st->hTonalMDCTConc->lastPcmOut, st->hTonalMDCTConc->lastPcmOut_float, 0, st->hTonalMDCTConc->nSamples ); - IF( sts[0]->bfi == 0 && !st->hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) - fixedToFloat_arr( st->hTonalMDCTConc->secondLastPcmOut, st->hTonalMDCTConc->secondLastPcmOut_float, 0, st->hTonalMDCTConc->nSamples / 2 ); - fixedToFloat_arr( st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synthFB, st->Q_syn, st->hTcxDec->old_synth_lenFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); - fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, st->Q_syn, 1280 ); - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB[p] = (float) ( st->hTcxDec->old_excFB_fx[p] ) / ( 1u << st->Q_exc ); - //} - for ( int p = 0; p < st->L_frame / 2; p++ ) - { - st->hTcxDec->old_syn_Overl_float[p] = (float) st->hTcxDec->old_syn_Overl[p] * 2 * ( 1u << st->Q_syn ); - st->hTcxDec->syn_Overl_TDACFB_float[p] = (float) st->hTcxDec->syn_Overl_TDACFB[p] * 2 * (float) pow( 2, st->Q_syn ); - st->hTcxDec->syn_Overl_TDAC_float[p] = (float) st->hTcxDec->syn_Overl_TDAC[p] * 2 * (float) pow( 2, st->Q_syn ); - } + for ( int p = 0; p < 640; p++ ) { st->hHQ_core->old_outLB[p] = (float) st->hHQ_core->old_out_LB_fx[p] / ( 1u << st->Q_syn ); } - if ( !st->tcxonly ) - { - fixedToFloat_arr( st->p_bpf_noise_buf, st->p_bpf_noise_buf_float, 0, L_FRAME_16k ); - } - - fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->Q_syn, L_FRAME_MAX / 2 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->Q_syn, L_FRAME32k / 2 ); - st->hTcxDec->tcxltp_last_gain_unmodified_float = fix16_to_float( st->hTcxDec->tcxltp_last_gain_unmodified, Q15 ); - //st->hTcxDec->conceal_eof_gain_float = fix16_to_float( st->hTcxDec->conceal_eof_gain, Q14 ); - /*-------------------cldfb-start-------------------------*/ /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ @@ -3483,238 +1527,97 @@ ivas_error ivas_jbm_dec_tc( sts[n]->hBWE_FD->prev_L_swb_norm = sts[n]->hBWE_FD->prev_L_swb_norm; sts[n]->hBWE_FD->prev_flag = sts[n]->hBWE_FD->prev_flag; } + } + } - for ( int p = 0; p < L_FRAME48k; p++ ) - { - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) + IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) + { + IF( !hMCT->currBlockDataCnt ) + { + FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - if ( p < TCXLTP_MAX_DELAY ) + IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->igf ) { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); + FOR( l = 0; l < IGF_START_MX; l++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise_evs[l]; + } } } } - if ( hCPE->hCoreCoder[n]->hTcxDec ) - { - for ( k = 0; k < 111; k++ ) - { - //hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] = (float) hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] / ( 1u << q_output ); - } - } - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - - if ( ( hCPE->hCoreCoder[n]->codec_mode == MODE1 && hCPE->hCoreCoder[n]->hTcxDec != NULL ) && ( ( hCPE->hCoreCoder[n]->core == ACELP_CORE && !( hCPE->hCoreCoder[n]->bfi == 1 && hCPE->hCoreCoder[n]->con_tcx == 1 ) ) || hCPE->hCoreCoder[n]->core == HQ_CORE ) ) - { - fixedToFloat_arr( hCPE->hCoreCoder[n]->hTcxDec->synth_history_fx, hCPE->hCoreCoder[n]->hTcxDec->synth_history, 0, output_frame ); - } } + } - IF( hCPE->hStereoDft != NULL ) + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) + //me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) + //me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + +#endif // Fix to float +#endif + + /* HP filtering */ + FOR( n = 0; n < st_ivas->nchan_transport; n++ ) + { + IF( NE_16( n, LFE_CHANNEL ) ) { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); - } - } - } - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->output_mem[n] != NULL ) - { - FOR( k = 0; k < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->output_mem[n][k] = (float) hCPE->output_mem_fx[n][k] / ( 1u << 11 ); - } - } - IF( hCPE->hCoreCoder[n] != NULL ) - { - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); k++ ) - { - //hCPE->hCoreCoder[n]->prev_synth_buffer[k] = (float) hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[k] / ( 1 << q_output ); - } - } - IF( hCPE->input_mem[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB[n][ind] = ( (float) hCPE->input_mem_LB_fx[n][ind] / ( 1 << q_output ) ); - } - } - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth[n][k] = (float) hCPE->prev_hb_synth_fx[n][k] / ( 1 << q_output ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth[n][k] = (float) hCPE->prev_synth_fx[n][k] / ( 1 << q_output ); - } - } - } - - - IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) - { - IF( !hMCT->currBlockDataCnt ) - { - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) - { - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->igf ) - { - //me2f_buf( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_e, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - FOR( l = 0; l < IGF_START_MX; l++ ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise_evs[l]; - } - } - } - } - } - } - - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) - me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, L_FRAME48k ); - } -#endif // Fix to float -#else - if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif - - /* HP filtering */ - for ( n = 0; n < st_ivas->nchan_transport; n++ ) - { - if ( n != LFE_CHANNEL ) - { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < output_frame; i++ ) - { - p_output_fx[n][i] = (Word32) ( p_output[n][i] * ( 1 << 11 ) ); - } hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - for ( i = 0; i < output_frame; i++ ) - { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << 11 ); - } -#else - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); -#endif // IVAS_FLOAT_FIXED } } - if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + IF( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) { - if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + IF( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) { -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 Q_in_buffer_td = 31; - FOR( i = 0; i < st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; i++ ) - { - Q_in_buffer_td = s_min( Q_in_buffer_td, Q_factor_arrL( p_output[i], output_frame ) ); - } - FOR( i = 0; i < st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; i++ ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q_in_buffer_td, output_frame ); - } -#endif // IVAS_FLOAT_FIXED ivas_mc2sba_fx( st_ivas->hTransSetup, p_output_fx, p_output_fx, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE_FX ); -#if 1 - FOR( i = 0; i < ( st_ivas->hIntSetup.ambisonics_order + 1 ) * ( st_ivas->hIntSetup.ambisonics_order + 1 ); i++ ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q_in_buffer_td - 3, output_frame ); - } -#endif -#else - ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); -#endif // IVAS_FLOAT_FIXED } } - if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + IF( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && GE_16( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ), ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) ) { - if ( st_ivas->renderer_type == RENDERER_MC ) + IF( st_ivas->renderer_type == RENDERER_MC ) { #ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx( st_ivas->nchan_transport ); + s = sub( Q16, Q11 ); + s = sub( s, find_guarded_bits_fx( st_ivas->nchan_transport ) ); FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) { - floatToFixed_arrL( p_output[i], p_output_fx[i], q, output_frame ); - } - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) - { - FOR( j = 0; j < st_ivas->nchan_transport; j++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); - } + Scale_sig32( p_output_fx[i], output_frame, s ); } ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, output_frame, p_output_fx, p_output_fx ); FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) { - fixedToFloat_arrL( p_output_fx[i], p_output[i], q, output_frame ); + Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); } -#else - ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); #endif } - else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + ELSE IF( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { - ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); + ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_fx, p_output_fx, output_frame, st_ivas->hOutSetup.ambisonics_order, 0 ); } } } - else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + ELSE IF( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { /* LFE channel decoder */ -#ifdef IVAS_FLOAT_FIXED - - ivas_lfe_dec_fx( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output_fx[LFE_CHANNEL] ); - for ( int p = 0; p < 960; p++ ) - { - p_output[LFE_CHANNEL][p] = (float) p_output_fx[LFE_CHANNEL][p] / ONE_IN_Q9; - } -#else - ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] ); -#endif // IVAS_FLOAT_FIXED + Scale_sig32( p_output_fx[LFE_CHANNEL], L_FRAME48k, sub( Q11, Q9 ) ); ivas_mc_paramupmix_dec_read_BS( st_ivas, st, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] ); #ifdef IVAS_FLOAT_FIXED #if 1 // Float to fix - + Word16 ch, nCPE, cpe_id; - Word16 q_output = 11; - Word16 k, l; - + Word16 l; + nCPE = st_ivas->nCPE; move16(); hMCT = st_ivas->hMCT; - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, L_FRAME48k ); - } FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { hCPE = st_ivas->hCPE[cpe_id]; @@ -3724,39 +1627,6 @@ ivas_error ivas_jbm_dec_tc( FOR( n = 0; n < CPE_CHANNELS; n++ ) { st = hCPE->hCoreCoder[n]; - IF( st->hTonalMDCTConc ) - { - - FOR( i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) - { - st->hTonalMDCTConc->scaleFactorsBackground_fx[i] = float_to_fix( st->hTonalMDCTConc->scaleFactorsBackground_flt[i], 15 ); - } - //st->hTonalMDCTConc->scf_fadeout = float_to_fix16( st->hTonalMDCTConc->scf_fadeout_flt, 15 ); - if ( hCPE->hCoreCoder[n]->bfi && st->tonal_mdct_plc_active ) - { - FOR( i = 0; i < FDNS_NPTS; i++ ) - { - f2me_16( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_float[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); - } - FOR( i = 0; i < 30; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phaseDiff_float[i]; - if ( pd >= PI2 ) - pd = fmodf( pd, PI2 ) - PI2; - st->hTonalMDCTConc->pTCI->phaseDiff[i] = (Word16) floatToFixed( pd, Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i]; - pd = fmodf( pd, PI2 ); - st->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i] = (Word16) ( pd * ( 1u << Q13 ) ); - } - // st->hTonalMDCTConc->nFramesLost = float_to_fix16( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - //f2me( st->hTonalMDCTConc->last_block_nrg_flt, &st->hTonalMDCTConc->last_block_nrg, &st->hTonalMDCTConc->last_block_nrg_exp ); - } - // 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 ); IF( sts[n]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { @@ -3766,10 +1636,6 @@ ivas_error ivas_jbm_dec_tc( sts[n]->hIGFDec->infoTCXNoise_evs[l] = (Word16) sts[n]->hIGFDec->infoTCXNoise[l]; } } - - - IF( st->hTcxDec ) - f2me_16( st->hTcxDec->CngLevelBackgroundTrace_bfi, &st->hTcxDec->conCngLevelBackgroundTrace, &st->hTcxDec->conCngLevelBackgroundTrace_e ); if ( st->hTcxDec && st->hTcxDec->conLastFrameLevel_e < 0 ) { st->hTcxDec->conLastFrameLevel_e = 0; @@ -3782,24 +1648,6 @@ ivas_error ivas_jbm_dec_tc( st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; IF( st->hTcxDec ) st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - IF( st->hTcxDec ) - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB_fx[p] = (Word16) ( st->hTcxDec->old_excFB[p] * ( 1u << st->Q_exc ) ); - //} - IF( st->hFdCngDec && st->hFdCngDec->hFdCngCom ) - floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, 15, 17 ); - // st->stab_fac_fx = float_to_fix16(st->stab_fac, Q15); - - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32, q_output, L_FRAME48k ); - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32, q_output, TCXLTP_MAX_DELAY ); - //floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, Q11, 111 ); - } - - - /*cldfb struct*/ /*------------------fix-to-fix-start---------------------*/ /*core_switching_post_dec*/ @@ -3808,93 +1656,8 @@ ivas_error ivas_jbm_dec_tc( hCPE->hCoreCoder[n]->hHQ_core->Q_old_postdec = 0; hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda = 0; } - - /*-------------------cldfb-start-------------------------*/ - - floatToFixed_arrL( hCPE->hCoreCoder[n]->bpf_noise_buf_float, hCPE->hCoreCoder[n]->bpf_noise_buf_32, 11, L_FRAME_16k ); - if ( hCPE->hCoreCoder[n]->cldfbAna != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbAna->cldfb_state, hCPE->hCoreCoder[n]->cldfbAna->cldfb_state_fx, 10, hCPE->hCoreCoder[n]->cldfbAna->cldfb_size ); - } - if ( hCPE->hCoreCoder[n]->cldfbSyn != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state, hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state_fx, 4, hCPE->hCoreCoder[n]->cldfbSyn->p_filter_length ); - } - if ( hCPE->hCoreCoder[n]->cldfbBPF != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state_fx, 11, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_size ); - } - - - /*-------------------cldfb-end---------------------------*/ - - //floatToFixed_arr( sts[n]->prev_synth_buffer, hCPE->hCoreCoder[n]->prev_synth_buffer_fx, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); - } - - IF( hCPE->output_mem[0] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[0], hCPE->output_mem_fx[0], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - IF( hCPE->output_mem[1] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[1], hCPE->output_mem_fx[1], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q_output ) ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q_output ) ); - } - } - } - - IF( hCPE->input_mem_LB[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB_fx[n][ind] = (Word32) ( hCPE->input_mem_LB[n][ind] * ( 1 << q_output ) ); - } - } - - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth_fx[n][k] = (Word32) ( hCPE->prev_hb_synth[n][k] * ( 1 << q_output ) ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth_fx[n][k] = (Word32) ( hCPE->prev_synth[n][k] * ( 1 << q_output ) ); - } - } - } - - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->icld_q ) - floatToFixed_arr16( st_ivas->hParamMC->icld_q, st_ivas->hParamMC->icld_q_fx, 8, st_ivas->hParamMC->hMetadataPMC->num_parameter_bands * st_ivas->hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->ls_conv_dmx_matrix ) - floatToFixed_arr32( st_ivas->hParamMC->ls_conv_dmx_matrix, st_ivas->hParamMC->ls_conv_dmx_matrix_fx, 15, st_ivas->hDecoderConfig->nchan_out * ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) ); - IF( st_ivas->hLsSetUpConversion ) - FOR( Word16 chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) - { - FOR( Word16 chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx][chOutIdx] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx], 30 ); /*Q30*/ } } - - #endif // Float to fix if ( ( error = ivas_mct_dec_fx( st_ivas, p_output_fx, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { @@ -3908,8 +1671,6 @@ ivas_error ivas_jbm_dec_tc( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = hCPE->hCoreCoder[ch]; - st->hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat(st->hTcxLtpDec->tcxltp_gain, 15); - //st->hTcxDec->tcxltp_last_gain_unmodified_float = st->hTcxLtpDec->tcxltp_gain_float; IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { // 16bit to u8bit @@ -3917,46 +1678,6 @@ ivas_error ivas_jbm_dec_tc( { sts[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) sts[ch]->hIGFDec->infoTCXNoise_evs[l]; } - - //IF( !sts[0]->bfi || ( sts[0]->bfi && sts[ch]->core != ACELP_CORE ) ) - //{ - // me2f_buf( sts[ch]->hIGFDec->virtualSpec, sts[ch]->hIGFDec->virtualSpec_e, sts[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - //} - } - IF( st->hTonalMDCTConc != NULL ) - { - //st->hTonalMDCTConc->scf_fadeout_flt = fixedToFloat( st->hTonalMDCTConc->scf_fadeout, 15 ); - //st->hTonalMDCTConc->last_block_nrg_flt = me2f( st->hTonalMDCTConc->last_block_nrg, st->hTonalMDCTConc->last_block_nrg_exp ); - if ( hCPE->hCoreCoder[ch]->bfi && st->tonal_mdct_plc_active ) - { - //st->hTonalMDCTConc->nFramesLost_float = fix16_to_float( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - } - - if ( sts[ch]->last_core != -1 && sts[ch]->nbLostCmpt == 1 ) - { - if ( !( sts[ch]->rf_flag && sts[ch]->use_partial_copy && ( sts[ch]->rf_frame_type == RF_TCXTD1 || sts[ch]->rf_frame_type == RF_TCXTD2 ) ) ) - { - IF( sts[ch]->hTonalMDCTConc != NULL && sts[ch]->last_core == TCX_20_CORE && sts[ch]->second_last_core == TCX_20_CORE && ( ( sts[ch]->old_fpitch <= L_shl( sts[ch]->L_frame, 15 ) ) || ( sts[ch]->hTcxDec->tcxltp_last_gain_unmodified <= 13107 /*0.4f*/ ) ) - /* it is fine to call the detection even if no ltp information - is available, meaning that st->old_fpitch == - st->tcxltp_second_last_pitch == st->L_frame */ - && ( sts[ch]->old_fpitch == sts[ch]->hTcxDec->tcxltp_second_last_pitch ) && !sts[ch]->last_tns_active && !sts[ch]->second_last_tns_active ) - { - - if ( sts[ch]->hTonalMDCTConc->pTCI->numIndexes < MAX_NUMBER_OF_IDX ) - { - FOR( i = 0; i < sts[ch]->hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phaseDiff_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phaseDiff[i], Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i], Q13 ); - } - } - } - } } } @@ -3964,43 +1685,13 @@ ivas_error ivas_jbm_dec_tc( { st = hCPE->hCoreCoder[n]; sts = hCPE->hCoreCoder; - IF( st->hTcxDec ) - st->hTcxDec->CngLevelBackgroundTrace_bfi = me2f_16( st->hTcxDec->conCngLevelBackgroundTrace, st->hTcxDec->conCngLevelBackgroundTrace_e ); - IF( st->hTonalMDCTConc && st->hTonalMDCTConc->lastPcmOut_float ) - fixedToFloat_arr( st->hTonalMDCTConc->lastPcmOut, st->hTonalMDCTConc->lastPcmOut_float, 0, st->hTonalMDCTConc->nSamples ); - IF( sts[0]->bfi == 0 && !st->hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) - fixedToFloat_arr( st->hTonalMDCTConc->secondLastPcmOut, st->hTonalMDCTConc->secondLastPcmOut_float, 0, st->hTonalMDCTConc->nSamples / 2 ); - fixedToFloat_arr( st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synthFB, st->Q_syn, st->hTcxDec->old_synth_lenFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); - fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, st->Q_syn, 1280 ); - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB[p] = (float) ( st->hTcxDec->old_excFB_fx[p] ) / ( 1u << st->Q_exc ); - //} - for ( int p = 0; p < st->L_frame / 2; p++ ) - { - st->hTcxDec->old_syn_Overl_float[p] = (float) st->hTcxDec->old_syn_Overl[p] * 2 * ( 1u << st->Q_syn ); - st->hTcxDec->syn_Overl_TDACFB_float[p] = (float) st->hTcxDec->syn_Overl_TDACFB[p] * 2 * (float) pow( 2, st->Q_syn ); - st->hTcxDec->syn_Overl_TDAC_float[p] = (float) st->hTcxDec->syn_Overl_TDAC[p] * 2 * (float) pow( 2, st->Q_syn ); - } for ( int p = 0; p < 640; p++ ) { st->hHQ_core->old_outLB[p] = (float) st->hHQ_core->old_out_LB_fx[p] / ( 1u << st->Q_syn ); } - if ( !st->tcxonly ) - { - fixedToFloat_arr( st->p_bpf_noise_buf, st->p_bpf_noise_buf_float, 0, L_FRAME_16k ); - } - - fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->Q_syn, L_FRAME_MAX / 2 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->Q_syn, L_FRAME32k / 2 ); - st->hTcxDec->tcxltp_last_gain_unmodified_float = fix16_to_float( st->hTcxDec->tcxltp_last_gain_unmodified, Q15 ); - //st->hTcxDec->conceal_eof_gain_float = fix16_to_float( st->hTcxDec->conceal_eof_gain, Q14 ); - /*-------------------cldfb-start-------------------------*/ - /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ - if ( sts[n]->cldfbAna != NULL ) { fixedToFloat_arrL( sts[n]->cldfbAna->cldfb_state_fx, sts[n]->cldfbAna->cldfb_state, 10, sts[n]->cldfbAna->cldfb_state_length ); @@ -4036,186 +1727,81 @@ ivas_error ivas_jbm_dec_tc( sts[n]->hBWE_FD->prev_L_swb_norm = sts[n]->hBWE_FD->prev_L_swb_norm; sts[n]->hBWE_FD->prev_flag = sts[n]->hBWE_FD->prev_flag; } + } + } - for ( int p = 0; p < L_FRAME48k; p++ ) - { - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) + IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) + { + IF( !hMCT->currBlockDataCnt ) + { + FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - if ( p < TCXLTP_MAX_DELAY ) + IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->igf ) { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); + FOR( l = 0; l < IGF_START_MX; l++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise_evs[l]; + } } } } - if ( hCPE->hCoreCoder[n]->hTcxDec ) - { - for ( k = 0; k < 111; k++ ) - { - //hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] = (float) hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] / ( 1u << q_output ); - } - } - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - - if ( ( hCPE->hCoreCoder[n]->codec_mode == MODE1 && hCPE->hCoreCoder[n]->hTcxDec != NULL ) && ( ( hCPE->hCoreCoder[n]->core == ACELP_CORE && !( hCPE->hCoreCoder[n]->bfi == 1 && hCPE->hCoreCoder[n]->con_tcx == 1 ) ) || hCPE->hCoreCoder[n]->core == HQ_CORE ) ) - { - fixedToFloat_arr( hCPE->hCoreCoder[n]->hTcxDec->synth_history_fx, hCPE->hCoreCoder[n]->hTcxDec->synth_history, 0, output_frame ); - } } + } - IF( hCPE->hStereoDft != NULL ) + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) + //me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) + //me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + +#endif // Fix to float +#endif + + /* HP filtering */ + FOR( n = 0; n < st_ivas->nchan_transport; n++ ) + { + IF( NE_16( n, LFE_CHANNEL ) ) { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); - } - } - } - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->output_mem[n] != NULL ) - { - FOR( k = 0; k < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->output_mem[n][k] = (float) hCPE->output_mem_fx[n][k] / ( 1u << 11 ); - } - } - IF( hCPE->hCoreCoder[n] != NULL ) - { - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); k++ ) - { - //hCPE->hCoreCoder[n]->prev_synth_buffer[k] = (float) hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[k] / ( 1 << q_output ); - } - } - IF( hCPE->input_mem[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB[n][ind] = ( (float) hCPE->input_mem_LB_fx[n][ind] / ( 1 << q_output ) ); - } - } - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth[n][k] = (float) hCPE->prev_hb_synth_fx[n][k] / ( 1 << q_output ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth[n][k] = (float) hCPE->prev_synth_fx[n][k] / ( 1 << q_output ); - } - } - } - - - IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) - { - IF( !hMCT->currBlockDataCnt ) - { - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) - { - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->igf ) - { - //me2f_buf( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_e, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - FOR( l = 0; l < IGF_START_MX; l++ ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise_evs[l]; - } - } - } - } - } - } - - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) - me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, L_FRAME48k ); - } -#endif // Fix to float -#else - if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif - - /* HP filtering */ - for ( n = 0; n < st_ivas->nchan_transport; n++ ) - { - if ( n != LFE_CHANNEL ) - { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < output_frame; i++ ) - { - p_output_fx[n][i] = (Word32) ( p_output[n][i] * ( 1 << 11 ) ); - } - hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - for ( i = 0; i < output_frame; i++ ) - { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << 11 ); - } -#else - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); -#endif // IVAS_FLOAT_FIXED + hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } } /* Rendering */ - if ( st_ivas->renderer_type == RENDERER_MC && ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + IF( st_ivas->renderer_type == RENDERER_MC && ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) { /* Compensate loudness for not doing full upmix */ - for ( n = 4; n < 8; n++ ) + FOR( n = 4; n < 8; n++ ) { - v_multc( p_output[n], 2.0f, p_output[n], output_frame ); + Scale_sig32( p_output_fx[n], output_frame, 1 ); } - if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + IF( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) { #ifdef IVAS_FLOAT_FIXED - Word16 q = Q16, nchan_transport; + s = sub( Q16, Q11 ); + Word16 nchan_transport; nchan_transport = audioCfg2channels( IVAS_AUDIO_CONFIG_5_1_2 ); - q = q - find_guarded_bits_fx( nchan_transport ); + s = s - find_guarded_bits_fx( nchan_transport ); FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, nchan_transport ); ++i ) { - floatToFixed_arrL( p_output[i], p_output_fx[i], q, output_frame ); - } - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) - { - FOR( j = 0; j < nchan_transport; j++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); - } + Scale_sig32( p_output_fx[i], output_frame, s ); } ivas_ls_setup_conversion_fx( st_ivas, nchan_transport, output_frame, p_output_fx, p_output_fx ); FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, nchan_transport ); ++i ) { - fixedToFloat_arrL( p_output_fx[i], p_output[i], q, output_frame ); + Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); } -#else - ivas_ls_setup_conversion( st_ivas, audioCfg2channels( IVAS_AUDIO_CONFIG_5_1_2 ), output_frame, p_output, p_output ); #endif } } } - else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + ELSE IF( st_ivas->mc_mode == MC_MODE_PARAMMC ) { /* read Parametric MC parameters from the bitstream */ ivas_param_mc_dec_read_BS( ivas_total_brate, st, st_ivas->hParamMC, &nb_bits_metadata[0] ); -#ifdef IVAS_FLOAT_FIXED IF( EQ_16( st_ivas->nCPE, 1 ) ) { Word16 q_output = 11; @@ -4224,39 +1810,23 @@ ivas_error ivas_jbm_dec_tc( { return error; } - for ( int k = 0; k < output_frame; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - p_output[1][k] = (float) p_output_fx[1][k] / ( 1 << q_output ); - } - - } -#else - if ( st_ivas->nCPE == 1 ) - { - if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + IF( NE_16( q_output, Q11 ) ) { - return error; + Scale_sig32( p_output_fx[0], output_frame, sub( Q11, q_output ) ); + Scale_sig32( p_output_fx[1], output_frame, sub( Q11, q_output ) ); } } -#endif // IVAS_FLOAT_FIXED - else if ( st_ivas->nCPE > 1 ) + ELSE IF( st_ivas->nCPE > 1 ) { - #ifdef IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED #if 1 // Float to fix Word16 ch, nCPE, cpe_id; - Word16 q_output = 11; - Word16 k, l; + Word16 l; nCPE = st_ivas->nCPE; move16(); hMCT = st_ivas->hMCT; - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, L_FRAME48k ); - } FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { hCPE = st_ivas->hCPE[cpe_id]; @@ -4266,40 +1836,6 @@ ivas_error ivas_jbm_dec_tc( FOR( n = 0; n < CPE_CHANNELS; n++ ) { st = hCPE->hCoreCoder[n]; - IF( st->hTonalMDCTConc ) - { - - FOR( i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) - { - st->hTonalMDCTConc->scaleFactorsBackground_fx[i] = float_to_fix( st->hTonalMDCTConc->scaleFactorsBackground_flt[i], 15 ); - } - //st->hTonalMDCTConc->scf_fadeout = float_to_fix16( st->hTonalMDCTConc->scf_fadeout_flt, 15 ); - if ( hCPE->hCoreCoder[n]->bfi && st->tonal_mdct_plc_active ) - { - FOR( i = 0; i < FDNS_NPTS; i++ ) - { - f2me_16( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_float[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); - } - FOR( i = 0; i < 30; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phaseDiff_float[i]; - if ( pd >= PI2 ) - pd = fmodf( pd, PI2 ) - PI2; - st->hTonalMDCTConc->pTCI->phaseDiff[i] = (Word16) floatToFixed( pd, Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - float pd = st->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i]; - pd = fmodf( pd, PI2 ); - st->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i] = (Word16) ( pd * ( 1u << Q13 ) ); - } - // st->hTonalMDCTConc->nFramesLost = float_to_fix16( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - //f2me( st->hTonalMDCTConc->last_block_nrg_flt, &st->hTonalMDCTConc->last_block_nrg, &st->hTonalMDCTConc->last_block_nrg_exp ); - } - // 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 ); - IF( sts[n]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { // u8bit to 16bit @@ -4308,10 +1844,6 @@ ivas_error ivas_jbm_dec_tc( sts[n]->hIGFDec->infoTCXNoise_evs[l] = (Word16) sts[n]->hIGFDec->infoTCXNoise[l]; } } - - - IF( st->hTcxDec ) - f2me_16( st->hTcxDec->CngLevelBackgroundTrace_bfi, &st->hTcxDec->conCngLevelBackgroundTrace, &st->hTcxDec->conCngLevelBackgroundTrace_e ); if ( st->hTcxDec && st->hTcxDec->conLastFrameLevel_e < 0 ) { st->hTcxDec->conLastFrameLevel_e = 0; @@ -4324,22 +1856,6 @@ ivas_error ivas_jbm_dec_tc( st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; IF( st->hTcxDec ) st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - IF( st->hTcxDec ) - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB_fx[p] = (Word16) ( st->hTcxDec->old_excFB[p] * ( 1u << st->Q_exc ) ); - //} - IF( st->hFdCngDec && st->hFdCngDec->hFdCngCom ) - floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, 15, 17 ); - // st->stab_fac_fx = float_to_fix16(st->stab_fac, Q15); - - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32, q_output, L_FRAME48k ); - floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float, hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32, q_output, TCXLTP_MAX_DELAY ); - //floatToFixed_arrL( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, Q11, 111 ); - } - /*cldfb struct*/ @@ -4350,93 +1866,8 @@ ivas_error ivas_jbm_dec_tc( hCPE->hCoreCoder[n]->hHQ_core->Q_old_postdec = 0; hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda = 0; } - - /*-------------------cldfb-start-------------------------*/ - - floatToFixed_arrL( hCPE->hCoreCoder[n]->bpf_noise_buf_float, hCPE->hCoreCoder[n]->bpf_noise_buf_32, 11, L_FRAME_16k ); - if ( hCPE->hCoreCoder[n]->cldfbAna != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbAna->cldfb_state, hCPE->hCoreCoder[n]->cldfbAna->cldfb_state_fx, 10, hCPE->hCoreCoder[n]->cldfbAna->cldfb_size ); - } - if ( hCPE->hCoreCoder[n]->cldfbSyn != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state, hCPE->hCoreCoder[n]->cldfbSyn->cldfb_state_fx, 4, hCPE->hCoreCoder[n]->cldfbSyn->p_filter_length ); - } - if ( hCPE->hCoreCoder[n]->cldfbBPF != NULL ) - { - floatToFixed_arrL( hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_state_fx, 11, hCPE->hCoreCoder[n]->cldfbBPF->cldfb_size ); - } - - - /*-------------------cldfb-end---------------------------*/ - - //floatToFixed_arr( sts[n]->prev_synth_buffer, hCPE->hCoreCoder[n]->prev_synth_buffer_fx, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); - } - - IF( hCPE->output_mem[0] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[0], hCPE->output_mem_fx[0], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - IF( hCPE->output_mem[1] != NULL ) - { - floatToFixed_arrL( hCPE->output_mem[1], hCPE->output_mem_fx[1], Q11, NS2SA( hCPE->hCoreCoder[0]->output_Fs, 3125000 ) ); - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q_output ) ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q_output ) ); - } - } - } - - IF( hCPE->input_mem_LB[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB_fx[n][ind] = (Word32) ( hCPE->input_mem_LB[n][ind] * ( 1 << q_output ) ); - } - } - - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth_fx[n][k] = (Word32) ( hCPE->prev_hb_synth[n][k] * ( 1 << q_output ) ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth_fx[n][k] = (Word32) ( hCPE->prev_synth[n][k] * ( 1 << q_output ) ); - } - } - } - - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev ) - f2me_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->icld_q ) - floatToFixed_arr16( st_ivas->hParamMC->icld_q, st_ivas->hParamMC->icld_q_fx, 8, st_ivas->hParamMC->hMetadataPMC->num_parameter_bands * st_ivas->hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - IF( st_ivas->hParamMC && st_ivas->hParamMC->ls_conv_dmx_matrix ) - floatToFixed_arr32( st_ivas->hParamMC->ls_conv_dmx_matrix, st_ivas->hParamMC->ls_conv_dmx_matrix_fx, 15, st_ivas->hDecoderConfig->nchan_out * ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) ); - IF( st_ivas->hLsSetUpConversion ) - FOR( Word16 chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) - { - FOR( Word16 chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx][chOutIdx] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx], 30 ); /*Q30*/ } } - - #endif // Float to fix if ( ( error = ivas_mct_dec_fx( st_ivas, p_output_fx, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { @@ -4450,7 +1881,6 @@ ivas_error ivas_jbm_dec_tc( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = hCPE->hCoreCoder[ch]; - st->hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat(st->hTcxLtpDec->tcxltp_gain, 15); IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { // 16bit to u8bit @@ -4458,45 +1888,6 @@ ivas_error ivas_jbm_dec_tc( { sts[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) sts[ch]->hIGFDec->infoTCXNoise_evs[l]; } - //IF( !sts[0]->bfi || ( sts[0]->bfi && sts[ch]->core != ACELP_CORE ) ) - //{ - // me2f_buf( sts[ch]->hIGFDec->virtualSpec, sts[ch]->hIGFDec->virtualSpec_e, sts[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - //} - } - IF( st->hTonalMDCTConc != NULL ) - { - //st->hTonalMDCTConc->scf_fadeout_flt = fixedToFloat( st->hTonalMDCTConc->scf_fadeout, 15 ); - //st->hTonalMDCTConc->last_block_nrg_flt = me2f( st->hTonalMDCTConc->last_block_nrg, st->hTonalMDCTConc->last_block_nrg_exp ); - if ( hCPE->hCoreCoder[ch]->bfi && st->tonal_mdct_plc_active ) - { - //st->hTonalMDCTConc->nFramesLost_float = fix16_to_float( st->hTonalMDCTConc->nFramesLost, Q1 ); - } - } - - if ( sts[ch]->last_core != -1 && sts[ch]->nbLostCmpt == 1 ) - { - if ( !( sts[ch]->rf_flag && sts[ch]->use_partial_copy && ( sts[ch]->rf_frame_type == RF_TCXTD1 || sts[ch]->rf_frame_type == RF_TCXTD2 ) ) ) - { - IF( sts[ch]->hTonalMDCTConc != NULL && sts[ch]->last_core == TCX_20_CORE && sts[ch]->second_last_core == TCX_20_CORE && ( ( sts[ch]->old_fpitch <= L_shl( sts[ch]->L_frame, 15 ) ) || ( sts[ch]->hTcxDec->tcxltp_last_gain_unmodified <= 13107 /*0.4f*/ ) ) - /* it is fine to call the detection even if no ltp information - is available, meaning that st->old_fpitch == - st->tcxltp_second_last_pitch == st->L_frame */ - && ( sts[ch]->old_fpitch == sts[ch]->hTcxDec->tcxltp_second_last_pitch ) && !sts[ch]->last_tns_active && !sts[ch]->second_last_tns_active ) - { - - if ( sts[ch]->hTonalMDCTConc->pTCI->numIndexes < MAX_NUMBER_OF_IDX ) - { - FOR( i = 0; i < sts[ch]->hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phaseDiff_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phaseDiff[i], Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i] = fixedToFloat( sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i], Q13 ); - } - } - } - } } } @@ -4504,39 +1895,11 @@ ivas_error ivas_jbm_dec_tc( { st = hCPE->hCoreCoder[n]; sts = hCPE->hCoreCoder; - IF( st->hTcxDec ) - st->hTcxDec->CngLevelBackgroundTrace_bfi = me2f_16( st->hTcxDec->conCngLevelBackgroundTrace, st->hTcxDec->conCngLevelBackgroundTrace_e ); - IF( st->hTonalMDCTConc && st->hTonalMDCTConc->lastPcmOut_float ) - fixedToFloat_arr( st->hTonalMDCTConc->lastPcmOut, st->hTonalMDCTConc->lastPcmOut_float, 0, st->hTonalMDCTConc->nSamples ); - IF( sts[0]->bfi == 0 && !st->hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) - fixedToFloat_arr( st->hTonalMDCTConc->secondLastPcmOut, st->hTonalMDCTConc->secondLastPcmOut_float, 0, st->hTonalMDCTConc->nSamples / 2 ); - fixedToFloat_arr( st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synthFB, st->Q_syn, st->hTcxDec->old_synth_lenFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); - fixedToFloat_arr( st->hTcxDec->old_synth, st->hTcxDec->old_synth_float, st->Q_syn, 1280 ); - //for ( int p = 0; p < st->L_frame; p++ ) - //{ - // st->hTcxDec->old_excFB[p] = (float) ( st->hTcxDec->old_excFB_fx[p] ) / ( 1u << st->Q_exc ); - //} - for ( int p = 0; p < st->L_frame / 2; p++ ) - { - st->hTcxDec->old_syn_Overl_float[p] = (float) st->hTcxDec->old_syn_Overl[p] * 2 * ( 1u << st->Q_syn ); - st->hTcxDec->syn_Overl_TDACFB_float[p] = (float) st->hTcxDec->syn_Overl_TDACFB[p] * 2 * (float) pow( 2, st->Q_syn ); - st->hTcxDec->syn_Overl_TDAC_float[p] = (float) st->hTcxDec->syn_Overl_TDAC[p] * 2 * (float) pow( 2, st->Q_syn ); - } for ( int p = 0; p < 640; p++ ) { st->hHQ_core->old_outLB[p] = (float) st->hHQ_core->old_out_LB_fx[p] / ( 1u << st->Q_syn ); } - if ( !st->tcxonly ) - { - fixedToFloat_arr( st->p_bpf_noise_buf, st->p_bpf_noise_buf_float, 0, L_FRAME_16k ); - } - - fixedToFloat_arr( st->hTcxDec->syn_OverlFB, st->hTcxDec->syn_OverlFB_float, st->Q_syn, L_FRAME_MAX / 2 ); - fixedToFloat_arr( st->hTcxDec->syn_Overl, st->hTcxDec->syn_Overl_float, st->Q_syn, L_FRAME32k / 2 ); - st->hTcxDec->tcxltp_last_gain_unmodified_float = fix16_to_float( st->hTcxDec->tcxltp_last_gain_unmodified, Q15 ); - //st->hTcxDec->conceal_eof_gain_float = fix16_to_float( st->hTcxDec->conceal_eof_gain, Q14 ); - /*-------------------cldfb-start-------------------------*/ /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ @@ -4563,7 +1926,6 @@ ivas_error ivas_jbm_dec_tc( /*------------------reset-code-start---------------------*/ - /* reset WB BWE buffers */ IF( NE_16( sts[n]->last_extl, WB_BWE ) && EQ_16( sts[n]->extl, WB_BWE ) && sts[n]->hBWE_FD != NULL ) @@ -4576,79 +1938,6 @@ ivas_error ivas_jbm_dec_tc( sts[n]->hBWE_FD->prev_L_swb_norm = sts[n]->hBWE_FD->prev_L_swb_norm; sts[n]->hBWE_FD->prev_flag = sts[n]->hBWE_FD->prev_flag; } - - for ( int p = 0; p < L_FRAME48k; p++ ) - { - - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); - } - } - } - if ( hCPE->hCoreCoder[n]->hTcxDec ) - { - for ( k = 0; k < 111; k++ ) - { - //hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] = (float) hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] / ( 1u << q_output ); - } - } - IF( hCPE->hCoreCoder[n]->hTcxLtpDec ) - - if ( ( hCPE->hCoreCoder[n]->codec_mode == MODE1 && hCPE->hCoreCoder[n]->hTcxDec != NULL ) && ( ( hCPE->hCoreCoder[n]->core == ACELP_CORE && !( hCPE->hCoreCoder[n]->bfi == 1 && hCPE->hCoreCoder[n]->con_tcx == 1 ) ) || hCPE->hCoreCoder[n]->core == HQ_CORE ) ) - { - fixedToFloat_arr( hCPE->hCoreCoder[n]->hTcxDec->synth_history_fx, hCPE->hCoreCoder[n]->hTcxDec->synth_history, 0, output_frame ); - } - } - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q_output ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q_output ); - } - } - } - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->output_mem[n] != NULL ) - { - FOR( k = 0; k < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->output_mem[n][k] = (float) hCPE->output_mem_fx[n][k] / ( 1u << 11 ); - } - } - IF( hCPE->hCoreCoder[n] != NULL ) - { - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); k++ ) - { - //hCPE->hCoreCoder[n]->prev_synth_buffer[k] = (float) hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[k] / ( 1 << q_output ); - } - } - IF( hCPE->input_mem[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB[n][ind] = ( (float) hCPE->input_mem_LB_fx[n][ind] / ( 1 << q_output ) ); - } - } - //FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth[n][k] = (float) hCPE->prev_hb_synth_fx[n][k] / ( 1 << q_output ); - //} - FOR( k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth[n][k] = (float) hCPE->prev_synth_fx[n][k] / ( 1 << q_output ); - } } } @@ -4663,7 +1952,6 @@ ivas_error ivas_jbm_dec_tc( { IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->igf ) { - //me2f_buf( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_e, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); FOR( l = 0; l < IGF_START_MX; l++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hIGFDec->infoTCXNoise_evs[l]; @@ -4674,73 +1962,42 @@ ivas_error ivas_jbm_dec_tc( } } - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) - me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) - me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->targetEnergyPrev ) + //me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); + //IF( st_ivas->hLsSetUpConversion && st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx ) + //me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - FOR( i = 0; i < 12; i++ ) - if ( p_output[i] ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, L_FRAME48k ); - } #endif // Fix to float -#else - if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } #endif } /* HP filtering */ - for ( n = 0; n < st_ivas->nchan_transport; n++ ) + FOR( n = 0; n < st_ivas->nchan_transport; n++ ) { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < output_frame; i++ ) - { - p_output_fx[n][i] = (Word32) ( p_output[n][i] * ( 1 << 11 ) ); - } hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - for ( i = 0; i < output_frame; i++ ) - { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << 11 ); - } -#else - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); -#endif // IVAS_FLOAT_FIXED } /* Rendering */ - if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + IF( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) { #ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx( st_ivas->nchan_transport ); + s = sub( Q16, Q11 ); + s = sub( s, find_guarded_bits_fx( st_ivas->nchan_transport ) ); FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) { - floatToFixed_arrL( p_output[i], p_output_fx[i], q, output_frame ); - } - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) - { - FOR( j = 0; j < st_ivas->nchan_transport; j++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); - } + Scale_sig32( p_output_fx[i], output_frame, s ); } ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, output_frame, p_output_fx, p_output_fx ); FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) { - fixedToFloat_arrL( p_output_fx[i], p_output[i], q, output_frame ); + Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); } -#else - ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); #endif } } - else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + ELSE IF( st_ivas->mc_mode == MC_MODE_MCMASA ) { - if ( st_ivas->hOutSetup.separateChannelEnabled ) + IF( st_ivas->hOutSetup.separateChannelEnabled ) { st = st_ivas->hCPE[0]->hCoreCoder[0]; /* Metadata is always with CPE in the case of separated channel */ } @@ -4755,24 +2012,6 @@ ivas_error ivas_jbm_dec_tc( st_ivas->hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio_fx[j] = float_to_fix16( st_ivas->hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio[j], Q14 ); } } - IF( st_ivas->hSpatParamRendCom != NULL ) - { - FOR( i = 0; i < st_ivas->hSpatParamRendCom->dirac_md_buffer_length; i++ ) - { - FOR( j = 0; j < st_ivas->hSpatParamRendCom->num_freq_bands; j++ ) - { - st_ivas->hSpatParamRendCom->diffuseness_vector_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->diffuseness_vector[i][j], 30 ); - st_ivas->hSpatParamRendCom->energy_ratio1_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->energy_ratio1[i][j], 30 ); - IF( EQ_16( st_ivas->hQMetaData->no_directions, 2 ) ) - { - st_ivas->hSpatParamRendCom->energy_ratio2_fx[i][j] = float_to_fix( st_ivas->hSpatParamRendCom->energy_ratio2[i][j], 30 ); - st_ivas->hSpatParamRendCom->spreadCoherence2_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->spreadCoherence2[i][j], 15 ); - } - st_ivas->hSpatParamRendCom->surroundingCoherence_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->surroundingCoherence[i][j], 15 ); - st_ivas->hSpatParamRendCom->spreadCoherence_fx[i][j] = float_to_fix16( st_ivas->hSpatParamRendCom->spreadCoherence[i][j], 15 ); - } - } - } // Float to fix conversion ends here. IF( ( error = ivas_masa_decode_fx( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) @@ -4789,7 +2028,7 @@ ivas_error ivas_jbm_dec_tc( { st_ivas->hSpatParamRendCom->energy_ratio1[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->energy_ratio1_fx[i][j], 30 ); st_ivas->hSpatParamRendCom->diffuseness_vector[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->diffuseness_vector_fx[i][j], 30 ); - IF( EQ_16( st_ivas->hQMetaData->no_directions, 2 ) ) + IF( EQ_32( st_ivas->hQMetaData->no_directions, 2 ) ) { st_ivas->hSpatParamRendCom->energy_ratio2[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->energy_ratio2_fx[i][j], 30 ); st_ivas->hSpatParamRendCom->spreadCoherence2[i][j] = fix_to_float( st_ivas->hSpatParamRendCom->spreadCoherence2_fx[i][j], 15 ); @@ -4799,18 +2038,6 @@ ivas_error ivas_jbm_dec_tc( } } } - FOR( Word16 d = 0; d < max( st_ivas->hMasa->config.numberOfDirections, st_ivas->hQMetaData->no_directions ); d++ ) - { - FOR( j = 0; j < max( st_ivas->hMasa->config.numCodingBands, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); j++ ) - { - FOR( Word16 k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) - { - st_ivas->hQMetaData->q_direction[d].band_data[j].elevation[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].elevation_fx[k], Q22 ); - st_ivas->hQMetaData->q_direction[d].band_data[j].azimuth[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].azimuth_fx[k], Q22 ); - st_ivas->hQMetaData->q_direction[d].band_data[j].energy_ratio[k] = fix_to_float( st_ivas->hQMetaData->q_direction[d].band_data[j].energy_ratio_fx[k], Q30 ); - } - } - } st_ivas->hMasa->data.dir_decode_quality = fix16_to_float( st_ivas->hMasa->data.dir_decode_quality_fx, Q14 ); IF( st_ivas->hMasa->hMasaLfeSynth != NULL ) { @@ -4833,35 +2060,21 @@ ivas_error ivas_jbm_dec_tc( } } // Fixed to float conversion ends here. -#else - if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } #endif - if ( st_ivas->hOutSetup.separateChannelEnabled ) + IF( st_ivas->hOutSetup.separateChannelEnabled ) { /* Decode the transport audio signals */ -#ifdef IVAS_FLOAT_FIXED Word16 q_output = 11; IF( ( error = ivas_cpe_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, nb_bits_metadata[0], &q_output ) ) != IVAS_ERR_OK ) { return error; } - - for ( int k = 0; k < output_frame; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - p_output[1][k] = (float) p_output_fx[1][k] / ( 1 << q_output ); - } - -#else - if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + IF( NE_16( q_output, Q11 ) ) { - return error; + Scale_sig32( p_output_fx[0], output_frame, sub( Q11, q_output ) ); + Scale_sig32( p_output_fx[1], output_frame, sub( Q11, q_output ) ); } -#endif // IVAS_FLOAT_FIXED /* Identify the index of the separated channel, always LFE_CHANNEL-1 here */ n = LFE_CHANNEL - 1; @@ -4869,73 +2082,47 @@ ivas_error ivas_jbm_dec_tc( /* Decode the separated channel to output[n] to be combined with the synthesized channels */ #ifdef IVAS_FLOAT_FIXED set32_fx( p_output_fx[n], 0, L_FRAME48k ); - //for ( int k = 0; k < 45; k++ ) - //{ - // st_ivas->hSCE[0]->prev_hb_synth_fx[k] = (Word32) ( st_ivas->hSCE[0]->prev_hb_synth[k] * ONE_IN_Q11 ); - //} IF( ( error = ivas_sce_dec_fx( st_ivas, 0, &p_output_fx[n], output_frame, 0 ) ) != IVAS_ERR_OK ) { return error; } - - for ( int k = 0; k < output_frame; k++ ) - { - p_output[n][k] = (float) p_output_fx[n][k] / ONE_IN_Q11; - } - for ( int k = 0; k < 96; k++ ) - { - //st_ivas->hSCE[0]->hCoreCoder[0]->prev_synth_buffer[k] = (float) st_ivas->hSCE[0]->hCoreCoder[0]->prev_synth_buffer32_fx[k] / ONE_IN_Q11; - //if ( k < 45 ) - // st_ivas->hSCE[0]->prev_hb_synth[k] = (float) st_ivas->hSCE[0]->prev_hb_synth_fx[k] / ONE_IN_Q11; - } -#else - if ( ( error = ivas_sce_dec( st_ivas, 0, &p_output[n], output_frame, 0 ) ) != IVAS_ERR_OK ) +#endif // IVAS_FLOAT_FIXED +#if 1 + FOR( i = 0; i < 12; i++ ) { - return error; + fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, output_frame ); } -#endif // IVAS_FLOAT_FIXED - /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */ - if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || - output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || - output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) + IF( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || + output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || + output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) { ivas_lfe_synth_with_filters( st_ivas->hMasa->hMasaLfeSynth, p_output, output_frame, n, LFE_CHANNEL ); } - else if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + ELSE IF( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) { /* Delay the separated channel to sync with the DirAC rendering */ delay_signal_float( p_output[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size ); } + FOR( i = 0; i < 12; i++ ) + { + floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, output_frame ); + } +#endif } - else + ELSE { #ifdef IVAS_FLOAT_FIXED Word16 q_output = 11; IF( EQ_16( st_ivas->nSCE, 1 ) ) { set32_fx( p_output_fx[0], 0, L_FRAME48k ); - //for ( int k = 0; k < 45; k++ ) - //{ - // st_ivas->hSCE[0]->prev_hb_synth_fx[k] = (Word32) ( st_ivas->hSCE[0]->prev_hb_synth[k] * ( 1 << q_output ) ); - //} IF( ( error = ivas_sce_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { return error; } - - for ( int k = 0; k < output_frame; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - } - for ( int k = 0; k < 96; k++ ) - { - //st_ivas->hSCE[0]->hCoreCoder[0]->prev_synth_buffer[k] = (float) st_ivas->hSCE[0]->hCoreCoder[0]->prev_synth_buffer32_fx[k] / ( 1 << q_output ); - //if ( k < 45 ) - // st_ivas->hSCE[0]->prev_hb_synth[k] = (float) st_ivas->hSCE[0]->prev_hb_synth_fx[k] / ( 1 << q_output ); - } } ELSE IF( EQ_16( st_ivas->nCPE, 1 ) ) { @@ -4944,306 +2131,135 @@ ivas_error ivas_jbm_dec_tc( { return error; } - - for ( int k = 0; k < output_frame; k++ ) - { - p_output[0][k] = (float) p_output_fx[0][k] / ( 1 << q_output ); - p_output[1][k] = (float) p_output_fx[1][k] / ( 1 << q_output ); - } - - } -#else - if ( st_ivas->nSCE == 1 ) - { - if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( st_ivas->nCPE == 1 ) - { - if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + IF( NE_16( q_output, Q11 ) ) { - return error; + Scale_sig32( p_output_fx[0], output_frame, sub( Q11, q_output ) ); + Scale_sig32( p_output_fx[1], output_frame, sub( Q11, q_output ) ); } } #endif // IVAS_FLOAT_FIXED } - if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ - { -#ifndef IVAS_FLOAT_FIXED - ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, 1 ); -#else + IF( NE_16( st_ivas->sba_dirac_stereo_flag, 0 ) ) /* use the flag to trigger the DFT upmix */ { +#ifdef IVAS_FLOAT_FIXED Word16 q; - float l_hb_nrg = 0.0, l_hb_nrg_subr = 0.0; - static int frame_counter = 0; - if ( frame_counter >= 200 ) - frame_counter = frame_counter; float max_val = 0.0; - int i_max_val_psd, i_max_val_op; + int i_max_val_op; hCPE = st_ivas->hCPE[0]; hSCE = st_ivas->hSCE[0]; - for ( int ii = 0; ii < sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0] ); ii++ ) - { - if ( max_val < fabs( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[ii] ) ) - { - max_val = (float) fabs( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[ii] ); - } - } - i_max_val_psd = (int) max_val; - for ( int ii = 0; ii < 2; ii++ ) - { - for ( int jj = 0; jj < ( 48000 / FRAMES_PER_SEC ); jj++ ) - { - if ( max_val < fabs( p_output[ii][jj] ) ) - { - max_val = (float) fabs( p_output[ii][jj] ); - } - } - } - i_max_val_op = (int)max_val; - hCPE->hStereoDft->q_dft = norm_l(i_max_val_op) - Q11; - IF(hCPE->hStereoDft->q_dft < 0) + i_max_val_op = (int) max_val; + s = 0; + FOR( i = 0; i < 2; i++ ) { - hCPE->hStereoDft->q_dft = 0; + s = s_min( s, L_norm_arr( p_output_fx[i], L_FRAME48k ) - 11 /* Guard bits */ ); } - ELSE IF (hCPE->hStereoDft->q_dft > Q11) + FOR( i = 0; i < 2; i++ ) { - hCPE->hStereoDft->q_dft = Q11; + Scale_sig32( p_output_fx[i], L_FRAME48k, s ); } - st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd = norm_l(i_max_val_psd) - Q9; - IF (EQ_16(hCPE->hStereoDft->first_frame, 1)) + hCPE->hStereoDft->q_dft = Q11 + s; + IF( EQ_16( hCPE->hStereoDft->first_frame, 1 ) ) { - //hCPE->q_prev_synth_fx = hCPE->hStereoDft->q_dft; - hCPE->hStereoDft->q_smoothed_nrg = Q6;//hCPE->hStereoDft->q_dft; + hCPE->hStereoDft->q_smoothed_nrg = Q6; // hCPE->hStereoDft->q_dft; hCPE->hStereoDft->q_ap_delay_mem_fx = hCPE->hStereoDft->q_dft; } - // st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact_fx = (Word16)floatToFixed(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact, 15); - floatToFixed_arrL(&st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0], st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd, sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx) / sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0])); - //floatToFixed_arrL(&hCPE->prev_hb_synth[0][0], &hCPE->prev_hb_synth_fx[0][0], hCPE->hStereoDft->q_dft, sizeof(hCPE->prev_hb_synth_fx) / sizeof(hCPE->prev_hb_synth_fx[0][0])); - for (int ii = 0; ii < sizeof(hCPE->hStereoDft->hb_nrg_subr_fx) / sizeof(hCPE->hStereoDft->hb_nrg_subr_fx[0]); ii++) - { - if ( l_hb_nrg_subr < hCPE->hStereoDft->hb_nrg_subr[ii] ) - { - l_hb_nrg_subr = hCPE->hStereoDft->hb_nrg_subr[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg_subr = 0; - if ( l_hb_nrg_subr > (float) MAX_32 ) - { - int quotient = (int) ceil( l_hb_nrg_subr / (float) MAX_32 ); - hCPE->hStereoDft->q_hb_nrg_subr = Q31 - norm_l( quotient ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_subr_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_subr_fx[0] ); ii++ ) - { - hCPE->hStereoDft->hb_nrg_subr_fx[ii] = (Word32) ( hCPE->hStereoDft->hb_nrg_subr[ii] / ( (float) ( 1 << hCPE->hStereoDft->q_hb_nrg_subr ) ) ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) - { - if ( l_hb_nrg < hCPE->hStereoDft->hb_nrg[ii] ) - { - l_hb_nrg = hCPE->hStereoDft->hb_nrg[ii]; - } - } - hCPE->hStereoDft->q_hb_nrg = 0; - if ( l_hb_nrg > (float) MAX_32 ) - { - int quotient = (int) ceil( l_hb_nrg / (float) MAX_32 ); - hCPE->hStereoDft->q_hb_nrg = Q31 - norm_l( quotient ); - } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) + q = hCPE->hStereoDft->q_dft; + scale_sig32( hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub( hCPE->hStereoDft->q_dft, Q11 ) ); + FOR( i = 0; i < CPE_CHANNELS; ++i ) { - hCPE->hStereoDft->hb_nrg_fx[ii] = (Word32)(hCPE->hStereoDft->hb_nrg[ii] * ((float)(1 << hCPE->hStereoDft->q_hb_nrg))); + scale_sig32( hCPE->input_mem_LB_fx[i], STEREO_DFT32MS_OVL_16k, sub( hCPE->hStereoDft->q_dft, Q11 ) ); + scale_sig32( hCPE->input_mem_fx[i], NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); } - //floatToFixed_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0] ) ); - IF( hCPE->hStereoCng != NULL ) - { - floatToFixed_arr( &hCPE->hStereoCng->cm[0], &hCPE->hStereoCng->cm_fx[0], Q15, sizeof( hCPE->hStereoCng->cm_fx ) / sizeof( hCPE->hStereoCng->cm_fx[0] ) ); - } - //floatToFixed_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0] ) ); - for ( int ii = 0; ii < 2; ii++ ) - { - floatToFixed_arrL( &p_output[ii][0], &p_output_fx[ii][0], hCPE->hStereoDft->q_dft, ( 48000 / FRAMES_PER_SEC ) ); - } - q = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hCPE->input_mem_BPF[0][0], &hCPE->input_mem_BPF_fx[0][0], q, STEREO_DFT32MS_OVL_16k); - floatToFixed_arrL(&hCPE->input_mem[0][0], &hCPE->input_mem_fx[0][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - floatToFixed_arrL(&hCPE->input_mem_LB[0][0], &hCPE->input_mem_LB_fx[0][0], q, STEREO_DFT32MS_OVL_16k); - floatToFixed_arrL(&hCPE->input_mem[1][0], &hCPE->input_mem_fx[1][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - floatToFixed_arrL(&hCPE->input_mem_LB[1][0], &hCPE->input_mem_LB_fx[1][0], q, STEREO_DFT32MS_OVL_16k); - if (hSCE != NULL) - { - //floatToFixed_arrL(&hSCE->prev_hb_synth[0], &hSCE->prev_hb_synth_fx[0], hCPE->hStereoDft->q_dft, sizeof(hSCE->prev_hb_synth_fx) / sizeof(hSCE->prev_hb_synth_fx[0])); - //hSCE->q_prev_hb_synth_fx = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hSCE->save_hb_synth[0], &hSCE->save_hb_synth_fx[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - hSCE->q_save_hb_synth_fx = q; - floatToFixed_arrL(&hSCE->save_synth[0], &hSCE->save_synth_fx[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - hSCE->q_save_synth_fx = q; - } IF( hCPE->hCoreCoder[0] != NULL ) { - floatToFixed_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], q, L_FRAME32k); + floatToFixed_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], q, L_FRAME32k ); hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; - floatToFixed_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_out[0], &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], q, L_FRAME48k); - IF( (hCPE->hCoreCoder[0] != NULL) && (hCPE->hCoreCoder[0]->p_bpf_noise_buf_32 != NULL) ) - floatToFixed_arrL(&hCPE->hCoreCoder[0]->p_bpf_noise_buf_float[0], &hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[0], q, L_FRAME16k); + floatToFixed_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], q, L_FRAME48k ); } IF( hCPE->hStereoDft != NULL ) { - floatToFixed_arrL(&hCPE->hStereoDft->td_gain[0], &hCPE->hStereoDft->td_gain_fx[0], Q31, sizeof( hCPE->hStereoDft->td_gain_fx ) / sizeof( hCPE->hStereoDft->td_gain_fx[0] ) ); - floatToFixed_arrL(&hCPE->hStereoDft->ap_delay_mem[0], &hCPE->hStereoDft->ap_delay_mem_fx[0], q, NS2SA( 16000, DELAY_BWE_TOTAL_NS )); - floatToFixed_arrL(&hCPE->hStereoDft->buff_LBTCX_mem[0], &hCPE->hStereoDft->buff_LBTCX_mem_fx[0], q, NS2SA( 16000, STEREO_DFT32MS_OVL_NS )); - hCPE->hStereoDft->q_smooth_buf_fx = Q7; - floatToFixed_arrL(&hCPE->hStereoDft->smooth_buf[0][0], &hCPE->hStereoDft->smooth_buf_fx[0][0], hCPE->hStereoDft->q_smooth_buf_fx, sizeof(hCPE->hStereoDft->smooth_buf_fx) / sizeof(hCPE->hStereoDft->smooth_buf_fx[0][0])); - } - IF (st_ivas->hSpar != NULL) - { - floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], Q31, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); - for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) - { - for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) - { - floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], - &st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], - Q31, - st_ivas->hSpar->hMdDec->mix_mat_dim_2); - } - } - } - //hCPE->lt_es_em_fx = floatToFixed(hCPE->lt_es_em, Q15); - for (int ii = 0; ii < CPE_CHANNELS; ii++) - { - hCPE->q_output_mem_fx[ii] = hCPE->hStereoDft->q_dft; - floatToFixed_arrL(&hCPE->output_mem[ii][0], &hCPE->output_mem_fx[ii][0], hCPE->hStereoDft->q_dft, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS )); + scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); + scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA( 16000, DELAY_BWE_TOTAL_NS ), sub( hCPE->hStereoDft->q_dft, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); + hCPE->hStereoDft->q_ap_fade_mem_fx = hCPE->hStereoDft->q_dft; } - floatToFixed_arrL(&hCPE->prev_synth[0][0], &hCPE->prev_synth_fx[0][0], hCPE->q_prev_synth_fx, sizeof(hCPE->prev_synth) / sizeof(hCPE->prev_synth[0][0])); - - ivas_sba_dirac_stereo_dec_fx( st_ivas, p_output_fx, output_frame, 1 ); - - fixedToFloat_arrL(&hCPE->prev_synth_fx[0][0], &hCPE->prev_synth[0][0], hCPE->q_prev_synth_fx, sizeof(hCPE->prev_synth) / sizeof(hCPE->prev_synth[0][0])); - // st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact = fixedToFloat( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_rescale_fact_fx, 15 ); - fixedToFloat_arrL( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd[0], st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->q_smoothed_psd, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->smoothed_psd_fx[0] ) ); - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_subr_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_subr_fx[0] ); ii++ ) + IF( st_ivas->hSpar != NULL ) { - hCPE->hStereoDft->hb_nrg_subr[ii] = ((float)hCPE->hStereoDft->hb_nrg_subr_fx[ii] / ((float)(1 << hCPE->hStereoDft->q_hb_nrg_subr))); + st_ivas->hSpar->hMdDec->Q_mixer_mat = 30; } - for ( int ii = 0; ii < sizeof( hCPE->hStereoDft->hb_nrg_fx ) / sizeof( hCPE->hStereoDft->hb_nrg_fx[0] ); ii++ ) + + IF( hSCE != NULL ) { - hCPE->hStereoDft->hb_nrg[ii] = ( (float) hCPE->hStereoDft->hb_nrg_fx[ii] * ( (float) ( 1 << hCPE->hStereoDft->q_hb_nrg ) ) ); + Scale_sig32( &hSCE->save_hb_synth_fx[0], (Word16) ( hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC ), hCPE->hStereoDft->q_dft - hSCE->q_save_hb_synth_fx ); + hSCE->q_save_hb_synth_fx = hCPE->hStereoDft->q_dft; + Scale_sig32( &hSCE->save_synth_fx[0], (Word16) ( hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC ), hCPE->hStereoDft->q_dft - hSCE->q_save_synth_fx ); + hSCE->q_save_synth_fx = hCPE->hStereoDft->q_dft; } - //fixedToFloat_arr(&st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm[0], Q15, sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx) / sizeof(st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_cm_fx[0])); - //fixedToFloat_arrL(&hCPE->prev_hb_synth_fx[0][0], &hCPE->prev_hb_synth[0][0], hCPE->hStereoDft->q_dft, sizeof(hCPE->prev_hb_synth_fx) / sizeof(hCPE->prev_hb_synth_fx[0][0])); - IF (hCPE->hStereoCng != NULL) + FOR( int ii = 0; ii < CPE_CHANNELS; ii++ ) { - fixedToFloat_arr( &hCPE->hStereoCng->cm_fx[0], &hCPE->hStereoCng->cm[0], Q15, sizeof( hCPE->hStereoCng->cm_fx ) / sizeof( hCPE->hStereoCng->cm_fx[0] ) ); + scale_sig32( hCPE->output_mem_fx[ii], NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( hCPE->hStereoDft->q_dft, Q11 ) ); + hCPE->q_output_mem_fx[ii] = hCPE->hStereoDft->q_dft; } - //fixedToFloat_arr( &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0], &st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state[0], Q15, sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx ) / sizeof( st_ivas->hCPE[0]->hCoreCoder[0]->hFdCngDec->cna_g_state_fx[0] ) ); - for ( int ii = 0; ii < 2; ii++ ) + Scale_sig32( &hCPE->prev_synth_fx[0][0], sizeof( hCPE->prev_synth_fx) / sizeof(hCPE->prev_synth_fx[0][0]), hCPE->q_prev_synth_fx - 11); + ivas_sba_dirac_stereo_dec_fx(st_ivas, p_output_fx, output_frame, 1); + FOR(i = 0; i < 2; i++) { - fixedToFloat_arrL( &p_output_fx[ii][0], &p_output[ii][0], hCPE->hStereoDft->q_dft, ( 48000 / FRAMES_PER_SEC ) ); + Scale_sig32(p_output_fx[i], L_FRAME48k, negate(s)); } - fixedToFloat_arrL(&hCPE->input_mem_BPF_fx[0][0], &hCPE->input_mem_BPF[0][0], q, STEREO_DFT32MS_OVL_16k); - fixedToFloat_arrL(&hCPE->input_mem_fx[0][0], &hCPE->input_mem[0][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&hCPE->input_mem_LB_fx[0][0], &hCPE->input_mem_LB[0][0], q, STEREO_DFT32MS_OVL_16k); - fixedToFloat_arrL(&hCPE->input_mem_fx[1][0], &hCPE->input_mem[1][0], q, NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&hCPE->input_mem_LB_fx[1][0], &hCPE->input_mem_LB[1][0], q, STEREO_DFT32MS_OVL_16k); - if (hSCE != NULL) + Scale_sig32(&hCPE->prev_synth_fx[0][0], sizeof(hCPE->prev_synth_fx) / sizeof(hCPE->prev_synth_fx[0][0] ), 11 - hCPE->q_prev_synth_fx ); + + scale_sig32( hCPE->input_mem_BPF_fx[0], STEREO_DFT32MS_OVL_16k, sub( Q11, hCPE->hStereoDft->q_dft ) ); + FOR( i = 0; i < CPE_CHANNELS; ++i ) { - //fixedToFloat_arrL(&hSCE->prev_hb_synth_fx[0], &hSCE->prev_hb_synth[0], hCPE->hStereoDft->q_dft, sizeof(hSCE->prev_hb_synth_fx) / sizeof(hSCE->prev_hb_synth_fx[0])); - fixedToFloat_arrL(&hSCE->save_synth_fx[0], &hSCE->save_synth[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); - fixedToFloat_arrL(&hSCE->save_hb_synth_fx[0], &hSCE->save_hb_synth[0], q, (Word16)(hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC)); + scale_sig32( hCPE->input_mem_LB_fx[i], STEREO_DFT32MS_OVL_16k, sub( Q11, hCPE->hStereoDft->q_dft ) ); + scale_sig32( hCPE->input_mem_fx[i], NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); } + IF( hCPE->hCoreCoder[0] != NULL ) { - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], q, L_FRAME32k); - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], q, L_FRAME48k); - IF( hCPE->hCoreCoder[0]->p_bpf_noise_buf_32 != NULL ) - fixedToFloat_arrL(&hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[0], &hCPE->hCoreCoder[0]->p_bpf_noise_buf_float[0], q, L_FRAME16k); + fixedToFloat_arrL( &hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_outLB[0], q, L_FRAME32k ); + fixedToFloat_arrL( &hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[0], &hCPE->hCoreCoder[0]->hHQ_core->old_out[0], q, L_FRAME48k ); } IF( hCPE->hStereoDft != NULL ) { - fixedToFloat_arrL( &hCPE->hStereoDft->td_gain_fx[0], &hCPE->hStereoDft->td_gain[0], Q31, sizeof( hCPE->hStereoDft->td_gain_fx ) / sizeof( hCPE->hStereoDft->td_gain_fx[0] ) ); - fixedToFloat_arrL(&hCPE->hStereoDft->ap_delay_mem_fx[0], &hCPE->hStereoDft->ap_delay_mem[0], q, NS2SA( 16000, DELAY_BWE_TOTAL_NS )); - fixedToFloat_arrL(&hCPE->hStereoDft->buff_LBTCX_mem_fx[0], &hCPE->hStereoDft->buff_LBTCX_mem[0], q, NS2SA( 16000, STEREO_DFT32MS_OVL_NS )); - fixedToFloat_arrL(&hCPE->hStereoDft->smooth_buf_fx[0][0], &hCPE->hStereoDft->smooth_buf[0][0], hCPE->hStereoDft->q_smooth_buf_fx, sizeof(hCPE->hStereoDft->smooth_buf_fx) / sizeof(hCPE->hStereoDft->smooth_buf_fx[0][0])); + scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); + scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA( 16000, DELAY_BWE_TOTAL_NS ), sub( Q11, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); + hCPE->hStereoDft->q_ap_fade_mem_fx = Q11; + + //fixedToFloat_arrL( &hCPE->hStereoDft->td_gain_fx[0], &hCPE->hStereoDft->td_gain[0], Q31, sizeof( hCPE->hStereoDft->td_gain_fx ) / sizeof( hCPE->hStereoDft->td_gain_fx[0] ) ); } - IF (st_ivas->hSpar != NULL) + IF( st_ivas->hSpar != NULL ) { - fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], Q31, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); - for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) + st_ivas->hSpar->hMdDec->Q_mixer_mat = 31; + FOR( int ii = 0; ii < CPE_CHANNELS; ii++ ) { - for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) - { - fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], - &st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], - Q31, - st_ivas->hSpar->hMdDec->mix_mat_dim_2); - } + scale_sig32( hCPE->output_mem_fx[ii], NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); + hCPE->q_output_mem_fx[ii] = Q11; } } - for (int ii = 0; ii < CPE_CHANNELS; ii++) - { - fixedToFloat_arrL(&hCPE->output_mem_fx[ii][0], &hCPE->output_mem[ii][0], hCPE->hStereoDft->q_dft, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, STEREO_DFT32MS_OVL_NS )); - } - //hCPE->lt_es_em = fixedToFloat(hCPE->lt_es_em_fx, Q15); - } #endif } /* HP filtering */ - for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + FOR( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < output_frame; i++ ) - { - p_output_fx[n][i] = (Word32) ( p_output[n][i] * ( 1 << 11 ) ); - } hp20_fix32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); - for ( i = 0; i < output_frame; i++ ) - { - p_output[n][i] = (float) p_output_fx[n][i] / ( 1 << 11 ); - } -#else - hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); -#endif // IVAS_FLOAT_FIXED } - if ( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO ) + IF( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO ) { -#ifdef IVAS_FLOAT_FIXED - for ( int lp = 0; lp < 12; lp++ ) - { - if ( p_output[lp] != NULL ) - { - for ( int lp2 = 0; lp2 < output_frame; lp2++ ) - { - p_output_fx[lp][lp2] = (Word32) ( p_output[lp][lp2] * ( 1u << 11 ) ); - } - } - } ivas_mono_stereo_downmix_mcmasa_fx( st_ivas, p_output_fx, output_frame ); - - for ( int lp = 0; lp < 12; lp++ ) - { - if ( p_output[lp] != NULL ) - { - for ( int lp2 = 0; lp2 < output_frame; lp2++ ) - { - p_output[lp][lp2] = (float) p_output_fx[lp][lp2] / ( 1u << 11 ); - } - } - } -#else - ivas_mono_stereo_downmix_mcmasa( st_ivas, p_output, output_frame ); -#endif } } } + FOR( Word16 ch = 0; ch < 12; ch++ ) IF(p_output[ch]) + { + fixedToFloat_arrL( p_output_fx[ch], p_output[ch], Q11, L_FRAME48k ); + } + /*----------------------------------------------------------------* * Write IVAS transport channels *----------------------------------------------------------------*/ @@ -5266,11 +2282,6 @@ ivas_error ivas_jbm_dec_tc( { f2me_16( st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain, &st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain_fx, &st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain_e ); } - - for ( int lp = 0; lp < n_ch_cldfb_tmp; lp++ ) - { - floatToFixed_arrL( p_output[lp], p_output_fx[lp], 11, 960 ); - } // cldfb_state for ( int ch = 0; ch < n_ch_cldfb_tmp; ch++ ) @@ -5322,11 +2333,19 @@ ivas_error ivas_jbm_dec_tc( } /*------------------------flt 2 fix----------------------*/ - + for ( int lp = 0; lp < n_ch_cldfb_tmp; lp++ ) + { + floatToFixed_arrL( p_output[lp], p_output_fx[lp], 11, 960 ); + } ivas_jbm_dec_copy_tc_no_tsm_fx( st_ivas, p_output_fx, output_frame ); /*------------------------fix 2 flt----------------------*/ // cldfb_state + for ( int lp = 0; lp < n_ch_cldfb_tmp; lp++ ) + { + fixedToFloat_arrL( p_output_fx[lp], p_output[lp], 11, 960 ); + } + for ( int ch = 0; ch < n_ch_cldfb_tmp; ch++ ) { Word16 cldfb_size = st_ivas->cldfbAnaDec[ch]->cldfb_size; @@ -5372,11 +2391,6 @@ ivas_error ivas_jbm_dec_tc( } } - for ( int lp = 0; lp < n_ch_cldfb_tmp; lp++ ) - { - fixedToFloat_arrL( p_output_fx[lp], p_output[lp], 11, 960 ); - } - if ( st_ivas->hParamIsmDec != NULL ) { st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain = me2f_16( st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain_fx, st_ivas->hParamIsmDec->hParamIsm->last_dmx_gain_e ); @@ -5389,11 +2403,7 @@ ivas_error ivas_jbm_dec_tc( fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[lp], st_ivas->hTcBuffer->tc[lp], Q_tc, hTcBuffer->n_samples_buffered ); } } - /*------------------------fix 2 flt----------------------*/ - -#else - ivas_jbm_dec_copy_tc_no_tsm( st_ivas, p_output, output_frame ); #endif } @@ -5424,1496 +2434,716 @@ ivas_error ivas_jbm_dec_tc( return IVAS_ERR_OK; } - - -/*--------------------------------------------------------------------------* - * ivas_jbm_dec_feed_tc_to_renderer() - * - * Feed decoded transport channels and metadata to the IVAS JBM renderer routine - *--------------------------------------------------------------------------*/ - -void ivas_jbm_dec_feed_tc_to_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ - int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - float *data /* i : transport channels */ +#else +ivas_error ivas_jbm_dec_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data /* o : transport channel signals */ ) { - float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ - float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; - int16_t n, n_render_timeslots, i; + int16_t n, output_frame, nchan_out; + Decoder_State *st; /* used for bitstream handling */ + float *p_output[MAX_TRANSPORT_CHANNELS]; /* 'float' buffer for output synthesis */ + int16_t nchan_remapped; + int16_t nb_bits_metadata[MAX_SCE + 1]; + int32_t output_Fs, ivas_total_brate; + AUDIO_CONFIG output_config; + ivas_error error; + int16_t num_md_sub_frames; + int32_t ism_total_brate; - push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); - for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) - { - p_data_f[n] = &data_f[n][0]; - } + push_wmops( "ivas_jbm_dec_tc" ); + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ - if ( st_ivas->hDecoderConfig->Opt_tsm ) - { - ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f ); - } - else + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) { - *nSamplesResidual = 0; + p_output[n] = st_ivas->p_output_f[n]; + if ( p_output[n] != NULL ) + { + set_zero( p_output[n], L_FRAME48k ); + } } - n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; - if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + if ( !st_ivas->hDecoderConfig->Opt_tsm ) { - ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - - if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) { - ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + st_ivas->hTcBuffer->tc[n] = st_ivas->p_output_f[n]; } } - else if ( st_ivas->ivas_format == STEREO_FORMAT ) + + /*----------------------------------------------------------------* + * Decoding + pre-rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->bfi && st_ivas->ini_frame == 0 ) { - ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + /* zero output when first frame(s) is lost */ + for ( n = 0; n < nchan_out; n++ ) + { + set_f( p_output[n], 0.0f, output_frame ); + } + } - else if ( st_ivas->ivas_format == ISM_FORMAT ) + else if ( st_ivas->ivas_format == STEREO_FORMAT ) { - /* Rendering */ - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, 0 ) ) != IVAS_ERR_OK ) { - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) - { -#ifdef IVAS_FLOAT_FIXED - ivas_dirac_dec_set_md_map_fx( st_ivas, n_render_timeslots ); -#if 1/*Float to fix */ - PARAM_ISM_DEC_HANDLE hParamIsmDec; - hParamIsmDec = st_ivas->hParamIsmDec; - FOR( i = 0; i < 11; i++ ) - { - FOR( Word16 j = 0; j < 1; j++ ) - { - FOR( Word16 k = 0; k < 2; k++ ) - { - hParamIsmDec->power_ratios_fx[i][j][k] = (Word16) floatToFixed( hParamIsmDec->power_ratios[i][j][k], 15 ); - } - } - } - //st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx = float_to_fix16( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_flt, 15 ); - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - hSpatParamRendCom = st_ivas->hSpatParamRendCom; - Word16 nBins = hSpatParamRendCom->num_freq_bands; - for ( Word16 sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) - { - for ( Word16 bin_idx = 0; bin_idx < nBins; bin_idx++ ) - { - hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx], 15 ); - hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx], 15 ); - hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx], 15 ); - hSpatParamRendCom->spreadCoherence2_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->spreadCoherence2[sf_idx][bin_idx], 15 ); - hSpatParamRendCom->energy_ratio2_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->energy_ratio2[sf_idx][bin_idx], 15 ); - } - } -#endif // IVAS_FLOAT_FIXED - ivas_param_ism_params_to_masa_param_mapping_fx( st_ivas ); -#if 1 /*Fix to float*/ - FOR( i = 0; i < 11; i++ ) - { - FOR( Word16 j = 0; j < 1; j++ ) - { - FOR( Word16 k = 0; k < 2; k++ ) - { - hParamIsmDec->power_ratios[i][j][k] = fixedToFloat( hParamIsmDec->power_ratios_fx[i][j][k], 15 ); - } - } - } - for ( Word16 sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) - { - for ( Word16 bin_idx = 0; bin_idx < nBins; bin_idx++ ) - { - hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx], 15 ); - hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx], 15 ); - hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx], 15 ); - hSpatParamRendCom->spreadCoherence2[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->spreadCoherence2_fx[sf_idx][bin_idx], 15 ); - hSpatParamRendCom->energy_ratio2[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->energy_ratio2_fx[sf_idx][bin_idx], 15 ); - } - } -#endif -#else - ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots ); - ivas_param_ism_params_to_masa_param_mapping( st_ivas ); -#endif - } - else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) - { - ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f ); - } + return error; } - else /* ISM_MODE_DISC */ + + /* HP filtering */ + for ( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ ) { + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } -#ifdef IVAS_FLOAT_FIXED - ivas_ism_dec_digest_tc_fx(st_ivas); -#else - ivas_ism_dec_digest_tc(st_ivas); -#endif + if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); } } - else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + else if ( st_ivas->ivas_format == ISM_FORMAT ) { -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 num_in_ch = 0, num_bands_out = 0, nchan_transport = 0, num_md_sub_frames = 0, j, b, i_ts, num_out_ch = 0; - SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; - if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + /* Metadata decoding and configuration */ + if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) { - num_md_sub_frames = ivas_get_spar_dec_md_num_subframes(st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate); - num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; - num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; - hSpar->hMdDec->Q_mixer_mat = 31; - num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) + ivas_ism_dtx_dec( st_ivas, nb_bits_metadata ); + + /* decode dominant object first so the noise energy of the other objects can be limited */ + if ( ( error = ivas_sce_dec( st_ivas, st_ivas->hISMDTX.sce_id_dtx, &p_output[st_ivas->hISMDTX.sce_id_dtx], output_frame, nb_bits_metadata[st_ivas->hISMDTX.sce_id_dtx] ) ) != IVAS_ERR_OK ) { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_C_re_fx = s_min(Q_C_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } + return error; } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) + + ivas_ism_dtx_limit_noise_energy_for_near_silence( st_ivas->hSCE, st_ivas->hISMDTX.sce_id_dtx, st_ivas->nchan_transport ); + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hParamIsmDec->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_P_re_fx = s_min(Q_P_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } + return error; } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min(Q_C_re_fx, Q_P_re_fx)); - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) + } + else /* ISM_MODE_DISC */ + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), 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 ) { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } + return error; } - FOR(i = 0; i < num_out_ch; i++) + } + + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + /* for DTX frames, dominant object has already been decoded before */ + if ( !( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) && n == st_ivas->hISMDTX.sce_id_dtx ) ) { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) + if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); + return error; } - } } - FOR(i = 0; i < num_out_ch; i++) + + /* HP filtering */ + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + } + else if ( 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 ) ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( p_output, st_ivas->nchan_transport, output_frame ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + set_s( nb_bits_metadata, 0, MAX_SCE ); + + + /* read parameters from the bitstream */ + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } + return error; } - } - - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) + if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } + ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); } - st_ivas->hTcBuffer->q_tc_fx = 14; - for ( i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); + return error; } - } } - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) + if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) { - st_ivas->hTcBuffer->q_tc_fx = 14; - Word16 nSamplesLeftForTD, default_frame; - default_frame = (Word16)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; + st_ivas->hCPE[0]->brate_surplus = 0; + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } - while (nSamplesLeftForTD) - { - Word16 nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; + /* core-decoding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); + return error; } } - nchan_transport = st_ivas->nchan_transport; - if (st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && (st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || (st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1))) + else if ( st_ivas->nCPE > 1 ) { - nchan_transport = 1; /* Only one channel transported */ + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } } - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) + /* TCs remapping */ + nchan_remapped = st_ivas->nchan_transport; + if ( st_ivas->sba_dirac_stereo_flag ) { - Word32 max_cngNoiseLevel = 0; - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - FOR( i = 0; i < FFTCLDFBLEN; i++) - { - max_cngNoiseLevel = L_max(L_abs((Word32)st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i]), max_cngNoiseLevel); - } - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l(max_cngNoiseLevel); + nchan_remapped = nchan_out; + + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, p_output, p_output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); - floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1); + if ( st_ivas->hSpar->hPCA != NULL ) + { + ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, p_output ); + } - floatToFixed_arrL(st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN); + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ); + } - for ( i = 0; i < FFTLEN; i++) - { - st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15); - } + ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, st_ivas->ivas_format == MC_FORMAT ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_remapped = 1; /* Only one channel transported */ } -#endif - ivas_sba_dec_digest_tc_fx(st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available); -#if 1 - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - st_ivas->hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat(st_ivas->hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], st_ivas->hSpar->hMdDec->Q_mixer_mat); - } - } - } - } + /* HP filtering */ + for ( n = 0; n < nchan_remapped; n++ ) + { + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) - { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } - } - for ( i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); - } - } - } - - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) - { - st_ivas->hTcBuffer->q_tc_fx = 14; - int16_t nSamplesLeftForTD, default_frame; - default_frame = (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; - - while (nSamplesLeftForTD) - { - int16_t nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; - } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); - } - } + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + nchan_remapped = ivas_sba_remapTCs( p_output, st_ivas, output_frame ); - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) - { - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->fftBuffer, st->hFdCngDec->hFdCngCom->fftBuffer_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + ivas_sba_mix_matrix_determiner( st_ivas->hSpar, p_output, st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); + } + else if ( st_ivas->renderer_type != RENDERER_DISABLE ) + { + ivas_spar_dec_agc_pca( st_ivas, p_output, output_frame ); + } + } - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - } -#endif -#else - ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); -#endif + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); + } + else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( p_output, nchan_remapped, output_frame ); + } } - else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { + int16_t nchan_ism, nchan_transport_ism; + int16_t dirac_bs_md_write_idx; - if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) - { -#ifdef IVAS_FLOAT_FIXED - ivas_ism_dec_digest_tc_fx( st_ivas ); -#else - ivas_ism_dec_digest_tc(st_ivas); -#endif + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); - /* delay the objects here for all renderers where it is needed */ - if ( - st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || - st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || - st_ivas->renderer_type == RENDERER_OSBA_AMBI || - st_ivas->renderer_type == RENDERER_OSBA_LS || - st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + /* Set the number of objects for the parametric rendering */ + dirac_bs_md_write_idx = 0; + if ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hSpatParamRendCom->numIsmDirections = 0; + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) { - for ( n = 0; n < st_ivas->nchan_ism; n++ ) - { - delay_signal_float( st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size ); - } + st_ivas->hSpatParamRendCom->numIsmDirections = st_ivas->nchan_ism; } - if ( !st_ivas->sba_dirac_stereo_flag ) - { - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) - { - n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); - } -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 num_in_ch, num_bands_out, nchan_transport, num_md_sub_frames, ch, i, j, b, i_ts, num_out_ch; - SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - num_md_sub_frames = ivas_get_spar_dec_md_num_subframes(st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate); - num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; - num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; - hSpar->hMdDec->Q_mixer_mat = 31; - num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_C_re_fx = s_min(Q_C_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_P_re_fx = s_min(Q_P_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min(Q_C_re_fx, Q_P_re_fx)); - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - } - + dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */ + } - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) - { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } - } - st_ivas->hTcBuffer->q_tc_fx = 14; - for (int i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); - } - } - } + /* MASA metadata decoding */ + if ( ( error = ivas_masa_decode( st_ivas, st_ivas->hCPE[0]->hCoreCoder[0], &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) - { - st_ivas->hTcBuffer->q_tc_fx = 14; - Word16 nSamplesLeftForTD, default_frame; - default_frame = (Word16)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; + /* Configuration of combined-format bit-budget distribution */ + ivas_set_surplus_brate_dec( st_ivas, &ism_total_brate ); - while (nSamplesLeftForTD) - { - Word16 nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; - } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); - } - } - nchan_transport = st_ivas->nchan_transport; - if (st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && (st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || (st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1))) - { - nchan_transport = 1; /* Only one channel transported */ - } + st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream = &( st_ivas->bit_stream[( ism_total_brate / FRAMES_PER_SEC )] ); - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) - { - Word32 max_cngNoiseLevel = 0; - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - FOR(int i = 0; i < FFTCLDFBLEN; i++) - { - max_cngNoiseLevel = L_max(L_abs((Word32)st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i]), max_cngNoiseLevel); - } - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l(max_cngNoiseLevel); + /* set ISM parameters and decode ISM metadata in OMASA format */ + if ( ( error = ivas_omasa_ism_metadata_dec( st_ivas, ism_total_brate, &nchan_ism, &nchan_transport_ism, dirac_bs_md_write_idx, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } - floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1); + /* decode ISM channels */ + for ( n = 0; n < nchan_transport_ism; n++ ) + { + if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[st_ivas->nchan_transport + n], output_frame, nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } - floatToFixed_arrL(st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN); + /* decode MASA channels */ + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } - for (int i = 0; i < FFTLEN; i++) - { - st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15); - } - } -#endif - ivas_sba_dec_digest_tc_fx(st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available); -#if 1 - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - st_ivas->hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat(st_ivas->hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], st_ivas->hSpar->hMdDec->Q_mixer_mat); - } - } - } - } + if ( st_ivas->hCPE[0]->nchan_out == 1 ) + { + mvr2r( p_output[0], p_output[1], output_frame ); /* Copy mono signal to stereo output channels */ + } - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) - { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } - } - for (int i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); - } - } - } + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) - { - st_ivas->hTcBuffer->q_tc_fx = 14; - int16_t nSamplesLeftForTD, default_frame; - default_frame = (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); + } + else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + /* sanity check in case of bitrate switching */ + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); + } - while (nSamplesLeftForTD) - { - int16_t nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; - } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); - } - } + ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) - { - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->fftBuffer, st->hFdCngDec->hFdCngCom->fftBuffer_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); + ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int16_t nchan_ism, sba_ch_idx; - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - } -#endif -#else - ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); -#endif + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + nchan_ism = st_ivas->nchan_ism; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + /* set ISM parameters and decode ISM metadata in OSBA format */ + if ( ( error = ivas_osba_ism_metadata_dec( st_ivas, ivas_total_brate, &nchan_ism, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; } + sba_ch_idx = st_ivas->nchan_ism; } else { - ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 num_in_ch, num_bands_out, nchan_transport, num_md_sub_frames, ch, i, j, b, i_ts, num_out_ch; - SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - num_md_sub_frames = ivas_get_spar_dec_md_num_subframes(st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate); - num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; - num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; - hSpar->hMdDec->Q_mixer_mat = 31; - num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_C_re_fx = s_min(Q_C_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_P_re_fx = s_min(Q_P_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min(Q_C_re_fx, Q_P_re_fx)); - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } - } - } - } + nb_bits_metadata[1] += NO_BITS_MASA_ISM_NO_OBJ; + sba_ch_idx = 0; + } + /* SBA metadata decoding */ + if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) - { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } - } - st_ivas->hTcBuffer->q_tc_fx = 14; - for (int i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); - } - } - } + if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) + /* core-decoding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) { - st_ivas->hTcBuffer->q_tc_fx = 14; - Word16 nSamplesLeftForTD, default_frame; - default_frame = (Word16)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; - - while (nSamplesLeftForTD) - { - Word16 nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; - } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); - } + return error; } - nchan_transport = st_ivas->nchan_transport; - if (st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && (st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || (st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1))) + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) { - nchan_transport = 1; /* Only one channel transported */ + return error; } + } + + if ( st_ivas->sba_dirac_stereo_flag ) + { + ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, &p_output[sba_ch_idx], &p_output[sba_ch_idx], st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) + if ( st_ivas->hSpar->hPCA != NULL ) { - Word32 max_cngNoiseLevel = 0; - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - FOR(int i = 0; i < FFTCLDFBLEN; i++) - { - max_cngNoiseLevel = L_max(L_abs((Word32)st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i]), max_cngNoiseLevel); - } - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l(max_cngNoiseLevel); + ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, &p_output[sba_ch_idx] ); + } - floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1); + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, 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 ) ); - floatToFixed_arrL(st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN); + ivas_sba_dirac_stereo_dec( st_ivas, &p_output[sba_ch_idx], output_frame, 0 ); + } - for (int i = 0; i < FFTLEN; i++) - { - st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15); - } - } -#endif - ivas_sba_dec_digest_tc_fx(st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available); -#if 1 - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - st_ivas->hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat(st_ivas->hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], st_ivas->hSpar->hMdDec->Q_mixer_mat); - } - } - } - } + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) - { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } - } - for (int i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); - } - } - } + nchan_remapped = ivas_sba_remapTCs( &p_output[sba_ch_idx], st_ivas, output_frame ); - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) - { - st_ivas->hTcBuffer->q_tc_fx = 14; - int16_t nSamplesLeftForTD, default_frame; - default_frame = (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); - while (nSamplesLeftForTD) - { - int16_t nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; - } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); - } - } + ivas_sba_mix_matrix_determiner( st_ivas->hSpar, &p_output[sba_ch_idx], st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames ); + } + else if ( st_ivas->renderer_type != RENDERER_DISABLE && !st_ivas->sba_dirac_stereo_flag ) + { + ivas_spar_dec_agc_pca( st_ivas, &p_output[sba_ch_idx], output_frame ); + } - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) - { - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->fftBuffer, st->hFdCngDec->hFdCngCom->fftBuffer_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + /* loudness correction */ + ivas_dirac_dec_binaural_sba_gain( &p_output[sba_ch_idx], nchan_remapped, output_frame ); + } + else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame ); - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); + /* add W */ + for ( n = 0; n < nchan_out; n++ ) + { + v_add( p_output[n], p_output[n + max( nchan_out, nchan_ism )], p_output[n], output_frame ); } -#endif -#else - ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); -#endif } } - else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + else if ( st_ivas->ivas_format == MC_FORMAT ) { - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + if ( st_ivas->mc_mode == MC_MODE_MCT ) { - n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); - } -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 num_in_ch, num_bands_out, nchan_transport, num_md_sub_frames, ch, i, j, b, i_ts, num_out_ch; - SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - num_md_sub_frames = ivas_get_spar_dec_md_num_subframes(st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate); - num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; - num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; - hSpar->hMdDec->Q_mixer_mat = 31; - num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) + /* LFE channel decoder */ + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] ); + + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, 0 ) ) != IVAS_ERR_OK ) { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_C_re_fx = s_min(Q_C_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } + return error; } - } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) + if ( n != LFE_CHANNEL ) { - Q_P_re_fx = s_min(Q_P_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } - } } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min(Q_C_re_fx, Q_P_re_fx)); - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) + + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); } - } } - FOR(i = 0; i < num_out_ch; i++) + + if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) + if ( st_ivas->renderer_type == RENDERER_MC ) { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); } - } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); } - } } - } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + /* LFE channel decoder */ + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] ); + ivas_mc_paramupmix_dec_read_BS( st_ivas, st, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] ); - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } + return error; } - st_ivas->hTcBuffer->q_tc_fx = 14; - for (int i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); + if ( n != LFE_CHANNEL ) + { + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } } - } - } - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) - { - st_ivas->hTcBuffer->q_tc_fx = 14; - Word16 nSamplesLeftForTD, default_frame; - default_frame = (Word16)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_MC && ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + /* Compensate loudness for not doing full upmix */ + for ( n = 4; n < 8; n++ ) + { + v_multc( p_output[n], 2.0f, p_output[n], output_frame ); + } - while (nSamplesLeftForTD) - { - Word16 nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; - } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); - } - } - nchan_transport = st_ivas->nchan_transport; - if (st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && (st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || (st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1))) - { - nchan_transport = 1; /* Only one channel transported */ + if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ivas_ls_setup_conversion( st_ivas, audioCfg2channels( IVAS_AUDIO_CONFIG_5_1_2 ), output_frame, p_output, p_output ); + } + } } - - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { - Word32 max_cngNoiseLevel = 0; - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - FOR(int i = 0; i < FFTCLDFBLEN; i++) - { - max_cngNoiseLevel = L_max(L_abs((Word32)st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i]), max_cngNoiseLevel); - } - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l(max_cngNoiseLevel); - - floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1); - - floatToFixed_arrL(st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN); + /* read Parametric MC parameters from the bitstream */ + ivas_param_mc_dec_read_BS( ivas_total_brate, st, st_ivas->hParamMC, &nb_bits_metadata[0] ); - for (int i = 0; i < FFTLEN; i++) - { - st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15); - } - } -#endif - ivas_sba_dec_digest_tc_fx(st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available); -#if 1 - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) + if ( st_ivas->nCPE == 1 ) { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { - st_ivas->hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat(st_ivas->hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], st_ivas->hSpar->hMdDec->Q_mixer_mat); + return error; } - } } - } - - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) + else if ( st_ivas->nCPE > 1 ) { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } + if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } } - for (int i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } - } - } - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) - { - st_ivas->hTcBuffer->q_tc_fx = 14; - int16_t nSamplesLeftForTD, default_frame; - default_frame = (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; - - while (nSamplesLeftForTD) - { - int16_t nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; - } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); - } - } - - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) - { - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->fftBuffer, st->hFdCngDec->hFdCngCom->fftBuffer_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); - - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - } -#endif -#else - ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); -#endif - if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) - { -#ifdef IVAS_FLOAT_FIXED - ivas_ism_dec_digest_tc_fx(st_ivas); -#else - ivas_ism_dec_digest_tc(st_ivas); -#endif - } - } - else if ( st_ivas->ivas_format == MC_FORMAT ) - { - if ( st_ivas->mc_mode == MC_MODE_MCT ) - { - ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - } - else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) - { - ivas_mc_paramupmix_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - } - else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) - { - ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); + /* Rendering */ + if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 num_in_ch, num_bands_out, nchan_transport, num_md_sub_frames, ch, i, j, b, i_ts, num_out_ch; - SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - num_md_sub_frames = ivas_get_spar_dec_md_num_subframes(st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate); - num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; - num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; - hSpar->hMdDec->Q_mixer_mat = 31; - num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) + if ( st_ivas->hOutSetup.separateChannelEnabled ) { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } + st = st_ivas->hCPE[0]->hCoreCoder[0]; /* Metadata is always with CPE in the case of separated channel */ } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) + + /* read McMASA parameters from the bitstream */ + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - Q_C_re_fx = s_min(Q_C_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } - } - } + return error; } - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) + + if ( st_ivas->hOutSetup.separateChannelEnabled ) { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) + /* Decode the transport audio signals */ + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { - FOR(b = 0; b < num_bands_out; b++) - { - Q_P_re_fx = s_min(Q_P_re_fx, Q_factor_L(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS])); - } + return error; } - } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min(Q_C_re_fx, Q_P_re_fx)); - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) + + /* Identify the index of the separated channel, always LFE_CHANNEL-1 here */ + n = LFE_CHANNEL - 1; + + /* Decode the separated channel to output[n] to be combined with the synthesized channels */ + if ( ( error = ivas_sce_dec( st_ivas, 0, &p_output[n], output_frame, 0 ) ) != IVAS_ERR_OK ) { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } + return error; } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < nchan_transport; j++) + + /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */ + if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || + output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || + output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } + ivas_lfe_synth_with_filters( st_ivas->hMasa->hMasaLfeSynth, p_output, output_frame, n, LFE_CHANNEL ); } - } - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = nchan_transport; j < num_out_ch; j++) + else if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) { - FOR(b = 0; b < num_bands_out; b++) - { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed(hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat); - } + /* Delay the separated channel to sync with the DirAC rendering */ + delay_signal_float( p_output[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size ); } - } } - - - 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))) + else { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) - { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) { - ch_sba_idx = st_ivas->nchan_ism; move16(); + if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } } - } - st_ivas->hTcBuffer->q_tc_fx = 14; - for (int i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); - } } - } - - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) - { - st_ivas->hTcBuffer->q_tc_fx = 14; - Word16 nSamplesLeftForTD, default_frame; - default_frame = (Word16)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; - while (nSamplesLeftForTD) + if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ { - Word16 nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; + ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, 1 ); } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); + hp20_flt( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } - } - nchan_transport = st_ivas->nchan_transport; - if (st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && (st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || (st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1))) - { - nchan_transport = 1; /* Only one channel transported */ - } - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) - { - Word32 max_cngNoiseLevel = 0; - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - FOR(int i = 0; i < FFTCLDFBLEN; i++) + if ( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO ) { - max_cngNoiseLevel = L_max(L_abs((Word32)st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i]), max_cngNoiseLevel); + ivas_mono_stereo_downmix_mcmasa( st_ivas, p_output, output_frame ); } - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l(max_cngNoiseLevel); + } + } - floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1); + /*----------------------------------------------------------------* + * Write IVAS transport channels + *----------------------------------------------------------------*/ - floatToFixed_arrL(st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN); + if ( st_ivas->hDecoderConfig->Opt_tsm == 1 ) + { + ivas_syn_output_f( p_output, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data ); + } + else + { + /* directly copy to tc buffers */ + ivas_jbm_dec_copy_tc_no_tsm( st_ivas, p_output, output_frame ); + } - for (int i = 0; i < FFTLEN; i++) - { - st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15); - } - } -#endif - ivas_sba_dec_digest_tc_fx(st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available); -#if 1 - if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - { - FOR(i_ts = 0; i_ts < num_md_sub_frames; i_ts++) - { - FOR(i = 0; i < num_out_ch; i++) - { - FOR(j = 0; j < num_in_ch; j++) - { - FOR(b = 0; b < num_bands_out; b++) - { - st_ivas->hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat(st_ivas->hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], st_ivas->hSpar->hMdDec->Q_mixer_mat); - } - } - } - } + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ - 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))) - { - Word16 ch_sba_idx = 0; - IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) - { - IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) - { - ch_sba_idx = st_ivas->nchan_ism; move16(); - } - } - for (int i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); - } - } - } + if ( !st_ivas->bfi ) /* do not update if first frame(s) are lost or NO_DATA */ + { + st_ivas->hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + st_ivas->last_active_ivas_total_brate = ( ivas_total_brate <= IVAS_SID_5k2 ) ? st_ivas->last_active_ivas_total_brate : ivas_total_brate; + } - if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) - { - st_ivas->hTcBuffer->q_tc_fx = 14; - int16_t nSamplesLeftForTD, default_frame; - default_frame = (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); - nSamplesLeftForTD = nSamplesForRendering; - Word16 size = 0; + if ( st_ivas->ini_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) ) /* keep "st_ivas->ini_frame = 0" until first good received frame */ + { + st_ivas->ini_frame++; + } - while (nSamplesLeftForTD) - { - int16_t nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); - size += nSamplesToDecorr; - nSamplesLeftForTD -= nSamplesToDecorr; - } - size = s_max(size, default_frame); - for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) - { - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); - } - } + if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_5k2 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */ + { + st_ivas->ini_active_frame++; + } - if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || - ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) - { - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->fftBuffer, st->hFdCngDec->hFdCngCom->fftBuffer_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); + st_ivas->last_ivas_format = st_ivas->ivas_format; - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); - } -#endif -#else - ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); -#endif - } - } pop_wmops(); - return; + return IVAS_ERR_OK; } +#endif /*--------------------------------------------------------------------------* - * ivas_dec_render() + * ivas_jbm_dec_feed_tc_to_renderer() * - * Principal IVAS JBM rendering routine + * Feed decoded transport channels and metadata to the IVAS JBM renderer routine *--------------------------------------------------------------------------*/ - -ivas_error ivas_jbm_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const uint16_t nSamplesAsked, /* i : number of samples wanted */ - uint16_t *nSamplesRendered, /* o : number of samples rendered */ - uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ - int16_t *data /* o : output synthesis signal */ +#ifdef IVAS_FLOAT_FIXED +void ivas_jbm_dec_feed_tc_to_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i : transport channels */ ) { - int16_t n, nchan_out; - int16_t nchan_transport; - int16_t nchan_remapped; - int32_t output_Fs; - AUDIO_CONFIG output_config; - int16_t nSamplesAskedLocal; - ivas_error error; - float *p_output[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; - float *p_tc[MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS]; -#ifdef IVAS_FLOAT_FIXED - Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; - Word32 tmp_buffer_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k] = { 0 }; - Word32 *p_temp_fx[MAX_OUTPUT_CHANNELS]; - Word32 *p_tc_fx[MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS]; - Word16 subframe_len, gd_bits, exp, nchan_in, i, j; - const Word16 output_q_factor = Q11; -#endif - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k] = { 0 }; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ + float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; + int16_t n, n_render_timeslots, i; - push_wmops( "ivas_dec_render" ); - /*----------------------------------------------------------------* - * Initialization of local vars after struct has been set - *----------------------------------------------------------------*/ + push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); + for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) + { + p_data_f[n] = &data_f[n][0]; + } - hSpatParamRendCom = st_ivas->hSpatParamRendCom; - output_Fs = st_ivas->hDecoderConfig->output_Fs; - nchan_out = st_ivas->hDecoderConfig->nchan_out; - nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; - output_config = st_ivas->hDecoderConfig->output_config; - nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard; - for ( n = 0; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + if ( st_ivas->hDecoderConfig->Opt_tsm ) { - p_output[n] = st_ivas->p_output_f[n]; -#ifdef IVAS_FLOAT_FIXED - p_output_fx[n] = st_ivas->p_output_fx[n]; -#endif - } -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - p_temp_fx[i] = tmp_buffer_fx[i]; - } -#endif - if ( !st_ivas->hDecoderConfig->Opt_tsm ) - { - for ( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) - { - p_tc[n] = p_output[n]; -#ifdef IVAS_FLOAT_FIXED - p_tc_fx[n] = p_output_fx[n]; -#endif - } - - for ( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) - { - st_ivas->hTcBuffer->tc[n] = p_output[n]; -#ifdef IVAS_FLOAT_FIXED - st_ivas->hTcBuffer->tc_fx[n] = st_ivas->p_output_fx[n]; -#endif - } + ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f ); } else { - for ( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) - { - p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered]; -#ifdef IVAS_FLOAT_FIXED - p_tc_fx[n] = &st_ivas->hTcBuffer->tc_fx[n][st_ivas->hTcBuffer->n_samples_rendered]; -#endif - } - } - - /*----------------------------------------------------------------* - * Update combined orientation access index - *----------------------------------------------------------------*/ - - if ( st_ivas->hCombinedOrientationData != NULL ) - { - /* take the discard samples into account here to make sure head rotation stays on the correct 5ms grid */ - st_ivas->hCombinedOrientationData->cur_subframe_samples_rendered_start -= st_ivas->hTcBuffer->n_samples_discard; - - ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); + *nSamplesResidual = 0; } + n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; - /*----------------------------------------------------------------* - * Rendering - *----------------------------------------------------------------*/ - - if ( st_ivas->ivas_format == UNDEFINED_FORMAT ) - { - assert( 0 ); - } - else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) { -#ifdef IVAS_FLOAT_FIXED - Word16 slot_size, slots_to_render, tmp, e, slots_rendered, nSamplesRendered_tmp; - - slot_size = st_ivas->hTcBuffer->n_samples_granularity; - - /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - tmp = BASOP_Util_Divide1616_Scale( nSamplesAsked, slot_size, &e ); - tmp = shr( tmp, sub( 15, e ) ); - slots_to_render = s_min( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered ), tmp ); - slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, slots_to_render ); - nSamplesRendered_tmp = (UWord16) L_mult0( slots_to_render, slot_size ); - FOR(Word16 ind = 0; ind < st_ivas->hTcBuffer->nchan_transport_jbm; ind++) { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ind] + st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hTcBuffer->tc_fx[ind] + st_ivas->hTcBuffer->n_samples_rendered, Q11, nSamplesRendered_tmp); - floatToFixed_arrL(p_output[ind], p_output_fx[ind], Q11, s_max(*nSamplesRendered, nSamplesAskedLocal)); - } - - ivas_jbm_dec_tc_buffer_playout_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output_fx ); + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - FOR(Word16 ind = 0; ind < st_ivas->hTcBuffer->nchan_transport_jbm; ind++) { - fixedToFloat_arrL(p_output_fx[ind], p_output[ind], Q11, s_max(*nSamplesRendered, nSamplesAskedLocal)); + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); } -#else - ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); -#endif } else if ( st_ivas->ivas_format == STEREO_FORMAT ) { - /* Rendering */ - if ( st_ivas->renderer_type == RENDERER_MC ) - { - *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); -#ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx( st_ivas->nchan_transport ); - FOR( i = 0; i < st_ivas->nchan_transport; ++i ) - { - floatToFixed_arrL( p_tc[i], p_tc_fx[i], q, *nSamplesRendered ); - } - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) - { - FOR( j = 0; j < st_ivas->nchan_transport; j++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); - } - } - ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc_fx, p_output_fx ); - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; ++i ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); - } -#else - ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); -#endif - } + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); } else if ( st_ivas->ivas_format == ISM_FORMAT ) { @@ -6922,1138 +3152,2801 @@ ivas_error ivas_jbm_dec_render( { if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { - ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output ); - } - else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) - { - *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); -#ifdef IVAS_FLOAT_FIXED - for ( int lp = 0; lp < L_FRAME48k; lp++ ) + ivas_dirac_dec_set_md_map_fx( st_ivas, n_render_timeslots ); +#if 1 /*Float to fix */ + PARAM_ISM_DEC_HANDLE hParamIsmDec; + hParamIsmDec = st_ivas->hParamIsmDec; + FOR( i = 0; i < 11; i++ ) { - p_output_fx[0][lp] = (Word32) ( p_output[0][lp] * ( 1u << 11 ) ); - p_output_fx[1][lp] = (Word32) ( p_output[1][lp] * ( 1u << 11 ) ); + FOR( Word16 j = 0; j < 1; j++ ) + { + FOR( Word16 k = 0; k < 2; k++ ) + { + hParamIsmDec->power_ratios_fx[i][j][k] = (Word16) floatToFixed( hParamIsmDec->power_ratios[i][j][k], 15 ); + } + } } - Word16 non_diegetic_pan_gain_fx = (Word16) ( 32767 * st_ivas->hDecoderConfig->non_diegetic_pan_gain ); - ivas_apply_non_diegetic_panning_fx( p_output_fx, non_diegetic_pan_gain_fx, *nSamplesRendered ); - for ( int lp = 0; lp < L_FRAME48k; lp++ ) + // st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx = float_to_fix16( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_flt, 15 ); + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + Word16 nBins = hSpatParamRendCom->num_freq_bands; + for ( Word16 sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { - p_output[0][lp] = (float) p_output_fx[0][lp] / ( 1u << 11 ); - p_output[1][lp] = (float) p_output_fx[1][lp] / ( 1u << 11 ); + for ( Word16 bin_idx = 0; bin_idx < nBins; bin_idx++ ) + { + hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx], 15 ); + hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx], 15 ); + hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx], 15 ); + hSpatParamRendCom->spreadCoherence2_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->spreadCoherence2[sf_idx][bin_idx], 15 ); + hSpatParamRendCom->energy_ratio2_fx[sf_idx][bin_idx] = float_to_fix16( hSpatParamRendCom->energy_ratio2[sf_idx][bin_idx], 15 ); + } + } +#endif // IVAS_FLOAT_FIXED + ivas_param_ism_params_to_masa_param_mapping_fx( st_ivas ); +#if 1 /*Fix to float*/ + FOR( i = 0; i < 11; i++ ) + { + FOR( Word16 j = 0; j < 1; j++ ) + { + FOR( Word16 k = 0; k < 2; k++ ) + { + hParamIsmDec->power_ratios[i][j][k] = fixedToFloat( hParamIsmDec->power_ratios_fx[i][j][k], 15 ); + } + } + } + for ( Word16 sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + for ( Word16 bin_idx = 0; bin_idx < nBins; bin_idx++ ) + { + hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx], 15 ); + hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx], 15 ); + hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx], 15 ); + hSpatParamRendCom->spreadCoherence2[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->spreadCoherence2_fx[sf_idx][bin_idx], 15 ); + hSpatParamRendCom->energy_ratio2[sf_idx][bin_idx] = fixedToFloat( hSpatParamRendCom->energy_ratio2_fx[sf_idx][bin_idx], 15 ); + } } -#else - ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); #endif } else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { -#ifdef IVAS_FLOAT_FIXED - Word32 output_fx_tmp[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; - Word16 ch; - Word32 *p_output_fx_tmp[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; - FOR( Word16 lp = 0; lp < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; lp++ ) + ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f ); + } + } + else /* ISM_MODE_DISC */ + { + ivas_ism_dec_digest_tc_fx( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { +#if 1 + Word16 num_in_ch = 0, num_bands_out = 0, nchan_transport = 0, num_md_sub_frames = 0, num_out_ch = 0; + SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + hSpar->hMdDec->Q_mixer_mat = 31; + num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + + 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 ) ) ) + { + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - p_output_fx_tmp[lp] = &output_fx_tmp[lp][0]; + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + ch_sba_idx = st_ivas->nchan_ism; + move16(); + } } - - Word16 Q_p_output_buf = Q11; - FOR( i = 0; i < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + st_ivas->hTcBuffer->q_tc_fx = 14; + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) { - floatToFixed_arrL( p_output[i], p_output_fx_tmp[i], Q_p_output_buf, L_FRAME48k ); + floatToFixed_arrL( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); } - /*-------------------------------------------flt 2 fix----------------------------------------------------------*/ - /*-----following buffers and values are getting used in the function and hence are in the intermediate conv-----*/ - /*i : st_ivas->hParamIsmDec->hParamIsmRendering->mixing_matrix_lin-------------------------------------norm-Q-*/ - /*i/o : st_ivas->hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_old---------------------------------norm-Q-*/ - /*i : st_ivas->hParamIsmDec->hParamIsmRendering->interpolator------------------------------------------Q14----*/ - /*i/o : st_ivas->hParamIsmDec->azimuth_values------------------------------------------------------------Q22----*/ - /*i/o : st_ivas->hParamIsmDec->elevation_values----------------------------------------------------------Q22----*/ - /*i : st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc-----------------------------------norm-Q-*/ - /*i : st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc-----------------------------------norm-Q-*/ - /*i/o : st_ivas->cldfbSynDec[ch]->cldfb_state------------------------------------------------------------Q11----*/ - /*--------------------------------------------------------------------------------------------------------------*/ + } + } - f2me_buf( (float *) st_ivas->hParamIsmDec->hParamIsmRendering->mixing_matrix_lin, (Word32 *) st_ivas->hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_fx, &st_ivas->hParamIsmDec->hParamIsmRendering->exp_mixing_matrix_lin_fx, CLDFB_NO_CHANNELS_MAX * ( PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX ) ); + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + { + st_ivas->hTcBuffer->q_tc_fx = 14; + Word16 nSamplesLeftForTD, default_frame; + default_frame = (Word16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; - Word16 n_slots_to_alloc = st_ivas->hDecoderConfig->Opt_tsm == 1 ? 32 : 16; - Word16 n_chan_transport_t = st_ivas->nchan_transport; - Word16 freq_bands = st_ivas->hSpatParamRendCom->num_freq_bands; + while ( nSamplesLeftForTD ) + { + Word16 nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; + } + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); + } + } + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_transport = 1; /* Only one channel transported */ + } - Word16 size = n_slots_to_alloc * n_chan_transport_t * freq_bands; + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) + { + Word32 max_cngNoiseLevel = 0; + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + FOR( i = 0; i < FFTCLDFBLEN; i++ ) + { + max_cngNoiseLevel = L_max( L_abs( (Word32) st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i] ), max_cngNoiseLevel ); + } + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l( max_cngNoiseLevel ); - f2me_buf( st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc, st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx, &st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp, size ); - f2me_buf( st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc, st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx, &st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp, size ); + //floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1 ); - Word16 n_out; - if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) - { - n_out = st_ivas->nchan_ism; - } - else - { - n_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; - } + floatToFixed_arrL( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN ); - for ( ch = 0; ch < n_out; ch++ ) - { - floatToFixed_arrL( st_ivas->cldfbSynDec[ch]->cldfb_state, st_ivas->cldfbSynDec[ch]->cldfb_state_fx, Q11, st_ivas->cldfbSynDec[ch]->p_filter_length ); - } - /*-------------------------------------flt 2 fix----------------------------------------------------------*/ + //for ( i = 0; i < FFTLEN; i++ ) + //{ + // st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15 ); + //} + } +#endif + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - ivas_param_ism_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext,p_output_fx_tmp ); +#if 1 + if (st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) + { + 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))) + { + Word16 ch_sba_idx = 0; + IF(EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT)) + { + IF(EQ_16(st_ivas->ism_mode, ISM_SBA_MODE_DISC)) + { + ch_sba_idx = st_ivas->nchan_ism; move16(); + } + } + for ( i = 0; i < ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate) + ch_sba_idx; i++) + { + fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min(nSamplesForRendering, (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC))); + } + } + } - /*-----------------------------------------fix 2 flt--------------------------------------------*/ - for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) + if (st_ivas->hDiracDecBin != NULL && (st_ivas->hDiracDecBin->useTdDecorr)) + { + st_ivas->hTcBuffer->q_tc_fx = 14; + int16_t nSamplesLeftForTD, default_frame; + default_frame = (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; + + while (nSamplesLeftForTD) + { + int16_t nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; + } + size = s_max(size, default_frame); + for (int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++) + { + fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size); + } + } + + if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || + ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->fftBuffer, st->hFdCngDec->hFdCngCom->fftBuffer_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); + + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); + fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); + } +#endif + + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + ivas_ism_dec_digest_tc_fx( st_ivas ); + + /* delay the objects here for all renderers where it is needed */ + if ( + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_OSBA_LS || + st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) { - st_ivas->hIsmMetaData[ch]->azimuth = fixedToFloat( st_ivas->hIsmMetaData[ch]->azimuth_fx, Q22 ); - st_ivas->hIsmMetaData[ch]->elevation = fixedToFloat( st_ivas->hIsmMetaData[ch]->elevation_fx, Q22 ); + delay_signal_float( st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size ); } - for ( ch = 0; ch < n_out; ch++ ) + } + + if ( !st_ivas->sba_dirac_stereo_flag ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { - fixedToFloat_arrL( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_state, Q11, st_ivas->cldfbSynDec[ch]->p_filter_length ); - fixedToFloat_arrL( p_output_fx_tmp[ch], p_output[ch], Q11, L_FRAME48k ); + n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); } - /*-----------------------------------------fix 2 flt--------------------------------------------*/ - -#else - ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); -#endif - if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) - { - /* Convert CICP19 -> Ambisonics */ -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word16 Q_in_buffer_td = 31; - FOR( i = 0; i < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) - { - Q_in_buffer_td = s_min( Q_in_buffer_td, Q_factor_arrL( p_output[i], *nSamplesRendered ) ); - } - FOR( i = 0; i < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], Q_in_buffer_td, *nSamplesRendered ); - } -#endif // IVAS_FLOAT_FIXED - ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_fx, p_output_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); #if 1 - FOR( i = 0; i < ( st_ivas->hOutSetup.ambisonics_order + 1 ) * ( st_ivas->hOutSetup.ambisonics_order + 1 ); i++ ) + Word16 num_in_ch = 0, num_bands_out = 0, nchan_transport = 0, num_md_sub_frames = 0, num_out_ch = 0; + SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + hSpar->hMdDec->Q_mixer_mat = 31; + num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + + 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 ) ) ) { - fixedToFloat_arrL( p_output_fx[i], p_output[i], Q_in_buffer_td - 3, *nSamplesRendered ); + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + ch_sba_idx = st_ivas->nchan_ism; + move16(); + } + } + st_ivas->hTcBuffer->q_tc_fx = 14; + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); + } } -#endif -#else - ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#endif // IVAS_FLOAT_FIXED } - } - } - else /* ISM_MODE_DISC */ - { - *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); - /* Loudspeaker or Ambisonics rendering */ - if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) - { - /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ -#ifdef IVAS_FLOAT_FIXED - Word16 q = 11; - FOR( Word16 ind1 = 0; ind1 < s_max( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); ind1++ ) + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) { - FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + st_ivas->hTcBuffer->q_tc_fx = 14; + Word16 nSamplesLeftForTD, default_frame; + default_frame = (Word16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; + + while ( nSamplesLeftForTD ) { - p_output_fx[ind1][ind2] = (Word16) ( p_output[ind1][ind2] * ( 1 << q ) ); + Word16 nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; } - FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) { - st_ivas->hTcBuffer->tc_fx[ind1][ind2] = (Word32) ( st_ivas->hTcBuffer->tc[ind1][ind2] * ( 1 << q ) ); + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); } } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) { - st_ivas->hIsmMetaData[ind1]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind1]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->elevation * ( 1 << 22 ) ); + nchan_transport = 1; /* Only one channel transported */ } - IF( st_ivas->hCombinedOrientationData ) - FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) + + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) { - FOR( Word16 ind2 = 0; ind2 < 3; ind2++ ) + Word32 max_cngNoiseLevel = 0; + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + FOR( i = 0; i < FFTCLDFBLEN; i++ ) { - st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32) ( st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * ( 1 << 15 ) ); + max_cngNoiseLevel = L_max( L_abs( (Word32) st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i] ), max_cngNoiseLevel ); } - } + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l( max_cngNoiseLevel ); - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); - FOR( Word16 ind1 = 0; ind1 < s_max( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); ind1++ ) + //floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1 ); + + floatToFixed_arrL( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN ); + + //for ( i = 0; i < FFTLEN; i++ ) + //{ + // st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15 ); + //} + } +#endif + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); +#if 1 + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) { - FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + 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 ) ) ) { - p_output[ind1][ind2] = (float) ( p_output_fx[ind1][ind2] ) / (float) ( 1 << q ); + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + ch_sba_idx = st_ivas->nchan_ism; + move16(); + } + } + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) + { + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); + } } } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) - { - st_ivas->hIsmMetaData[ind1]->azimuth = (float) ( st_ivas->hIsmMetaData[ind1]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind1]->elevation = (float) ( st_ivas->hIsmMetaData[ind1]->elevation_fx ) / (float) ( 1 << 22 ); - } -#else - ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); -#endif - } - else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) - { -#ifdef IVAS_FLOAT_FIXED - for ( int lp = 0; lp < L_FRAME48k; lp++ ) + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) { - p_output_fx[0][lp] = (Word32) ( p_output[0][lp] * ( 1u << 11 ) ); - p_output_fx[1][lp] = (Word32) ( p_output[1][lp] * ( 1u << 11 ) ); + st_ivas->hTcBuffer->q_tc_fx = 14; + int16_t nSamplesLeftForTD, default_frame; + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; + + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; + } + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) + { + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); + } } - Word16 non_diegetic_pan_gain_fx = (Word16) ( 32767 * st_ivas->hDecoderConfig->non_diegetic_pan_gain ); - ivas_apply_non_diegetic_panning_fx( p_output_fx, non_diegetic_pan_gain_fx, *nSamplesRendered ); - for ( int lp = 0; lp < L_FRAME48k; lp++ ) + + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) { - p_output[0][lp] = (float) p_output_fx[0][lp] / ( 1u << 11 ); - p_output[1][lp] = (float) p_output_fx[1][lp] / ( 1u << 11 ); + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); + + //fixedToFloat_arrL( st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize ); + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize ); } -#else - ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); #endif + } - else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + } + else + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); +#if 1 + Word16 num_in_ch = 0, num_bands_out = 0, nchan_transport = 0, num_md_sub_frames = 0, num_out_ch = 0; + SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) { - /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ -#ifdef IVAS_FLOAT_FIXED - FOR( i = 0; i < 15; i++ ) + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + hSpar->hMdDec->Q_mixer_mat = 31; + num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + + 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 ) ) ) { - FOR( j = 0; j < 16; j++ ) + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + ch_sba_idx = st_ivas->nchan_ism; + move16(); + } + } + st_ivas->hTcBuffer->q_tc_fx = 14; + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) { - st_ivas->hIsmRendererData->gains_fx[i][j] = L_shr( st_ivas->hIsmRendererData->gains_fx[i][j], 1 ); // Q30 -> Q29 - st_ivas->hIsmRendererData->prev_gains_fx[i][j] = L_shr( st_ivas->hIsmRendererData->prev_gains_fx[i][j], 1 ); // Q30 -> Q29 + floatToFixed_arrL( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); } } - Word16 Q_buffer_in = 31; - FOR( i = 0; i < st_ivas->nchan_transport; i++ ) + } + + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + { + st_ivas->hTcBuffer->q_tc_fx = 14; + Word16 nSamplesLeftForTD, default_frame; + default_frame = (Word16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; + + while ( nSamplesLeftForTD ) { - Q_buffer_in = s_min( Q_buffer_in, Q_factor_arrL( st_ivas->hTcBuffer->tc[i], L_FRAME48k ) ); + Word16 nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; } - FOR( i = 0; i < st_ivas->nchan_transport; i++ ) + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) { - floatToFixed_arrL( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q_buffer_in, L_FRAME48k ); + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); } - ivas_ism2sba_sf_fx( st_ivas->hTcBuffer->tc_fx, p_output_fx, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); - Word16 sba_num_chans = imult1616( add( st_ivas->hIntSetup.ambisonics_order, 1 ), add( st_ivas->hIntSetup.ambisonics_order, 1 ) ); - FOR( j = 0; j < sba_num_chans; j++ ) + } + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_transport = 1; /* Only one channel transported */ + } + + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) + { + Word32 max_cngNoiseLevel = 0; + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + FOR( i = 0; i < FFTCLDFBLEN; i++ ) { - fixedToFloat_arrL( p_output_fx[j], p_output[j], Q_buffer_in + 29 - 31, *nSamplesRendered ); + max_cngNoiseLevel = L_max( L_abs( (Word32) st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i] ), max_cngNoiseLevel ); } + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l( max_cngNoiseLevel ); + + //floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1 ); - FOR(i = 0; i < 15; i++) + floatToFixed_arrL( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN ); + + //for ( i = 0; i < FFTLEN; i++ ) + //{ + // st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15 ); + //} + } +#endif + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); +#if 1 + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + 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 ) ) ) { - FOR(j = 0; j < 16; j++) + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + ch_sba_idx = st_ivas->nchan_ism; + move16(); + } + } + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) { - st_ivas->hIsmRendererData->gains_fx[i][j] = L_shl(st_ivas->hIsmRendererData->gains_fx[i][j], 1); // Q29 -> Q30 - st_ivas->hIsmRendererData->prev_gains_fx[i][j] = L_shl(st_ivas->hIsmRendererData->prev_gains_fx[i][j], 1); // Q29 -> Q30 + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); } } -#else - ivas_ism2sba_sf( st_ivas->hTcBuffer->tc, p_output, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); -#endif // IVAS_FLOAT_FIXED } - /* Binaural rendering */ - if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++) + st_ivas->hTcBuffer->q_tc_fx = 14; + int16_t nSamplesLeftForTD, default_frame; + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; + + while ( nSamplesLeftForTD ) { - for ( j = 0; j < L_FRAME48k; j++) - { - p_output_fx[i][j] = floatToFixed(p_output[i][j], Q11); - } + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; } - for (int ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++) + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k); - } - IF ( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, *nSamplesRendered ) ) != IVAS_ERR_OK ) - { - return error; + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); } + } - // Fixed to float - for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++) + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); + + //fixedToFloat_arrL( st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize ); + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize ); + } +#endif + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); + } +#if 1 + Word16 num_in_ch = 0, num_bands_out = 0, nchan_transport = 0, num_md_sub_frames = 0, num_out_ch = 0; + SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + hSpar->hMdDec->Q_mixer_mat = 31; + num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + + 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 ) ) ) + { + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - for ( j = 0; j < L_FRAME48k; j++) + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - p_output[i][j] = fixedToFloat(p_output_fx[i][j], Q11); + ch_sba_idx = st_ivas->nchan_ism; + move16(); } } -#else - if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + st_ivas->hTcBuffer->q_tc_fx = 14; + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) { - return error; + floatToFixed_arrL( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); } -#endif } - else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + } + + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + { + st_ivas->hTcBuffer->q_tc_fx = 14; + Word16 nSamplesLeftForTD, default_frame; + default_frame = (Word16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; + + while ( nSamplesLeftForTD ) { -#ifdef IVAS_FLOAT_FIXED - st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; - subframe_len = st_ivas->hTcBuffer->subframe_nbslots[0] * st_ivas->hTcBuffer->n_samples_granularity; - gd_bits = find_guarded_bits_fx( subframe_len ); - exp = 13; - nchan_in = 12; - nchan_out = 2; - exp -= gd_bits; - *st_ivas->hCrendWrapper->p_io_qfactor = exp; - for ( i = 0; i < nchan_in; i++ ) - { - for ( j = 0; j < *nSamplesRendered; j++ ) - { + Word16 nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; + } + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); + } + } + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_transport = 1; /* Only one channel transported */ + } - p_temp_fx[i][j] = (Word32) float_to_fixed( p_output[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); - } - } - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_temp_fx, p_temp_fx, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - for ( i = 0; i < nchan_out; i++ ) + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) + { + Word32 max_cngNoiseLevel = 0; + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + FOR( i = 0; i < FFTCLDFBLEN; i++ ) + { + max_cngNoiseLevel = L_max( L_abs( (Word32) st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i] ), max_cngNoiseLevel ); + } + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l( max_cngNoiseLevel ); + + //floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1 ); + + floatToFixed_arrL( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN ); + + //for ( i = 0; i < FFTLEN; i++ ) + //{ + // st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15 ); + //} + } +#endif + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); +#if 1 + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + 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 ) ) ) + { + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - for ( j = 0; j < *nSamplesRendered; j++ ) + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - - p_output[i][j] = fixed_to_float( p_temp_fx[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); + ch_sba_idx = st_ivas->nchan_ism; + move16(); } } -#else - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) { - return error; + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); } -#endif } } + + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + { + st_ivas->hTcBuffer->q_tc_fx = 14; + int16_t nSamplesLeftForTD, default_frame; + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; + + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; + } + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) + { + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); + } + } + + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); + + //fixedToFloat_arrL( st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize ); + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize ); + } +#endif + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + ivas_ism_dec_digest_tc_fx( st_ivas ); + } } - else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + else if ( st_ivas->ivas_format == MC_FORMAT ) { - nchan_remapped = nchan_transport; - - /* Loudspeakers, Ambisonics or Binaural rendering */ - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + if ( st_ivas->mc_mode == MC_MODE_MCT ) { - ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); } - else if ( st_ivas->ivas_format == MASA_FORMAT ) + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + st_ivas->hTcBuffer->q_tc_fx = 11; + //for (int ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++) + //All transport channels retain same q11 function doesnt change ouptut q + for (int ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++) { - *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); - for ( n = 0; n < nchan_remapped; n++ ) - { - mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); - } - - if ( ( error = ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, 0, output_config, st_ivas->hOutSetup ) ) != IVAS_ERR_OK ) - { - return error; - } + floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, L_FRAME48k); } - else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + ivas_mc_paramupmix_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + for (int ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++) { - ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, L_FRAME48k); } } - else + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { #ifdef IVAS_FLOAT_FIXED - for ( n = 0; n < st_ivas->p_out_len; n++ ) + Word16 cldfb_slots, j; + Word32 p_data_f_fx[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ + cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; + if (st_ivas->hDecoderConfig->Opt_tsm) { - floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; } -#if 1 /*Float to fixed conversion*/ - SPAR_DEC_HANDLE hSpar; - hSpar = st_ivas->hSpar; - uint16_t nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - Word16 numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - DECODER_CONFIG_HANDLE hDecoderConfig; - hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_out_dirac = hDecoderConfig->nchan_out; - Word16 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 ); + f2me_buf(st_ivas->hParamMC->Cldfb_RealBuffer_tc, st_ivas->hParamMC->Cldfb_RealBuffer_tc_fx, &st_ivas->hParamMC->Cldfb_RealBuffer_tc_e, cldfb_slots * st_ivas->nchan_transport * st_ivas->hParamMC->num_freq_bands); + f2me_buf(st_ivas->hParamMC->Cldfb_ImagBuffer_tc, st_ivas->hParamMC->Cldfb_ImagBuffer_tc_fx, &st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e, cldfb_slots * st_ivas->nchan_transport * st_ivas->hParamMC->num_freq_bands); - for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) + + + Word16 max_e = 0, input_q[MAX_CLDFB_DIGEST_CHANNELS], in_q; + FOR(i = 0; i < MAX_CLDFB_DIGEST_CHANNELS; i++) { - floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); + f2me_buf(p_data_f[i], p_data_f_fx[i], &input_q[i], MAX_JBM_L_FRAME48k); } - Word16 q1 = 30, q2 = 30; - for ( int l = 0; l < numch_out; l++ ) + + max_e = input_q[0]; + + FOR(i = 0; i < MAX_CLDFB_DIGEST_CHANNELS; i++) { - for ( j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } - } + IF(max_e < input_q[i]) + max_e = input_q[i]; } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + + FOR(i = 0; i < MAX_CLDFB_DIGEST_CHANNELS; i++) { - for ( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } - } - } + FOR(j = 0; j < MAX_JBM_L_FRAME48k; j++) + p_data_f_fx[i][j] = L_shr(p_data_f_fx[i][j], max_e - input_q[i]); } - for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + + in_q = max_e; + + Word16 nchan_transport = st_ivas->nchan_transport; + Word16 nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + Word16 nchan_out_cov; + IF(st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) { - for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); - } + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + ELSE IF(st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB) { - for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + nchan_out_cov = nchan_out_transport; } - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + ELSE IF(st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO) { - IF( st_ivas->cldfbSynDec[out_ch] ) - { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] ,Q11); - } - } + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; } -#endif // - if ( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx,960) ) != IVAS_ERR_OK ) + ELSE { - return error; + nchan_out_cov = nchan_out_transport; } -#ifdef IVAS_FLOAT_FIXED /*Fixed to float */ - for ( n = 0; n < st_ivas->p_out_len; n++ ) + f2me_buf(st_ivas->hParamMC->h_output_synthesis_params.proto_matrix, st_ivas->hParamMC->h_output_synthesis_params.proto_matrix_fx, &st_ivas->hParamMC->h_output_synthesis_params.proto_matrix_e, nchan_out_cov * nchan_transport); + + //IF (st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV) + //{ + // f2me_buf(st_ivas->hParamMC->ls_conv_dmx_matrix, st_ivas->hParamMC->ls_conv_dmx_matrix_fx, &st_ivas->hParamMC->ls_conv_dmx_e, nchan_out_cov * nchan_out_transport); + //} + + floatToFixed_arr(st_ivas->hParamMC->icld_q, st_ivas->hParamMC->icld_q_fx, 8, st_ivas->hParamMC->hMetadataPMC->num_parameter_bands * st_ivas->hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe); + + FOR(Word16 lp = 0; lp < st_ivas->hParamMC->hMetadataPMC->num_parameter_bands * st_ivas->hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; lp++) { - fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); + st_ivas->hParamMC->icc_q_fx[lp] = (Word16)(st_ivas->hParamMC->icc_q[lp] * 32767); } - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + + FOR(Word16 param_band_idx = 0; param_band_idx < st_ivas->hParamMC->num_param_bands_synth; param_band_idx++) { - FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + f2me_buf(st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_fx[param_band_idx], &st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx], nchan_transport * nchan_transport); + f2me_buf(st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_fx[param_band_idx], &st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx], nchan_out_cov * nchan_out_cov); + } + f2me_buf(st_ivas->hParamMC->proto_matrix_int, st_ivas->hParamMC->proto_matrix_int_fx, &st_ivas->hParamMC->proto_matrix_int_e, nchan_transport * nchan_out_transport); + + ivas_param_mc_dec_digest_tc_fx( st_ivas, (uint8_t) n_render_timeslots, (Word32 **)p_data_f_fx, in_q ); + + me2f_buf_16(st_ivas->hParamMC->h_output_synthesis_params.interpolator_fx, 0, st_ivas->hParamMC->h_output_synthesis_params.interpolator, n_render_timeslots ); + + + FOR(Word16 param_band_idx = 0; param_band_idx < st_ivas->hParamMC->num_param_bands_synth; param_band_idx++) + { + me2f_buf(st_ivas->hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.mixing_matrix[param_band_idx], nchan_out_cov * nchan_transport); + IF(st_ivas->hParamMC->band_grouping[param_band_idx] < st_ivas->hParamMC->h_output_synthesis_params.max_band_decorr) { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ + me2f_buf(st_ivas->hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.mixing_matrix_res[param_band_idx], nchan_out_cov * nchan_out_cov); } } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + + FOR(Word16 param_band_idx = 0; param_band_idx < st_ivas->hParamMC->num_param_bands_synth; param_band_idx++) + { + me2f_buf(st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_fx[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.cx_old[param_band_idx], nchan_transport * nchan_transport); + me2f_buf(st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_fx[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx], st_ivas->hParamMC->h_output_synthesis_cov_state.cy_old[param_band_idx], nchan_out_cov * nchan_out_cov); + } + +#else + ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); +#endif + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + +#if 1 + Word16 num_in_ch = 0, num_bands_out = 0, nchan_transport = 0, num_md_sub_frames = 0, num_out_ch = 0; + SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) { - FOR( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + hSpar->hMdDec->Q_mixer_mat = 31; + num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; + + 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 ) ) ) { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); + ch_sba_idx = st_ivas->nchan_ism; + move16(); } } + st_ivas->hTcBuffer->q_tc_fx = 14; + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); + } } } - // fix2float (to be cleaned) - 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 ) ) ) ) + + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) { - fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); - FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + st_ivas->hTcBuffer->q_tc_fx = 14; + Word16 nSamplesLeftForTD, default_frame; + default_frame = (Word16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; + + while ( nSamplesLeftForTD ) { - fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + Word16 nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; } - } - // fix2float end - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) - { - IF( st_ivas->cldfbSynDec[out_ch] ) + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); - } + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); } } -#endif -#else - if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 || ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) { - return error; + nchan_transport = 1; /* Only one channel transported */ } -#endif // IVAS_FLOAT_FIXED - } - } - else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) - { - nchan_remapped = st_ivas->nchan_transport; - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) - { - if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) + if ( ( ( st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag ) || + ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) && ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) { - if ( ( error = ivas_omasa_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ) ) != IVAS_ERR_OK ) + Word32 max_cngNoiseLevel = 0; + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + FOR( i = 0; i < FFTCLDFBLEN; i++ ) { - return error; + max_cngNoiseLevel = L_max( L_abs( (Word32) st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[i] ), max_cngNoiseLevel ); } - } - else - { - ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); - } - } - else if ( st_ivas->renderer_type == RENDERER_DIRAC ) - { - ivas_omasa_dirac_rend_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); - } - } - else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) - { - nchan_remapped = nchan_transport; + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l( max_cngNoiseLevel ); - /* Loudspeakers, Ambisonics or Binaural rendering */ - if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) - { - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) - { -#ifdef IVAS_FLOAT_FIXED - for ( n = 0; n < st_ivas->p_out_len; n++ ) - { - floatToFixed_arr32( p_output[n], p_output_fx[n], 11, 960 ); - } -#if 1 /*Float to fixed conversion*/ - SPAR_DEC_HANDLE hSpar; - hSpar = st_ivas->hSpar; - uint16_t nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - Word16 numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - DECODER_CONFIG_HANDLE hDecoderConfig; - hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_out_dirac = hDecoderConfig->nchan_out; + //floatToFixed_arr( st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1 ); - Word16 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 ); + floatToFixed_arrL( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN ); - for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) - { - floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); - } - Word16 q1 = 30, q2 = 30; - for ( int l = 0; l < numch_out; l++ ) - { - for ( j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + //for ( i = 0; i < FFTLEN; i++ ) + //{ + // st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15 ); + //} + } +#endif + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); +#if 1 + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + 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 ) ) ) { - for ( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) + Word16 ch_sba_idx = 0; + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) + IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } + ch_sba_idx = st_ivas->nchan_ism; + move16(); } } - } - for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); - } - } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) - { - for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); - } - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) - { - IF( st_ivas->cldfbSynDec[out_ch] ) + for ( i = 0; i < ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) + ch_sba_idx; i++ ) { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i],Q11 ); - } + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->q_tc_fx, min( nSamplesForRendering, (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) ) ); } } -#endif // - -#if 1 /* NOTE: remove float to fix conversion */ - Word16 n_tc; - if (st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - n_tc = st_ivas->nchan_ism; - else - n_tc = st_ivas->hTcBuffer->nchan_transport_internal; - for (int ch = 0; ch < n_tc; ch++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k); - } -#endif + } - IF ( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, output_q_factor, 960 ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + { + st_ivas->hTcBuffer->q_tc_fx = 14; + int16_t nSamplesLeftForTD, default_frame; + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + Word16 size = 0; -#if 1 /*Fixed to float */ - for ( n = 0; n < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n++ ) - { - fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); - } - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); - } - } - FOR(Word16 m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - FOR( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } - } - // fix2float (to be cleaned) - 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 ) ) ) ) + while ( nSamplesLeftForTD ) { - fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); - FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + size += nSamplesToDecorr; + nSamplesLeftForTD -= nSamplesToDecorr; } - // fix2float end - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + size = s_max( size, default_frame ); + for ( int ch_idx = 0; ch_idx < BINAURAL_CHANNELS + 2; ch_idx++ ) { - IF( st_ivas->cldfbSynDec[out_ch] ) - { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); - } - } + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[ch_idx], st_ivas->hTcBuffer->tc[ch_idx], st_ivas->hTcBuffer->q_tc_fx, size ); } -#endif + } -#if 1 /*TODO: remove fixed to float conversions */ - for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++) - { - for ( j = 0; j < L_FRAME48k; j++) - { - p_output[i][j] = fixedToFloat(p_output_fx[i][j], Q11); - } - } + if (((st_ivas->ivas_format != SBA_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT) && st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag) || + ((st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC) && (nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag))) + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); + + //fixedToFloat_arrL( st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize ); + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize ); + } #endif + } + } + + pop_wmops(); + return; +} #else - if ( ( error = ivas_osba_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif +void ivas_jbm_dec_feed_tc_to_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i : transport channels */ +) +{ + float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ + float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; + int16_t n, n_render_timeslots; + + push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); + for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) + { + p_data_f[n] = &data_f[n][0]; + } + + + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f ); + } + else + { + *nSamplesResidual = 0; + } + n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + + if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + } + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots ); + + ivas_param_ism_params_to_masa_param_mapping( st_ivas ); } - else if ( st_ivas->renderer_type == RENDERER_OSBA_STEREO ) + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { - *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f ); + } + } + else /* ISM_MODE_DISC */ + { + ivas_ism_dec_digest_tc( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { - /* shift SBA channels to avoid overwrite by ISM upmix in 1 object case and non-TSM unified channel memory*/ - if ( st_ivas->nchan_ism == 1 && st_ivas->hDecoderConfig->Opt_tsm == 0 ) + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + ivas_ism_dec_digest_tc( st_ivas ); + + /* delay the objects here for all renderers where it is needed */ + if ( + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_OSBA_AMBI || + st_ivas->renderer_type == RENDERER_OSBA_LS || + st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL + ) + { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) { - mvr2r( p_tc[2], p_output[3], *nSamplesRendered ); - mvr2r( p_tc[1], p_output[2], *nSamplesRendered ); - p_tc[1] = p_output[2]; - p_tc[2] = p_output[3]; + delay_signal_float( st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size ); } + } - /* render objects */ -#ifdef IVAS_FLOAT_FIXED - Word16 q = 15; - FOR( Word16 ind1 = 0; ind1 < s_max( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); ind1++ ) + if ( !st_ivas->sba_dirac_stereo_flag ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { - FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) - { + n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); + } + + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + else + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); + } + + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + ivas_ism_dec_digest_tc( st_ivas ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_mc_paramupmix_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + + pop_wmops(); + return; +} +#endif + +/*--------------------------------------------------------------------------* + * ivas_dec_render() + * + * Principal IVAS JBM rendering routine + *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_jbm_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t n, nchan_out; + int16_t nchan_transport; + int16_t nchan_remapped; + int32_t output_Fs; + AUDIO_CONFIG output_config; + int16_t nSamplesAskedLocal; + ivas_error error; + float *p_output[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS] = { NULL }; + float *p_tc[MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS] = { NULL }; + Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; + Word32 tmp_buffer_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k] = { 0 }; + Word32 *p_temp_fx[MAX_OUTPUT_CHANNELS]; + Word32 *p_tc_fx[MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS]; + Word16 subframe_len, gd_bits, exp, nchan_in, i, j; + const Word16 output_q_factor = Q11; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + push_wmops( "ivas_dec_render" ); + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard; + + for ( n = 0; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + p_output[n] = st_ivas->p_output_f[n]; + p_output_fx[n] = st_ivas->p_output_fx[n]; + } + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_temp_fx[i] = tmp_buffer_fx[i]; + } + if ( !st_ivas->hDecoderConfig->Opt_tsm ) + { + for ( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) + { + p_tc[n] = p_output[n]; + p_tc_fx[n] = p_output_fx[n]; + } + + for ( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + st_ivas->hTcBuffer->tc[n] = p_output[n]; + st_ivas->hTcBuffer->tc_fx[n] = st_ivas->p_output_fx[n]; + } + } + else + { + for ( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) + { + p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered]; + p_tc_fx[n] = &st_ivas->hTcBuffer->tc_fx[n][st_ivas->hTcBuffer->n_samples_rendered]; + } + } + + /*----------------------------------------------------------------* + * Update combined orientation access index + *----------------------------------------------------------------*/ + + if ( st_ivas->hCombinedOrientationData != NULL ) + { + /* take the discard samples into account here to make sure head rotation stays on the correct 5ms grid */ + st_ivas->hCombinedOrientationData->cur_subframe_samples_rendered_start -= st_ivas->hTcBuffer->n_samples_discard; + + ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); + } + + /*----------------------------------------------------------------* + * Rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == UNDEFINED_FORMAT ) + { + assert( 0 ); + } + else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + Word16 slot_size, slots_to_render, tmp, e, slots_rendered, nSamplesRendered_tmp; + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + tmp = BASOP_Util_Divide1616_Scale( nSamplesAsked, slot_size, &e ); + tmp = shr( tmp, sub( 15, e ) ); + slots_to_render = s_min( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered ), tmp ); + slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, slots_to_render ); + nSamplesRendered_tmp = (UWord16) L_mult0( slots_to_render, slot_size ); + FOR( Word16 ind = 0; ind < st_ivas->hTcBuffer->nchan_transport_jbm; ind++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ind] + st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hTcBuffer->tc_fx[ind] + st_ivas->hTcBuffer->n_samples_rendered, Q11, nSamplesRendered_tmp ); + floatToFixed_arrL( p_output[ind], p_output_fx[ind], Q11, s_max( *nSamplesRendered, nSamplesAskedLocal ) ); + } + + ivas_jbm_dec_tc_buffer_playout_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output_fx ); + + FOR( Word16 ind = 0; ind < st_ivas->hTcBuffer->nchan_transport_jbm; ind++ ) + { + fixedToFloat_arrL( p_output_fx[ind], p_output[ind], Q11, s_max( *nSamplesRendered, nSamplesAskedLocal ) ); + } + + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + Word16 q = Q16; + q = q - find_guarded_bits_fx( st_ivas->nchan_transport ); + FOR( i = 0; i < st_ivas->nchan_transport; ++i ) + { + floatToFixed_arrL( p_tc[i], p_tc_fx[i], q, *nSamplesRendered ); + } + FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) + { + FOR( j = 0; j < st_ivas->nchan_transport; j++ ) + { + //st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); + } + } + ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc_fx, p_output_fx ); + FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; ++i ) + { + fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); + } + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + for ( int lp = 0; lp < L_FRAME48k; lp++ ) + { + p_output_fx[0][lp] = (Word32) ( p_output[0][lp] * ( 1u << 11 ) ); + p_output_fx[1][lp] = (Word32) ( p_output[1][lp] * ( 1u << 11 ) ); + } + Word16 non_diegetic_pan_gain_fx = (Word16) ( 32767 * st_ivas->hDecoderConfig->non_diegetic_pan_gain ); + ivas_apply_non_diegetic_panning_fx( p_output_fx, non_diegetic_pan_gain_fx, *nSamplesRendered ); + for ( int lp = 0; lp < L_FRAME48k; lp++ ) + { + p_output[0][lp] = (float) p_output_fx[0][lp] / ( 1u << 11 ); + p_output[1][lp] = (float) p_output_fx[1][lp] / ( 1u << 11 ); + } + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + Word32 output_fx_tmp[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; + Word16 ch; + Word32 *p_output_fx_tmp[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; + FOR( Word16 lp = 0; lp < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; lp++ ) + { + p_output_fx_tmp[lp] = &output_fx_tmp[lp][0]; + } + + Word16 Q_p_output_buf = Q11; + FOR( i = 0; i < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + { + floatToFixed_arrL( p_output[i], p_output_fx_tmp[i], Q_p_output_buf, L_FRAME48k ); + } + /*-------------------------------------------flt 2 fix----------------------------------------------------------*/ + /*-----following buffers and values are getting used in the function and hence are in the intermediate conv-----*/ + /*i : st_ivas->hParamIsmDec->hParamIsmRendering->mixing_matrix_lin-------------------------------------norm-Q-*/ + /*i/o : st_ivas->hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_old---------------------------------norm-Q-*/ + /*i : st_ivas->hParamIsmDec->hParamIsmRendering->interpolator------------------------------------------Q14----*/ + /*i/o : st_ivas->hParamIsmDec->azimuth_values------------------------------------------------------------Q22----*/ + /*i/o : st_ivas->hParamIsmDec->elevation_values----------------------------------------------------------Q22----*/ + /*i : st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc-----------------------------------norm-Q-*/ + /*i : st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc-----------------------------------norm-Q-*/ + /*i/o : st_ivas->cldfbSynDec[ch]->cldfb_state------------------------------------------------------------Q11----*/ + /*--------------------------------------------------------------------------------------------------------------*/ + + f2me_buf( (float *) st_ivas->hParamIsmDec->hParamIsmRendering->mixing_matrix_lin, (Word32 *) st_ivas->hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_fx, &st_ivas->hParamIsmDec->hParamIsmRendering->exp_mixing_matrix_lin_fx, CLDFB_NO_CHANNELS_MAX * ( PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX ) ); + + Word16 n_slots_to_alloc = st_ivas->hDecoderConfig->Opt_tsm == 1 ? 32 : 16; + Word16 n_chan_transport_t = st_ivas->nchan_transport; + Word16 freq_bands = st_ivas->hSpatParamRendCom->num_freq_bands; + + Word16 size = n_slots_to_alloc * n_chan_transport_t * freq_bands; + + f2me_buf( st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc, st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx, &st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp, size ); + f2me_buf( st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc, st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx, &st_ivas->hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp, size ); + + Word16 n_out; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + n_out = st_ivas->nchan_ism; + } + else + { + n_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + } + + for ( ch = 0; ch < n_out; ch++ ) + { + floatToFixed_arrL( st_ivas->cldfbSynDec[ch]->cldfb_state, st_ivas->cldfbSynDec[ch]->cldfb_state_fx, Q11, st_ivas->cldfbSynDec[ch]->p_filter_length ); + } + /*-------------------------------------flt 2 fix----------------------------------------------------------*/ + + ivas_param_ism_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx_tmp ); + + /*-----------------------------------------fix 2 flt--------------------------------------------*/ + for ( ch = 0; ch < n_out; ch++ ) + { + fixedToFloat_arrL( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_state, Q11, st_ivas->cldfbSynDec[ch]->p_filter_length ); + fixedToFloat_arrL( p_output_fx_tmp[ch], p_output[ch], Q11, L_FRAME48k ); + } + /*-----------------------------------------fix 2 flt--------------------------------------------*/ + + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* Convert CICP19 -> Ambisonics */ +#if 1 + FOR( i = 0; i < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + { + floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, *nSamplesRendered ); + } +#endif + ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_fx, p_output_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); +#if 1 + FOR( i = 0; i < ( st_ivas->hOutSetup.ambisonics_order + 1 ) * ( st_ivas->hOutSetup.ambisonics_order + 1 ); i++ ) + { + fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, *nSamplesRendered ); + } +#endif + } + } + } + else /* ISM_MODE_DISC */ + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + + /* Loudspeaker or Ambisonics rendering */ + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + Word16 q = 11; + FOR( Word16 ind1 = 0; ind1 < s_max( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + { + p_output_fx[ind1][ind2] = (Word16) ( p_output[ind1][ind2] * ( 1 << q ) ); + } + FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + { + st_ivas->hTcBuffer->tc_fx[ind1][ind2] = (Word32) ( st_ivas->hTcBuffer->tc[ind1][ind2] * ( 1 << q ) ); + } + } + IF( st_ivas->hCombinedOrientationData ) + FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < 3; ind2++ ) + { + st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32) ( st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * ( 1 << 15 ) ); + } + } + + ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); + FOR( Word16 ind1 = 0; ind1 < s_max( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + { + p_output[ind1][ind2] = (float) ( p_output_fx[ind1][ind2] ) / (float) ( 1 << q ); + } + } + } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + for ( int lp = 0; lp < L_FRAME48k; lp++ ) + { + p_output_fx[0][lp] = (Word32) ( p_output[0][lp] * ( 1u << 11 ) ); + p_output_fx[1][lp] = (Word32) ( p_output[1][lp] * ( 1u << 11 ) ); + } + Word16 non_diegetic_pan_gain_fx = (Word16) ( 32767 * st_ivas->hDecoderConfig->non_diegetic_pan_gain ); + ivas_apply_non_diegetic_panning_fx( p_output_fx, non_diegetic_pan_gain_fx, *nSamplesRendered ); + for ( int lp = 0; lp < L_FRAME48k; lp++ ) + { + p_output[0][lp] = (float) p_output_fx[0][lp] / ( 1u << 11 ); + p_output[1][lp] = (float) p_output_fx[1][lp] / ( 1u << 11 ); + } + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ + FOR( i = 0; i < 15; i++ ) + { + FOR( j = 0; j < 16; j++ ) + { + st_ivas->hIsmRendererData->gains_fx[i][j] = L_shr( st_ivas->hIsmRendererData->gains_fx[i][j], 1 ); // Q30 -> Q29 + st_ivas->hIsmRendererData->prev_gains_fx[i][j] = L_shr( st_ivas->hIsmRendererData->prev_gains_fx[i][j], 1 ); // Q30 -> Q29 + } + } + Word16 Q_buffer_in = 31; + FOR( i = 0; i < st_ivas->nchan_transport; i++ ) + { + Q_buffer_in = s_min( Q_buffer_in, Q_factor_arrL( st_ivas->hTcBuffer->tc[i], L_FRAME48k ) ); + } + FOR( i = 0; i < st_ivas->nchan_transport; i++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q_buffer_in, L_FRAME48k ); + } + ivas_ism2sba_sf_fx( st_ivas->hTcBuffer->tc_fx, p_output_fx, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); + Word16 sba_num_chans = imult1616( add( st_ivas->hIntSetup.ambisonics_order, 1 ), add( st_ivas->hIntSetup.ambisonics_order, 1 ) ); + FOR( j = 0; j < sba_num_chans; j++ ) + { + fixedToFloat_arrL( p_output_fx[j], p_output[j], Q_buffer_in + 29 - 31, *nSamplesRendered ); + } + + FOR( i = 0; i < 15; i++ ) + { + FOR( j = 0; j < 16; j++ ) + { + st_ivas->hIsmRendererData->gains_fx[i][j] = L_shl( st_ivas->hIsmRendererData->gains_fx[i][j], 1 ); // Q29 -> Q30 + st_ivas->hIsmRendererData->prev_gains_fx[i][j] = L_shl( st_ivas->hIsmRendererData->prev_gains_fx[i][j], 1 ); // Q29 -> Q30 + } + } + } + + /* Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) + { + for ( j = 0; j < L_FRAME48k; j++ ) + { + p_output_fx[i][j] = floatToFixed( p_output[i][j], Q11 ); + } + } + for ( int ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k ); + } + IF( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + + // Fixed to float + for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) + { + for ( j = 0; j < L_FRAME48k; j++ ) + { + p_output[i][j] = fixedToFloat( p_output_fx[i][j], Q11 ); + } + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; + subframe_len = st_ivas->hTcBuffer->subframe_nbslots[0] * st_ivas->hTcBuffer->n_samples_granularity; + gd_bits = find_guarded_bits_fx( subframe_len ); + exp = 13; + nchan_in = 12; + nchan_out = 2; + exp -= gd_bits; + *st_ivas->hCrendWrapper->p_io_qfactor = exp; + for ( i = 0; i < nchan_in; i++ ) + { + for ( j = 0; j < *nSamplesRendered; j++ ) + { + + p_temp_fx[i][j] = (Word32) float_to_fixed( p_output[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); + } + } + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_temp_fx, p_temp_fx, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + for ( i = 0; i < nchan_out; i++ ) + { + for ( j = 0; j < *nSamplesRendered; j++ ) + { + + p_output[i][j] = fixed_to_float( p_temp_fx[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); + } + } + } + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + nchan_remapped = nchan_transport; + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + for ( n = 0; n < nchan_remapped; n++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); + } +#ifdef IVAS_FLOAT_FIXED +#if 1//To Be removed + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + } +#endif + IF ( ( error = ivas_sba_linear_renderer_fx( p_output_fx, *nSamplesRendered, nchan_remapped, 0, output_config, st_ivas->hOutSetup ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1//To Be removed + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); + } +#endif +#else + if ( ( error = ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, 0, output_config, st_ivas->hOutSetup ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_dirac_dec_render_fx( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + } + else + { + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + } +#if 1 /*Float to fixed conversion*/ + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + DECODER_CONFIG_HANDLE hDecoderConfig; + hDecoderConfig = st_ivas->hDecoderConfig; + Word16 numch_out_dirac = hDecoderConfig->nchan_out; + + for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) + { + floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); + } + hSpar->hMdDec->Q_mixer_mat = 30; + for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + } + } + //if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + //{ + // for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + // { + // floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + // } + // floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + //} + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i], Q11 ); + } + } + } +#endif // + if ( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1 /*Fixed to float */ + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); + } + FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ + } + } + // fix2float (to be cleaned) + 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 ) ) ) ) + { + fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); + FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + } + // fix2float end + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); + } + } + } +#endif + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + nchan_remapped = st_ivas->nchan_transport; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) + { + if ( ( error = ivas_omasa_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_omasa_dirac_rend_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + nchan_remapped = nchan_transport; + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + floatToFixed_arr32( p_output[n], p_output_fx[n], 11, 960 ); + } +#if 1 /*Float to fixed conversion*/ + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + DECODER_CONFIG_HANDLE hDecoderConfig; + hDecoderConfig = st_ivas->hDecoderConfig; + Word16 numch_out_dirac = hDecoderConfig->nchan_out; + + for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) + { + floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); + } + hSpar->hMdDec->Q_mixer_mat = 30; + for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + } + } + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + } + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i], Q11 ); + } + } + } +#endif // + +#if 1 /* NOTE: remove float to fix conversion */ + Word16 n_tc; + if ( st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + n_tc = st_ivas->nchan_ism; + else + n_tc = st_ivas->hTcBuffer->nchan_transport_internal; + for ( int ch = 0; ch < n_tc; ch++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k ); + } +#endif + + IF( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, output_q_factor, 960 ) ) != IVAS_ERR_OK ) + { + return error; + } + +#if 1 /*Fixed to float */ + for ( n = 0; n < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n++ ) + { + fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); + } + FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); + } + } + // fix2float (to be cleaned) + 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 ) ) ) ) + { + fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); + FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + } + // fix2float end + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); + } + } + } +#endif + +#if 1 /*TODO: remove fixed to float conversions */ + for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) + { + for ( j = 0; j < L_FRAME48k; j++ ) + { + p_output[i][j] = fixedToFloat( p_output_fx[i][j], Q11 ); + } + } +#endif + } + else if ( st_ivas->renderer_type == RENDERER_OSBA_STEREO ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + + /* shift SBA channels to avoid overwrite by ISM upmix in 1 object case and non-TSM unified channel memory*/ + if ( st_ivas->nchan_ism == 1 && st_ivas->hDecoderConfig->Opt_tsm == 0 ) + { + mvr2r( p_tc[2], p_output[3], *nSamplesRendered ); + mvr2r( p_tc[1], p_output[2], *nSamplesRendered ); + p_tc[1] = p_output[2]; + p_tc[2] = p_output[3]; + } + + /* render objects */ + Word16 q = 15; + FOR( Word16 ind1 = 0; ind1 < s_max( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + { p_output_fx[ind1][ind2] = (Word16) ( p_output[ind1][ind2] * ( 1 << q ) ); } - IF( st_ivas->hTcBuffer->tc ) - FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + IF( st_ivas->hTcBuffer->tc ) + FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + { + st_ivas->hTcBuffer->tc_fx[ind1][ind2] = (Word32) ( st_ivas->hTcBuffer->tc[ind1][ind2] * ( 1 << q ) ); + } + } + + IF( st_ivas->hCombinedOrientationData ) + FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < 3; ind2++ ) + { + st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32) ( st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * ( 1 << 15 ) ); + } + } + + ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); + FOR( Word16 ind1 = 0; ind1 < s_max( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + { + p_output[ind1][ind2] = (float) ( p_output_fx[ind1][ind2] ) / (float) ( 1 << q ); + } + } + + /* add already rendered SBA part */ + for ( n = 0; n < nchan_out; n++ ) + { + v_add( p_output[n], p_tc[n + st_ivas->nchan_ism], p_output[n], *nSamplesRendered ); + } + } + else if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI || st_ivas->renderer_type == RENDERER_OSBA_LS || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + Word16 q = 15; + FOR(Word16 ind1 = 0; ind1 < s_max(st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max(st_ivas->nchan_transport, st_ivas->nchan_ism)); ind1++) + { + FOR(Word16 ind2 = 0; ind2 < L_FRAME48k; ind2++) + { + p_output_fx[ind1][ind2] = (Word32)(p_output[ind1][ind2] * (1 << q)); + } + IF(st_ivas->hTcBuffer->tc) + { + FOR(Word16 ind2 = 0; ind2 < L_FRAME48k; ind2++) + { + st_ivas->hTcBuffer->tc_fx[ind1][ind2] = (Word32)(st_ivas->hTcBuffer->tc[ind1][ind2] * (1 << q)); + } + } + } + IF(st_ivas->hCombinedOrientationData) + { + FOR(Word16 ind1 = 0; ind1 < 3; ind1++) + { + FOR(Word16 ind2 = 0; ind2 < 3; ind2++) + { + st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32)(st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * (1 << 15)); + } + } + } + IF((error = ivas_osba_render_sf_fx(st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx)) != IVAS_ERR_OK) + { + return error; + } + q = Q11; + FOR(Word16 ind1 = 0; ind1 < s_max(st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max(st_ivas->nchan_transport, st_ivas->nchan_ism)); ind1++) + { + FOR(Word16 ind2 = 0; ind2 < L_FRAME48k; ind2++) + { + p_output[ind1][ind2] = (float)(p_output_fx[ind1][ind2]) / (float)(1 << q); + } + } + } + else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) /*EXT output = individual objects + HOA3*/ + { + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + } +#if 1 /*Float to fixed conversion*/ + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + DECODER_CONFIG_HANDLE hDecoderConfig; + hDecoderConfig = st_ivas->hDecoderConfig; + Word16 numch_out_dirac = hDecoderConfig->nchan_out; + + for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) + { + floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); + } + hSpar->hMdDec->Q_mixer_mat = 30; + for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + } + } + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + } + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i], Q11 ); + } + } + } +#endif // + if ( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output_fx[st_ivas->nchan_ism], 960 ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1 /*Fixed to float */ + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); + } + FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); + } + } + // fix2float (to be cleaned) + 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 ) ) ) ) + { + fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); + FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + } + // fix2float end + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); + } + } + } +#endif + + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); + } + } + else + { + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + } +#if 1 /*Float to fixed conversion*/ + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + DECODER_CONFIG_HANDLE hDecoderConfig; + hDecoderConfig = st_ivas->hDecoderConfig; + Word16 numch_out_dirac = hDecoderConfig->nchan_out; + + for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) + { + floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); + } + hSpar->hMdDec->Q_mixer_mat = 30; + for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + } + } + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + } + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i], Q11 ); + } + } + } +#endif // + if ( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1 /*Fixed to float */ + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); + } + FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ + } + } + // fix2float (to be cleaned) + 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 ) ) ) ) + { + fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); + FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + } + // fix2float end + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); + } + } + } +#endif + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else + { + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + } +#if 1 /*Float to fixed conversion*/ + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + DECODER_CONFIG_HANDLE hDecoderConfig; + hDecoderConfig = st_ivas->hDecoderConfig; + Word16 numch_out_dirac = hDecoderConfig->nchan_out; + + for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) + { + floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); + } + for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + } + } + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + } + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i], Q11 ); + } + } + } +#endif // + if ( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1 /*Fixed to float */ + for ( n = 0; n < st_ivas->p_out_len; n++ ) + { + fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); + } + FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ + } + } + 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 ) ) ) ) + { + fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); + FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + } + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); + } + } + } +#endif + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + for ( n = st_ivas->hIntSetup.nchan_out_woLFE - 1; n >= 0; n-- ) + { + mvr2r( p_output[n], p_output[n + st_ivas->nchan_ism], *nSamplesRendered ); + } + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { + set_zero( p_output[n], *nSamplesRendered ); + } + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + int16_t crendInPlaceRotation = FALSE; + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + { + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + { + crendInPlaceRotation = TRUE; +#ifdef IVAS_FLOAT_FIXED + ivas_mc2sba_fx( st_ivas->hTransSetup, p_tc_fx, p_output_fx, *nSamplesRendered, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE_FX ); +#if 1 + FOR( i = 0; i < ( st_ivas->hIntSetup.ambisonics_order + 1 ) * ( st_ivas->hIntSetup.ambisonics_order + 1 ); i++ ) { - st_ivas->hTcBuffer->tc_fx[ind1][ind2] = (Word32) ( st_ivas->hTcBuffer->tc[ind1][ind2] * ( 1 << q ) ); + fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, *nSamplesRendered ); } +#endif +#else + ivas_mc2sba( st_ivas->hTransSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); +#endif // IVAS_FLOAT_FIXED } + } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; + subframe_len = st_ivas->hTcBuffer->subframe_nbslots[0] * st_ivas->hTcBuffer->n_samples_granularity; + gd_bits = find_guarded_bits_fx( subframe_len ); + exp = 13; + if ( ( error = getAudioConfigNumChannels( st_ivas->intern_config, &nchan_in ) ) != IVAS_ERR_OK ) { - st_ivas->hIsmMetaData[ind1]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind1]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->elevation * ( 1 << 22 ) ); + return error; } - IF( st_ivas->hCombinedOrientationData ) - FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) + if ( ( error = getAudioConfigNumChannels( st_ivas->hOutSetup.output_config, &nchan_out ) ) != IVAS_ERR_OK ) { - FOR( Word16 ind2 = 0; ind2 < 3; ind2++ ) + return error; + } + exp -= gd_bits; + *st_ivas->hCrendWrapper->p_io_qfactor = exp; + for ( i = 0; i < nchan_in; i++ ) + { + for ( j = 0; j < *nSamplesRendered; j++ ) { - st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32) ( st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * ( 1 << 15 ) ); + p_output_fx[i][j] = (Word32) float_to_fixed( p_output[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); } } + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, + &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : p_tc_fx, p_output_fx, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); - FOR( Word16 ind1 = 0; ind1 < s_max( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe, s_max( st_ivas->nchan_transport, st_ivas->nchan_ism ) ); ind1++ ) { - FOR( Word16 ind2 = 0; ind2 < *nSamplesRendered; ind2++ ) + return error; + } + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); + + for ( i = 0; i < nchan_in; i++ ) + { + for ( j = 0; j < *nSamplesRendered; j++ ) { - p_output[ind1][ind2] = (float) ( p_output_fx[ind1][ind2] ) / (float) ( 1 << q ); + p_output[i][j] = fixed_to_float( p_output_fx[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); + } + } + + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + Word16 q = Q16; + q = q - find_guarded_bits_fx( st_ivas->nchan_transport ); + FOR( i = 0; i < st_ivas->nchan_transport; ++i ) + { + floatToFixed_arrL( p_tc[i], p_tc_fx[i], q, *nSamplesRendered ); + } + FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) + { + FOR( j = 0; j < st_ivas->nchan_transport; j++ ) + { + //st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); } } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) + ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc_fx, p_output_fx ); + FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; ++i ) { - st_ivas->hIsmMetaData[ind1]->azimuth = (float) ( st_ivas->hIsmMetaData[ind1]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind1]->elevation = (float) ( st_ivas->hIsmMetaData[ind1]->elevation_fx ) / (float) ( 1 << 22 ); + fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); } + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { +#ifdef IVAS_FLOAT_FIXED + ivas_mc2sba_fx( st_ivas->hIntSetup, p_tc_fx, p_output_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); +#if 1 + FOR( i = 0; i < ( st_ivas->hOutSetup.ambisonics_order + 1 ) * ( st_ivas->hOutSetup.ambisonics_order + 1 ); i++ ) + { + fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, *nSamplesRendered ); + } +#endif #else - ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); + ivas_mc2sba( st_ivas->hIntSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { +#if 1 /* TODO: remove float to fix conversions: */ + for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) + { + for ( j = 0; j < L_FRAME48k; j++ ) + { + p_output_fx[i][j] = floatToFixed( p_output[i][j], output_q_factor ); + } + } + for ( int ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k ); + } #endif + IF( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } - /* add already rendered SBA part */ - for ( n = 0; n < nchan_out; n++ ) +#if 1 /* TODO: remove Fixed to float */ + for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) { - v_add( p_output[n], p_tc[n + st_ivas->nchan_ism], p_output[n], *nSamplesRendered ); + for ( j = 0; j < L_FRAME48k; j++ ) + { + p_output[i][j] = fixedToFloat( p_output_fx[i][j], Q11 ); + } + } +#endif + + Word16 q = Q16; + q = q - find_guarded_bits_fx( *nSamplesRendered ); + FOR( i = 0; i < st_ivas->nchan_transport; ++i ) + { + // p_tc and pout point to same location + floatToFixed_arrL( p_tc[i], p_tc_fx[i], q, *nSamplesRendered ); + floatToFixed_arrL( p_output[i], p_output_fx[i], q, *nSamplesRendered ); + } + + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); + + FOR( i = 0; i < st_ivas->nchan_transport; ++i ) + { + // p_tc and pout point to same location + fixedToFloat_arrL( p_tc_fx[i], p_tc[i], q, *nSamplesRendered ); + fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); } } - else if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI || st_ivas->renderer_type == RENDERER_OSBA_LS || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + FOR(i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++) + { + if (p_output[i] != NULL) + { + //fixedToFloat_arrL(p_output_fx[i], p_output[i], 11, 960); + floatToFixed_arrL(p_output[i], p_output_fx[i], 11, 960); + } + } + FOR(i = 0; i < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; i++) + { + if (p_tc[i] != NULL) + { + //fixedToFloat_arrL(p_tc_fx[i], p_tc[i], 11, 960); + floatToFixed_arrL(p_tc[i], p_tc_fx[i], 11, 960); + } + } + + ivas_mc_paramupmix_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_tc_fx, p_output_fx); + + FOR(i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++) + { + if (p_output[i] != NULL) + { + //fixedToFloat_arrL(p_output_fx[i], p_output[i], 11, 960); + fixedToFloat_arrL(p_output_fx[i], p_output[i], 11, 960); + } + } + FOR(i = 0; i < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; i++) + { + if (p_tc[i] != NULL) + { + + fixedToFloat_arrL(p_tc_fx[i], p_tc[i], 11, 960); + } + } + + /* Rendering */ + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && !st_ivas->hDecoderConfig->Opt_Headrotation ) { - if ( ( error = ivas_osba_render_sf( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) { - return error; + Word16 q = Q16; + q = q - find_guarded_bits_fx( *nSamplesRendered ); + FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS ); ++i ) + { + floatToFixed_arrL( p_output[i], p_output_fx[i], q, *nSamplesRendered ); + } + + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_output_fx, p_output_fx ); + + FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS ); ++i ) + { + fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); + } } } - else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) /*EXT output = individual objects + HOA3*/ + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + Word16 q = Q16; + q = q - find_guarded_bits_fx( MC_PARAMUPMIX_MAX_INPUT_CHANS ); + FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS ); ++i ) + { + floatToFixed_arrL( p_output[i], p_output_fx[i], q, *nSamplesRendered ); + } + FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) + { + FOR( j = 0; j < MC_PARAMUPMIX_MAX_INPUT_CHANS; j++ ) + { + //st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); + } + } + ivas_ls_setup_conversion_fx( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, *nSamplesRendered, p_output_fx, p_output_fx ); + FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS ); ++i ) + { + fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); + } + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { #ifdef IVAS_FLOAT_FIXED - for ( n = 0; n < st_ivas->p_out_len; n++ ) + FOR( i = 0; i < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + { + floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, *nSamplesRendered ); + } + ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_fx, p_output_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); +#if 1 + FOR( i = 0; i < ( st_ivas->hOutSetup.ambisonics_order + 1 ) * ( st_ivas->hOutSetup.ambisonics_order + 1 ); i++ ) { - floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, *nSamplesRendered ); } -#if 1 /*Float to fixed conversion*/ - SPAR_DEC_HANDLE hSpar; - hSpar = st_ivas->hSpar; - uint16_t nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - Word16 numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - DECODER_CONFIG_HANDLE hDecoderConfig; - hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_out_dirac = hDecoderConfig->nchan_out; +#endif +#else + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( error = ivas_td_binaural_renderer( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + + Word16 q = Q16; + q = q - find_guarded_bits_fx( *nSamplesRendered ); + FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS ); ++i ) + { + floatToFixed_arrL( p_output[i], p_output_fx[i], q, *nSamplesRendered ); + } + + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_output_fx, p_output_fx ); + + FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS ); ++i ) + { + fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + int16_t offset = hSpatParamRendCom->slots_rendered * hSpatParamRendCom->slot_size; + nchan_remapped = st_ivas->nchan_transport; - Word16 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 ); + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ + { + ivas_dirac_dec_render_fx( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); - for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) - { - floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); - } - Word16 q1 = 30, q2 = 30; - for ( int l = 0; l < numch_out; l++ ) - { - for ( j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { - for ( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) + /* we still need to copy the separate channel if available */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } - } + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, p_output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); } - } - for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + +#ifdef IVAS_FLOAT_FIXED + FOR( i = 0; i < st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + floatToFixed_arrL( p_output[i], p_output_fx[i], Q11, *nSamplesRendered ); } - } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) - { - for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_fx, p_output_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); +#if 1 + FOR( i = 0; i < ( st_ivas->hOutSetup.ambisonics_order + 1 ) * ( st_ivas->hOutSetup.ambisonics_order + 1 ); i++ ) { - floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + fixedToFloat_arrL( p_output_fx[i], p_output[i], Q11, *nSamplesRendered ); } - floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); +#endif +#else + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif } - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + else if ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_5_1 && ( output_config == IVAS_AUDIO_CONFIG_5_1_2 || output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1 ) ) { - IF( st_ivas->cldfbSynDec[out_ch] ) + for ( n = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n < st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; n++ ) { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix(st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] , Q11 ); - } + set_zero( p_output[n], *nSamplesRendered ); } } -#endif // - if ( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output_fx[st_ivas->nchan_ism], 960) ) != IVAS_ERR_OK ) - { - return error; - } -#ifdef IVAS_FLOAT_FIXED /*Fixed to float */ - for ( n = 0; n < st_ivas->p_out_len; n++ ) - { - fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); - } - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + } + + /* copy discrete C and TD LFE from internal TC to output */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || + output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || + output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) { - FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); - } + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL] + offset, p_output[LFE_CHANNEL], *nSamplesRendered ); + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, p_output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + else if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) { - FOR( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } + /* Delay the separated channel to sync with the DirAC rendering */ + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, p_output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); } - // fix2float (to be cleaned) - 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 ) ) ) ) + } + } + } + + /*----------------------------------------------------------------* + * Write IVAS output channels + * - compensation for saturation + * - float to integer conversion + *----------------------------------------------------------------*/ + + st_ivas->hTcBuffer->n_samples_available -= *nSamplesRendered; + st_ivas->hTcBuffer->n_samples_rendered += *nSamplesRendered; + + /* update global combined orientation start index */ + ivas_combined_orientation_update_start_index( st_ivas->hCombinedOrientationData, *nSamplesRendered ); + + if ( st_ivas->hTcBuffer->n_samples_discard > 0 ) + { + for ( n = 0; n < min( MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); n++ ) + { + p_output[n] += st_ivas->hTcBuffer->n_samples_discard; + } + *nSamplesRendered -= st_ivas->hTcBuffer->n_samples_discard; + st_ivas->hTcBuffer->n_samples_discard = 0; + } + + { + if ( st_ivas->ivas_format != MONO_FORMAT ) + { +#ifndef DISABLE_LIMITER + Word16 ch_idx; + exp = 16; + for ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + { + + p_output_fx[ch_idx] = tmp_buffer_fx[ch_idx]; + } + for ( ch_idx = 0; ch_idx < nchan_out; ch_idx++ ) + { + exp = s_min( exp, Q_factor_arrL( p_output[ch_idx], *nSamplesRendered ) ); + } + exp -= 2; + for ( ch_idx = 0; ch_idx < nchan_out; ch_idx++ ) + { + for ( j = 0; j < *nSamplesRendered; j++ ) { - fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); - FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } + p_output_fx[ch_idx][j] = (Word32) ( p_output[ch_idx][j] * ( 1 << exp ) ); } - // fix2float end - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + } + ivas_limiter_dec_fx( st_ivas->hLimiter, p_output_fx, nchan_out, *nSamplesRendered, st_ivas->BER_detect, exp ); + for ( ch_idx = 0; ch_idx < st_ivas->hDecoderConfig->nchan_out; ch_idx++ ) + { + for ( j = 0; j < *nSamplesRendered; j++ ) { - IF( st_ivas->cldfbSynDec[out_ch] ) - { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); - } - } + p_output[ch_idx][j] = ( (float) p_output_fx[ch_idx][j] / ( 1 << exp ) ); } + } #endif + } + } + Word16 q_p_output = Q11; + FOR( i = 0; i < nchan_out; i++ ) + { + floatToFixed_arrL( p_output[i], p_output_fx[i], q_p_output, *nSamplesRendered ); + } + + ivas_syn_output_fx( p_output_fx, q_p_output, *nSamplesRendered, nchan_out, data ); + + FOR( i = 0; i < nchan_out; i++ ) + { + } + + + + *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available; + + pop_wmops(); + return IVAS_ERR_OK; +} #else - if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output[st_ivas->nchan_ism] ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif // IVAS_FLOAT_FIXED +ivas_error ivas_jbm_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t n, nchan_out; + int16_t nchan_transport; + int16_t nchan_remapped; + int32_t output_Fs; + AUDIO_CONFIG output_config; + int16_t nSamplesAskedLocal; + ivas_error error; + float *p_output[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; + float *p_tc[MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS]; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - for ( n = 0; n < st_ivas->nchan_ism; n++ ) - { - mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); - } + push_wmops( "ivas_dec_render" ); + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard; + + for ( n = 0; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + p_output[n] = st_ivas->p_output_f[n]; + } + + if ( !st_ivas->hDecoderConfig->Opt_tsm ) + { + for ( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) + { + p_tc[n] = p_output[n]; + } + + for ( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + st_ivas->hTcBuffer->tc[n] = p_output[n]; + } + } + else + { + for ( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) + { + p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered]; + } + } + + /*----------------------------------------------------------------* + * Update combined orientation access index + *----------------------------------------------------------------*/ + + if ( st_ivas->hCombinedOrientationData != NULL ) + { + /* take the discard samples into account here to make sure head rotation stays on the correct 5ms grid */ + st_ivas->hCombinedOrientationData->cur_subframe_samples_rendered_start -= st_ivas->hTcBuffer->n_samples_discard; + + ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); + } + + /*----------------------------------------------------------------* + * Rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == UNDEFINED_FORMAT ) + { + assert( 0 ); + } + else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output ); } - else + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { -#ifdef IVAS_FLOAT_FIXED - for ( n = 0; n < st_ivas->p_out_len; n++ ) + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { - floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + /* Convert CICP19 -> Ambisonics */ + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); } -#if 1 /*Float to fixed conversion*/ - SPAR_DEC_HANDLE hSpar; - hSpar = st_ivas->hSpar; - uint16_t nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - Word16 numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - DECODER_CONFIG_HANDLE hDecoderConfig; - hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_out_dirac = hDecoderConfig->nchan_out; + } + } + else /* ISM_MODE_DISC */ + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); - Word16 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 ); + /* Loudspeaker or Ambisonics rendering */ + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); + } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ + ivas_ism2sba_sf( st_ivas->hTcBuffer->tc, p_output, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); + } - for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) - { - floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); - } - Word16 q1 = 30, q2 = 30; - for ( int l = 0; l < numch_out; l++ ) - { - for ( j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - for ( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } - } - } - } - for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); - } - } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) - { - for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); - } - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) - { - IF( st_ivas->cldfbSynDec[out_ch] ) + /* Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] , Q11 ); - } + return error; } - } -#endif // - if ( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx,960) ) != IVAS_ERR_OK ) + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED /*Fixed to float */ - for ( n = 0; n < st_ivas->p_out_len; n++ ) - { - fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); - } - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ - } - } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - FOR( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } - } - // fix2float (to be cleaned) - 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 ) ) ) ) - { - fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); - FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - } - // fix2float end - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + } + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + nchan_remapped = nchan_transport; + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + for ( n = 0; n < nchan_remapped; n++ ) { - IF( st_ivas->cldfbSynDec[out_ch] ) - { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); - } - } + mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); } -#endif -#else - if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) + + if ( ( error = ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, 0, output_config, st_ivas->hOutSetup ) ) != IVAS_ERR_OK ) { return error; } -#endif // IVAS_FLOAT_FIXED } - } - else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) - { - ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } } else { -#ifdef IVAS_FLOAT_FIXED - for ( n = 0; n < st_ivas->p_out_len; n++ ) + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) { - floatToFixed_arr32( p_output[n], p_output_fx[n], Q11, 960 ); + return error; } -#if 1 /*Float to fixed conversion*/ - SPAR_DEC_HANDLE hSpar; - hSpar = st_ivas->hSpar; - uint16_t nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - Word16 numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - DECODER_CONFIG_HANDLE hDecoderConfig; - hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_out_dirac = hDecoderConfig->nchan_out; - - Word16 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 ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + nchan_remapped = st_ivas->nchan_transport; - for ( i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) - { - floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); - } - Word16 q1 = 30, q2 = 30; - for ( int l = 0; l < numch_out; l++ ) + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) { - for ( j = 0; j < numch_in; j++ ) + if ( ( error = ivas_omasa_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ) ) != IVAS_ERR_OK ) { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } + return error; } } - for (Word16 m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + else { - for ( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } - } - } + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); } - for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_omasa_dirac_rend_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + nchan_remapped = nchan_transport; + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { - for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + if ( ( error = ivas_osba_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + return error; } } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + else if ( st_ivas->renderer_type == RENDERER_OSBA_STEREO ) { - for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + + /* shift SBA channels to avoid overwrite by ISM upmix in 1 object case and non-TSM unified channel memory*/ + if ( st_ivas->nchan_ism == 1 && st_ivas->hDecoderConfig->Opt_tsm == 0 ) { - floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + mvr2r( p_tc[2], p_output[3], *nSamplesRendered ); + mvr2r( p_tc[1], p_output[2], *nSamplesRendered ); + p_tc[1] = p_output[2]; + p_tc[2] = p_output[3]; } - floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); - } - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) - { - IF( st_ivas->cldfbSynDec[out_ch] ) + + /* render objects */ + ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); + + /* add already rendered SBA part */ + for ( n = 0; n < nchan_out; n++ ) { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] ,Q11); - } + v_add( p_output[n], p_tc[n + st_ivas->nchan_ism], p_output[n], *nSamplesRendered ); } } -#endif // - if ( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx , 960) ) != IVAS_ERR_OK ) - { - return error; - } -#ifdef IVAS_FLOAT_FIXED /*Fixed to float */ - for ( n = 0; n < st_ivas->p_out_len; n++ ) - { - fixedToFloat_arrL( p_output_fx[n], p_output[n], 11, 960 ); - } - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + else if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI || st_ivas->renderer_type == RENDERER_OSBA_LS || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { - FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + if ( ( error = ivas_osba_render_sf( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ + return error; } } - FOR(Word16 m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) /*EXT output = individual objects + HOA3*/ { - FOR( j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output[st_ivas->nchan_ism] ) ) != IVAS_ERR_OK ) { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } + return error; } - } - 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 ) ) ) ) - { - fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); - FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + + for ( n = 0; n < st_ivas->nchan_ism; n++ ) { - fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); } } - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + else { - IF( st_ivas->cldfbSynDec[out_ch] ) + if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) { - FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); - } + return error; } } -#endif -#else + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else + { if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) { return error; } -#endif if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { @@ -8086,83 +5979,21 @@ ivas_error ivas_jbm_dec_render( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { -#ifdef IVAS_FLOAT_FIXED - st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; - subframe_len = st_ivas->hTcBuffer->subframe_nbslots[0] * st_ivas->hTcBuffer->n_samples_granularity; - gd_bits = find_guarded_bits_fx( subframe_len ); - exp = 13; - if ( ( error = getAudioConfigNumChannels( st_ivas->intern_config, &nchan_in ) ) != IVAS_ERR_OK ) - { - return error; - } - if ( ( error = getAudioConfigNumChannels( st_ivas->hOutSetup.output_config, &nchan_out ) ) != IVAS_ERR_OK ) - { - return error; - } - exp -= gd_bits; - *st_ivas->hCrendWrapper->p_io_qfactor = exp; - for (i = 0; i < nchan_in; i++) - { - for (j = 0; j < *nSamplesRendered; j++) - { - p_output_fx[i][j] = (Word32)float_to_fixed(p_output[i][j], *st_ivas->hCrendWrapper->p_io_qfactor); - } - } - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, - &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : p_tc_fx, p_output_fx, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) - - - { - return error; - } - ivas_binaural_add_LFE_fix(st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx); - for (i = 0; i < nchan_in; i++) - { - for (j = 0; j < *nSamplesRendered; j++) - { - p_output[i][j] = fixed_to_float(p_output_fx[i][j], *st_ivas->hCrendWrapper->p_io_qfactor); - } - } - -#else if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output : p_tc, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - - ivas_binaural_add_LFE(st_ivas, *nSamplesRendered, p_tc, p_output); -#endif + { + return error; + } + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_tc, p_output ); } else if ( st_ivas->renderer_type == RENDERER_MC ) { *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); -#ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx( st_ivas->nchan_transport ); - FOR( i = 0; i < st_ivas->nchan_transport; ++i ) - { - floatToFixed_arrL( p_tc[i], p_tc_fx[i], q, *nSamplesRendered ); - } - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) - { - FOR( j = 0; j < st_ivas->nchan_transport; j++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); - } - } - ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc_fx, p_output_fx ); - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; ++i ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); - } -#else ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); -#endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { @@ -8170,63 +6001,12 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { -#ifdef IVAS_FLOAT_FIXED -#if 1 /* TODO: remove float to fix conversions: */ - for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++) - { - for ( j = 0; j < L_FRAME48k; j++) - { - p_output_fx[i][j] = floatToFixed(p_output[i][j], output_q_factor); - } - } - for (int ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k); - } -#endif - IF ( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, *nSamplesRendered ) ) != IVAS_ERR_OK ) - { - return error; - } - -#if 1 /* TODO: remove Fixed to float */ - for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++) - { - for ( j = 0; j < L_FRAME48k; j++) + if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) { - p_output[i][j] = fixedToFloat(p_output_fx[i][j], Q11); + return error; } - } -#endif -#else - if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif - -#ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx(*nSamplesRendered); - FOR(i = 0; i < st_ivas->nchan_transport; ++i) - { - //p_tc and pout point to same location - floatToFixed_arrL(p_tc[i], p_tc_fx[i], q, *nSamplesRendered); - floatToFixed_arrL(p_output[i], p_output_fx[i], q, *nSamplesRendered); - } - ivas_binaural_add_LFE_fix(st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx); - - FOR(i = 0; i < st_ivas->nchan_transport; ++i) - { - //p_tc and pout point to same location - fixedToFloat_arrL(p_tc_fx[i], p_tc[i], q, *nSamplesRendered); - fixedToFloat_arrL(p_output_fx[i], p_output[i], q, *nSamplesRendered); - } -#else - ivas_binaural_add_LFE(st_ivas, *nSamplesRendered, p_tc, p_output); -#endif - + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_tc, p_output ); } } else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) @@ -8238,49 +6018,12 @@ ivas_error ivas_jbm_dec_render( if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && !st_ivas->hDecoderConfig->Opt_Headrotation ) { { -#ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx(*nSamplesRendered); - FOR(i = 0; i < max(st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS); ++i) - { - floatToFixed_arrL(p_output[i], p_output_fx[i], q, *nSamplesRendered); - } - - ivas_binaural_add_LFE_fix( st_ivas, *nSamplesRendered, p_output_fx, p_output_fx); - - FOR(i = 0; i < max(st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS); ++i) - { - fixedToFloat_arrL(p_output_fx[i], p_output[i], q, *nSamplesRendered); - } -#else - ivas_binaural_add_LFE(st_ivas, *nSamplesRendered, p_output, p_output); -#endif + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output ); } } else if ( st_ivas->renderer_type == RENDERER_MC ) { -#ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx( MC_PARAMUPMIX_MAX_INPUT_CHANS ); - FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS ); ++i ) - { - floatToFixed_arrL( p_output[i], p_output_fx[i], q, *nSamplesRendered ); - } - FOR( i = 0; i < st_ivas->hDecoderConfig->nchan_out; i++ ) - { - FOR( j = 0; j < MC_PARAMUPMIX_MAX_INPUT_CHANS; j++ ) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[j][i] = float_to_fix( st_ivas->hLsSetUpConversion->dmxMtx[j][i], Q30 ); - } - } - ivas_ls_setup_conversion_fx( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, *nSamplesRendered, p_output_fx, p_output_fx ); - FOR( i = 0; i < max( st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS ); ++i ) - { - fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); - } -#else ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, *nSamplesRendered, p_output, p_output ); -#endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { @@ -8288,28 +6031,12 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { - if ( ( error = ivas_td_binaural_renderer( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) - { - return error; - } - -#ifdef IVAS_FLOAT_FIXED - Word16 q = Q16; - q = q - find_guarded_bits_fx(*nSamplesRendered); - FOR(i = 0; i < max(st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS); ++i) - { - floatToFixed_arrL(p_output[i], p_output_fx[i], q, *nSamplesRendered); - } - - ivas_binaural_add_LFE_fix(st_ivas, *nSamplesRendered, p_output_fx, p_output_fx); + if ( ( error = ivas_td_binaural_renderer( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } - FOR(i = 0; i < max(st_ivas->hDecoderConfig->nchan_out, MC_PARAMUPMIX_MAX_INPUT_CHANS); ++i) - { - fixedToFloat_arrL(p_output_fx[i], p_output[i], q, *nSamplesRendered); - } -#else - ivas_binaural_add_LFE(st_ivas, *nSamplesRendered, p_output, p_output); -#endif + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output ); } } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) @@ -8393,54 +6120,12 @@ ivas_error ivas_jbm_dec_render( if ( st_ivas->ivas_format != MONO_FORMAT ) { #ifndef DISABLE_LIMITER -#ifdef IVAS_FLOAT_FIXED - Word16 ch_idx; - exp = 16; - for ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) - { - - p_output_fx[ch_idx] = tmp_buffer_fx[ch_idx]; - } - for ( ch_idx = 0; ch_idx < nchan_out; ch_idx++ ) - { - exp = s_min( exp , Q_factor_arrL( p_output[ch_idx], *nSamplesRendered ) ); - } - exp -= 2; - for ( ch_idx = 0; ch_idx < nchan_out; ch_idx++ ) - { - for ( j = 0; j < *nSamplesRendered; j++ ) - { - p_output_fx[ch_idx][j] = (Word32) ( p_output[ch_idx][j] * ( 1 << exp ) ); - } - } - ivas_limiter_dec_fx( st_ivas->hLimiter, p_output_fx, nchan_out, *nSamplesRendered, st_ivas->BER_detect, exp ); - for ( ch_idx = 0; ch_idx < st_ivas->hDecoderConfig->nchan_out; ch_idx++ ) - { - for ( j = 0; j < *nSamplesRendered; j++ ) - { - p_output[ch_idx][j] = ( (float) p_output_fx[ch_idx][j] / ( 1 << exp ) ); - } - } -#else ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect ); - #endif #endif } } -#ifdef IVAS_FLOAT_FIXED - Word16 q_p_output = Q11; - FOR( i = 0; i < nchan_out; i++) { - floatToFixed_arrL(p_output[i], p_output_fx[i], q_p_output, *nSamplesRendered); - } - - ivas_syn_output_fx( p_output_fx, q_p_output, *nSamplesRendered, nchan_out, data ); - - FOR( i = 0; i < nchan_out; i++) { - } -#else ivas_syn_output( p_output, *nSamplesRendered, nchan_out, data ); -#endif *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available; @@ -8448,7 +6133,7 @@ ivas_error ivas_jbm_dec_render( pop_wmops(); return IVAS_ERR_OK; } - +#endif /*--------------------------------------------------------------------------* * ivas_jbm_dec_dec_flush_renderer() @@ -8459,14 +6144,14 @@ ivas_error ivas_jbm_dec_render( #ifdef IVAS_FLOAT_FIXED ivas_error ivas_jbm_dec_flush_renderer_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 tc_granularity_new, /* i : new renderer granularity */ + const Word16 tc_granularity_new, /* i : new renderer granularity */ const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ const AUDIO_CONFIG intern_config_old, /* i : old internal config */ const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ const MC_MODE mc_mode_old, /* i : old MC mode */ const ISM_MODE ism_mode_old, /* i : old ISM mode */ - UWord16 *nSamplesRendered, /* o : number of samples flushed */ - Word16 *data /* o : output synthesis signal */ + UWord16 *nSamplesRendered, /* o : number of samples flushed */ + Word16 *data /* o : output synthesis signal */ ) { ivas_error error; @@ -8478,7 +6163,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( Word32 *p_output_fx[MAX_CICP_CHANNELS]; Word16 nchan_in, nchan_out; const Word16 output_q_factor = Q11; - IF ( !st_ivas->hDecoderConfig->Opt_tsm ) + IF( !st_ivas->hDecoderConfig->Opt_tsm ) { return IVAS_ERR_OK; } @@ -8488,23 +6173,23 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( hTcBuffer = st_ivas->hTcBuffer; /* get number of possible slots in new granularity */ - n_samples_still_available = sub(hTcBuffer->n_samples_buffered , hTcBuffer->n_samples_rendered); + n_samples_still_available = sub( hTcBuffer->n_samples_buffered, hTcBuffer->n_samples_rendered ); n_slots_still_available = n_samples_still_available / tc_granularity_new; - *nSamplesRendered = imult1616(n_slots_still_available , tc_granularity_new); + *nSamplesRendered = imult1616( n_slots_still_available, tc_granularity_new ); n_samples_to_render = *nSamplesRendered; move16(); - n_samples_still_available = sub(n_samples_still_available,n_samples_to_render); + n_samples_still_available = sub( n_samples_still_available, n_samples_to_render ); assert( n_samples_still_available < tc_granularity_new ); /* update combined orientation access index */ ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); - IF ( n_slots_still_available ) + IF( n_slots_still_available ) { Word16 ch_idx; /* render what is still there with zero padding */ - FOR ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) { /* move it at the beginning of the TC buffer with zero padding */ Copy32( hTcBuffer->tc_fx[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc_fx[ch_idx], n_samples_to_render ); @@ -8517,7 +6202,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( hTcBuffer->subframes_rendered = 0; hTcBuffer->slots_rendered = 0; hTcBuffer->subframe_nbslots[0] = 1; - hTcBuffer->n_samples_buffered = add(hTcBuffer->n_samples_granularity , n_samples_still_available); + hTcBuffer->n_samples_buffered = add( hTcBuffer->n_samples_granularity, n_samples_still_available ); hTcBuffer->n_samples_available = 0; hTcBuffer->n_samples_flushed = n_samples_to_render; #ifdef CR_FIX_JBM_FLUSH_OFFSET @@ -8525,26 +6210,33 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( #else hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity; #endif - move16();move16();move16();move16();move16();move16();move16();move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); - FOR ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) { p_output_fx[ch_idx] = output_fx[ch_idx]; } - IF ( EQ_16(st_ivas->ivas_format , ISM_FORMAT) ) + IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) ) { - IF ( EQ_16(ism_mode_old , ISM_MODE_DISC) ) + IF( EQ_16( ism_mode_old, ISM_MODE_DISC ) ) { /* Binaural rendering */ - IF ( EQ_16(renderer_type_old , RENDERER_BINAURAL_OBJECTS_TD) ) + IF( EQ_16( renderer_type_old, RENDERER_BINAURAL_OBJECTS_TD ) ) { - IF ( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) { return error; } } - ELSE IF ( EQ_16(renderer_type_old , RENDERER_BINAURAL_MIXER_CONV_ROOM) ) + ELSE IF( EQ_16( renderer_type_old, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { /*TODO :To be tested : no stream entering---------------------------------------*/ /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ @@ -8555,8 +6247,8 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; *st_ivas->hCrendWrapper->p_io_qfactor = 11; move16(); - IF ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, - NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, + NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -8567,40 +6259,39 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong ISM_MODE in VoIP renderer flushing!" ); } } - ELSE IF ( EQ_16(st_ivas->ivas_format , MC_FORMAT) ) + ELSE IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) ) { - IF ( EQ_16(mc_mode_old , MC_MODE_MCT) ) + IF( EQ_16( mc_mode_old, MC_MODE_MCT ) ) { - IF ( EQ_16(renderer_type_old , RENDERER_BINAURAL_MIXER_CONV) || EQ_16(renderer_type_old , RENDERER_BINAURAL_MIXER_CONV_ROOM) ) + IF( EQ_16( renderer_type_old, RENDERER_BINAURAL_MIXER_CONV ) || EQ_16( renderer_type_old, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { /*TODO :To be tested : no stream entering*/ st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; - IF ( ( error = getAudioConfigNumChannels( intern_config_old, &nchan_in ) ) != IVAS_ERR_OK ) + IF( ( error = getAudioConfigNumChannels( intern_config_old, &nchan_in ) ) != IVAS_ERR_OK ) { return error; } - IF ( ( error = getAudioConfigNumChannels( st_ivas->hOutSetup.output_config, &nchan_out ) ) != IVAS_ERR_OK ) + IF( ( error = getAudioConfigNumChannels( st_ivas->hOutSetup.output_config, &nchan_out ) ) != IVAS_ERR_OK ) { return error; } *st_ivas->hCrendWrapper->p_io_qfactor = 11; move16(); - IF ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, - hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, + hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { return error; } - ivas_binaural_add_LFE_fix( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc_fx, p_output_fx ); - + ivas_binaural_add_LFE_fx( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc_fx, p_output_fx ); } - ELSE IF ( EQ_16(st_ivas->renderer_type , RENDERER_BINAURAL_OBJECTS_TD) ) + ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) { - IF ( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) { return error; } - ivas_binaural_add_LFE_fix( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc_fx, p_output_fx ); + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc_fx, p_output_fx ); } } ELSE @@ -8608,38 +6299,38 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong MC_MODE in VoIP renderer flushing!" ); } } - ELSE IF ( EQ_16(st_ivas->ivas_format , MASA_ISM_FORMAT) || EQ_16(st_ivas->ivas_format , MASA_FORMAT) ) + ELSE IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_FORMAT ) ) { - IF ( EQ_16(ism_mode_old , ISM_MASA_MODE_DISC) ) + IF( EQ_16( ism_mode_old, ISM_MASA_MODE_DISC ) ) { Word32 *tc_local_fx[MAX_TRANSPORT_CHANNELS]; move16(); - FOR ( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) { tc_local_fx[ch_idx] = &st_ivas->hTcBuffer->tc_fx[ch_idx + 2][hTcBuffer->n_samples_rendered]; - Copy32( st_ivas->hMasaIsmData->delayBuffer_fx[ch_idx], tc_local_fx[ch_idx], st_ivas->hMasaIsmData->delayBuffer_size );/*Q11*/ + Copy32( st_ivas->hMasaIsmData->delayBuffer_fx[ch_idx], tc_local_fx[ch_idx], st_ivas->hMasaIsmData->delayBuffer_size ); /*Q11*/ } - IF ( GT_16(st_ivas->nchan_ism , 0) ) + IF( GT_16( st_ivas->nchan_ism, 0 ) ) { - IF ( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, output_q_factor, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) { return error; } } ELSE { - FOR ( ch_idx = 0; ch_idx < st_ivas->hDecoderConfig->nchan_out; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < st_ivas->hDecoderConfig->nchan_out; ch_idx++ ) { set_zero_fx( p_output_fx[ch_idx], (Word16) ( *nSamplesRendered ) ); } - st_ivas->hTcBuffer->slots_rendered = add(st_ivas->hTcBuffer->slots_rendered,1); - st_ivas->hTcBuffer->subframes_rendered = add(st_ivas->hTcBuffer->subframes_rendered,1); + st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, 1 ); + st_ivas->hTcBuffer->subframes_rendered = add( st_ivas->hTcBuffer->subframes_rendered, 1 ); } } } - ELSE IF ( EQ_16(st_ivas->ivas_format , SBA_ISM_FORMAT) ) + ELSE IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { Word32 *tc_local_fx[MAX_TRANSPORT_CHANNELS]; Word16 last_spar_md_idx; @@ -8651,7 +6342,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( move16(); move16(); /* copy from ISM delay buffer to the correct place in tcs */ - FOR ( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ ) { tc_local_fx[ch_idx] = &st_ivas->hTcBuffer->tc_fx[ch_idx + 2][hTcBuffer->n_samples_rendered]; Copy32( st_ivas->hSbaIsmData->delayBuffer_fx[ch_idx], tc_local_fx[ch_idx], st_ivas->hSbaIsmData->delayBuffer_size ); @@ -8668,14 +6359,23 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( st_ivas->hSpatParamRendCom->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME; st_ivas->hSpatParamRendCom->slots_rendered = 0; st_ivas->hSpatParamRendCom->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME; - move16();move16();move16();move16();move16();move16();move16();move16();move16();move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); /* also adapt md maps, just use the last index */ set16_fx( st_ivas->hSpar->render_to_md_map, last_spar_md_idx, n_slots_still_available ); set16_fx( st_ivas->hSpatParamRendCom->render_to_md_map, last_dirac_md_idx, n_slots_still_available ); /* render the last subframe */ - IF ( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, (UWord16) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output_fx, output_q_factor, L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES) ) != IVAS_ERR_OK ) + IF( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, (UWord16) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output_fx, output_q_factor, L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES ) ) != IVAS_ERR_OK ) { return error; } @@ -8696,11 +6396,11 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( move16(); /* Only write out the valid data*/ { - IF ( NE_16(st_ivas->ivas_format , MONO_FORMAT) ) + IF( NE_16( st_ivas->ivas_format, MONO_FORMAT ) ) { #ifndef DISABLE_LIMITER - Word16 ch_idx,exp=11; - FOR ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + Word16 ch_idx, exp = 11; + FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) { p_output_fx[ch_idx] = output_fx[ch_idx]; } @@ -8709,7 +6409,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( } } - ivas_syn_output_fx( p_output_fx,Q11, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out,data); + ivas_syn_output_fx( p_output_fx, Q11, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, data ); return IVAS_ERR_OK; } #else @@ -8943,7 +6643,7 @@ ivas_error ivas_jbm_dec_flush_renderer( for ( j = 0; j < hTcBuffer->n_samples_granularity; j++ ) { - hTcBuffer->tc_fx[i][j] = (Word32) float_to_fixed( hTcBuffer->tc[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); + hTcBuffer->tc_fx[i][j] = (Word32) float_to_fixed( hTcBuffer->tc[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); } } if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, @@ -8952,15 +6652,15 @@ ivas_error ivas_jbm_dec_flush_renderer( return error; } - ivas_binaural_add_LFE_fix(st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc_fx, p_output_fx); + ivas_binaural_add_LFE_fx( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc_fx, p_output_fx ); - for (i = 0; i < nchan_in; i++) + for ( i = 0; i < nchan_in; i++ ) { - for (j = 0; j < *nSamplesRendered; j++) - { - // p_output[i][j] = fixed_to_float(p_output_fx[i][j], *st_ivas->hCrendWrapper->p_io_qfactor); - st_ivas->hTcBuffer->tc[i][j] = fixed_to_float(st_ivas->hTcBuffer->tc_fx[i][j], *st_ivas->hCrendWrapper->p_io_qfactor); - } + for ( j = 0; j < *nSamplesRendered; j++ ) + { + // p_output[i][j] = fixed_to_float(p_output_fx[i][j], *st_ivas->hCrendWrapper->p_io_qfactor); + st_ivas->hTcBuffer->tc[i][j] = fixed_to_float( st_ivas->hTcBuffer->tc_fx[i][j], *st_ivas->hCrendWrapper->p_io_qfactor ); + } } #else if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, @@ -8968,10 +6668,8 @@ ivas_error ivas_jbm_dec_flush_renderer( { return error; } - ivas_binaural_add_LFE(st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output); + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); #endif - - } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { @@ -8982,26 +6680,26 @@ ivas_error ivas_jbm_dec_flush_renderer( #ifdef IVAS_FLOAT_FIXED Word16 q = Q16; - q = q - find_guarded_bits_fx(*nSamplesRendered); - FOR(i = 0; i < st_ivas->nchan_transport; ++i) + q = q - find_guarded_bits_fx( *nSamplesRendered ); + FOR( i = 0; i < st_ivas->nchan_transport; ++i ) { - //p_tc and pout point to same location - floatToFixed_arrL(st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], q, *nSamplesRendered); - p_output_fx[i] = malloc(L_FRAME48k * sizeof(Word32)); - floatToFixed_arrL(p_output[i], p_output_fx[i], q, *nSamplesRendered); + // p_tc and pout point to same location + floatToFixed_arrL( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], q, *nSamplesRendered ); + p_output_fx[i] = malloc( L_FRAME48k * sizeof( Word32 ) ); + floatToFixed_arrL( p_output[i], p_output_fx[i], q, *nSamplesRendered ); } - ivas_binaural_add_LFE_fix(st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc_fx, p_output_fx); + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc_fx, p_output_fx ); - FOR(i = 0; i < st_ivas->nchan_transport; ++i) + FOR( i = 0; i < st_ivas->nchan_transport; ++i ) { - //p_tc and pout point to same location only need to do for 2 channels can be cleaned up later - fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], q, *nSamplesRendered); - fixedToFloat_arrL(p_output_fx[i], p_output[i], q, *nSamplesRendered); - free(p_output_fx[i]); + // p_tc and pout point to same location only need to do for 2 channels can be cleaned up later + fixedToFloat_arrL( st_ivas->hTcBuffer->tc_fx[i], st_ivas->hTcBuffer->tc[i], q, *nSamplesRendered ); + fixedToFloat_arrL( p_output_fx[i], p_output[i], q, *nSamplesRendered ); + free( p_output_fx[i] ); } #else - ivas_binaural_add_LFE(st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output); + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output ); #endif } } @@ -9114,7 +6812,7 @@ ivas_error ivas_jbm_dec_flush_renderer( { for ( j = 0; j < *nSamplesRendered; j++ ) { - p_output_fx[ch_idx][j] = (Word32) ( p_output[ch_idx][j] *(1<< exp) ) ; + p_output_fx[ch_idx][j] = (Word32) ( p_output[ch_idx][j] * ( 1 << exp ) ); } } ivas_limiter_dec_fx( st_ivas->hLimiter, p_output_fx, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect, exp ); @@ -10697,21 +8395,21 @@ static void ivas_jbm_dec_tc_buffer_playout_fx( slot_size = st_ivas->hTcBuffer->n_samples_granularity; /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - tmp = BASOP_Util_Divide1616_Scale(nSamplesAsked, slot_size, &e); - tmp = shr(tmp, sub(15, e)); - slots_to_render = s_min( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered), tmp ); - st_ivas->hTcBuffer->slots_rendered = add(st_ivas->hTcBuffer->slots_rendered, slots_to_render); - *nSamplesRendered = (UWord16) L_mult0(slots_to_render, slot_size); + tmp = BASOP_Util_Divide1616_Scale( nSamplesAsked, slot_size, &e ); + tmp = shr( tmp, sub( 15, e ) ); + slots_to_render = s_min( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered ), tmp ); + st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, slots_to_render ); + *nSamplesRendered = (UWord16) L_mult0( slots_to_render, slot_size ); first_sf = st_ivas->hTcBuffer->subframes_rendered; last_sf = first_sf; - WHILE ( GT_16(slots_to_render, 0) ) + WHILE( GT_16( slots_to_render, 0 ) ) { - slots_to_render = sub(slots_to_render, st_ivas->hTcBuffer->subframe_nbslots[last_sf]); - last_sf = add(last_sf, 1); + slots_to_render = sub( slots_to_render, st_ivas->hTcBuffer->subframe_nbslots[last_sf] ); + last_sf = add( last_sf, 1 ); } - FOR ( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ ) { mvl2l( st_ivas->hTcBuffer->tc_fx[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered, output_fx[ch_idx], *nSamplesRendered ); } @@ -11371,7 +9069,7 @@ static void ivas_jbm_dec_copy_masa_meta_to_buffer( static void ivas_jbm_masa_sf_to_slot_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef IVAS_FLOAT_FIXED - const Word16 nCldfbTs /* i : number of CLDFB time slots */ + const Word16 nCldfbTs /* i : number of CLDFB time slots */ ) { Word16 sf_to_slot_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index a38dee76fd9c284a84967c3eeaa2fed636a661c9..a7c0fe222efaf292e8d93c8f89d9a27835efc09b 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -32,6 +32,7 @@ #include #include "options.h" +#ifndef IVAS_FLOAT_FIXED #include "prot.h" #include "ivas_prot.h" #include "ivas_rom_com.h" @@ -46,7 +47,7 @@ /* Delay handling of LFE: overall_lfe_delay = max(11.5, BLOCK_OFFSET_MS); */ #define BLOCK_OFFSET_MS 12 - +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_dec_delay_adjust() * @@ -470,3 +471,5 @@ void ivas_lfe_dec_close( return; } +#endif +#endif \ No newline at end of file diff --git a/lib_dec/ivas_lfe_dec_fx.c b/lib_dec/ivas_lfe_dec_fx.c index bd4a7399711c2ba9e57c2f459d9d551f415fd1cb..ecda2cb2e16976ed28b9695ba30f40cfc798c83b 100644 --- a/lib_dec/ivas_lfe_dec_fx.c +++ b/lib_dec/ivas_lfe_dec_fx.c @@ -71,34 +71,43 @@ static void ivas_lfe_dec_delay_adjust_fx( diff = sub( hLFE->lfe_prior_buf_len, hLFE->pWindow_state->fade_len ); loop_counter = LT_16( diff, 0 ) ? 0 : diff; + move16(); fade_len = hLFE->pWindow_state->fade_len; + move16(); dct_len = hLFE->pWindow_state->dct_len; + move16(); zero_pad_len = hLFE->pWindow_state->zero_pad_len; + move16(); FOR( i = 0; i < loop_counter; i++ ) { tmp_buffer[i] = hLFE->prior_out_buffer_fx[i]; + move32(); } FOR( i = 0; i < fade_len; i++ ) { tmp_buffer[i + loop_counter] = L_add( hLFE->prior_out_buffer_fx[i + loop_counter], pInbuf[i] ); + move32(); } loop_counter = add( loop_counter, fade_len ); FOR( i = 0; i < add( fade_len, shl( zero_pad_len, 1 ) ); i++ ) { tmp_buffer[i + loop_counter] = pInbuf[i + fade_len]; + move32(); } FOR( i = 0; i < hLFE->lfe_prior_buf_len; i++ ) { hLFE->prior_out_buffer_fx[i] = tmp_buffer[i + dct_len]; + move32(); } FOR( i = 0; i < dct_len; i++ ) { output_lfe_ch[i] = tmp_buffer[i]; + move32(); } return; @@ -121,22 +130,27 @@ static void ivas_lfe_dec_windowing_fx( const Word32 *pWindow_coeffs; fade_len = hLFE->pWindow_state->fade_len; + move16(); zero_pad_len = hLFE->pWindow_state->zero_pad_len; + move16(); pWindow_coeffs = hLFE->pWindow_state->pWindow_coeffs_fx; FOR( i = 0; i < fade_len; i++ ) { pInbuf[i] = Mpy_32_32( pInbuf[add( zero_pad_len, i )], pWindow_coeffs[i] ); + move32(); } FOR( i = 0; i < shl( zero_pad_len, 1 ); i++ ) { pInbuf[add( fade_len, i )] = pInbuf[add( add( zero_pad_len, fade_len ), i )]; + move32(); } FOR( i = 0; i < fade_len; i++ ) { pInbuf[add( add( shl( zero_pad_len, 1 ), fade_len ), i )] = Mpy_32_32( pInbuf[add( add( i_mult( zero_pad_len, 3 ), fade_len ), i )], pWindow_coeffs[sub( sub( fade_len, i ), 1 )] ); + move32(); } return; @@ -168,17 +182,22 @@ static Word16 ivas_lfe_dec_dequant_fx( Word16 values[IVAS_LFE_MAX_NUM_DCT_COEFFS]; Word16 num_dct_coeffs, num_groups; - all_zeros_dct = get_next_indice( st0, 1 ); + all_zeros_dct = get_next_indice_fx( st0, 1 ); lfe_bits = st0->next_bit_pos; + move16(); shift_bits = IVAS_LFE_SHIFT_BITS; + move16(); min_shift_bits = 0; + move16(); shift = 0; + move16(); IF( EQ_16( all_zeros_dct, 1 ) ) { FOR( i = 0; i < IVAS_LFE_MAX_NUM_DCT_COEFFS; i++ ) { pOut_buf[i] = 0; + move32(); } } ELSE @@ -188,28 +207,34 @@ static Word16 ivas_lfe_dec_dequant_fx( Word16 iii, extra_bits_read; extra_bits_read = 0; - quant_strategy = get_next_indice( st0, 1 ); + move16(); + quant_strategy = get_next_indice_fx( st0, 1 ); *num_dct_pass_bins = ivas_lfe_num_dct_pass_bins_tbl[quant_strategy]; + move16(); num_dct_coeffs = shl( *num_dct_pass_bins, 1 ); num_groups = shr( num_dct_coeffs, 2 ); min_shift_bits = ivas_lfe_min_shift_tbl[quant_strategy]; - shift = add( get_next_indice( st0, shift_bits ), shl( min_shift_bits, 2 ) ); + move16(); + shift = add( get_next_indice_fx( st0, shift_bits ), shl( min_shift_bits, 2 ) ); FOR( i = 0; i < num_dct_coeffs; i++ ) { - sign_bits[i] = get_next_indice( st0, 1 ); + sign_bits[i] = get_next_indice_fx( st0, 1 ); + move16(); } - coding_strategy = get_next_indice( st0, 1 ); + coding_strategy = get_next_indice_fx( st0, 1 ); IF( coding_strategy ) { FOR( iii = 0; iii < num_groups; iii++ ) { base2_bit_size = hLFE->lfe_dec_indices_coeffs_tbl[quant_strategy][iii]; + move16(); FOR( i = 0; i < 4; i++ ) { - abs_values[iii * 4 + i] = get_next_indice( st0, base2_bit_size ); + abs_values[iii * 4 + i] = get_next_indice_fx( st0, base2_bit_size ); + move16(); } } } @@ -218,11 +243,13 @@ static Word16 ivas_lfe_dec_dequant_fx( FOR( iii = 0; iii < num_groups; iii++ ) { extra_bits_read = 0; + move16(); ivas_ari_start_decoding_14bits_ext_1_lfe( st0, &as, &extra_bits_read ); FOR( i = 0; i < 4; i++ ) { abs_values[iii * 4 + i] = ivas_ari_decode_14bits_bit_ext_1_lfe( st0, &as, hLFE->cum_freq_models[quant_strategy][iii], &extra_bits_read ); + move16(); } ivas_ari_done_decoding_14bits_ext_1_lfe( st0, extra_bits_read ); } @@ -231,21 +258,28 @@ static Word16 ivas_lfe_dec_dequant_fx( FOR( i = 0; i < num_dct_coeffs; i++ ) { values[i] = shl( abs_values[i], 9 ); // Q9 + move16(); IF( GT_16( sign_bits[i], 0 ) ) { values[i] = shl( sub( negate( abs_values[i] ), 1 ), 9 ); // Q9 + move16(); } } two_pow_shift_by_4 = tbl_two_pow_shift_by_4[shift]; + move32(); FOR( i = 0; i < num_groups; i++ ) { - pOut_buf[2 * i] = Mpy_32_16_1( two_pow_shift_by_4, values[4 * i] ); // Q30 + Q9 >> 15 = Q24 + pOut_buf[2 * i] = Mpy_32_16_1( two_pow_shift_by_4, values[4 * i] ); // Q30 + Q9 >> 15 = Q24 + move32(); pOut_buf[2 * i + 1] = Mpy_32_16_1( two_pow_shift_by_4, values[4 * i + 1] ); // Q30 + Q9 >> 15 = Q24 + move32(); - pOut_buf[2 * i + *num_dct_pass_bins] = Mpy_32_16_1( two_pow_shift_by_4, values[4 * i + 2] ); // Q30 + Q9 >> 15 = Q24 + pOut_buf[2 * i + *num_dct_pass_bins] = Mpy_32_16_1( two_pow_shift_by_4, values[4 * i + 2] ); // Q30 + Q9 >> 15 = Q24 + move32(); pOut_buf[2 * i + *num_dct_pass_bins + 1] = Mpy_32_16_1( two_pow_shift_by_4, values[4 * i + 3] ); // Q30 + Q9 >> 15 = Q24 + move32(); } } @@ -276,7 +310,9 @@ void ivas_lfe_dec_fx( Word32 lfe_dct[IVAS_LFE_MAX_NUM_DCT_COEFFS]; dct_len = hLFE->pWindow_state->dct_len; + move16(); num_dct_pass_bins = IVAS_LFE_MAX_NUM_DCT_PASS_BINS; + move16(); IF( EQ_16( bfi, 0 ) ) { @@ -285,6 +321,7 @@ void ivas_lfe_dec_fx( set32_fx( t_audio, 0, dct_len ); Copy32( lfe_dct, t_audio, num_dct_pass_bins ); // Q24 q_out = Q24; + move16(); ivas_imdct_fx( t_audio, out, dct_len, &q_out ); // Q9 ivas_lfe_dec_windowing_fx( hLFE, out ); // Q9 ivas_lfe_dec_delay_adjust_fx( hLFE, out, output_lfe_ch ); // Q9 @@ -292,6 +329,7 @@ void ivas_lfe_dec_fx( set32_fx( t_audio, 0, dct_len ); Copy32( &lfe_dct[num_dct_pass_bins], t_audio, num_dct_pass_bins ); // Q24 q_out = Q24; + move16(); ivas_imdct_fx( t_audio, out, dct_len, &q_out ); // Q9 ivas_lfe_dec_windowing_fx( hLFE, out ); // Q9 ivas_lfe_dec_delay_adjust_fx( hLFE, out, output_lfe_ch + dct_len ); // Q9 @@ -299,39 +337,23 @@ void ivas_lfe_dec_fx( Copy32( hLFE->prevsynth_buf_fx + L_FRAME_1k6, hLFE->prevsynth_buf_fx, LFE_PLC_BUFLEN - L_FRAME_1k6 ); j = 0; + move16(); FOR( i = 0; i < L_FRAME_1k6; i++ ) { hLFE->prevsynth_buf_fx[i + LFE_PLC_BUFLEN - L_FRAME_1k6] = output_lfe_ch[j]; + move32(); j = add( j, shr( output_frame, 5 ) ); } hLFE->bfi_count = 0; + move16(); } ELSE { /* note: in BFI branch, buffer 't_audio' is in time-domain ('wtda' signal) */ hLFE->bfi_count++; -#ifdef IVAS_FLOAT_FIXED_TBD - ivas_lfe_tdplc_fx( hLFE, hLFE->prevsynth_buf, t_audio, output_frame ); -#else - float t_audio_flt[L_FRAME48k]; - FOR( int k = 0; k < 240; k++ ) - { - - hLFE->prevsynth_buf[k] = (float) hLFE->prevsynth_buf_fx[k] / ONE_IN_Q9; - } - - ivas_lfe_tdplc( hLFE, hLFE->prevsynth_buf, t_audio_flt, output_frame ); - FOR( int k = 0; k < 960; k++ ) - { - if ( k < 240 ) - { - hLFE->prevsynth_buf_fx[k] = (Word32) ( hLFE->prevsynth_buf[k] * ONE_IN_Q9 ); - } - t_audio[k] = (Word32) ( t_audio_flt[k] * ONE_IN_Q9 ); - } -#endif // IVAS_FLOAT_FIXED_TBD + ivas_lfe_tdplc_fx( hLFE, hLFE->prevsynth_buf_fx, t_audio, output_frame ); ivas_itda_fx( t_audio, out, dct_len ); ivas_lfe_dec_windowing_fx( hLFE, out ); @@ -344,9 +366,11 @@ void ivas_lfe_dec_fx( Copy32( hLFE->prevsynth_buf_fx + L_FRAME_1k6, hLFE->prevsynth_buf_fx, LFE_PLC_BUFLEN - L_FRAME_1k6 ); j = 0; + move16(); FOR( i = 0; i < L_FRAME_1k6; i++ ) { hLFE->prevsynth_buf_fx[i + LFE_PLC_BUFLEN - L_FRAME_1k6] = output_lfe_ch[j]; + move32(); j = add( j, shr( output_frame, 5 ) ); } } @@ -389,9 +413,11 @@ ivas_error ivas_create_lfe_dec_fx( Word32 output_fs_fx; low_pass_delay_dec_out = 0; + move16(); block_offset_s = 0; + move16(); - output_frame = extract_l(Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 )); + output_frame = extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /*-----------------------------------------------------------------* * Allocate LFE handle @@ -424,20 +450,27 @@ ivas_error ivas_create_lfe_dec_fx( hLFE->cum_freq_models[1][3] = &ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg4; /* delay calculation */ - hLFE->lfe_block_delay_s_fx = ( IVAS_LFE_FADE_S_Q15 ) + ivas_lfe_lpf_delay_Q15[IVAS_FILTER_ORDER_4 - 3]; + hLFE->lfe_block_delay_s_fx = add( IVAS_LFE_FADE_S_Q15, ivas_lfe_lpf_delay_Q15[IVAS_FILTER_ORDER_4 - 3] ); block_offset_s = BLOCK_OFFSET_S_Q15; + move16(); filt_order = 0; + move16(); low_pass_delay_dec_out = 0; + move16(); hLFE->filter_state.order = filt_order; - hLFE->lfe_block_delay_s_fx = hLFE->lfe_block_delay_s_fx + low_pass_delay_dec_out; + move16(); + hLFE->lfe_block_delay_s_fx = add( hLFE->lfe_block_delay_s_fx, low_pass_delay_dec_out ); hLFE->lfe_prior_buf_len = NS2SA_fx2( output_Fs, IVAS_LFE_FADE_NS ); + move16(); hLFE->bfi_count = 0; + move16(); output_fs_fx = NE_32( output_Fs, 48000 ) ? ( NE_32( output_Fs, 32000 ) ? FS_16K_IN_NS_Q31 : FS_32K_IN_NS_Q31 ) : FS_48K_IN_NS_Q31; + move32(); - lfe_addl_delay_s = block_offset_s - hLFE->lfe_block_delay_s_fx; + lfe_addl_delay_s = sub( block_offset_s, hLFE->lfe_block_delay_s_fx ); lfe_addl_delay_s = s_max( 0, lfe_addl_delay_s ); add_delay_sa = (Word16) W_round64_L( W_mult0_32_32( L_shl( binauralization_delay_ns, 1 ), output_fs_fx ) ); hLFE->lfe_addl_delay = add( (Word16) L_shr( ( (Word32) lfe_addl_delay_s * (Word32) output_Fs ), 15 ), add_delay_sa ); @@ -462,6 +495,7 @@ ivas_error ivas_create_lfe_dec_fx( FOR( j = 0; j < IVAS_MAX_NUM_DCT_COEF_GROUPS; j++ ) { hLFE->lfe_dec_indices_coeffs_tbl[i][j] = ivas_lfe_log2_num_ele_in_coder_models_fx[i][j]; + move16(); } } @@ -481,6 +515,7 @@ void ivas_lfe_dec_close_fx( LFE_DEC_HANDLE *hLFE /* i/o: LFE decoder handle */ ) { + test(); IF( hLFE == NULL || *hLFE == NULL ) { return; diff --git a/lib_dec/ivas_lfe_plc.c b/lib_dec/ivas_lfe_plc.c index 1844ca8ee470708fbdaf5be2e607997b021f7744..6fe8d59394dfd51932ab8cf7255f887286c7ecf1 100644 --- a/lib_dec/ivas_lfe_plc.c +++ b/lib_dec/ivas_lfe_plc.c @@ -54,7 +54,7 @@ #define MAX_LEN_LP 960 #define EPS_STOP 1e-5 - +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------------------------* * Static function declarations * @@ -535,3 +535,4 @@ void ivas_lfe_tdplc( return; } +#endif \ No newline at end of file diff --git a/lib_dec/ivas_lfe_plc_fx.c b/lib_dec/ivas_lfe_plc_fx.c new file mode 100644 index 0000000000000000000000000000000000000000..279749caafd4a5fefec52871fb9069910bbc5138 --- /dev/null +++ b/lib_dec/ivas_lfe_plc_fx.c @@ -0,0 +1,990 @@ +/****************************************************************************************************** + + (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. + +*******************************************************************************************************/ + +#include +#include "options.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" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_prot_fx.h" +#endif + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define LFE_PLC_DSF ( 48000 / LFE_PLC_FS ) +#define LFE_PLC_LPCORD ( 20 ) +#define LFE_PLC_MAXITER ( 10 ) +#define POW_THR ( 1.0e-8f ) +#define LFE_PLC_RECLEN_48K ( ( IVAS_LFE_NUM_COEFFS_IN_SUBGRP + 1 ) * L_FRAME48k / IVAS_LFE_NUM_COEFFS_IN_SUBGRP + LFE_PLC_FDEL ) +#define LFE_PLC_RECLEN ( ( LFE_PLC_RECLEN_48K / LFE_PLC_DSF ) ) +#define LFE_PLC_MUTE_THR ( 10 ) +#define LFE_PLC_BURST_ATT ( pow( pow( 10.0, -3.0 / 20.0 ), 1.0 / ( LFE_PLC_FS * 0.02 ) ) ) /* attenuate 3dB per frame starting with 10th consecutive loss */ + +#define MAX_LEN_LP 960 + +#define EPS_STOP 1e-5 +#ifdef IVAS_FLOAT_FIXED +#define POW_THR_Q50 ( 11258999 ) +#define EPS_STOP_Q31 ( 21475 ) +#define LFE_PLC_BURST_ATT_Q31 ( 2124429696 ) + +/*------------------------------------------------------------------------------------------* + * Static function declarations + * + * Note (DLB): the local double precision functions defined below are replica of corresponding + * float functions defined in tools.c, lpc_tools.c and syn_filt.c. + * Double precision arithmetic is required for proper functioning of the lfe_plc. + *------------------------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * autocorr_fx() + * + * Compute autocorrelations of input signal + *---------------------------------------------------------------------*/ + +static void d_autocorr_fx( + const Word32 *x_fx, /* i : input signal */ + Word16 x_q_fx, + Word32 *r_fx, /* o : autocorrelations vector */ + Word16 *r_q_fx, + const Word16 m, /* i : order of LP filter */ + const Word16 len, /* i : window size */ + const UWord32 *wind_fx, /* i : window */ + const Word16 rev_flag, /* i : flag to reverse window */ + const Word16 sym_flag, /* i : symmetric window flag */ + const Word16 no_thr /* i : flag to avoid thresholding */ +) +{ + Word16 i, j; + Word32 t_fx[MAX_LEN_LP]; + Word64 s_fx; + Word32 temp; + Word16 tmp_q, exp1, exp2; + + /* Windowing of signal */ + IF( EQ_16( rev_flag, 1 ) ) + { + /* time reversed window */ + FOR( i = 0; i < len; i++ ) + { + t_fx[i] = Mpy_32_32( x_fx[i], wind_fx[sub( sub( len, i ), 1 )] ); // Q = x_q_fx + move32(); + } + } + ELSE IF( EQ_16( sym_flag, 1 ) ) + { + /* symmetric window of even length */ + FOR( i = 0; i < len / 2; i++ ) + { + t_fx[i] = Mpy_32_32( x_fx[i], wind_fx[i] ); // Q = x_q_fx + move32(); + } + + FOR( ; i < len; i++ ) + { + t_fx[i] = Mpy_32_32( x_fx[i], wind_fx[sub( sub( len, 1 ), i )] ); // Q = x_q_fx + move32(); + } + } + ELSE /* assymetric window */ + { + FOR( i = 0; i < len; i++ ) + { + t_fx[i] = Mpy_32_32( x_fx[i], wind_fx[i] ); // Q = x_q_fx + move32(); + } + } + + /* Compute r[1] to r[m] */ + FOR( i = 0; i <= m; i++ ) + { + exp1 = norm_l( t_fx[0] ); + exp2 = norm_l( t_fx[i] ); + s_fx = W_deposit32_l( Mpy_32_32( L_shl( t_fx[0], exp1 ), L_shl( t_fx[i], exp2 ) ) ); + r_q_fx[i] = sub( add( add( x_q_fx, exp1 ), add( x_q_fx, exp2 ) ), 31 ); + move16(); + FOR( j = 1; j < sub( len, i ); j++ ) + { + exp1 = norm_l( t_fx[j] ); + exp2 = norm_l( t_fx[add( i, j )] ); + temp = Mpy_32_32( L_shl( t_fx[j], exp1 ), L_shl( t_fx[add( i, j )], exp2 ) ); + tmp_q = sub( add( add( x_q_fx, exp1 ), add( x_q_fx, exp2 ) ), 31 ); + + IF( LT_16( tmp_q, r_q_fx[i] ) ) + { + s_fx = W_add( W_shr( s_fx, sub( r_q_fx[i], tmp_q ) ), W_deposit32_l( temp ) ); + r_q_fx[i] = tmp_q; + move16(); + } + ELSE + { + s_fx = W_add( s_fx, W_shr( temp, sub( tmp_q, r_q_fx[i] ) ) ); + } + } + exp1 = W_norm( s_fx ); + r_fx[i] = W_extract_h( W_shl( s_fx, exp1 ) ); + move32(); + r_q_fx[i] = sub( add( r_q_fx[i], exp1 ), 32 ); + move16(); + } + + // 2097152000 = 1000 in Q21 + IF( LT_16( r_q_fx[0], Q21 ) ) + { + IF( L_and( LT_32( r_fx[0], L_shr( 2097152000, sub( Q21, r_q_fx[0] ) ) ), EQ_16( no_thr, 0 ) ) ) + { + r_fx[0] = 2097152000; + move32(); + r_q_fx[0] = Q21; + move16(); + } + } + ELSE + { + IF( L_and( LT_32( L_shr( r_fx[0], sub( r_q_fx[0], Q21 ) ), 2097152000 ), EQ_16( no_thr, 0 ) ) ) + { + r_fx[0] = 2097152000; + move32(); + r_q_fx[0] = Q21; + move16(); + } + } + + return; +} + +/*---------------------------------------------------------------------* + * lev_dur_fx() + * + * Wiener-Levinson-Durbin algorithm to compute LP parameters from the autocorrelations + * of input signal + *---------------------------------------------------------------------*/ + +/*! r: energy of prediction error */ +static Word16 d_lev_dur_fx( + Word32 *a_fx, /* o : LP coefficients (a[0] = 1.0) */ + Word16 *a_q_fx, + Word32 *r_fx, /* i : vector of autocorrelations */ + Word16 *r_q_fx, + const Word16 m, /* i : order of LP filter */ + Word32 *epsP_fx, /* o : prediction error energy */ + Word16 *epsP_q_fx ) +{ + Word16 i, j, l; + Word16 flag = 0; + Word32 buf_fx[TCXLTP_LTP_ORDER]; + Word16 rc_q_fx[TCXLTP_LTP_ORDER]; + Word32 *rc_fx; /* reflection coefficients 0,...,m-1 */ + Word32 temp1, temp2, err_fx, at_fx, s, a_tmp; + Word16 temp_q1, temp_q2, s_q_fx, err_q_fx, exp1, exp2; + Word64 s_fx; + + rc_fx = &buf_fx[0]; + rc_fx[0] = BASOP_Util_Divide3232_Scale_cadence( -r_fx[1], r_fx[0], &temp_q2 ); + move32(); + rc_q_fx[0] = add( sub( r_q_fx[1], r_q_fx[0] ), sub( 31, temp_q2 ) ); + move16(); + + a_fx[0] = ONE_IN_Q30; + move32(); + a_q_fx[0] = 30; + move16(); + a_fx[1] = rc_fx[0]; + move32(); + a_q_fx[1] = rc_q_fx[0]; + move32(); + + temp1 = Mpy_32_32( r_fx[1], rc_fx[0] ); + temp_q1 = sub( add( r_q_fx[1], rc_q_fx[0] ), 31 ); + + IF( LT_16( temp_q1, r_q_fx[0] ) ) + { + err_fx = L_add( L_shr( r_fx[0], sub( r_q_fx[0], temp_q1 ) ), temp1 ); + err_q_fx = temp_q1; + move16(); + } + ELSE + { + err_fx = L_add( r_fx[0], L_shr( temp1, sub( temp_q1, r_q_fx[0] ) ) ); + err_q_fx = r_q_fx[0]; + move16(); + } + + IF( epsP_fx != NULL ) + { + epsP_fx[0] = r_fx[0]; + move32(); + epsP_q_fx[0] = r_q_fx[0]; + move16(); + epsP_fx[1] = err_fx; + move32(); + epsP_q_fx[1] = err_q_fx; + move16(); + } + + FOR( i = 2; i <= m; i++ ) + { + s_fx = 0; + move64(); + + FOR( j = 0; j < i; j++ ) + { + exp1 = norm_l( r_fx[i - j] ); + exp2 = norm_l( a_fx[j] ); + temp1 = Mpy_32_32( L_shl( r_fx[i - j], exp1 ), L_shl( a_fx[j], exp2 ) ); + temp_q1 = sub( add( add( r_q_fx[i - j], exp1 ), add( a_q_fx[j], exp2 ) ), 31 ); + + IF( EQ_16( j, 0 ) ) + { + s_fx = W_deposit32_l( temp1 ); + s_q_fx = temp_q1; + move16(); + } + ELSE + { + IF( LT_16( temp_q1, s_q_fx ) ) + { + s_fx = W_add( W_shr( s_fx, sub( s_q_fx, temp_q1 ) ), W_deposit32_l( temp1 ) ); + s_q_fx = temp_q1; + move16(); + } + ELSE + { + s_fx = W_add( s_fx, W_shr( W_deposit32_l( temp1 ), sub( temp_q1, s_q_fx ) ) ); + } + } + } + exp1 = W_norm( s_fx ); + s = W_extract_h( W_shl( s_fx, exp1 ) ); + s_q_fx = sub( add( s_q_fx, exp1 ), 32 ); + + rc_fx[i - 1] = L_shr( BASOP_Util_Divide3232_Scale_cadence( -s, err_fx, &temp_q2 ), 1 ); + move32(); + rc_q_fx[i - 1] = sub( add( sub( s_q_fx, err_q_fx ), sub( 31, temp_q2 ) ), 1 ); + move16(); + + IF( LT_16( rc_q_fx[i - 1], 31 ) ) + { + + IF( GT_32( abs( rc_fx[i - 1] ), L_shr( 2146302532, sub( 31, rc_q_fx[i - 1] ) ) ) ) // 2146302532 = 0.99945f in Q31 + { + flag = 1; /* Test for unstable filter. If unstable keep old A(z) */ + move16(); + } + } + ELSE + { + IF( GT_32( abs( L_shr( rc_fx[i - 1], sub( rc_q_fx[i - 1], 31 ) ) ), 2146302532 ) ) // 2146302532 = 0.00045f in Q31 + { + flag = 1; /* Test for unstable filter. If unstable keep old A(z) */ + move16(); + } + } + + FOR( j = 1; j <= i / 2; j++ ) + { + l = sub( i, j ); + exp1 = sub( norm_l( rc_fx[sub( i, 1 )] ), 1 ); + exp2 = sub( norm_l( a_fx[l] ), 1 ); + rc_fx[sub( i, 1 )] = L_shl( rc_fx[sub( i, 1 )], exp1 ); + move32(); + rc_q_fx[sub( i, 1 )] = add( rc_q_fx[sub( i, 1 )], exp1 ); + move16(); + a_fx[l] = L_shl( a_fx[l], exp2 ); + move32(); + a_q_fx[l] = add( a_q_fx[l], exp2 ); + move16(); + + exp2 = sub( norm_l( a_fx[j] ), 1 ); + a_fx[j] = L_shl( a_fx[j], exp2 ); + move32(); + a_q_fx[j] = add( a_q_fx[j], exp2 ); + move16(); + + temp2 = Mpy_32_32( rc_fx[sub( i, 1 )], a_fx[l] ); + temp_q2 = sub( add( rc_q_fx[sub( i, 1 )], a_q_fx[l] ), 31 ); + + IF( LT_16( temp_q2, a_q_fx[j] ) ) + { + at_fx = L_add( L_shr( a_fx[j], sub( a_q_fx[j], temp_q2 ) ), temp2 ); + temp_q1 = temp_q2; + move16(); + } + ELSE + { + at_fx = L_add( a_fx[j], L_shr( temp2, sub( temp_q2, a_q_fx[j] ) ) ); + temp_q1 = a_q_fx[j]; + move16(); + } + + temp2 = Mpy_32_32( rc_fx[sub( i, 1 )], a_fx[j] ); + temp_q2 = sub( add( rc_q_fx[sub( i, 1 )], a_q_fx[j] ), 31 ); + + IF( LT_16( temp_q2, a_q_fx[l] ) ) + { + a_fx[l] = L_add( L_shr( a_fx[l], sub( a_q_fx[l], temp_q2 ) ), temp2 ); + move32(); + a_q_fx[l] = temp_q2; + move16(); + } + ELSE + { + a_fx[l] = L_add( a_fx[l], L_shr( temp2, sub( temp_q2, a_q_fx[l] ) ) ); + move16(); + } + a_fx[j] = at_fx; + move32(); + a_q_fx[j] = temp_q1; + move16(); + } + a_fx[i] = rc_fx[sub( i, 1 )]; + move32(); + a_q_fx[i] = rc_q_fx[sub( i, 1 )]; + move16(); + + exp1 = sub( norm_l( rc_fx[sub( i, 1 )] ), 1 ); + exp2 = norm_l( s ); + temp1 = Mpy_32_32( L_shl( rc_fx[sub( i, 1 )], exp1 ), L_shl( s, exp2 ) ); + temp_q1 = sub( add( add( rc_q_fx[sub( i, 1 )], exp1 ), add( s_q_fx, exp2 ) ), 31 ); + + IF( LT_16( temp_q1, err_q_fx ) ) + { + err_fx = L_add( L_shr( err_fx, sub( err_q_fx, temp_q1 ) ), temp1 ); + err_q_fx = temp_q1; + move16(); + } + ELSE + { + err_fx = L_add( err_fx, L_shr( temp1, sub( temp_q1, err_q_fx ) ) ); + } + + IF( LE_32( err_fx, 0 ) ) + { + err_fx = 21474836; // 0.01 in Q31 + move32(); + err_q_fx = Q31; + move16(); + } + IF( epsP_fx != NULL ) + { + epsP_fx[i] = err_fx; + move32(); + epsP_q_fx[i] = err_q_fx; + move16(); + } + } + + return ( flag ); +} + +/*-------------------------------------------------------------------* + * a2rc_fx() + * + * Convert from LPC to reflection coeff + *-------------------------------------------------------------------*/ + +static Word16 d_a2rc_fx( + const Word32 *a_fx, /* i : LPC coefficients */ + Word16 *a_q_fx, + Word32 *refl_fx, /* o : Reflection co-efficients */ + const Word16 lpcorder /* i : LPC order */ +) +{ + Word16 m, j, n; + Word32 ff_fx[LFE_PLC_LPCORD]; + Word32 km_fx, denom_fx, temp1, temp2, temp; + Word16 ff_q_fx[LFE_PLC_LPCORD], temp_q1, temp_q2, denom_q_fx, km_q_fx, temp_q; + Word16 exp1, exp2; + + FOR( m = 0; m < lpcorder; m++ ) + { + ff_fx[m] = -a_fx[m]; + move32(); + ff_q_fx[m] = a_q_fx[m]; + move32(); + } + + /* Initialization */ + FOR( m = sub( lpcorder, 1 ); m >= 0; m-- ) + { + km_fx = ff_fx[m]; + move32(); + km_q_fx = ff_q_fx[m]; + move16(); + IF( GE_64( W_shr( abs( km_fx ), sub( ff_q_fx[m], Q30 ) ), W_deposit32_l( ONE_IN_Q30 ) ) ) + { + FOR( j = 0; j < lpcorder; j++ ) + { + refl_fx[j] = 0; + move32(); + } + return 0; + } + + refl_fx[m] = -km_fx; + move32(); + + exp1 = norm_l( km_fx ); + temp1 = Mpy_32_32( L_shl( km_fx, exp1 ), L_shl( km_fx, exp1 ) ); + temp_q1 = sub( add( add( km_q_fx, exp1 ), add( km_q_fx, exp1 ) ), 31 ); + temp1 = L_sub( ONE_IN_Q30, L_shr( temp1, sub( temp_q1, 30 ) ) ); + denom_fx = L_deposit_l( BASOP_Util_Divide3232_Scale( ONE_IN_Q30, temp1, &temp_q1 ) ); + denom_q_fx = sub( 15, temp_q1 ); + + FOR( j = 0; j < m / 2; j++ ) + { + n = sub( sub( m, 1 ), j ); + + exp1 = norm_l( denom_fx ); + exp2 = sub( norm_l( ff_fx[j] ), 1 ); + temp1 = Mpy_32_32( L_shl( denom_fx, exp1 ), L_shl( ff_fx[j], exp2 ) ); + temp_q1 = sub( add( add( denom_q_fx, exp1 ), add( ff_q_fx[j], exp2 ) ), 31 ); + + exp2 = sub( norm_l( ff_fx[n] ), 1 ); + temp2 = Mpy_32_32( L_shl( denom_fx, exp1 ), L_shl( ff_fx[n], exp2 ) ); + temp_q2 = sub( add( add( denom_q_fx, exp1 ), add( ff_q_fx[n], exp2 ) ), 31 ); + + exp1 = norm_l( km_fx ); + exp2 = sub( norm_l( temp2 ), 1 ); + temp = Mpy_32_32( L_shl( km_fx, exp1 ), L_shl( temp2, exp2 ) ); + temp_q = sub( add( add( km_q_fx, exp1 ), add( temp_q2, exp2 ) ), 31 ); + + IF( LT_16( temp_q, temp_q1 ) ) + { + ff_fx[j] = L_add( L_shr( temp1, sub( temp_q1, temp_q ) ), temp ); + move32(); + ff_q_fx[j] = temp_q; + move16(); + } + ELSE + { + ff_fx[j] = L_add( temp1, L_shr( temp, sub( temp_q, temp_q1 ) ) ); + move32(); + ff_q_fx[j] = temp_q1; + move16(); + } + + exp1 = norm_l( km_fx ); + exp2 = sub( norm_l( temp1 ), 1 ); + temp = Mpy_32_32( L_shl( km_fx, exp1 ), L_shl( temp1, exp2 ) ); + temp_q = sub( add( add( km_q_fx, exp1 ), add( temp_q1, exp2 ) ), 31 ); + + IF( LT_16( temp_q, temp_q2 ) ) + { + ff_fx[n] = L_add( L_shr( temp2, sub( temp_q2, temp_q ) ), temp ); + move32(); + ff_q_fx[n] = temp_q; + move16(); + } + ELSE + { + ff_fx[n] = L_add( temp2, L_shr( temp, sub( temp_q, temp_q2 ) ) ); + move32(); + ff_q_fx[n] = temp_q2; + move16(); + } + } + + IF( m & 1 ) + { + exp1 = norm_l( denom_fx ); + exp2 = sub( norm_l( ff_fx[j] ), 1 ); + temp1 = Mpy_32_32( L_shl( denom_fx, exp1 ), L_shl( ff_fx[j], exp2 ) ); + temp_q1 = sub( add( add( denom_q_fx, exp1 ), add( ff_q_fx[j], exp2 ) ), 31 ); + + exp1 = norm_l( km_fx ); + exp2 = sub( norm_l( temp1 ), 1 ); + temp = Mpy_32_32( L_shl( km_fx, exp1 ), L_shl( temp1, exp2 ) ); + temp_q = sub( add( add( km_q_fx, exp1 ), add( temp_q1, exp2 ) ), 31 ); + + IF( LT_16( temp_q, temp_q1 ) ) + { + ff_fx[j] = L_add( L_shr( temp1, sub( temp_q1, temp_q ) ), temp ); + move32(); + ff_q_fx[j] = temp_q; + move16(); + } + ELSE + { + ff_fx[j] = L_add( temp1, L_shr( temp, sub( temp_q, temp_q1 ) ) ); + move32(); + ff_q_fx[j] = temp_q1; + move16(); + } + } + } + + return 1; +} + +static void d_syn_filt_fx( + const Word32 *a_fx, /* i : LP filter coefficients */ + Word16 *a_q_fx, + const Word16 m, /* i : order of LP filter */ + const Word32 *x_fx, /* i : input signal */ + Word32 *y_fx, /* o : output signal */ + Word16 *y_q_fx, + const Word16 l, /* i : size of filtering */ + const Word32 *mem_fx, /* i : initial filter states */ + Word16 mem_q_fx ) +{ + Word16 i, j; + Word32 buf_fx[LFE_PLC_LPCORD + LFE_PLC_RECLEN]; /* temporary synthesis buffer */ + Word32 s_fx, *yy_fx, temp; + Word16 yy_q_fx[LFE_PLC_LPCORD + LFE_PLC_RECLEN], exp1, exp2, s_q_fx, temp_q; + + yy_fx = &buf_fx[0]; + + /*------------------------------------------------------------------* + * copy initial filter states into synthesis buffer and do synthesis + *------------------------------------------------------------------*/ + FOR( i = 0; i < m; i++ ) + { + *yy_fx++ = mem_fx[i]; + move32(); + yy_q_fx[i] = mem_q_fx; + move16(); + } + + /*-----------------------------------------------------------------------* + * Do the filtering + *-----------------------------------------------------------------------*/ + + FOR( i = 0; i < l; i++ ) + { + s_fx = x_fx[i]; + move32(); + s_q_fx = Q31; + move16(); + FOR( j = 1; j <= m; j++ ) + { + exp1 = sub( norm_l( a_fx[j] ), 1 ); + exp2 = sub( norm_l( yy_fx[i - j] ), 1 ); + IF( GT_16( j, i ) ) + { + temp_q = mem_q_fx; + move16(); + } + ELSE + { + temp_q = yy_q_fx[sub( i, j )]; + move16(); + } + temp = Mpy_32_32( L_shl( a_fx[j], exp1 ), L_shl( yy_fx[sub( i, j )], exp2 ) ); + temp_q = sub( add( add( a_q_fx[j], exp1 ), add( temp_q, exp2 ) ), 31 ); + + IF( LT_16( s_q_fx, temp_q ) ) + { + s_fx = L_sub( s_fx, L_shr( temp, sub( temp_q, s_q_fx ) ) ); + } + ELSE + { + s_fx = L_sub( L_shr( s_fx, sub( s_q_fx, temp_q ) ), temp ); + s_q_fx = temp_q; + move16(); + } + } + yy_fx[i] = s_fx; + move32(); + yy_q_fx[i] = s_q_fx; + move16(); + y_fx[i] = L_shr( s_fx, sub( s_q_fx, Q5 ) ); + move32(); + } + *y_q_fx = Q5; + move16(); + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function check_stab_fx() + * + * LPC filter stability check applying given sharpening value delta + *-----------------------------------------------------------------------------------------*/ + +static Word16 check_stab_fx( + Word32 *a_fx, + Word16 *a_q_fx, + Word32 delta_fx, + Word16 delta_q_fx ) +{ + Word16 i; + Word16 stable; + + Word32 amod_fx[LFE_PLC_LPCORD], refl_fx[LFE_PLC_LPCORD]; + Word16 fac_q_fx, fac1_q_fx, amod_q_fx[LFE_PLC_LPCORD]; + Word16 exp1, exp2; + Word32 fac_fx, fac1_fx; + + exp1 = norm_l( delta_fx ); + delta_fx = L_shl( delta_fx, exp1 ); + delta_q_fx = add( delta_q_fx, exp1 ); + + IF( LT_16( delta_q_fx, 29 ) ) + { + fac_fx = L_add( L_shr( ONE_IN_Q29, sub( 29, delta_q_fx ) ), delta_fx ); + fac_q_fx = delta_q_fx; + move16(); + } + ELSE + { + fac_fx = L_add( ONE_IN_Q29, L_shr( delta_fx, sub( delta_q_fx, 29 ) ) ); + fac_q_fx = Q29; + move16(); + } + fac1_fx = fac_fx; + move32(); + fac1_q_fx = fac_q_fx; + move16(); + + FOR( i = 0; i < LFE_PLC_LPCORD; i++ ) + { + exp1 = norm_l( a_fx[i] ); + exp2 = norm_l( fac_fx ); + amod_fx[i] = Mpy_32_32( L_shl( a_fx[i], exp1 ), L_shl( fac_fx, exp2 ) ); + move32(); + amod_q_fx[i] = sub( add( add( a_q_fx[i], exp1 ), add( fac_q_fx, exp2 ) ), 31 ); + move16(); + + exp1 = norm_l( fac_fx ); + exp2 = norm_l( fac1_fx ); + fac_fx = Mpy_32_32( L_shl( fac_fx, exp1 ), L_shl( fac1_fx, exp2 ) ); + fac_q_fx = sub( add( add( fac_q_fx, exp1 ), add( fac1_q_fx, exp2 ) ), 31 ); + } + stable = d_a2rc_fx( amod_fx, amod_q_fx, refl_fx, LFE_PLC_LPCORD ); + + return stable; +} + +/*-----------------------------------------------------------------------------------------* + * Function find_max_delta_fx() + * + * Find maximum LPC filter sharpening by iteration to get a filter that is almost instable + *-----------------------------------------------------------------------------------------*/ + +static Word32 find_max_delta_fx( + Word32 *a_fx, + Word16 *a_q_fx, + Word16 *delta_q_fx ) +{ + Word16 stable; + Word16 eps_q_fx, fac_q_fx, exp1, exp2; + Word32 delta_fx, fac_fx, eps_fx, temp; + + delta_fx = 0; + move32(); + eps_fx = 21474836; // 0.01 in Q31 + move32(); + fac_fx = 1073741824; // 2 in Q29 + move32(); + eps_q_fx = Q31; + move16(); + fac_q_fx = Q29; + move16(); + + stable = FALSE; + move16(); + + WHILE( check_stab_fx( a_fx, a_q_fx, eps_fx, eps_q_fx ) ) + { + exp1 = norm_l( eps_fx ); + exp2 = norm_l( fac_fx ); + eps_fx = Mpy_32_32( L_shl( eps_fx, exp1 ), L_shl( fac_fx, exp2 ) ); + eps_q_fx = sub( add( add( eps_q_fx, exp1 ), add( fac_q_fx, exp2 ) ), 31 ); + stable = TRUE; + move16(); + } + fac_fx = 1073741824; // 0.5 in Q31 + move32(); + fac_q_fx = Q31; + move16(); + + IF( stable ) + { + exp1 = norm_l( eps_fx ); + exp2 = norm_l( fac_fx ); + eps_fx = Mpy_32_32( L_shl( eps_fx, exp1 ), L_shl( fac_fx, exp2 ) ); + eps_q_fx = sub( add( add( eps_q_fx, exp1 ), add( fac_q_fx, exp2 ) ), 31 ); + } + + WHILE( !stable ) + { + exp1 = norm_l( eps_fx ); + exp2 = norm_l( fac_fx ); + eps_fx = Mpy_32_32( L_shl( eps_fx, exp1 ), L_shl( fac_fx, exp2 ) ); + eps_q_fx = sub( add( add( eps_q_fx, exp1 ), add( fac_q_fx, exp2 ) ), 31 ); + + stable = check_stab_fx( a_fx, a_q_fx, eps_fx, eps_q_fx ); + } + + /* must be stable with current eps */ + *delta_q_fx = sub( norm_l( eps_fx ), 1 ); + delta_fx = L_shl( eps_fx, *delta_q_fx ); + *delta_q_fx = add( eps_q_fx, *delta_q_fx ); + + exp1 = norm_l( eps_fx ); + exp2 = norm_l( fac_fx ); + eps_fx = Mpy_32_32( L_shl( eps_fx, exp1 ), L_shl( fac_fx, exp2 ) ); + eps_q_fx = sub( add( add( eps_q_fx, exp1 ), add( fac_q_fx, exp2 ) ), 31 ); + + WHILE( 1 ) + { + IF( LT_16( *delta_q_fx, eps_q_fx ) ) + { + delta_fx = L_add( delta_fx, L_shr( eps_fx, sub( eps_q_fx, *delta_q_fx ) ) ); + } + ELSE + { + delta_fx = L_add( L_shr( delta_fx, sub( *delta_q_fx, eps_q_fx ) ), eps_fx ); + *delta_q_fx = eps_q_fx; + move16(); + } + stable = check_stab_fx( a_fx, a_q_fx, delta_fx, *delta_q_fx ); + + IF( !stable ) + { + temp = abs( eps_fx ); + IF( GT_32( L_shr( temp, sub( eps_q_fx, 31 ) ), EPS_STOP_Q31 ) ) + { + exp1 = norm_l( -temp ); + exp2 = norm_l( fac_fx ); + eps_fx = Mpy_32_32( L_shl( -temp, exp1 ), L_shl( fac_fx, exp2 ) ); + eps_q_fx = sub( add( add( eps_q_fx, exp1 ), add( fac_q_fx, exp2 ) ), 31 ); + } + ELSE + { + eps_fx = -abs( eps_fx ); + } + } + ELSE + { + temp = abs( eps_fx ); + IF( LT_32( L_shr( temp, sub( eps_q_fx, 31 ) ), EPS_STOP_Q31 ) ) + { + BREAK; + } + + exp1 = norm_l( temp ); + exp1 = norm_l( fac_fx ); + eps_fx = Mpy_32_32( L_shl( temp, exp1 ), L_shl( fac_fx, exp2 ) ); + eps_q_fx = sub( add( add( eps_q_fx, exp1 ), add( fac_q_fx, exp2 ) ), 31 ); + } + } + + return delta_fx; +} + +/*-----------------------------------------------------------------------------------------* + * Function recover_samples_fx() + * + * recover lost samples by extrapolation of signal buffer + *-----------------------------------------------------------------------------------------*/ + +static void recover_samples_fx( + const Word16 bfi_count, + const Word32 *outbuf_fx, + Word16 outbuf_q_fx, + Word32 *rec_frame_fx, + Word16 *rec_frame_q_fx ) +{ + Word16 i; + Word32 d_outbuf_fx[LFE_PLC_BUFLEN], d_a_fx[LFE_PLC_LPCORD + 1], d_pee_fx[LFE_PLC_LPCORD + 1]; + Word16 d_r_q_fx[LFE_PLC_LPCORD + 1], d_a_q_fx[LFE_PLC_LPCORD + 1], d_pee_q_fx[LFE_PLC_LPCORD + 1]; + Word32 d_r_fx[LFE_PLC_LPCORD + 1], zeroes_fx[LFE_PLC_RECLEN]; + Word32 delta_fx, fac_fx, att_fx, temp; + Word16 delta_q_fx, fac_q_fx, att_q_fx, temp_q, exp1, exp2; + + Copy32( outbuf_fx, d_outbuf_fx, LFE_PLC_BUFLEN ); + + d_autocorr_fx( d_outbuf_fx, outbuf_q_fx, d_r_fx, d_r_q_fx, LFE_PLC_LPCORD, LFE_PLC_BUFLEN, d_hamm_lfe_plc_fx, 0, 1, 1 ); + + IF( LT_64( W_shr( d_r_fx[0], sub( d_r_q_fx[0], Q19 ) ), W_deposit32_l( Mpy_32_32( POW_THR_Q50, LFE_PLC_BUFLEN ) ) ) ) + { + set_zero_fx( rec_frame_fx, LFE_PLC_RECLEN ); + return; + } + + d_lev_dur_fx( d_a_fx, d_a_q_fx, d_r_fx, d_r_q_fx, LFE_PLC_LPCORD, d_pee_fx, d_pee_q_fx ); + + delta_fx = find_max_delta_fx( d_a_fx + 1, d_a_q_fx + 1, &delta_q_fx ); + + IF( LT_16( delta_q_fx, Q29 ) ) + { + fac_fx = L_add( L_shr( ONE_IN_Q29, sub( Q29, delta_q_fx ) ), delta_fx ); + fac_q_fx = delta_q_fx; + move16(); + } + ELSE + { + fac_fx = L_add( ONE_IN_Q29, L_shr( delta_fx, sub( delta_q_fx, Q29 ) ) ); + fac_q_fx = Q29; + move16(); + } + att_fx = ONE_IN_Q30; + move32(); + att_q_fx = Q30; + move16(); + + IF( GE_16( bfi_count, LFE_PLC_MUTE_THR ) ) + { + att_fx = LFE_PLC_BURST_ATT_Q31; + move32(); + fac_fx = Mpy_32_32( fac_fx, att_fx ); + fac_q_fx = sub( add( fac_q_fx, att_q_fx ), 31 ); + } + + FOR( i = 1; i <= LFE_PLC_LPCORD; i++ ) + { + d_a_fx[i] = Mpy_32_32( d_a_fx[i], fac_fx ); + move32(); + d_a_q_fx[i] = sub( add( d_a_q_fx[i], fac_q_fx ), 31 ); + move16(); + IF( LT_16( delta_q_fx, Q30 ) ) + { + temp = L_add( L_shr( ONE_IN_Q30, sub( Q30, delta_q_fx ) ), delta_fx ); + temp_q = delta_q_fx; + move16(); + } + ELSE + { + temp = L_add( ONE_IN_Q30, L_shr( delta_fx, sub( delta_q_fx, Q30 ) ) ); + temp_q = Q30; + move16(); + } + exp1 = norm_l( att_fx ); + exp2 = norm_l( temp ); + temp = Mpy_32_32( L_shl( att_fx, exp1 ), L_shl( temp, exp2 ) ); + temp_q = sub( add( add( att_q_fx, exp1 ), add( temp_q, exp2 ) ), 31 ); + + exp1 = norm_l( fac_fx ); + exp2 = norm_l( temp ); + fac_fx = Mpy_32_32( L_shl( fac_fx, exp1 ), L_shl( temp, exp2 ) ); + fac_q_fx = sub( add( add( fac_q_fx, exp1 ), add( temp_q, exp2 ) ), 31 ); + } + + set_zero_fx( zeroes_fx, LFE_PLC_RECLEN ); + + d_syn_filt_fx( d_a_fx, d_a_q_fx, LFE_PLC_LPCORD, zeroes_fx, rec_frame_fx, rec_frame_q_fx, LFE_PLC_RECLEN, outbuf_fx + LFE_PLC_BUFLEN - LFE_PLC_LPCORD, outbuf_q_fx ); + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function ivas_lfe_tdplc_fx() + * + * MDCT interface recover lost samples by extrapolation of signal buffer + *-----------------------------------------------------------------------------------------*/ + +void ivas_lfe_tdplc_fx( + LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ + const Word32 *prevsynth, /* i : previous frame synthesis */ + Word32 *ytda, /* o : output time-domain buffer */ + const Word16 output_frame /* i : output frame length */ +) +{ + Word32 rec_frame_us_fx[LFE_PLC_RECLEN_48K], input_tda_fx[L_FRAME48k]; + Word32 rec_frame_fx[LFE_PLC_RECLEN], prevsynth_fx[LFE_PLC_BUFLEN]; + Word16 rec_frame_us_16_fx[LFE_PLC_RECLEN_48K], mem_fx[2 * LFE_PLC_FDEL / LFE_PLC_DSF], rec_frame_16_fx[LFE_PLC_RECLEN]; + Word16 prevsynth_16_fx[LFE_PLC_BUFLEN]; + 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; + + output_Fs = L_mult0( output_frame, FRAMES_PER_SEC ); + fade_len = hLFE->pWindow_state->fade_len; + move16(); + full_len = hLFE->pWindow_state->full_len; + move16(); + dct_len = hLFE->pWindow_state->dct_len; + move16(); + zero_pad_len = hLFE->pWindow_state->zero_pad_len; + 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 ); + + Copy32( prevsynth, prevsynth_fx, LFE_PLC_BUFLEN ); + exp = L_norm_arr( prevsynth_fx, LFE_PLC_BUFLEN ); + scale_sig32( prevsynth_fx, LFE_PLC_BUFLEN, exp ); + prevsynth_q_fx = add( Q9, exp ); + move16(); + + 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 ) ); + + 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 ); + /*samples are generated with 48k sampling rate + and then converted to required sampling rate by simple decimation + as signal is already bandlimited*/ + + /*decimation to correct sampling rate*/ + IF( NE_32( output_Fs, 48000 ) ) + { + FOR( i = 0; i < rec_frame_len; i++ ) + { + idx = BASOP_Util_Divide3232_Scale( Mpy_32_32( L_shl( i, 16 ), L_shl( 44100, 15 ) ), output_Fs, &temp_q ); + idx = shr( idx, add( sub( 15, temp_q ), 1 ) ); + rec_frame_us_16_fx[i] = rec_frame_us_16_fx[idx]; + move16(); + } + } + + Copy_Scale_sig_16_32( rec_frame_us_16_fx, rec_frame_us_fx, LFE_PLC_RECLEN_48K, 5 ); // Q10 = rec_frame_q + 5 + + FOR( i = 0; i < 2; i++ ) + { + ivas_dct_windowing_fx( fade_len, full_len, dct_len, zero_pad_len, pWindow_coeffs_fx, output_frame, input_tda_fx, rec_frame_us_fx + plc_fdel, rec_frame_us_fx + add( add( plc_fdel, fade_len ), i_mult( i, dct_len ) ) ); + ivas_tda_fx( input_tda_fx, ytda + i * dct_len, dct_len ); + } + + return; +} +#endif \ No newline at end of file diff --git a/lib_dec/ivas_ls_custom_dec.c b/lib_dec/ivas_ls_custom_dec.c index f7c24d8f542b48a8d43341e25e026148a56647ba..7c35700f2d62a7f6e6becb73d0c43c389f84187f 100644 --- a/lib_dec/ivas_ls_custom_dec.c +++ b/lib_dec/ivas_ls_custom_dec.c @@ -45,7 +45,7 @@ * * Allocate Custom LS layout handle *-----------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_ls_custom_open( LSSETUP_CUSTOM_HANDLE *hLsSetupCustom /* o : Custom loudspeaker setup handle */ ) @@ -70,8 +70,7 @@ ivas_error ivas_ls_custom_open( return IVAS_ERR_OK; } - -#ifdef IVAS_FLOAT_FIXED +#else ivas_error ivas_ls_custom_open_fx( LSSETUP_CUSTOM_HANDLE *hLsSetupCustom /* o : Custom loudspeaker setup handle */ ) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 7efec9664a753984a6068fcbe568526c188122da..2aba53751fe63522bb38ce50738badba7c43caf5 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1387,7 +1387,7 @@ ivas_error ivas_masa_decode_fx( create_masa_ext_out_meta_fx( hMasa, hQMetaData, st_ivas->nchan_transport ); } -#if 1 /* fix to float */ +#if 0 /* fix to float */ if ( st_ivas->hSpatParamRendCom != NULL ) { for ( i = 0; i < st_ivas->hSpatParamRendCom->dirac_md_buffer_length; i++ ) @@ -3030,7 +3030,7 @@ static Word16 decode_lfe_to_total_energy_ratio_fx( * * Reconfigure IVAS MASA decoder *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_masa_dec_reconfigure( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ @@ -3067,7 +3067,11 @@ ivas_error ivas_masa_dec_reconfigure( ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin == NULL ) ) { /* init a new DirAC dec */ +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -3103,7 +3107,11 @@ ivas_error ivas_masa_dec_reconfigure( if ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin != NULL ) { +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -3129,7 +3137,11 @@ ivas_error ivas_masa_dec_reconfigure( if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend != NULL ) || ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin != NULL ) ) { +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -3141,7 +3153,11 @@ ivas_error ivas_masa_dec_reconfigure( if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend != NULL ) || ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin != NULL ) ) { +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -3283,7 +3299,7 @@ ivas_error ivas_masa_dec_reconfigure( nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); DECODER_CONFIG_HANDLE hDecoderConfig; hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_in, numch_out, num_md_sub_frames, q1 = 30, q2 = 30; + Word16 numch_in = 0, numch_out, num_md_sub_frames, q1 = 30, q2 = 30; ; Word16 numch_out_dirac = hDecoderConfig->nchan_out; IF( hSpar ) @@ -3291,7 +3307,8 @@ ivas_error ivas_masa_dec_reconfigure( numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; 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 ); - + hSpar->hMdDec->Q_mixer_mat = 30; +#if 0 for ( int l = 0; l < numch_out; l++ ) { for ( int j = 0; j < numch_in; j++ ) @@ -3315,6 +3332,7 @@ ivas_error ivas_masa_dec_reconfigure( } } } +#endif for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) { for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) @@ -3367,6 +3385,7 @@ ivas_error ivas_masa_dec_reconfigure( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); } } +#if 0 FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) { FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) @@ -3380,6 +3399,7 @@ ivas_error ivas_masa_dec_reconfigure( } } } +#endif // fix2float (to be cleaned) 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 ) ) ) ) { @@ -3456,7 +3476,7 @@ ivas_error ivas_masa_dec_reconfigure( } -#ifdef IVAS_FLOAT_FIXED +#else /*-------------------------------------------------------------------* * ivas_masa_dec_reconfigure_fx() * @@ -3507,7 +3527,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( ( ( EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin == NULL ) ) { /* init a new DirAC dec */ - IF( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) { return error; } @@ -3573,7 +3593,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( IF( ( EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) { - IF( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) { return error; } @@ -3627,7 +3647,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); IF( ( EQ_16( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) ) { - IF( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) { return error; } @@ -3643,7 +3663,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); IF( ( EQ_16( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) ) { - IF( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) { return error; } @@ -3758,172 +3778,11 @@ ivas_error ivas_masa_dec_reconfigure_fx( IF( LT_16( n_samples_granularity, st_ivas->hTcBuffer->n_samples_granularity ) ) { #ifdef IVAS_FLOAT_FIXED -#if 1 /*Float to fixed conversion*/ - DECODER_TC_BUFFER_HANDLE hTcBuffer; - hTcBuffer = st_ivas->hTcBuffer; - if ( st_ivas->hIsmRendererData ) - { - FOR( Word16 ind1 = 0; ind1 < st_ivas->hIsmRendererData->interpolator_len; ind1++ ) - { - st_ivas->hIsmRendererData->interpolator_fx[ind1] = (Word16) L_min( 32767, floatToFixed( st_ivas->hIsmRendererData->interpolator_fx[ind1], 15 ) ); - } - } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) - { - if ( st_ivas->hIsmMetaData[ind1] ) - { - st_ivas->hIsmMetaData[ind1]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind1]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->elevation * ( 1 << 22 ) ); - } - } - IF( st_ivas->hCombinedOrientationData ) - FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) - { - FOR( Word16 ind2 = 0; ind2 < 3; ind2++ ) - { - st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32) ( st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * ( 1 << 15 ) ); - } - } - if ( st_ivas->hSbaIsmData ) - { - for ( Word16 ch_idx = 0; ch_idx < st_ivas->hSbaIsmData->delayBuffer_nchan; ch_idx++ ) - { - floatToFixed_arr32( st_ivas->hSbaIsmData->delayBuffer[ch_idx], st_ivas->hSbaIsmData->delayBuffer_fx[ch_idx], Q11, st_ivas->hSbaIsmData->delayBuffer_size ); - } - } - SPAR_DEC_HANDLE hSpar; - hSpar = st_ivas->hSpar; - uint16_t nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - DECODER_CONFIG_HANDLE hDecoderConfig; - hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_in, numch_out, num_md_sub_frames, q1 = 30, q2 = 30; - ; - Word16 numch_out_dirac = hDecoderConfig->nchan_out; - IF( hSpar ) - { - numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - 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 ); - for ( int l = 0; l < numch_out; l++ ) - { - for ( int j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - for ( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } - } - } - } - for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); - } - } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) - { - for ( Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); - } - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) - { - IF( st_ivas->cldfbSynDec[out_ch] ) - { - FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix ( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] ,Q11 ); - } - } - } - } - Word16 n_tc; - if (st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) - n_tc = st_ivas->nchan_ism; - else - n_tc = st_ivas->hTcBuffer->nchan_transport_internal; - for (int ch = 0; ch < n_tc; ch++) - { - floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k); - } -#endif IF( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, n_samples_granularity, st_ivas->renderer_type, st_ivas->intern_config, &st_ivas->hIntSetup, MC_MODE_NONE, ISM_MASA_MODE_DISC, nSamplesRendered, data ) ) != IVAS_ERR_OK ) { return error; } -#if 1 /*Fixed to float */ - if ( hTcBuffer->tc_buffer ) - fixedToFloat_arrL( hTcBuffer->tc_buffer_fx, hTcBuffer->tc_buffer, Q11, hTcBuffer->tc_buff_len ); - IF( hSpar ) - { - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - FOR( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ - } - } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } - } - // fix2float (to be cleaned) - 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 ) ) ) ) - { - fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); - FOR( Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - } - // fix2float end - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) - { - IF( st_ivas->cldfbSynDec[out_ch] ) - { - FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); - } - } - } - } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) - { - if ( st_ivas->hIsmMetaData[ind1] ) - { - st_ivas->hIsmMetaData[ind1]->azimuth = (float) ( st_ivas->hIsmMetaData[ind1]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind1]->elevation = (float) ( st_ivas->hIsmMetaData[ind1]->elevation_fx ) / (float) ( 1 << 22 ); - } - } -#endif #else IF( ( error = ivas_jbm_dec_flush_renderer( st_ivas, n_samples_granularity, st_ivas->renderer_type, st_ivas->intern_config, &st_ivas->hIntSetup, MC_MODE_NONE, ISM_MASA_MODE_DISC, nSamplesRendered, data ) ) != IVAS_ERR_OK ) { @@ -3975,7 +3834,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( } #endif - +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * ivas_spar_param_to_masa_param_mapping() * @@ -3995,6 +3854,7 @@ void fixedToFloat_arrL_check (Word32 *i, float *f, Word16 Q, Word16 l) } } } + void ivas_spar_param_to_masa_param_mapping_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -4418,7 +4278,7 @@ void ivas_spar_param_to_masa_param_mapping_fx( return; } - +#else void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -4639,8 +4499,8 @@ void ivas_spar_param_to_masa_param_mapping( return; } - - +#endif +#ifdef IVAS_FLOAT_FIXED /* Estimate FOA properties: foaCov = mixMtx * inCov * mixMtx' */ static void compute_foa_cov_matrix_fx( Word32 foaCov_fx[FOA_CHANNELS][FOA_CHANNELS], /* o : Estimated FOA covariance matrix */ @@ -4679,7 +4539,7 @@ static void compute_foa_cov_matrix_fx( return; } - +#else static void compute_foa_cov_matrix( float foaCov[FOA_CHANNELS][FOA_CHANNELS], /* o : Estimated FOA covariance matrix */ float inCov[FOA_CHANNELS][FOA_CHANNELS], /* i : Input covariance matrix */ @@ -4718,6 +4578,7 @@ static void compute_foa_cov_matrix( return; } +#endif static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, @@ -6228,4 +6089,4 @@ static Word16 rint_fx( /* returns in Q0 */ res = negate( res ); } return res; -} \ No newline at end of file +} diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index c57ddaac46cfe1675583e0b9d6d3a66b6b6136c6..aae13ac70b52b1032e6698662f97a53e383af7ab 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -49,6 +49,7 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "ivas_prot_fx.h" +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED #endif #define INV_EPSILON_MANT 214748365 @@ -79,6 +80,7 @@ typedef struct parameter_band_mapping_struct *-----------------------------------------------------------------------*/ static void ivas_param_mc_dec_init( PARAM_MC_DEC_HANDLE hParamMC, const int16_t nchan_in, const int16_t nchan_out ); +static void ivas_param_mc_dec_init_fx( PARAM_MC_DEC_HANDLE hParamMC, const Word16 nchan_in, const Word16 nchan_out ); static void param_mc_protoSignalComputation( float *RealBuffer, float *ImagBuffer, float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t num_freq_bands ); #ifdef IVAS_FLOAT_FIXED @@ -86,7 +88,7 @@ static void ivas_param_mc_dec_copy_diffuse_proto(PARAM_MC_DEC_HANDLE hParamMC, W #else static void ivas_param_mc_dec_copy_diffuse_proto( PARAM_MC_DEC_HANDLE hParamMC, float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nY, const int16_t slot_idx ); #endif -static int16_t ivas_param_mc_range_decoder_LC( uint16_t *bit_buffer, int16_t *x, int16_t *BER_detect, const int16_t sz_seq, const int16_t sz_alphabet, const uint16_t *cft, const uint16_t *sft, const int16_t tot_shift, const int16_t nbbits ); +static Word16 ivas_param_mc_range_decoder_LC( UWord16 *bit_buffer, Word16 *x, Word16 *BER_detect, const Word16 sz_seq, const Word16 sz_alphabet, const UWord16 *cft, const UWord16 *sft, const Word16 tot_shift, const Word16 nbbits ); static int16_t ivas_param_mc_uniform_decoder( float *seq, const int16_t sz_seq, const float *alphabet, const int16_t N, uint16_t bit_buffer[PARAM_MC_MAX_BITS] ); @@ -94,11 +96,27 @@ static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hDirAC, float *ild static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); +static void ivas_param_mc_get_mixing_matrices_fx( + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, + Word32 Cx_in_fixed[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ + Word16 Cx_in_e, + Word32 *mixing_matrix_fx[], + Word16 *mixing_matrix_e, + Word32 *mixing_matrix_res_fx[], + Word16 *mixing_matrix_res_e, + const Word16 nY_intern, /* i : number of channels in the transported format */ + const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ + const Word16 nX, /* i : number of transport channels */ + const Word16 nY_cov /* i : number of covariance synthesis output channels */ +); +#ifndef IVAS_FLOAT_FIXED static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); - +#endif static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float *mixing_matrix[], float *mixing_matrix_res[], const uint16_t nX, const uint16_t nY ); #ifdef IVAS_FLOAT_FIXED +static Word16 ivas_param_mc_uniform_decoder_fx(Word16 *seq, const Word16 sz_seq, const Word16 *alphabet, const Word16 N, UWord16 bit_buffer[PARAM_MC_MAX_BITS]); static void ivas_param_mc_dec_compute_interpolator_fx( const UWord16 bAttackPresent, const UWord16 attackPos, const UWord16 interp_length, Word16 *interpolator ); #endif // IVAS_FLOAT_FIXED @@ -113,8 +131,14 @@ static void ivas_param_mc_get_param_band_mapping( const int16_t n_target_bands, static void ivas_param_mc_bs_decode_parameter_values( uint16_t bit_buffer[], int16_t *bit_pos, const int16_t max_bits, int16_t *BER_detect, HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC, HANDLE_PARAM_MC_PARAMETER_CODING_INFO hParamCodingInfo, const int16_t map_size_wo_lfe, const int16_t map_size, const int16_t num_lfe_bands, const int16_t band_step, const int16_t num_param_bands, float *value_buffer ); #ifdef IVAS_FLOAT_FIXED +static void ivas_param_mc_bs_decode_parameter_values_fx(UWord16 bit_buffer[], Word16 *bit_pos, const Word16 max_bits, Word16 *BER_detect, HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC, HANDLE_PARAM_MC_PARAMETER_CODING_INFO hParamCodingInfo, const Word16 map_size_wo_lfe, const Word16 map_size, const Word16 num_lfe_bands, const Word16 band_step, const Word16 num_param_bands, Word16 *value_buffer); static void ivas_param_mc_dequantize_cov_fx(PARAM_MC_DEC_HANDLE hParamMC, Word16 *ild_q_fx, Word16 *icc_q_fx, const Word16 param_band_index, const Word16 nY_cov, const PARAM_MC_SYNTHESIS_CONF synth_conf, const Word16 nY_int, const Word16 nX, Word32 *Cx_state_fx, Word16 Cx_state_e, Word32 *Cproto_fx, Word16 Cproto_e, Word32 *Cy_state_fx, Word16 *Cy_state_e); -static ivas_error param_mc_get_diff_proto_info_fx(const Word32 *proto_mtx, const UWord16 nchan_transport, const UWord16 nchan_out_cov, PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info); +static ivas_error param_mc_get_diff_proto_info_fx(const Word32 *proto_mtx, const UWord16 nchan_transport, const UWord16 nchan_out_cov, PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info, Word16 Q_proto_mtx); +static void param_mc_update_mixing_matrices_fx( PARAM_MC_DEC_HANDLE hParamMC, Word32 *mixing_matrix[], Word16 *mixing_matrix_fx, Word32 *mixing_matrix_res[], Word16 *mixing_matrix_res_exp, const UWord16 nX, const UWord16 nY ); + +//static ivas_error param_mc_get_diff_proto_info_fx(const Word32 *proto_mtx, const UWord16 nchan_transport, const UWord16 nchan_out_cov, PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info); + +static void param_mc_protoSignalComputation_fx(Word32 *RealBuffer_fx, Word32 *ImagBuffer_fx, Word32 *proto_frame_f_fx, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t num_freq_bands/*, Word16 RealBuffer_fx_e, Word16 ImagBuffer_fx_e, Word16 *common_e*/); #endif /*------------------------------------------------------------------------- @@ -122,29 +146,26 @@ static ivas_error param_mc_get_diff_proto_info_fx(const Word32 *proto_mtx, const * * Open Parametric MC decoder handle *-------------------------------------------------------------------------*/ - -ivas_error ivas_param_mc_dec_open( +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_param_mc_dec_open_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { - int16_t k, nchan_transport; + Word16 k, nchan_transport; PARAM_MC_DEC_HANDLE hParamMC; #ifndef FIX_901_PARAMMC_DEAD_CODE IVAS_OUTPUT_SETUP hTransportSetup; #endif - int16_t nchan_out_transport; - int16_t nchan_out_cov; -#ifdef IVAS_FLOAT_FIXED + Word16 nchan_out_transport; + Word16 nchan_out_cov; Word32 proto_matrix_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; -#endif // IVAS_FLOAT_FIXED - float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float proto_mtx_norm; - int16_t max_param_band_residual; - uint16_t config_index; + Word32 proto_mtx_norm_fx; + Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 max_param_band_residual; + UWord16 config_index; MC_LS_SETUP mc_ls_setup; - float frequency_axis[CLDFB_NO_CHANNELS_MAX]; AUDIO_CONFIG output_config; - int32_t output_Fs, ivas_total_brate; + Word32 output_Fs, ivas_total_brate; ivas_error error; error = IVAS_ERR_OK; @@ -171,7 +192,10 @@ ivas_error ivas_param_mc_dec_open( #endif mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hParamMC->hoa_encoder_fx = NULL; +#if 1/*TODO: To be removed later(floating pointer initialization)*/ hParamMC->hoa_encoder = NULL; +#endif /* determine the synthesis config */ if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD || st_ivas->transport_config == output_config ) @@ -193,8 +217,12 @@ ivas_error ivas_param_mc_dec_open( if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hLsSetupCustom->num_spk; +#if 1/*TODO: To be removed later*/ st_ivas->hIntSetup.ls_azimuth = st_ivas->hLsSetupCustom->ls_azimuth; st_ivas->hIntSetup.ls_elevation = st_ivas->hLsSetupCustom->ls_elevation; +#endif + st_ivas->hIntSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; + st_ivas->hIntSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; } } else @@ -203,7 +231,10 @@ ivas_error ivas_param_mc_dec_open( } } +#if 0/*TODO: To be removed later*/ hParamMC->ls_conv_dmx_matrix = NULL; +#endif + hParamMC->ls_conv_dmx_matrix_fx = NULL; if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { @@ -252,28 +283,30 @@ ivas_error ivas_param_mc_dec_open( #endif /* init arrays for quantized parameters */ -#ifdef IVAS_FLOAT_FIXED - if ( ( hParamMC->icc_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof(Word16) ) ) == NULL ) + + if ( ( hParamMC->icc_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( Word16 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#endif - if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) + if ( ( hParamMC->icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( Word16 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - if ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) + set16_fx( hParamMC->icld_q_fx, PARAM_MC_DEFAULT_MIN_ILD_FX, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + set16_fx( hParamMC->icc_q_fx, 0, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + +#if 1/*TODO: To be removed later(floating point initialization)*/ + if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - if ( ( hParamMC->icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( Word16 ) ) ) == NULL ) + if ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#endif // IVAS_FLOAT_FIXED set_f( hParamMC->icld_q, PARAM_MC_DEFAULT_MIN_ILD, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - set_f( hParamMC->icc_q, 0.0f, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + set_f( hParamMC->icc_q, 0, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); +#endif param_mc_set_num_synth_bands( output_Fs, hParamMC ); @@ -310,35 +343,28 @@ ivas_error ivas_param_mc_dec_open( if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB || hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { -#ifdef IVAS_FLOAT_FIXED if ( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif /* convert the ls conv dmx matrix into column order matrix format (nchan_out_cldfb x nchan_out) */ if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { +#if 0/*TODO: To be removed later (floating point malloc)*/ if ( ( hParamMC->ls_conv_dmx_matrix = (float *) malloc( nchan_out_transport * nchan_out_cov * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - IF ( ( hParamMC->ls_conv_dmx_matrix_fx = (Word32 *) malloc( nchan_out_transport * nchan_out_cov * sizeof( Word32 ) ) ) == NULL ) +#endif + IF( ( hParamMC->ls_conv_dmx_matrix_fx = (Word32 *) malloc( nchan_out_transport * nchan_out_cov * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#endif for ( k = 0; k < nchan_out_transport; k++ ) { - mvr2r( st_ivas->hLsSetUpConversion->dmxMtx[k], &hParamMC->ls_conv_dmx_matrix[k * nchan_out_cov], nchan_out_cov ); + Copy32( st_ivas->hLsSetUpConversion->dmxMtx_fx[k], &hParamMC->ls_conv_dmx_matrix_fx[k * nchan_out_cov], nchan_out_cov );/*Q30*/ } /* convert ParamMC parameter bands to SFB */ @@ -353,53 +379,49 @@ ivas_error ivas_param_mc_dec_open( else { /* close the ls conversion handle immediately, it was only needed to get the DMX matrix in case of DMX in the covariance domain */ -#ifdef IVAS_FLOAT_FIXED ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); -#else - ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); -#endif } } } -#ifdef IVAS_FLOAT_FIXED if ( ( hParamMC->proto_matrix_int_fx = (Word32 *) malloc( nchan_out_transport * nchan_transport * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#endif // IVAS_FLOAT_FIXED + Copy32( ivas_param_mc_conf[config_index].dmx_fac_fx, hParamMC->proto_matrix_int_fx, nchan_transport * nchan_out_transport );/*Q31*/ if ( ( hParamMC->proto_matrix_int = (float *) malloc( nchan_out_transport * nchan_transport * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - mvr2r( ivas_param_mc_conf[config_index].dmx_fac, hParamMC->proto_matrix_int, nchan_transport * nchan_out_transport ); if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - matrix_product( hParamMC->ls_conv_dmx_matrix, nchan_out_cov, nchan_out_transport, 0, ivas_param_mc_conf[config_index].dmx_fac, nchan_out_transport, nchan_transport, 0, proto_matrix ); - + Scale_sig32( hParamMC->ls_conv_dmx_matrix_fx, nchan_out_transport * nchan_out_cov, -4 ); /*Q.26*/ + matrix_product_fx( hParamMC->ls_conv_dmx_matrix_fx, nchan_out_cov, nchan_out_transport, 0, ivas_param_mc_conf[config_index].dmx_fac_fx, nchan_out_transport, nchan_transport, 0, proto_matrix_fx );/*Q.26*/ + Scale_sig32( hParamMC->ls_conv_dmx_matrix_fx, nchan_out_transport * nchan_out_cov, 4 ); /*Q.26*/ if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - proto_mtx_norm = 1.f; + proto_mtx_norm_fx = ONE_IN_Q26;/*Q26*/ for ( k = 0; k < nchan_transport * nchan_out_cov; k++ ) { - proto_mtx_norm = max( fabsf( proto_mtx_norm ), fabsf( proto_matrix[k] ) ); + proto_mtx_norm_fx = L_max(L_abs(proto_mtx_norm_fx), L_abs( proto_matrix_fx[k] ) );/*Q.26*/ } - proto_mtx_norm = 1.f / proto_mtx_norm; + proto_mtx_norm_fx = divide3232(ONE_IN_Q26 , proto_mtx_norm_fx);/*Q15*/ /* transfer flattened proto_matrix to 2D in hLsSetupConversion->dmxMtx */ for ( k = 0; k < nchan_transport; k++ ) { for ( int16_t i = 0; i < nchan_out_cov; i++ ) { - st_ivas->hLsSetUpConversion->dmxMtx[k][i] = proto_matrix[k * nchan_out_cov + i] * proto_mtx_norm; + st_ivas->hLsSetUpConversion->dmxMtx_fx[k][i] = L_shl(Mult_32_16(proto_matrix_fx[k * nchan_out_cov + i] , extract_l(proto_mtx_norm_fx)),4);/*Q.30*/ } } } } else { - mvr2r( ivas_param_mc_conf[config_index].dmx_fac, proto_matrix, nchan_out_transport * nchan_transport ); + Copy32( ivas_param_mc_conf[config_index].dmx_fac_fx, proto_matrix_fx, nchan_out_transport * nchan_transport );/*Q.31*/ + Scale_sig32( proto_matrix_fx, nchan_out_transport * nchan_transport, -5);/*Scaling down to 26*/ } if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) @@ -419,7 +441,7 @@ ivas_error ivas_param_mc_dec_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - if ( ( error = param_mc_get_diff_proto_info( proto_matrix, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ) ) != IVAS_ERR_OK ) + if ( ( error = param_mc_get_diff_proto_info_fx( proto_matrix_fx, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ,Q26) ) != IVAS_ERR_OK ) { return error; } @@ -428,30 +450,13 @@ ivas_error ivas_param_mc_dec_open( hParamMC->h_freq_domain_decorr_ap_params = NULL; hParamMC->h_freq_domain_decorr_ap_state = NULL; -#ifdef IVAS_FLOAT_FIXED - Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, hParamMC->num_freq_bands ); - for ( int i = 0; i < hParamMC->num_freq_bands; i++ ) - { - frequency_axis[i] = (float) frequency_axis_fx[i]; - } - IF( ( error = ivas_dirac_dec_decorr_open_fx( &( hParamMC->h_freq_domain_decorr_ap_params ), &( hParamMC->h_freq_domain_decorr_ap_state ), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis_fx, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#else - ivas_dirac_dec_get_frequency_axis( frequency_axis, output_Fs, hParamMC->num_freq_bands ); - if ((error = ivas_dirac_dec_decorr_open(&(hParamMC->h_freq_domain_decorr_ap_params), &(hParamMC->h_freq_domain_decorr_ap_state), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, hParamMC->diff_proto_info->num_protos_diff, - DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis, nchan_transport, output_Fs)) != IVAS_ERR_OK) - { - return error; - } -#endif - - hParamMC->h_output_synthesis_params.use_onset_filters = 0; hParamMC->max_band_decorr = hParamMC->h_freq_domain_decorr_ap_params->max_band_decorr; @@ -470,293 +475,218 @@ ivas_error ivas_param_mc_dec_open( } /* output synthesis */ -#ifdef IVAS_FLOAT_FIXED - floatToFixed_arrL( proto_matrix, proto_matrix_fx, Q30, MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); - if ( ( error = ivas_dirac_dec_output_synthesis_cov_open_fx( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix_fx ) ) != IVAS_ERR_OK ) - { - return error; - } - fixedToFloat_arrL( hParamMC->h_output_synthesis_params.proto_matrix_fx, hParamMC->h_output_synthesis_params.proto_matrix, 30, nchan_transport * nchan_out_cov ); -#else - if ( ( error = ivas_dirac_dec_output_synthesis_cov_open( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, - hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_dec_output_synthesis_cov_open_fx( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix_fx ) ) != IVAS_ERR_OK ) { return error; } -#endif // IVAS_FLOAT_FIXED - ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); + ivas_param_mc_dec_compute_interpolator_fx( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator_fx ); /* Head or external rotation */ if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) { - if ( ( hParamMC->hoa_encoder = (float *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( float ) ) ) == NULL ) +#if 1/*TODO : To be removed later*/ + IF ( ( hParamMC->hoa_encoder = (float *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - compute_hoa_encoder_mtx( st_ivas->hTransSetup.ls_azimuth, st_ivas->hTransSetup.ls_elevation, hParamMC->hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER ); +#endif + IF ( ( hParamMC->hoa_encoder_fx = (Word32 *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof(Word32) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + compute_hoa_encoder_mtx_fx( st_ivas->hTransSetup.ls_azimuth_fx, st_ivas->hTransSetup.ls_elevation_fx, hParamMC->hoa_encoder_fx, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER ); } /*-----------------------------------------------------------------* * memory allocation *-----------------------------------------------------------------*/ - if ( hParamMC->max_band_decorr > 0 ) + IF ( GT_16(hParamMC->max_band_decorr , 0) ) { - if ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) +#if 1/*TODO: To be removed later(floating point malloc)*/ + IF ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - - if ( ( hParamMC->proto_frame_dec_f = (float *) malloc( 2 * nchan_out_cov * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + IF ( ( hParamMC->proto_frame_dec_f = (float *) malloc( 2 * nchan_out_cov * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - if ((hParamMC->proto_frame_dec_f_fx = (Word32 *)malloc(2 * nchan_out_cov * hParamMC->num_freq_bands * sizeof(Word32))) == NULL) +#endif + IF ( ( hParamMC->proto_frame_f_fx = (Word32 *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) { - return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n")); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + hParamMC->proto_frame_f_len = 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands; + IF ( ( hParamMC->proto_frame_dec_f_fx = (Word32 *) malloc( 2 * nchan_out_cov * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#endif } - else + ELSE { +#if 1/*TODO: To be removed later*/ hParamMC->proto_frame_f = NULL; hParamMC->proto_frame_dec_f = NULL; -#ifdef IVAS_FLOAT_FIXED - hParamMC->proto_frame_dec_f_fx = NULL; #endif + hParamMC->proto_frame_f_fx = NULL; + hParamMC->proto_frame_dec_f_fx = NULL; } - ivas_param_mc_dec_init( hParamMC, nchan_transport, nchan_out_cov ); + ivas_param_mc_dec_init_fx( hParamMC, nchan_transport, nchan_out_cov ); - if ( hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + IF ( hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) { - int16_t n_cldfb_slots; + Word16 n_cldfb_slots; n_cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; - if ( st_ivas->hDecoderConfig->Opt_tsm ) + IF ( st_ivas->hDecoderConfig->Opt_tsm ) { n_cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; } - if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + + IF( ( hParamMC->Cldfb_RealBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } - set_zero( hParamMC->Cldfb_RealBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); - -#ifdef IVAS_FLOAT_FIXED - IF ( ( hParamMC->Cldfb_RealBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) + set32_fx( hParamMC->Cldfb_RealBuffer_tc_fx, 0, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + IF( ( hParamMC->Cldfb_ImagBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } - set32_fx( hParamMC->Cldfb_RealBuffer_tc_fx, 0, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); -#endif + set32_fx( hParamMC->Cldfb_ImagBuffer_tc_fx, 0, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); - if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + hParamMC->sz = n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands; + +#if 1/*TODO: To be removed later(floating point malloc)*/ + if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } - set_zero( hParamMC->Cldfb_ImagBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); - -#ifdef IVAS_FLOAT_FIXED - IF ( ( hParamMC->Cldfb_ImagBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) + set_zero( hParamMC->Cldfb_RealBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } - set32_fx( hParamMC->Cldfb_ImagBuffer_tc_fx, 0, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + set_zero( hParamMC->Cldfb_ImagBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); #endif - if ( st_ivas->hTcBuffer == NULL ) + IF ( st_ivas->hTcBuffer == NULL ) { -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) -#endif + IF ( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) { return error; } } } - else + ELSE { + hParamMC->Cldfb_RealBuffer_tc_fx = NULL; + hParamMC->Cldfb_ImagBuffer_tc_fx = NULL; +#if 1/*TODO: To be removed later*/ hParamMC->Cldfb_RealBuffer_tc = NULL; hParamMC->Cldfb_ImagBuffer_tc = NULL; +#endif } hParamMC->subframes_rendered = 0; hParamMC->slots_rendered = 0; st_ivas->hParamMC = hParamMC; - return error; } +#else +ivas_error ivas_param_mc_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t k, nchan_transport; + PARAM_MC_DEC_HANDLE hParamMC; +#ifndef FIX_901_PARAMMC_DEAD_CODE + IVAS_OUTPUT_SETUP hTransportSetup; +#endif + int16_t nchan_out_transport; + int16_t nchan_out_cov; +#ifdef IVAS_FLOAT_FIXED + Word32 proto_matrix_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; +#endif // IVAS_FLOAT_FIXED + float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float proto_mtx_norm; + int16_t max_param_band_residual; + uint16_t config_index; + MC_LS_SETUP mc_ls_setup; + float frequency_axis[CLDFB_NO_CHANNELS_MAX]; + AUDIO_CONFIG output_config; + int32_t output_Fs, ivas_total_brate; + ivas_error error; + error = IVAS_ERR_OK; -/*------------------------------------------------------------------------- - * ivas_param_mc_get_param_band_mapping() - * - * - *-------------------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -static void ivas_param_mc_get_param_band_mapping( - const Word16 n_target_bands, - const Word16 *target_band_grouping, - const Word16 n_source_bands, - const Word16 *source_band_grouping, - PARAM_MC_PARAMETER_BAND_MAPPING *parameter_band_mapping ) -{ - Word16 target_band_idx; - Word16 source_band_idx = 0; - move16(); - Word16 source_band_cnt_total; + if ( ( hParamMC = (PARAM_MC_DEC_HANDLE) malloc( sizeof( PARAM_MC_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } - FOR ( target_band_idx = 0; target_band_idx < n_target_bands; target_band_idx++ ) + if ( ( hParamMC->hMetadataPMC = (HANDLE_IVAS_PARAM_MC_METADATA) malloc( sizeof( IVAS_PARAM_MC_METADATA ) ) ) == NULL ) { - Word16 upper = target_band_grouping[target_band_idx + 1]; - Word16 lower = target_band_grouping[target_band_idx]; - Word16 source_band_in_target_band_cnt = 0; - Word16 norm_fac_fx = 32767; - source_band_cnt_total = 0; - move16();move16();move16(); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC metadata \n" ) ); + } - FOR ( source_band_idx = 0; source_band_idx < n_source_bands; source_band_idx++ ) + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; +#ifndef FIX_901_PARAMMC_DEAD_CODE + hTransportSetup = st_ivas->hTransSetup; +#endif + mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hParamMC->hoa_encoder = NULL; + + /* determine the synthesis config */ + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD || st_ivas->transport_config == output_config ) + { + hParamMC->synthesis_conf = PARAM_MC_SYNTH_DIRECT; + } + else if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + hParamMC->synthesis_conf = PARAM_MC_SYNTH_MONO_STEREO; + } + else if ( st_ivas->transport_config != output_config ) + { + if ( ( output_config != IVAS_AUDIO_CONFIG_LS_CUSTOM && nchan_out_transport > audioCfg2channels( output_config ) ) || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && nchan_out_transport > st_ivas->hOutSetup.nchan_out_woLFE ) ) { - /* find lowest corresponding source band*/ - IF ( LE_16(source_band_grouping[source_band_idx] , lower) && GE_16(source_band_grouping[source_band_idx + 1] , lower) ) + hParamMC->synthesis_conf = PARAM_MC_SYNTH_LS_CONV_COV; + /* need to reset the intern config */ + st_ivas->intern_config = output_config; + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { - DO - { - Word16 source_bands_in_target_band = sub(s_min( source_band_grouping[source_band_idx + 1], upper ) , s_max( source_band_grouping[source_band_idx], lower )); - IF ( source_bands_in_target_band ) - { - source_band_cnt_total = add(source_band_cnt_total,source_bands_in_target_band); - parameter_band_mapping->source_band_idx[target_band_idx][source_band_in_target_band_cnt] = source_band_idx; - parameter_band_mapping->source_band_factor_fx[target_band_idx][source_band_in_target_band_cnt++] = shl(source_bands_in_target_band,10); /*Q10*/ - move16(); - move16(); - } - source_band_idx++; - } WHILE ( LE_16(source_band_grouping[source_band_idx] , upper) && LT_16(source_band_idx , n_source_bands) ); - BREAK; + st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->hLsSetupCustom->num_spk; + st_ivas->hIntSetup.ls_azimuth = st_ivas->hLsSetupCustom->ls_azimuth; + st_ivas->hIntSetup.ls_elevation = st_ivas->hLsSetupCustom->ls_elevation; } } - norm_fac_fx = div_s(1, source_band_cnt_total );/*Q15*/ - for ( source_band_idx = 0; source_band_idx < source_band_in_target_band_cnt; source_band_idx++ ) + else { - parameter_band_mapping->source_band_factor_fx[target_band_idx][source_band_idx] = shl_sat(mult(parameter_band_mapping->source_band_factor_fx[target_band_idx][source_band_idx],norm_fac_fx)/*Q10*/,5);/*Q15*/ + hParamMC->synthesis_conf = PARAM_MC_SYNTH_LS_CONV_CLDFB; } - parameter_band_mapping->n_source_bands[target_band_idx] = source_band_in_target_band_cnt; - move16(); } - return; -} +#ifndef IVAS_FLOAT_FIXED + hParamMC->ls_conv_dmx_matrix = NULL; #else -static void ivas_param_mc_get_param_band_mapping( - const int16_t n_target_bands, - const int16_t *target_band_grouping, - const int16_t n_source_bands, - const int16_t *source_band_grouping, - PARAM_MC_PARAMETER_BAND_MAPPING *parameter_band_mapping ) -{ - int16_t target_band_idx; - int16_t source_band_idx = 0; - int16_t source_band_cnt_total; - - for ( target_band_idx = 0; target_band_idx < n_target_bands; target_band_idx++ ) - { - int16_t upper = target_band_grouping[target_band_idx + 1]; - int16_t lower = target_band_grouping[target_band_idx]; - int16_t source_band_in_target_band_cnt = 0; - float norm_fac = 1.0f; - source_band_cnt_total = 0; - for ( source_band_idx = 0; source_band_idx < n_source_bands; source_band_idx++ ) - { - /* find lowest corresponding source band*/ - if ( source_band_grouping[source_band_idx] <= lower && source_band_grouping[source_band_idx + 1] >= lower ) - { - do - { - int16_t source_bands_in_target_band = min( source_band_grouping[source_band_idx + 1], upper ) - max( source_band_grouping[source_band_idx], lower ); - if ( source_bands_in_target_band ) - { - source_band_cnt_total += source_bands_in_target_band; - parameter_band_mapping->source_band_idx[target_band_idx][source_band_in_target_band_cnt] = source_band_idx; - parameter_band_mapping->source_band_factor[target_band_idx][source_band_in_target_band_cnt++] = (float) source_bands_in_target_band; - } - source_band_idx++; - } while ( source_band_grouping[source_band_idx] <= upper && source_band_idx < n_source_bands ); - break; - } - } - norm_fac = 1.0f / ( (float) source_band_cnt_total ); - for ( source_band_idx = 0; source_band_idx < source_band_in_target_band_cnt; source_band_idx++ ) - { - - parameter_band_mapping->source_band_factor[target_band_idx][source_band_idx] *= norm_fac; - } - parameter_band_mapping->n_source_bands[target_band_idx] = source_band_in_target_band_cnt; - } - - return; -} + hParamMC->ls_conv_dmx_matrix_fx = NULL; #endif // IVAS_FLOAT_FIXED - -/*------------------------------------------------------------------------- - * ivas_param_mc_dec_reconfig() - * - * Reconfiguration of ParamMC decoder - *-------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -ivas_error ivas_param_mc_dec_reconfig_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word16 k, nchan_transport; - PARAM_MC_DEC_HANDLE hParamMC; -#ifndef FIX_901_PARAMMC_DEAD_CODE - IVAS_OUTPUT_SETUP hTransportSetup; -#endif - Word16 nchan_out_transport; - Word16 nchan_out_cov; - Word32 proto_matrix_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word32 proto_mtx_norm_fx; - Word16 max_param_band_residual; - UWord16 config_index; - MC_LS_SETUP mc_ls_setup; - Word32 output_Fs, ivas_total_brate; - ivas_error error; - Word16 nchan_transport_old; - Word16 num_param_bands_old; - PARAM_MC_PARAMETER_BAND_MAPPING parameter_band_mapping; - Word16 band_grouping_old[20 + 1]; - - hParamMC = st_ivas->hParamMC; - error = IVAS_ERR_OK; - /* save important config information from the previous state */ - nchan_transport_old = st_ivas->nchan_transport; - num_param_bands_old = hParamMC->hMetadataPMC->num_parameter_bands; - - /*-----------------------------------------------------------------* - * prepare library opening - *-----------------------------------------------------------------*/ - - output_Fs = st_ivas->hDecoderConfig->output_Fs; - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; -#ifndef FIX_901_PARAMMC_DEAD_CODE - hTransportSetup = st_ivas->hTransSetup; -#endif - mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); - nchan_out_transport = add(st_ivas->hTransSetup.nchan_out_woLFE , st_ivas->hTransSetup.num_lfe); - - IF ( EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_LS_CONV_COV) || EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - nchan_out_cov = add(st_ivas->hOutSetup.nchan_out_woLFE , st_ivas->hOutSetup.num_lfe); + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; } - ELSE + else { nchan_out_cov = nchan_out_transport; } @@ -765,305 +695,216 @@ ivas_error ivas_param_mc_dec_reconfig_fx( config_index = ivas_param_mc_get_configuration_index( mc_ls_setup, ivas_total_brate ); nchan_transport = st_ivas->nchan_transport; - SWITCH ( nchan_transport ) + switch ( nchan_transport ) { case 4: case 3: st_ivas->nCPE = 2; st_ivas->nSCE = 0; st_ivas->element_mode_init = IVAS_CPE_MDCT; - BREAK; + break; case 2: st_ivas->nCPE = 1; st_ivas->nSCE = 0; st_ivas->element_mode_init = IVAS_CPE_MDCT; - BREAK; + break; } /*-----------------------------------------------------------------* * set input parameters *-----------------------------------------------------------------*/ - hParamMC->num_freq_bands = shr( add( (Word16) Mpy_32_32( output_Fs, INV_CLDFB_BANDWIDTH_Q31 << 1 ), 1 ), 1 ); - hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* deallocate the full icc map, gets newly allocated in the metadata open function */ + hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; + set_s( hParamMC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hParamMC->subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hParamMC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; - FOR ( k = 0; k < 2; k++ ) - { - IF ( hParamMC->hMetadataPMC->icc_map_full[k] != NULL ) - { - free( hParamMC->hMetadataPMC->icc_map_full[k] ); - hParamMC->hMetadataPMC->icc_map_full[k] = NULL; - } - } -#endif - Copy( hParamMC->band_grouping, band_grouping_old, add(hParamMC->hMetadataPMC->num_parameter_bands , 1) ); + hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; #ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); #else ivas_param_mc_metadata_open( mc_ls_setup, ivas_total_brate, hParamMC->hMetadataPMC ); #endif + + /* init arrays for quantized parameters */ +#ifdef IVAS_FLOAT_FIXED + if ( ( hParamMC->icc_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof(Word16) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } +#endif + if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + if ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } +#ifdef IVAS_FLOAT_FIXED + if ( ( hParamMC->icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( Word16 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } +#endif // IVAS_FLOAT_FIXED + set_f( hParamMC->icld_q, PARAM_MC_DEFAULT_MIN_ILD, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + set_f( hParamMC->icc_q, 0.0f, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + + param_mc_set_num_synth_bands( output_Fs, hParamMC ); + /* Band Grouping */ - IF ( EQ_16(hParamMC->hMetadataPMC->num_parameter_bands , 20) ) + if ( hParamMC->hMetadataPMC->num_parameter_bands == 20 ) { - Copy( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); + mvs2s( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); } - ELSE IF ( EQ_16(hParamMC->hMetadataPMC->num_parameter_bands , 14) ) + else if ( hParamMC->hMetadataPMC->num_parameter_bands == 14 ) { - Copy( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); + mvs2s( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); } - ELSE IF ( EQ_16(hParamMC->hMetadataPMC->num_parameter_bands , 10) ) + else if ( hParamMC->hMetadataPMC->num_parameter_bands == 10 ) { - Copy( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); + mvs2s( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); } - ELSE + else { assert( 0 && "nbands must be 20, 14, or 10!" ); } - ivas_param_mc_get_param_band_mapping( hParamMC->hMetadataPMC->num_parameter_bands, hParamMC->band_grouping, num_param_bands_old, band_grouping_old, ¶meter_band_mapping ); - - IF ( NE_16(nchan_transport_old , nchan_transport) || NE_16(num_param_bands_old , hParamMC->hMetadataPMC->num_parameter_bands) ) + /* set max parameter band for abs cov */ + k = 0; + while ( hParamMC->band_grouping[k] <= PARAM_MC_MAX_BAND_ABS_COV_DEC ) { - Word16 *ild_q_old_fx = hParamMC->icld_q_fx; - Word16 *icc_q_old_fx = hParamMC->icc_q_fx; -#if 1/*To be removed later*/ + hParamMC->max_param_band_abs_cov = ( k++ ); + } - /* init arrays for the quantized parameters */ - IF ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) + /*-----------------------------------------------------------------* + * open sub-modules + *-----------------------------------------------------------------*/ + + /* prototype signal computation */ + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB || hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + return error; } - IF ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) +#else + if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + return error; } - set_f( hParamMC->icld_q, PARAM_MC_DEFAULT_MIN_ILD, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - set_f( hParamMC->icc_q, 0.0f, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); #endif - IF ( ( hParamMC->icc_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof(Word16) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); - } - IF ( ( hParamMC->icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( Word16 ) ) ) == NULL ) + /* convert the ls conv dmx matrix into column order matrix format (nchan_out_cldfb x nchan_out) */ + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); - } - set16_fx( hParamMC->icld_q_fx, PARAM_MC_DEFAULT_MIN_ILD_FX, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe );/*Q8*/ - set16_fx( hParamMC->icc_q_fx, 0, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe );/*Q15*/ +#ifndef IVAS_FLOAT_FIXED + if ( ( hParamMC->ls_conv_dmx_matrix = (float *) malloc( nchan_out_transport * nchan_out_cov * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } +#else + IF ( ( hParamMC->ls_conv_dmx_matrix_fx = (Word32 *) malloc( nchan_out_transport * nchan_out_cov * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } +#endif - /* map old to new parameter banding, only for same number of TCs, needs some more thought for a changing number of TCs */ - IF ( NE_16(num_param_bands_old , hParamMC->hMetadataPMC->num_parameter_bands) && EQ_16(nchan_transport_old , nchan_transport) ) - { - Word16 new_param_band_idx, param_idx, source_param_idx; - Word16 num_param_lfe; - Word16 *p_icc_new_fx = hParamMC->icc_q_fx; - Word16 *p_ild_new_fx = hParamMC->icld_q_fx; - Word16 p_ild_new_e = 23; - Word16 p_ild_new_tmp; + for ( k = 0; k < nchan_out_transport; k++ ) + { +#ifdef IVAS_FLOAT_FIXED +#if 1 //To be removed when hParamMC->ls_conv_dmx_matrix is removed - /* ICC */ - num_param_lfe = hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; - FOR ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) - { - FOR ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) - { - *p_icc_new_fx = 0; - FOR ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) - { - *p_icc_new_fx = add( *p_icc_new_fx, mult( icc_q_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]* num_param_lfe + param_idx], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx] ) ); /*Q15*/ - } - p_icc_new_fx++; - } +#endif + Copy32( st_ivas->hLsSetUpConversion->dmxMtx_fx[k], &hParamMC->ls_conv_dmx_matrix_fx[k * nchan_out_cov], nchan_out_cov ); +#else + mvr2r( st_ivas->hLsSetUpConversion->dmxMtx[k], &hParamMC->ls_conv_dmx_matrix[k * nchan_out_cov], nchan_out_cov ); +#endif } - /* ILD */ - num_param_lfe = hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; - FOR ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + /* convert ParamMC parameter bands to SFB */ + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - FOR ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) + st_ivas->hLsSetUpConversion->sfbCnt = hParamMC->num_param_bands_synth; + for ( k = 0; k <= hParamMC->num_param_bands_synth; k++ ) { - *p_ild_new_fx = 0; - FOR ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) - { - p_ild_new_tmp = extract_h(BASOP_util_Pow2( L_mult0( 10885/*log2(10)/10*2^15*/, ild_q_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx] * num_param_lfe + param_idx] ), 8, &p_ild_new_e )); - *p_ild_new_fx = add(*p_ild_new_fx,mult(p_ild_new_tmp, parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx] )); - } - *p_ild_new_fx = extract_l(L_shr(Mpy_32_16_1(L_add(BASOP_Util_Log2(*p_ild_new_fx),L_add(16<hLsSetUpConversion->sfbOffset[k] = PARAM_MC_BAND_TO_MDCT_BAND_RATIO * hParamMC->band_grouping[k]; } } - } - free( ild_q_old_fx ); - free( icc_q_old_fx ); - } - - param_mc_set_num_synth_bands( output_Fs, hParamMC ); - - /* set max parameter band for abs cov */ - k = 0; - WHILE ( LE_16(hParamMC->band_grouping[k] , PARAM_MC_MAX_BAND_ABS_COV_DEC) ) - { - hParamMC->max_param_band_abs_cov = ( k++ ); - } - - /*-----------------------------------------------------------------* - * open sub-modules - *-----------------------------------------------------------------*/ - - /* prototype signal computation */ - - IF ( EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) - { - IF ( NE_16(nchan_transport_old , nchan_transport) ) - { - IF ( st_ivas->hLsSetUpConversion != NULL ) + else { + /* close the ls conversion handle immediately, it was only needed to get the DMX matrix in case of DMX in the covariance domain */ +#ifdef IVAS_FLOAT_FIXED ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); - } - - IF ( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* convert the ls conv dmx matrix into column order matrix format (nchan_out_cldfb x nchan_out) */ -#if 1/*To be removed later*/ - free( hParamMC->ls_conv_dmx_matrix ); -#endif - free( hParamMC->ls_conv_dmx_matrix_fx ); -#if 1 - IF ( ( hParamMC->ls_conv_dmx_matrix = (float *) malloc( nchan_out_transport * nchan_out_cov * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); - } +#else + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); #endif - IF ( ( hParamMC->ls_conv_dmx_matrix_fx = (Word32 *) malloc( nchan_out_transport * nchan_out_cov * sizeof(Word32) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); - } - FOR ( k = 0; k < nchan_out_transport; k++ ) - { - Copy32( st_ivas->hLsSetUpConversion->dmxMtx_fx[k], &hParamMC->ls_conv_dmx_matrix_fx[k * nchan_out_cov], nchan_out_cov ); - Scale_sig32( &hParamMC->ls_conv_dmx_matrix_fx[k * nchan_out_cov],nchan_out_cov,1 ); } } - /* convert ParamMC parameter bands to SFB */ - - st_ivas->hLsSetUpConversion->sfbCnt = hParamMC->num_param_bands_synth; - FOR ( k = 0; k <= hParamMC->num_param_bands_synth; k++ ) - { - st_ivas->hLsSetUpConversion->sfbOffset[k] = PARAM_MC_BAND_TO_MDCT_BAND_RATIO * hParamMC->band_grouping[k]; - } - FOR ( ; k < MAX_SFB + 2; k++ ) - { - st_ivas->hLsSetUpConversion->sfbOffset[k] = 0; - } } +#ifdef IVAS_FLOAT_FIXED + if ( ( hParamMC->proto_matrix_int_fx = (Word32 *) malloc( nchan_out_transport * nchan_transport * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } +#endif // IVAS_FLOAT_FIXED - IF ( NE_16(nchan_transport_old , nchan_transport) ) + if ( ( hParamMC->proto_matrix_int = (float *) malloc( nchan_out_transport * nchan_transport * sizeof( float ) ) ) == NULL ) { -#if 1 - free( hParamMC->proto_matrix_int ); - IF ( ( hParamMC->proto_matrix_int = (float *) malloc( nchan_out_transport * nchan_transport * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); - } -#endif - free( hParamMC->proto_matrix_int_fx ); - IF ( ( hParamMC->proto_matrix_int_fx = (Word32 *) malloc( nchan_out_transport * nchan_transport * sizeof(Word32) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); - } - Copy32( ivas_param_mc_conf[config_index].dmx_fac_fx, hParamMC->proto_matrix_int_fx, nchan_transport * nchan_out_transport );/*Q31*/ + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } + mvr2r( ivas_param_mc_conf[config_index].dmx_fac, hParamMC->proto_matrix_int, nchan_transport * nchan_out_transport ); - IF ( EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_LS_CONV_COV) || EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - matrix_product_fx( hParamMC->ls_conv_dmx_matrix_fx, nchan_out_cov, nchan_out_transport, 0, - ivas_param_mc_conf[config_index].dmx_fac_fx, nchan_out_transport, nchan_transport, 0, - proto_matrix_fx ); + matrix_product( hParamMC->ls_conv_dmx_matrix, nchan_out_cov, nchan_out_transport, 0, ivas_param_mc_conf[config_index].dmx_fac, nchan_out_transport, nchan_transport, 0, proto_matrix ); - IF ( EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - proto_mtx_norm_fx = MAX_32; - FOR ( k = 0; k < nchan_transport * nchan_out_cov; k++ ) + proto_mtx_norm = 1.f; + for ( k = 0; k < nchan_transport * nchan_out_cov; k++ ) { - proto_mtx_norm_fx = L_max(L_abs( proto_mtx_norm_fx ), L_abs( proto_matrix_fx[k] ) ); + proto_mtx_norm = max( fabsf( proto_mtx_norm ), fabsf( proto_matrix[k] ) ); } - proto_mtx_norm_fx = divide3232(1 , proto_mtx_norm_fx);/*Q15*/ + proto_mtx_norm = 1.f / proto_mtx_norm; /* transfer flattened proto_matrix to 2D in hLsSetupConversion->dmxMtx */ - FOR ( k = 0; k < nchan_transport; k++ ) + for ( k = 0; k < nchan_transport; k++ ) { - FOR ( Word16 i = 0; i < nchan_out_cov; i++ ) + for ( int16_t i = 0; i < nchan_out_cov; i++ ) { - st_ivas->hLsSetUpConversion->dmxMtx_fx[k][i] = L_shr(Mpy_32_16_1(proto_matrix_fx[k * nchan_out_cov + i] , (Word16)proto_mtx_norm_fx),1); - st_ivas->hLsSetUpConversion->dmxMtx[k][i] = fixedToFloat( st_ivas->hLsSetUpConversion->dmxMtx_fx[k][i], Q30 ); + st_ivas->hLsSetUpConversion->dmxMtx[k][i] = proto_matrix[k * nchan_out_cov + i] * proto_mtx_norm; } } } } - ELSE + else { - Copy32( ivas_param_mc_conf[config_index].dmx_fac_fx, proto_matrix_fx, nchan_out_transport * nchan_transport ); + mvr2r( ivas_param_mc_conf[config_index].dmx_fac, proto_matrix, nchan_out_transport * nchan_transport ); } - IF ( NE_16(nchan_transport_old , nchan_transport) && NE_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + hParamMC->num_outputs_diff = 0; + hParamMC->diff_proto_info = NULL; + hParamMC->h_output_synthesis_params.use_onset_filters = 0; + hParamMC->max_band_decorr = 0; + hParamMC->h_freq_domain_decorr_ap_params = NULL; + hParamMC->h_freq_domain_decorr_ap_state = NULL; + } + else { - Word16 i; - Word16 len; - - /* close decorrelator */ - ivas_dirac_dec_decorr_close( &hParamMC->h_freq_domain_decorr_ap_params, &hParamMC->h_freq_domain_decorr_ap_state ); - - /* deallocate diffuse prototype info */ - IF ( hParamMC->diff_proto_info ) - { -#if 1/*To be removed later*/ - FOR ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) - { - free( hParamMC->diff_proto_info->proto_fac[i] ); - hParamMC->diff_proto_info->proto_fac[i] = NULL; - } - - free( hParamMC->diff_proto_info->proto_fac ); - hParamMC->diff_proto_info->proto_fac = NULL; -#endif - FOR ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) - { - free( hParamMC->diff_proto_info->source_chan_idx[i] ); - hParamMC->diff_proto_info->source_chan_idx[i] = NULL; - - free( hParamMC->diff_proto_info->proto_fac_fx[i] ); - hParamMC->diff_proto_info->proto_fac_fx[i] = NULL; - } - - free( hParamMC->diff_proto_info->source_chan_idx ); - hParamMC->diff_proto_info->source_chan_idx = NULL; - - free( hParamMC->diff_proto_info->proto_fac_fx ); - hParamMC->diff_proto_info->proto_fac_fx = NULL; - - free( hParamMC->diff_proto_info->proto_index_diff ); - hParamMC->diff_proto_info->proto_index_diff = NULL; - - free( hParamMC->diff_proto_info->num_source_chan_diff ); - hParamMC->diff_proto_info->num_source_chan_diff = NULL; - - free( hParamMC->diff_proto_info ); - hParamMC->diff_proto_info = NULL; - } - hParamMC->num_outputs_diff = nchan_out_cov; - IF ( ( hParamMC->diff_proto_info = (PARAM_MC_DIFF_PROTO_INFO *) malloc( sizeof( PARAM_MC_DIFF_PROTO_INFO ) ) ) == NULL ) + if ( ( hParamMC->diff_proto_info = (PARAM_MC_DIFF_PROTO_INFO *) malloc( sizeof( PARAM_MC_DIFF_PROTO_INFO ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - IF ( ( param_mc_get_diff_proto_info_fx( proto_matrix_fx, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ) ) != IVAS_ERR_OK ) + + if ( ( error = param_mc_get_diff_proto_info( proto_matrix, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ) ) != IVAS_ERR_OK ) { return error; } @@ -1072,37 +913,40 @@ ivas_error ivas_param_mc_dec_reconfig_fx( hParamMC->h_freq_domain_decorr_ap_params = NULL; hParamMC->h_freq_domain_decorr_ap_state = NULL; +#ifdef IVAS_FLOAT_FIXED Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, hParamMC->num_freq_bands ); - IF( ( error = ivas_dirac_dec_decorr_open_fx( &( hParamMC->h_freq_domain_decorr_ap_params ), &( hParamMC->h_freq_domain_decorr_ap_state ), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, - hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis_fx, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + for ( int i = 0; i < hParamMC->num_freq_bands; i++ ) + { + frequency_axis[i] = (float) frequency_axis_fx[i]; + } + + IF( ( error = ivas_dirac_dec_decorr_open_fx( &( hParamMC->h_freq_domain_decorr_ap_params ), &( hParamMC->h_freq_domain_decorr_ap_state ), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis_fx, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) { return error; } - hParamMC->h_output_synthesis_params.use_onset_filters = 0; - hParamMC->max_band_decorr = hParamMC->h_freq_domain_decorr_ap_params->max_band_decorr; - /* init decorrelation */ - IF ( GT_16(hParamMC->max_band_decorr , 0) ) +#else + ivas_dirac_dec_get_frequency_axis( frequency_axis, output_Fs, hParamMC->num_freq_bands ); + if ((error = ivas_dirac_dec_decorr_open(&(hParamMC->h_freq_domain_decorr_ap_params), &(hParamMC->h_freq_domain_decorr_ap_state), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis, nchan_transport, output_Fs)) != IVAS_ERR_OK) { + return error; + } +#endif - len = hParamMC->diff_proto_info->num_protos_diff * hParamMC->h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; + - /* init onsetDetectionPower */ - set_zero_fx( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx, len ); - set_zero_fx( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx, len ); -#if 1/*To be removed later*/ - set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1, len ); - set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2, len ); -#endif - } + hParamMC->h_output_synthesis_params.use_onset_filters = 0; + hParamMC->max_band_decorr = hParamMC->h_freq_domain_decorr_ap_params->max_band_decorr; } hParamMC->max_band_energy_compensation = hParamMC->band_grouping[hParamMC->hMetadataPMC->nbands_coded]; max_param_band_residual = 0; - FOR ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) + for ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) { - IF (LE_16( hParamMC->band_grouping[k] , hParamMC->max_band_decorr) ) + if ( hParamMC->band_grouping[k] <= hParamMC->max_band_decorr ) { max_param_band_residual = k; assert( hParamMC->band_grouping[k] == hParamMC->max_band_decorr ); @@ -1110,362 +954,468 @@ ivas_error ivas_param_mc_dec_reconfig_fx( } } - IF ( NE_16(nchan_transport_old , nchan_transport) || NE_16(num_param_bands_old , hParamMC->hMetadataPMC->num_parameter_bands) ) + /* output synthesis */ +#ifdef IVAS_FLOAT_FIXED + floatToFixed_arrL( proto_matrix, proto_matrix_fx, Q26, MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS ); + if ( ( error = ivas_dirac_dec_output_synthesis_cov_open_fx( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix_fx ) ) != IVAS_ERR_OK ) { - DIRAC_OUTPUT_SYNTHESIS_COV_STATE cov_state_old = hParamMC->h_output_synthesis_cov_state; - DIRAC_OUTPUT_SYNTHESIS_PARAMS params_old = hParamMC->h_output_synthesis_params; + return error; + } + fixedToFloat_arrL( hParamMC->h_output_synthesis_params.proto_matrix_fx, hParamMC->h_output_synthesis_params.proto_matrix, Q26, nchan_transport * nchan_out_cov ); +#else + if ( ( error = ivas_dirac_dec_output_synthesis_cov_open( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, + hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif // IVAS_FLOAT_FIXED - Word32 tmp_buf_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - - set_zero_fx( tmp_buf_fx,MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - - /* output synthesis */ - IF ( ( error = ivas_dirac_dec_output_synthesis_cov_open_fx( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, - hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix_fx ) ) != IVAS_ERR_OK ) - { - return error; - } - - ivas_param_mc_dec_compute_interpolator_fx( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator_fx ); - - ivas_dirac_dec_output_synthesis_cov_init_fx( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); + ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); - /* map old to new parameter banding, only for same number of TCs, needs some more thought for changing number of TCs */ - IF ( NE_16(num_param_bands_old , hParamMC->hMetadataPMC->num_parameter_bands) && EQ_16(nchan_transport_old , nchan_transport) ) + /* Head or external rotation */ + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + { + if ( ( hParamMC->hoa_encoder = (float *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( float ) ) ) == NULL ) { - Word16 new_param_band_idx, source_param_idx; - - FOR ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) - { - FOR ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) - { - /* Cx */ - v_multc_fixed_16( cov_state_old.cx_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, nchan_transport_old * nchan_transport_old ); - v_add_fx( tmp_buf_fx, hParamMC->h_output_synthesis_cov_state.cx_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old_fx[new_param_band_idx], nchan_transport_old * nchan_transport_old ); - /* Cy */ - v_multc_fixed_16( cov_state_old.cy_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, nchan_out_cov * nchan_out_cov ); - v_add_fx( tmp_buf_fx, hParamMC->h_output_synthesis_cov_state.cy_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old_fx[new_param_band_idx], nchan_out_cov * nchan_out_cov ); - /* mixing matrix*/ - v_multc_fixed_16( cov_state_old.mixing_matrix_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, nchan_transport_old * nchan_out_cov ); - v_add_fx( tmp_buf_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[new_param_band_idx], nchan_transport_old * nchan_out_cov ); - } - } - FOR ( new_param_band_idx = 0; new_param_band_idx < max_param_band_residual; new_param_band_idx++ ) - { - FOR ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) - { - /* residual mixing matrix*/ - v_multc_fixed_16( cov_state_old.mixing_matrix_res_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, nchan_out_cov * nchan_out_cov ); - v_add_fx( tmp_buf_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[new_param_band_idx], nchan_out_cov * nchan_out_cov ); - } - } + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - ivas_dirac_dec_output_synthesis_cov_close( ¶ms_old, &cov_state_old ); + compute_hoa_encoder_mtx( st_ivas->hTransSetup.ls_azimuth, st_ivas->hTransSetup.ls_elevation, hParamMC->hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER ); } /*-----------------------------------------------------------------* * memory allocation *-----------------------------------------------------------------*/ - IF ( GT_16(hParamMC->max_band_decorr , 0) && NE_16(nchan_transport_old , nchan_transport) ) + if ( hParamMC->max_band_decorr > 0 ) { -#if 1 /*To be removed later:floating point memory alocations*/ - free( hParamMC->proto_frame_f ); - IF ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) +#ifdef IVAS_FLOAT_FIXED + IF ((hParamMC->proto_frame_f_fx = (Word32 *)malloc(2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof(Word32))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n")); + } + hParamMC->proto_frame_f_len = 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands; + hParamMC->proto_frame_dec_f_len = 2 * nchan_out_cov * hParamMC->num_freq_bands; +#endif + if ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - set_zero( hParamMC->proto_frame_f, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); -#endif - free( hParamMC->proto_frame_f_fx ); - IF ( ( hParamMC->proto_frame_f_fx = (Word32 *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof(Word32) ) ) == NULL ) + + if ( ( hParamMC->proto_frame_dec_f = (float *) malloc( 2 * nchan_out_cov * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - set_zero_fx( hParamMC->proto_frame_f_fx, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); +#ifdef IVAS_FLOAT_FIXED + hParamMC->proto_frame_f_len = 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands; + hParamMC->proto_frame_dec_f_len = 2 * nchan_out_cov * hParamMC->num_freq_bands; + if ((hParamMC->proto_frame_dec_f_fx = (Word32 *)malloc(2 * nchan_out_cov * hParamMC->num_freq_bands * sizeof(Word32))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n")); + } + + if ( ( hParamMC->proto_frame_f_fx = (Word32 *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + +#endif + } + else + { + hParamMC->proto_frame_f = NULL; + hParamMC->proto_frame_dec_f = NULL; + +#ifdef IVAS_FLOAT_FIXED + hParamMC->proto_frame_dec_f_fx = NULL; + hParamMC->proto_frame_f_fx = NULL; +#endif } + ivas_param_mc_dec_init( hParamMC, nchan_transport, nchan_out_cov ); - IF ( NE_16(nchan_transport_old , nchan_transport) ) + if ( hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) { - IF ( NE_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) + int16_t n_cldfb_slots; + + n_cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; + if ( st_ivas->hDecoderConfig->Opt_tsm ) { - Word16 n_cldfb_slots; -#if 1 /*TODO: To be removed later*/ - IF ( hParamMC->Cldfb_RealBuffer_tc != NULL ) - { - free( hParamMC->Cldfb_RealBuffer_tc ); - hParamMC->Cldfb_RealBuffer_tc = NULL; - } - IF ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) - { - free( hParamMC->Cldfb_ImagBuffer_tc ); - hParamMC->Cldfb_ImagBuffer_tc = NULL; - } + n_cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; + } + if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero( hParamMC->Cldfb_RealBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + +#ifdef IVAS_FLOAT_FIXED + hParamMC->sz = n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands; + IF ( ( hParamMC->Cldfb_RealBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set32_fx( hParamMC->Cldfb_RealBuffer_tc_fx, 0, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); #endif - IF ( hParamMC->Cldfb_RealBuffer_tc_fx != NULL ) - { - free( hParamMC->Cldfb_RealBuffer_tc_fx ); - hParamMC->Cldfb_RealBuffer_tc_fx = NULL; - } - IF ( hParamMC->Cldfb_ImagBuffer_tc_fx != NULL ) - { - free( hParamMC->Cldfb_ImagBuffer_tc_fx ); - hParamMC->Cldfb_ImagBuffer_tc_fx = NULL; - } - n_cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; - IF ( st_ivas->hDecoderConfig->Opt_tsm ) - { - n_cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; - } -#if 1/*TODO: To be removed later*/ - IF ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); - } - set_zero( hParamMC->Cldfb_RealBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero( hParamMC->Cldfb_ImagBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); - IF ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); - } - set_zero( hParamMC->Cldfb_ImagBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); +#ifdef IVAS_FLOAT_FIXED + IF ( ( hParamMC->Cldfb_ImagBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set32_fx( hParamMC->Cldfb_ImagBuffer_tc_fx, 0, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); #endif - IF ( ( hParamMC->Cldfb_RealBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof(Word32) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); - } - set_zero_fx( hParamMC->Cldfb_RealBuffer_tc_fx, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); - IF ( ( hParamMC->Cldfb_ImagBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof(Word32) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); - } - set_zero_fx( hParamMC->Cldfb_ImagBuffer_tc_fx, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); - } - ELSE + if ( st_ivas->hTcBuffer == NULL ) { -#if 1/*TODO:To be removed later(floating point memory dealloc)*/ - IF ( hParamMC->Cldfb_RealBuffer_tc != NULL ) - { - free( hParamMC->Cldfb_RealBuffer_tc ); - hParamMC->Cldfb_RealBuffer_tc = NULL; - } - IF ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) - { - free( hParamMC->Cldfb_ImagBuffer_tc ); - hParamMC->Cldfb_ImagBuffer_tc = NULL; - } +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) #endif - IF ( hParamMC->Cldfb_RealBuffer_tc_fx != NULL ) - { - free( hParamMC->Cldfb_RealBuffer_tc_fx ); - hParamMC->Cldfb_RealBuffer_tc_fx = NULL; - } - IF ( hParamMC->Cldfb_ImagBuffer_tc_fx != NULL ) { - free( hParamMC->Cldfb_ImagBuffer_tc_fx ); - hParamMC->Cldfb_ImagBuffer_tc_fx = NULL; + return error; } } } - return error; -} -#endif // IVAS_FLOAT_FIXED + else + { + hParamMC->Cldfb_RealBuffer_tc = NULL; + hParamMC->Cldfb_ImagBuffer_tc = NULL; -ivas_error ivas_param_mc_dec_reconfig( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - int16_t k, nchan_transport; - PARAM_MC_DEC_HANDLE hParamMC; -#ifndef FIX_901_PARAMMC_DEAD_CODE - IVAS_OUTPUT_SETUP hTransportSetup; +#ifdef IVAS_FLOAT_FIXED + hParamMC->Cldfb_RealBuffer_tc_fx = NULL; + hParamMC->Cldfb_ImagBuffer_tc_fx = NULL; #endif - int16_t nchan_out_transport; - int16_t nchan_out_cov; - float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float proto_mtx_norm; - int16_t max_param_band_residual; - uint16_t config_index; - MC_LS_SETUP mc_ls_setup; - float frequency_axis[CLDFB_NO_CHANNELS_MAX]; - int32_t output_Fs, ivas_total_brate; - ivas_error error; - int16_t nchan_transport_old; - int16_t num_param_bands_old; - PARAM_MC_PARAMETER_BAND_MAPPING parameter_band_mapping; - int16_t band_grouping_old[20 + 1]; - - error = IVAS_ERR_OK; - hParamMC = st_ivas->hParamMC; + } - /* save important config information from the previous state */ - nchan_transport_old = st_ivas->nchan_transport; - num_param_bands_old = hParamMC->hMetadataPMC->num_parameter_bands; + hParamMC->subframes_rendered = 0; + hParamMC->slots_rendered = 0; - /*-----------------------------------------------------------------* - * prepare library opening - *-----------------------------------------------------------------*/ + st_ivas->hParamMC = hParamMC; - output_Fs = st_ivas->hDecoderConfig->output_Fs; - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; -#ifndef FIX_901_PARAMMC_DEAD_CODE - hTransportSetup = st_ivas->hTransSetup; + return error; +} #endif - mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); - nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; - if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) - { - nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - } - else - { - nchan_out_cov = nchan_out_transport; - } +/*------------------------------------------------------------------------- + * ivas_param_mc_get_param_band_mapping() + * + * + *-------------------------------------------------------------------------*/ - st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_ls_setup ); +#ifdef IVAS_FLOAT_FIXED +static void ivas_param_mc_get_param_band_mapping( + const Word16 n_target_bands, + const Word16 *target_band_grouping, + const Word16 n_source_bands, + const Word16 *source_band_grouping, + PARAM_MC_PARAMETER_BAND_MAPPING *parameter_band_mapping ) +{ + Word16 target_band_idx; + Word16 source_band_idx = 0; + move16(); + Word16 source_band_cnt_total; + + FOR ( target_band_idx = 0; target_band_idx < n_target_bands; target_band_idx++ ) + { + Word16 upper = target_band_grouping[target_band_idx + 1]; + Word16 lower = target_band_grouping[target_band_idx]; + Word16 source_band_in_target_band_cnt = 0; + Word16 norm_fac_fx = 32767; + source_band_cnt_total = 0; + move16();move16();move16(); + + FOR ( source_band_idx = 0; source_band_idx < n_source_bands; source_band_idx++ ) + { + /* find lowest corresponding source band*/ + IF ( LE_16(source_band_grouping[source_band_idx] , lower) && GE_16(source_band_grouping[source_band_idx + 1] , lower) ) + { + DO + { + Word16 source_bands_in_target_band = sub(s_min( source_band_grouping[source_band_idx + 1], upper ) , s_max( source_band_grouping[source_band_idx], lower )); + IF ( source_bands_in_target_band ) + { + source_band_cnt_total = add(source_band_cnt_total,source_bands_in_target_band); + parameter_band_mapping->source_band_idx[target_band_idx][source_band_in_target_band_cnt] = source_band_idx; + parameter_band_mapping->source_band_factor_fx[target_band_idx][source_band_in_target_band_cnt++] = shl(source_bands_in_target_band,10); /*Q10*/ + move16(); + move16(); + } + source_band_idx++; + } WHILE ( LE_16(source_band_grouping[source_band_idx] , upper) && LT_16(source_band_idx , n_source_bands) ); + BREAK; + } + } + norm_fac_fx = div_s(1, source_band_cnt_total );/*Q15*/ + for ( source_band_idx = 0; source_band_idx < source_band_in_target_band_cnt; source_band_idx++ ) + { + parameter_band_mapping->source_band_factor_fx[target_band_idx][source_band_idx] = shl_sat(mult(parameter_band_mapping->source_band_factor_fx[target_band_idx][source_band_idx],norm_fac_fx)/*Q10*/,5);/*Q15*/ + } + parameter_band_mapping->n_source_bands[target_band_idx] = source_band_in_target_band_cnt; + move16(); + } + return; +} +#else +static void ivas_param_mc_get_param_band_mapping( + const int16_t n_target_bands, + const int16_t *target_band_grouping, + const int16_t n_source_bands, + const int16_t *source_band_grouping, + PARAM_MC_PARAMETER_BAND_MAPPING *parameter_band_mapping ) +{ + int16_t target_band_idx; + int16_t source_band_idx = 0; + int16_t source_band_cnt_total; + + for ( target_band_idx = 0; target_band_idx < n_target_bands; target_band_idx++ ) + { + int16_t upper = target_band_grouping[target_band_idx + 1]; + int16_t lower = target_band_grouping[target_band_idx]; + int16_t source_band_in_target_band_cnt = 0; + float norm_fac = 1.0f; + source_band_cnt_total = 0; + for ( source_band_idx = 0; source_band_idx < n_source_bands; source_band_idx++ ) + { + /* find lowest corresponding source band*/ + if ( source_band_grouping[source_band_idx] <= lower && source_band_grouping[source_band_idx + 1] >= lower ) + { + do + { + int16_t source_bands_in_target_band = min( source_band_grouping[source_band_idx + 1], upper ) - max( source_band_grouping[source_band_idx], lower ); + if ( source_bands_in_target_band ) + { + source_band_cnt_total += source_bands_in_target_band; + parameter_band_mapping->source_band_idx[target_band_idx][source_band_in_target_band_cnt] = source_band_idx; + parameter_band_mapping->source_band_factor[target_band_idx][source_band_in_target_band_cnt++] = (float) source_bands_in_target_band; + } + source_band_idx++; + } while ( source_band_grouping[source_band_idx] <= upper && source_band_idx < n_source_bands ); + break; + } + } + norm_fac = 1.0f / ( (float) source_band_cnt_total ); + for ( source_band_idx = 0; source_band_idx < source_band_in_target_band_cnt; source_band_idx++ ) + { + + parameter_band_mapping->source_band_factor[target_band_idx][source_band_idx] *= norm_fac; + } + parameter_band_mapping->n_source_bands[target_band_idx] = source_band_in_target_band_cnt; + } + + return; +} +#endif // IVAS_FLOAT_FIXED + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_reconfig() + * + * Reconfiguration of ParamMC decoder + *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_param_mc_dec_reconfig_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 k, nchan_transport; + PARAM_MC_DEC_HANDLE hParamMC; +#ifndef FIX_901_PARAMMC_DEAD_CODE + IVAS_OUTPUT_SETUP hTransportSetup; +#endif + Word16 nchan_out_transport; + Word16 nchan_out_cov; + Word32 proto_matrix_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 proto_mtx_norm_fx; + Word16 max_param_band_residual; + UWord16 config_index; + MC_LS_SETUP mc_ls_setup; + Word32 output_Fs, ivas_total_brate; + ivas_error error; + Word16 nchan_transport_old; + Word16 num_param_bands_old; + PARAM_MC_PARAMETER_BAND_MAPPING parameter_band_mapping; + Word16 band_grouping_old[20 + 1]; + + hParamMC = st_ivas->hParamMC; + error = IVAS_ERR_OK; + /* save important config information from the previous state */ + nchan_transport_old = st_ivas->nchan_transport; + num_param_bands_old = hParamMC->hMetadataPMC->num_parameter_bands; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; +#ifndef FIX_901_PARAMMC_DEAD_CODE + hTransportSetup = st_ivas->hTransSetup; +#endif + mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + nchan_out_transport = add(st_ivas->hTransSetup.nchan_out_woLFE , st_ivas->hTransSetup.num_lfe); + + IF ( EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_LS_CONV_COV) || EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) + { + nchan_out_cov = add(st_ivas->hOutSetup.nchan_out_woLFE , st_ivas->hOutSetup.num_lfe); + } + ELSE + { + nchan_out_cov = nchan_out_transport; + } + + st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_ls_setup ); config_index = ivas_param_mc_get_configuration_index( mc_ls_setup, ivas_total_brate ); nchan_transport = st_ivas->nchan_transport; - switch ( nchan_transport ) + SWITCH ( nchan_transport ) { case 4: case 3: st_ivas->nCPE = 2; st_ivas->nSCE = 0; st_ivas->element_mode_init = IVAS_CPE_MDCT; - break; + BREAK; case 2: st_ivas->nCPE = 1; st_ivas->nSCE = 0; st_ivas->element_mode_init = IVAS_CPE_MDCT; - break; + BREAK; } /*-----------------------------------------------------------------* * set input parameters *-----------------------------------------------------------------*/ - - hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hParamMC->num_freq_bands = shr( add( (Word16) Mpy_32_32( output_Fs, INV_CLDFB_BANDWIDTH_Q31 << 1 ), 1 ), 1 ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; #ifndef FIX_901_PARAMMC_DEAD_CODE /* deallocate the full icc map, gets newly allocated in the metadata open function */ - for ( k = 0; k < 2; k++ ) + FOR ( k = 0; k < 2; k++ ) { - if ( hParamMC->hMetadataPMC->icc_map_full[k] != NULL ) + IF ( hParamMC->hMetadataPMC->icc_map_full[k] != NULL ) { free( hParamMC->hMetadataPMC->icc_map_full[k] ); hParamMC->hMetadataPMC->icc_map_full[k] = NULL; } } - #endif - mvs2s( hParamMC->band_grouping, band_grouping_old, hParamMC->hMetadataPMC->num_parameter_bands + 1 ); - + Copy( hParamMC->band_grouping, band_grouping_old, add(hParamMC->hMetadataPMC->num_parameter_bands , 1) ); #ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); #else ivas_param_mc_metadata_open( mc_ls_setup, ivas_total_brate, hParamMC->hMetadataPMC ); #endif - /* Band Grouping */ - if ( hParamMC->hMetadataPMC->num_parameter_bands == 20 ) + IF ( EQ_16(hParamMC->hMetadataPMC->num_parameter_bands , 20) ) { - mvs2s( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); + Copy( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); } - else if ( hParamMC->hMetadataPMC->num_parameter_bands == 14 ) + ELSE IF ( EQ_16(hParamMC->hMetadataPMC->num_parameter_bands , 14) ) { - mvs2s( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); + Copy( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); } - else if ( hParamMC->hMetadataPMC->num_parameter_bands == 10 ) + ELSE IF ( EQ_16(hParamMC->hMetadataPMC->num_parameter_bands , 10) ) { - mvs2s( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); + Copy( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); } - else + ELSE { assert( 0 && "nbands must be 20, 14, or 10!" ); } ivas_param_mc_get_param_band_mapping( hParamMC->hMetadataPMC->num_parameter_bands, hParamMC->band_grouping, num_param_bands_old, band_grouping_old, ¶meter_band_mapping ); - if ( nchan_transport_old != nchan_transport || num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands ) + IF ( NE_16(nchan_transport_old , nchan_transport) || NE_16(num_param_bands_old , hParamMC->hMetadataPMC->num_parameter_bands) ) { - float *ild_q_old = hParamMC->icld_q; - float *icc_q_old = hParamMC->icc_q; - - + Word16 *ild_q_old_fx = hParamMC->icld_q_fx; + Word16 *icc_q_old_fx = hParamMC->icc_q_fx; +#if 1/*To be removed later*/ + free( hParamMC->icc_q ); + free( hParamMC->icld_q ); /* init arrays for the quantized parameters */ - if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) + IF ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - if ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) + IF ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - if ( ( hParamMC->icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof(Word16) ) ) == NULL ) + set_f( hParamMC->icld_q, PARAM_MC_DEFAULT_MIN_ILD, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + set_f( hParamMC->icc_q, 0.0f, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); +#endif + + IF ( ( hParamMC->icc_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof(Word16) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } -#endif // IVAS_FLOAT_FIXED - set_f( hParamMC->icld_q, PARAM_MC_DEFAULT_MIN_ILD, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - set_f( hParamMC->icc_q, 0.0f, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + IF ( ( hParamMC->icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( Word16 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + set16_fx( hParamMC->icld_q_fx, PARAM_MC_DEFAULT_MIN_ILD_FX, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe );/*Q8*/ + set16_fx( hParamMC->icc_q_fx, 0, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe );/*Q15*/ /* map old to new parameter banding, only for same number of TCs, needs some more thought for a changing number of TCs */ - if ( num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands && nchan_transport_old == nchan_transport ) + IF ( NE_16(num_param_bands_old , hParamMC->hMetadataPMC->num_parameter_bands) && EQ_16(nchan_transport_old , nchan_transport) ) { - int16_t new_param_band_idx, param_idx, source_param_idx; - int16_t num_param_lfe; - float *p_icc_new = hParamMC->icc_q; - float *p_ild_new = hParamMC->icld_q; + Word16 new_param_band_idx, param_idx, source_param_idx; + Word16 num_param_lfe; + Word16 *p_icc_new_fx = hParamMC->icc_q_fx; + Word16 *p_ild_new_fx = hParamMC->icld_q_fx; + Word16 p_ild_new_e = 23; + Word16 p_ild_new_tmp; /* ICC */ num_param_lfe = hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; - for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + FOR ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) { - for ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) + FOR ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) { - *p_icc_new = 0.0f; - for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + *p_icc_new_fx = 0; + FOR ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) { - *p_icc_new += icc_q_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx] * num_param_lfe + param_idx] * parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx]; + *p_icc_new_fx = add( *p_icc_new_fx, mult( icc_q_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]* num_param_lfe + param_idx], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx] ) ); /*Q15*/ } - p_icc_new++; + p_icc_new_fx++; } } /* ILD */ num_param_lfe = hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; - for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + FOR ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) { - for ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) + FOR ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) { - *p_ild_new = 0.0f; - for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) - { - *p_ild_new += powf( 10.0f, ild_q_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx] * num_param_lfe + param_idx] / 10.0f ) * parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx]; + *p_ild_new_fx = 0; + FOR ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + { + p_ild_new_tmp = extract_h(BASOP_util_Pow2( L_mult0( 10885/*log2(10)/10*2^15*/, ild_q_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx] * num_param_lfe + param_idx] ), 8, &p_ild_new_e )); + *p_ild_new_fx = add(*p_ild_new_fx,mult(p_ild_new_tmp, parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx] )); } - *p_ild_new = 10.0f * log10f( *p_ild_new ); - p_ild_new++; + *p_ild_new_fx = extract_l(L_shr(Mpy_32_16_1(L_add(BASOP_Util_Log2(*p_ild_new_fx),L_add(16<band_grouping[k] <= PARAM_MC_MAX_BAND_ABS_COV_DEC ) + WHILE ( LE_16(hParamMC->band_grouping[k] , PARAM_MC_MAX_BAND_ABS_COV_DEC) ) { hParamMC->max_param_band_abs_cov = ( k++ ); } @@ -1476,121 +1426,138 @@ ivas_error ivas_param_mc_dec_reconfig( /* prototype signal computation */ - if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + IF ( EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) { - if ( nchan_transport_old != nchan_transport ) + IF ( NE_16(nchan_transport_old , nchan_transport) ) { -#ifdef IVAS_FLOAT_FIXED - if ( st_ivas->hLsSetUpConversion != NULL ) + IF ( st_ivas->hLsSetUpConversion != NULL ) { ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); } - if ( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( st_ivas->hLsSetUpConversion != NULL ) - { - ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); - } - if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + /* convert the ls conv dmx matrix into column order matrix format (nchan_out_cldfb x nchan_out) */ +#if 0/*To be removed later*/ + free( hParamMC->ls_conv_dmx_matrix ); +#endif + free( hParamMC->ls_conv_dmx_matrix_fx ); +#if 0 + IF ( ( hParamMC->ls_conv_dmx_matrix = (float *) malloc( nchan_out_transport * nchan_out_cov * sizeof( float ) ) ) == NULL ) { - return error; + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } #endif - - /* convert the ls conv dmx matrix into column order matrix format (nchan_out_cldfb x nchan_out) */ - free( hParamMC->ls_conv_dmx_matrix ); - if ( ( hParamMC->ls_conv_dmx_matrix = (float *) malloc( nchan_out_transport * nchan_out_cov * sizeof( float ) ) ) == NULL ) + IF ( ( hParamMC->ls_conv_dmx_matrix_fx = (Word32 *) malloc( nchan_out_transport * nchan_out_cov * sizeof(Word32) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - for ( k = 0; k < nchan_out_transport; k++ ) + FOR ( k = 0; k < nchan_out_transport; k++ ) { - mvr2r( st_ivas->hLsSetUpConversion->dmxMtx[k], &hParamMC->ls_conv_dmx_matrix[k * nchan_out_cov], nchan_out_cov ); + Copy32( st_ivas->hLsSetUpConversion->dmxMtx_fx[k], &hParamMC->ls_conv_dmx_matrix_fx[k * nchan_out_cov], nchan_out_cov ); } } /* convert ParamMC parameter bands to SFB */ st_ivas->hLsSetUpConversion->sfbCnt = hParamMC->num_param_bands_synth; - for ( k = 0; k <= hParamMC->num_param_bands_synth; k++ ) + FOR ( k = 0; k <= hParamMC->num_param_bands_synth; k++ ) { st_ivas->hLsSetUpConversion->sfbOffset[k] = PARAM_MC_BAND_TO_MDCT_BAND_RATIO * hParamMC->band_grouping[k]; } - for ( ; k < MAX_SFB + 2; k++ ) + FOR ( ; k < MAX_SFB + 2; k++ ) { st_ivas->hLsSetUpConversion->sfbOffset[k] = 0; } } - if ( nchan_transport_old != nchan_transport ) + IF ( NE_16(nchan_transport_old , nchan_transport) ) { +#if 1 free( hParamMC->proto_matrix_int ); - if ( ( hParamMC->proto_matrix_int = (float *) malloc( nchan_out_transport * nchan_transport * sizeof( float ) ) ) == NULL ) + IF ( ( hParamMC->proto_matrix_int = (float *) malloc( nchan_out_transport * nchan_transport * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - mvr2r( ivas_param_mc_conf[config_index].dmx_fac, hParamMC->proto_matrix_int, nchan_transport * nchan_out_transport ); +#endif + free( hParamMC->proto_matrix_int_fx ); + IF ( ( hParamMC->proto_matrix_int_fx = (Word32 *) malloc( nchan_out_transport * nchan_transport * sizeof(Word32) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + Copy32( ivas_param_mc_conf[config_index].dmx_fac_fx, hParamMC->proto_matrix_int_fx, nchan_transport * nchan_out_transport );/*Q31*/ } - if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + IF ( EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_LS_CONV_COV) || EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) { - matrix_product( hParamMC->ls_conv_dmx_matrix, nchan_out_cov, nchan_out_transport, 0, - ivas_param_mc_conf[config_index].dmx_fac, nchan_out_transport, nchan_transport, 0, - proto_matrix ); + Scale_sig32( hParamMC->ls_conv_dmx_matrix_fx, nchan_out_transport * nchan_out_cov, -4 ); + matrix_product_fx( hParamMC->ls_conv_dmx_matrix_fx, nchan_out_cov, nchan_out_transport, 0, + ivas_param_mc_conf[config_index].dmx_fac_fx, nchan_out_transport, nchan_transport, 0, + proto_matrix_fx /*Q26*/); + Scale_sig32( hParamMC->ls_conv_dmx_matrix_fx, nchan_out_transport * nchan_out_cov, 4 ); - if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + IF ( EQ_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) { - proto_mtx_norm = 1.f; - for ( k = 0; k < nchan_transport * nchan_out_cov; k++ ) + proto_mtx_norm_fx = ONE_IN_Q26; + FOR ( k = 0; k < nchan_transport * nchan_out_cov; k++ ) { - proto_mtx_norm = max( fabsf( proto_mtx_norm ), fabsf( proto_matrix[k] ) ); + proto_mtx_norm_fx = L_max(L_abs( proto_mtx_norm_fx ), L_abs( proto_matrix_fx[k] ) ); } - proto_mtx_norm = 1.f / proto_mtx_norm; + proto_mtx_norm_fx = divide3232(ONE_IN_Q26 , proto_mtx_norm_fx);/*Q15*/ /* transfer flattened proto_matrix to 2D in hLsSetupConversion->dmxMtx */ - for ( k = 0; k < nchan_transport; k++ ) + FOR ( k = 0; k < nchan_transport; k++ ) { - for ( int16_t i = 0; i < nchan_out_cov; i++ ) + FOR ( Word16 i = 0; i < nchan_out_cov; i++ ) { - st_ivas->hLsSetUpConversion->dmxMtx[k][i] = proto_matrix[k * nchan_out_cov + i] * proto_mtx_norm; + st_ivas->hLsSetUpConversion->dmxMtx_fx[k][i] = L_shl(Mpy_32_16_1(proto_matrix_fx[k * nchan_out_cov + i] , (Word16)proto_mtx_norm_fx),4); } } } } - else + ELSE { - mvr2r( ivas_param_mc_conf[config_index].dmx_fac, proto_matrix, nchan_out_transport * nchan_transport ); + Copy32( ivas_param_mc_conf[config_index].dmx_fac_fx, proto_matrix_fx, nchan_out_transport * nchan_transport ); + Scale_sig32( proto_matrix_fx, nchan_out_transport * nchan_transport, -5 ); } - if ( nchan_transport_old != nchan_transport && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + IF ( NE_16(nchan_transport_old , nchan_transport) && NE_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) { - int16_t i; - int16_t len; + Word16 i; + Word16 len; /* close decorrelator */ ivas_dirac_dec_decorr_close( &hParamMC->h_freq_domain_decorr_ap_params, &hParamMC->h_freq_domain_decorr_ap_state ); /* deallocate diffuse prototype info */ - if ( hParamMC->diff_proto_info ) + IF ( hParamMC->diff_proto_info ) { - for ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) +#if 1/*To be removed later*/ + FOR ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) + { + free( hParamMC->diff_proto_info->proto_fac[i] ); + hParamMC->diff_proto_info->proto_fac[i] = NULL; + } + + free( hParamMC->diff_proto_info->proto_fac ); + hParamMC->diff_proto_info->proto_fac = NULL; +#endif + FOR ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) { free( hParamMC->diff_proto_info->source_chan_idx[i] ); hParamMC->diff_proto_info->source_chan_idx[i] = NULL; - free( hParamMC->diff_proto_info->proto_fac[i] ); - hParamMC->diff_proto_info->proto_fac[i] = NULL; + free( hParamMC->diff_proto_info->proto_fac_fx[i] ); + hParamMC->diff_proto_info->proto_fac_fx[i] = NULL; } free( hParamMC->diff_proto_info->source_chan_idx ); hParamMC->diff_proto_info->source_chan_idx = NULL; - free( hParamMC->diff_proto_info->proto_fac ); - hParamMC->diff_proto_info->proto_fac = NULL; + free( hParamMC->diff_proto_info->proto_fac_fx ); + hParamMC->diff_proto_info->proto_fac_fx = NULL; free( hParamMC->diff_proto_info->proto_index_diff ); hParamMC->diff_proto_info->proto_index_diff = NULL; @@ -1603,12 +1570,11 @@ ivas_error ivas_param_mc_dec_reconfig( } hParamMC->num_outputs_diff = nchan_out_cov; - if ( ( hParamMC->diff_proto_info = (PARAM_MC_DIFF_PROTO_INFO *) malloc( sizeof( PARAM_MC_DIFF_PROTO_INFO ) ) ) == NULL ) + IF ( ( hParamMC->diff_proto_info = (PARAM_MC_DIFF_PROTO_INFO *) malloc( sizeof( PARAM_MC_DIFF_PROTO_INFO ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - - if ( ( param_mc_get_diff_proto_info( proto_matrix, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ) ) != IVAS_ERR_OK ) + IF ( ( param_mc_get_diff_proto_info_fx( proto_matrix_fx, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ,Q26) ) != IVAS_ERR_OK ) { return error; } @@ -1617,48 +1583,37 @@ ivas_error ivas_param_mc_dec_reconfig( hParamMC->h_freq_domain_decorr_ap_params = NULL; hParamMC->h_freq_domain_decorr_ap_state = NULL; -#ifdef IVAS_FLOAT_FIXED Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, hParamMC->num_freq_bands ); - FOR( i = 0; i < hParamMC->num_freq_bands; i++ ) - { - frequency_axis[i] = (float) frequency_axis_fx[i]; - } - IF( ( error = ivas_dirac_dec_decorr_open_fx( &( hParamMC->h_freq_domain_decorr_ap_params ), &( hParamMC->h_freq_domain_decorr_ap_state ), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, - hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis_fx, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } -#else - ivas_dirac_dec_get_frequency_axis( frequency_axis, output_Fs, hParamMC->num_freq_bands ); - - if ((error = ivas_dirac_dec_decorr_open(&(hParamMC->h_freq_domain_decorr_ap_params), &(hParamMC->h_freq_domain_decorr_ap_state), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, - hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis, nchan_transport, output_Fs)) != IVAS_ERR_OK) + hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis_fx, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#endif hParamMC->h_output_synthesis_params.use_onset_filters = 0; hParamMC->max_band_decorr = hParamMC->h_freq_domain_decorr_ap_params->max_band_decorr; /* init decorrelation */ - if ( hParamMC->max_band_decorr > 0 ) + IF ( GT_16(hParamMC->max_band_decorr , 0) ) { len = hParamMC->diff_proto_info->num_protos_diff * hParamMC->h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; /* init onsetDetectionPower */ + set_zero_fx( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx, len ); + set_zero_fx( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx, len ); +#if 1/*To be removed later*/ set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1, len ); set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2, len ); +#endif } } hParamMC->max_band_energy_compensation = hParamMC->band_grouping[hParamMC->hMetadataPMC->nbands_coded]; max_param_band_residual = 0; - for ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) + FOR ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) { - if ( hParamMC->band_grouping[k] <= hParamMC->max_band_decorr ) + IF (LE_16( hParamMC->band_grouping[k] , hParamMC->max_band_decorr) ) { max_param_band_residual = k; assert( hParamMC->band_grouping[k] == hParamMC->max_band_decorr ); @@ -1666,1966 +1621,4077 @@ ivas_error ivas_param_mc_dec_reconfig( } } - if ( nchan_transport_old != nchan_transport || num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands ) + IF ( NE_16(nchan_transport_old , nchan_transport) || NE_16(num_param_bands_old , hParamMC->hMetadataPMC->num_parameter_bands) ) { DIRAC_OUTPUT_SYNTHESIS_COV_STATE cov_state_old = hParamMC->h_output_synthesis_cov_state; DIRAC_OUTPUT_SYNTHESIS_PARAMS params_old = hParamMC->h_output_synthesis_params; - float tmp_buf[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - set_zero( tmp_buf, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + Word32 tmp_buf_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + + set_zero_fx( tmp_buf_fx,MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); /* output synthesis */ - if ( ( error = ivas_dirac_dec_output_synthesis_cov_open( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, - hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_dirac_dec_output_synthesis_cov_open_fx( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, + hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix_fx ) ) != IVAS_ERR_OK ) { return error; } - ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); + ivas_param_mc_dec_compute_interpolator_fx( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator_fx ); - ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); + ivas_dirac_dec_output_synthesis_cov_init_fx( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); /* map old to new parameter banding, only for same number of TCs, needs some more thought for changing number of TCs */ - if ( num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands && nchan_transport_old == nchan_transport ) + IF ( NE_16(num_param_bands_old , hParamMC->hMetadataPMC->num_parameter_bands) && EQ_16(nchan_transport_old , nchan_transport) ) { - int16_t new_param_band_idx, source_param_idx; - + Word16 new_param_band_idx, source_param_idx; - for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + FOR ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) { - for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + FOR ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) { /* Cx */ - v_multc( cov_state_old.cx_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_transport_old * nchan_transport_old ); - v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.cx_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old[new_param_band_idx], nchan_transport_old * nchan_transport_old ); + v_multc_fixed_16( cov_state_old.cx_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, nchan_transport_old * nchan_transport_old ); + v_add_fx( tmp_buf_fx, hParamMC->h_output_synthesis_cov_state.cx_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old_fx[new_param_band_idx], nchan_transport_old * nchan_transport_old ); /* Cy */ - v_multc( cov_state_old.cy_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_out_cov * nchan_out_cov ); - v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.cy_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old[new_param_band_idx], nchan_out_cov * nchan_out_cov ); + v_multc_fixed_16( cov_state_old.cy_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, nchan_out_cov * nchan_out_cov ); + v_add_fx( tmp_buf_fx, hParamMC->h_output_synthesis_cov_state.cy_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old_fx[new_param_band_idx], nchan_out_cov * nchan_out_cov ); /* mixing matrix*/ - v_multc( cov_state_old.mixing_matrix_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_transport_old * nchan_out_cov ); - v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[new_param_band_idx], nchan_transport_old * nchan_out_cov ); + v_multc_fixed_16( cov_state_old.mixing_matrix_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, nchan_transport_old * nchan_out_cov ); + v_add_fx( tmp_buf_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[new_param_band_idx], nchan_transport_old * nchan_out_cov ); } } - for ( new_param_band_idx = 0; new_param_band_idx < max_param_band_residual; new_param_band_idx++ ) + FOR ( new_param_band_idx = 0; new_param_band_idx < max_param_band_residual; new_param_band_idx++ ) { - for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + FOR ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) { /* residual mixing matrix*/ - v_multc( cov_state_old.mixing_matrix_res_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_out_cov * nchan_out_cov ); - v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[new_param_band_idx], nchan_out_cov * nchan_out_cov ); + v_multc_fixed_16( cov_state_old.mixing_matrix_res_old_fx[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor_fx[new_param_band_idx][source_param_idx], tmp_buf_fx, nchan_out_cov * nchan_out_cov ); + v_add_fx( tmp_buf_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[new_param_band_idx], nchan_out_cov * nchan_out_cov ); } } } - - ivas_dirac_dec_output_synthesis_cov_close( ¶ms_old, &cov_state_old ); + ivas_dirac_dec_output_synthesis_cov_close_fx( ¶ms_old, &cov_state_old ); } /*-----------------------------------------------------------------* * memory allocation *-----------------------------------------------------------------*/ - if ( hParamMC->max_band_decorr > 0 && nchan_transport_old != nchan_transport ) + IF ( GT_16(hParamMC->max_band_decorr , 0) && NE_16(nchan_transport_old , nchan_transport) ) { +#ifdef IVAS_FLOAT_FIXED /*To be removed later:floating point memory alocations*/ free( hParamMC->proto_frame_f ); - if ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + hParamMC->proto_frame_f_len = 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands; + IF ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } + set_zero( hParamMC->proto_frame_f, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); +#endif + free( hParamMC->proto_frame_f_fx ); + IF ( ( hParamMC->proto_frame_f_fx = (Word32 *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof(Word32) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + set_zero_fx( hParamMC->proto_frame_f_fx, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); } - if ( nchan_transport_old != nchan_transport ) + IF ( NE_16(nchan_transport_old , nchan_transport) ) { - if ( hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + IF ( NE_16(hParamMC->synthesis_conf , PARAM_MC_SYNTH_MONO_STEREO) ) { - int16_t n_cldfb_slots; - - if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) + Word16 n_cldfb_slots; +#if 1 /*TODO: To be removed later*/ + IF ( hParamMC->Cldfb_RealBuffer_tc != NULL ) { free( hParamMC->Cldfb_RealBuffer_tc ); hParamMC->Cldfb_RealBuffer_tc = NULL; } - if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + IF ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) { free( hParamMC->Cldfb_ImagBuffer_tc ); hParamMC->Cldfb_ImagBuffer_tc = NULL; } +#endif + IF ( hParamMC->Cldfb_RealBuffer_tc_fx != NULL ) + { + free( hParamMC->Cldfb_RealBuffer_tc_fx ); + hParamMC->Cldfb_RealBuffer_tc_fx = NULL; + } + IF ( hParamMC->Cldfb_ImagBuffer_tc_fx != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc_fx ); + hParamMC->Cldfb_ImagBuffer_tc_fx = NULL; + } n_cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; - if ( st_ivas->hDecoderConfig->Opt_tsm ) + IF ( st_ivas->hDecoderConfig->Opt_tsm ) { n_cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; } - if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) +#if 1/*TODO: To be removed later*/ + IF ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } set_zero( hParamMC->Cldfb_RealBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); - if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + IF ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } set_zero( hParamMC->Cldfb_ImagBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); +#endif + IF ( ( hParamMC->Cldfb_RealBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof(Word32) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero_fx( hParamMC->Cldfb_RealBuffer_tc_fx, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + + IF ( ( hParamMC->Cldfb_ImagBuffer_tc_fx = (Word32 *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof(Word32) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero_fx( hParamMC->Cldfb_ImagBuffer_tc_fx, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); } - else + ELSE { - if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) +#if 1/*TODO:To be removed later(floating point memory dealloc)*/ + IF ( hParamMC->Cldfb_RealBuffer_tc != NULL ) { free( hParamMC->Cldfb_RealBuffer_tc ); hParamMC->Cldfb_RealBuffer_tc = NULL; } - if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + IF ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) { free( hParamMC->Cldfb_ImagBuffer_tc ); hParamMC->Cldfb_ImagBuffer_tc = NULL; } - } - } +#endif + IF ( hParamMC->Cldfb_RealBuffer_tc_fx != NULL ) + { + free( hParamMC->Cldfb_RealBuffer_tc_fx ); + hParamMC->Cldfb_RealBuffer_tc_fx = NULL; + } + IF ( hParamMC->Cldfb_ImagBuffer_tc_fx != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc_fx ); + hParamMC->Cldfb_ImagBuffer_tc_fx = NULL; + } + } + } return error; } +#else // IVAS_FLOAT_FIXED - -/*------------------------------------------------------------------------- - * param_mc_get_num_cldfb_syntheses() - * - * calculate the necessary number of CLDFB synthesis instances - *------------------------------------------------------------------------*/ - -/*! r: number of cldfb synthesis instances */ -int16_t param_mc_get_num_cldfb_syntheses( - Decoder_Struct *st_ivas /* i : Parametric MC handle */ +ivas_error ivas_param_mc_dec_reconfig( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { - int16_t num_cldfb_syntheses; + int16_t k, nchan_transport; + PARAM_MC_DEC_HANDLE hParamMC; +#ifndef FIX_901_PARAMMC_DEAD_CODE + IVAS_OUTPUT_SETUP hTransportSetup; +#endif + int16_t nchan_out_transport; + int16_t nchan_out_cov; + float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float proto_mtx_norm; + int16_t max_param_band_residual; + uint16_t config_index; + MC_LS_SETUP mc_ls_setup; + float frequency_axis[CLDFB_NO_CHANNELS_MAX]; + int32_t output_Fs, ivas_total_brate; + ivas_error error; + int16_t nchan_transport_old; + int16_t num_param_bands_old; + PARAM_MC_PARAMETER_BAND_MAPPING parameter_band_mapping; + int16_t band_grouping_old[20 + 1]; - num_cldfb_syntheses = 0; + error = IVAS_ERR_OK; + hParamMC = st_ivas->hParamMC; - /* sanity check*/ - if ( st_ivas->hParamMC == NULL ) - { - assert( 0 && "ParamMC handle does not exist!\n" ); - } + /* save important config information from the previous state */ + nchan_transport_old = st_ivas->nchan_transport; + num_param_bands_old = hParamMC->hMetadataPMC->num_parameter_bands; - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; +#ifndef FIX_901_PARAMMC_DEAD_CODE + hTransportSetup = st_ivas->hTransSetup; +#endif + mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - num_cldfb_syntheses = 2; + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; } - else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + else { - num_cldfb_syntheses = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + nchan_out_cov = nchan_out_transport; } - else if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC ) + + st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_ls_setup ); + config_index = ivas_param_mc_get_configuration_index( mc_ls_setup, ivas_total_brate ); + nchan_transport = st_ivas->nchan_transport; + + switch ( nchan_transport ) { - num_cldfb_syntheses = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - } + case 4: + case 3: + st_ivas->nCPE = 2; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; + case 2: + st_ivas->nCPE = 1; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; - return num_cldfb_syntheses; -} + break; + } + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ -/*------------------------------------------------------------------------- - * ivas_param_mc_dec_close() - * - * Close Parametric MC memories - *------------------------------------------------------------------------*/ + hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; -void ivas_param_mc_dec_close( - PARAM_MC_DEC_HANDLE *hParamMC_out /* i/o: Parametric MC decoder handle */ -) -{ - uint16_t i; - PARAM_MC_DEC_HANDLE hParamMC; +#ifndef FIX_901_PARAMMC_DEAD_CODE + /* deallocate the full icc map, gets newly allocated in the metadata open function */ - if ( hParamMC_out == NULL || *hParamMC_out == NULL ) + for ( k = 0; k < 2; k++ ) { - return; + if ( hParamMC->hMetadataPMC->icc_map_full[k] != NULL ) + { + free( hParamMC->hMetadataPMC->icc_map_full[k] ); + hParamMC->hMetadataPMC->icc_map_full[k] = NULL; + } } - hParamMC = *hParamMC_out; +#endif + mvs2s( hParamMC->band_grouping, band_grouping_old, hParamMC->hMetadataPMC->num_parameter_bands + 1 ); - /* close sub-modules */ - ivas_dirac_dec_output_synthesis_cov_close( &hParamMC->h_output_synthesis_params, &hParamMC->h_output_synthesis_cov_state ); +#ifndef FIX_901_PARAMMC_DEAD_CODE + ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); +#else + ivas_param_mc_metadata_open( mc_ls_setup, ivas_total_brate, hParamMC->hMetadataPMC ); +#endif - if ( hParamMC->h_freq_domain_decorr_ap_params != NULL || hParamMC->h_freq_domain_decorr_ap_state != NULL ) + /* Band Grouping */ + if ( hParamMC->hMetadataPMC->num_parameter_bands == 20 ) { - ivas_dirac_dec_decorr_close( &hParamMC->h_freq_domain_decorr_ap_params, &hParamMC->h_freq_domain_decorr_ap_state ); + mvs2s( param_mc_band_grouping_20, hParamMC->band_grouping, 20 + 1 ); } - - /* parameter decoding */ - if ( hParamMC->hMetadataPMC != NULL ) + else if ( hParamMC->hMetadataPMC->num_parameter_bands == 14 ) { -#ifndef FIX_901_PARAMMC_DEAD_CODE - ivas_param_mc_metadata_close( hParamMC->hMetadataPMC ); -#endif - free( hParamMC->hMetadataPMC ); - hParamMC->hMetadataPMC = NULL; + mvs2s( param_mc_band_grouping_14, hParamMC->band_grouping, 14 + 1 ); } - - if ( hParamMC->icc_q != NULL ) + else if ( hParamMC->hMetadataPMC->num_parameter_bands == 10 ) { - free( hParamMC->icc_q ); - hParamMC->icc_q = NULL; + mvs2s( param_mc_band_grouping_10, hParamMC->band_grouping, 10 + 1 ); } - - if ( hParamMC->icld_q != NULL ) + else { - free( hParamMC->icld_q ); - hParamMC->icld_q = NULL; + assert( 0 && "nbands must be 20, 14, or 10!" ); } - /* diffuse prototype info */ - if ( hParamMC->diff_proto_info ) - { - for ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) - { - free( hParamMC->diff_proto_info->source_chan_idx[i] ); - hParamMC->diff_proto_info->source_chan_idx[i] = NULL; + ivas_param_mc_get_param_band_mapping( hParamMC->hMetadataPMC->num_parameter_bands, hParamMC->band_grouping, num_param_bands_old, band_grouping_old, ¶meter_band_mapping ); - free( hParamMC->diff_proto_info->proto_fac[i] ); - hParamMC->diff_proto_info->proto_fac[i] = NULL; - } + if ( nchan_transport_old != nchan_transport || num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands ) + { + float *ild_q_old = hParamMC->icld_q; + float *icc_q_old = hParamMC->icc_q; - free( hParamMC->diff_proto_info->source_chan_idx ); - hParamMC->diff_proto_info->source_chan_idx = NULL; - free( hParamMC->diff_proto_info->proto_fac ); - hParamMC->diff_proto_info->proto_fac = NULL; + /* init arrays for the quantized parameters */ + if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + if ( ( hParamMC->icld_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } +#ifdef IVAS_FLOAT_FIXED + if ( ( hParamMC->icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof(Word16) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } +#endif // IVAS_FLOAT_FIXED + set_f( hParamMC->icld_q, PARAM_MC_DEFAULT_MIN_ILD, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + set_f( hParamMC->icc_q, 0.0f, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); - free( hParamMC->diff_proto_info->proto_index_diff ); - hParamMC->diff_proto_info->proto_index_diff = NULL; + /* map old to new parameter banding, only for same number of TCs, needs some more thought for a changing number of TCs */ + if ( num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands && nchan_transport_old == nchan_transport ) + { + int16_t new_param_band_idx, param_idx, source_param_idx; + int16_t num_param_lfe; + float *p_icc_new = hParamMC->icc_q; + float *p_ild_new = hParamMC->icld_q; - free( hParamMC->diff_proto_info->num_source_chan_diff ); - hParamMC->diff_proto_info->num_source_chan_diff = NULL; + /* ICC */ + num_param_lfe = hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; + for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + { + for ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) + { + *p_icc_new = 0.0f; + for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + { + *p_icc_new += icc_q_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx] * num_param_lfe + param_idx] * parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx]; + } + p_icc_new++; + } + } - free( hParamMC->diff_proto_info ); - hParamMC->diff_proto_info = NULL; + /* ILD */ + num_param_lfe = hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; + for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) + { + for ( param_idx = 0; param_idx < num_param_lfe; param_idx++ ) + { + *p_ild_new = 0.0f; + for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) + { + *p_ild_new += powf( 10.0f, ild_q_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx] * num_param_lfe + param_idx] / 10.0f ) * parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx]; + } + *p_ild_new = 10.0f * log10f( *p_ild_new ); + p_ild_new++; + } + } + } + free( ild_q_old ); + free( icc_q_old ); } - /* States */ - /* free prototype signal buffers */ - if ( hParamMC->proto_frame_f != NULL ) + param_mc_set_num_synth_bands( output_Fs, hParamMC ); + + /* set max parameter band for abs cov */ + k = 0; + while ( hParamMC->band_grouping[k] <= PARAM_MC_MAX_BAND_ABS_COV_DEC ) { - free( hParamMC->proto_frame_f ); - hParamMC->proto_frame_f = NULL; + hParamMC->max_param_band_abs_cov = ( k++ ); } - if ( hParamMC->proto_frame_dec_f != NULL ) - { - free( hParamMC->proto_frame_dec_f ); - hParamMC->proto_frame_dec_f = NULL; - } + /*-----------------------------------------------------------------* + * open sub-modules + *-----------------------------------------------------------------*/ - if ( hParamMC->ls_conv_dmx_matrix != NULL ) + /* prototype signal computation */ + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - free( hParamMC->ls_conv_dmx_matrix ); - hParamMC->ls_conv_dmx_matrix = NULL; + if ( nchan_transport_old != nchan_transport ) + { +#ifdef IVAS_FLOAT_FIXED + if ( st_ivas->hLsSetUpConversion != NULL ) + { + ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); + } + + if ( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#else + if ( st_ivas->hLsSetUpConversion != NULL ) + { + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + } + + if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + + /* convert the ls conv dmx matrix into column order matrix format (nchan_out_cldfb x nchan_out) */ + free( hParamMC->ls_conv_dmx_matrix ); + if ( ( hParamMC->ls_conv_dmx_matrix = (float *) malloc( nchan_out_transport * nchan_out_cov * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + for ( k = 0; k < nchan_out_transport; k++ ) + { + mvr2r( st_ivas->hLsSetUpConversion->dmxMtx[k], &hParamMC->ls_conv_dmx_matrix[k * nchan_out_cov], nchan_out_cov ); + } + } + /* convert ParamMC parameter bands to SFB */ + + st_ivas->hLsSetUpConversion->sfbCnt = hParamMC->num_param_bands_synth; + for ( k = 0; k <= hParamMC->num_param_bands_synth; k++ ) + { + st_ivas->hLsSetUpConversion->sfbOffset[k] = PARAM_MC_BAND_TO_MDCT_BAND_RATIO * hParamMC->band_grouping[k]; + } + for ( ; k < MAX_SFB + 2; k++ ) + { + st_ivas->hLsSetUpConversion->sfbOffset[k] = 0; + } } - if ( hParamMC->proto_matrix_int != NULL ) + if ( nchan_transport_old != nchan_transport ) { free( hParamMC->proto_matrix_int ); - hParamMC->proto_matrix_int = NULL; + if ( ( hParamMC->proto_matrix_int = (float *) malloc( nchan_out_transport * nchan_transport * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + mvr2r( ivas_param_mc_conf[config_index].dmx_fac, hParamMC->proto_matrix_int, nchan_transport * nchan_out_transport ); } - if ( hParamMC->hoa_encoder != NULL ) + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { - free( hParamMC->hoa_encoder ); - hParamMC->hoa_encoder = NULL; - } + matrix_product( hParamMC->ls_conv_dmx_matrix, nchan_out_cov, nchan_out_transport, 0, + ivas_param_mc_conf[config_index].dmx_fac, nchan_out_transport, nchan_transport, 0, + proto_matrix ); - if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) - { - free( hParamMC->Cldfb_RealBuffer_tc ); - hParamMC->Cldfb_RealBuffer_tc = NULL; + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + proto_mtx_norm = 1.f; + for ( k = 0; k < nchan_transport * nchan_out_cov; k++ ) + { + proto_mtx_norm = max( fabsf( proto_mtx_norm ), fabsf( proto_matrix[k] ) ); + } + proto_mtx_norm = 1.f / proto_mtx_norm; + + /* transfer flattened proto_matrix to 2D in hLsSetupConversion->dmxMtx */ + for ( k = 0; k < nchan_transport; k++ ) + { + for ( int16_t i = 0; i < nchan_out_cov; i++ ) + { + st_ivas->hLsSetUpConversion->dmxMtx[k][i] = proto_matrix[k * nchan_out_cov + i] * proto_mtx_norm; + } + } + } } - if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + else { - free( hParamMC->Cldfb_ImagBuffer_tc ); - hParamMC->Cldfb_ImagBuffer_tc = NULL; + mvr2r( ivas_param_mc_conf[config_index].dmx_fac, proto_matrix, nchan_out_transport * nchan_transport ); } - free( *hParamMC_out ); - *hParamMC_out = NULL; + if ( nchan_transport_old != nchan_transport && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + { + int16_t i; + int16_t len; - return; -} + /* close decorrelator */ + ivas_dirac_dec_decorr_close( &hParamMC->h_freq_domain_decorr_ap_params, &hParamMC->h_freq_domain_decorr_ap_state ); + /* deallocate diffuse prototype info */ + if ( hParamMC->diff_proto_info ) + { + for ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) + { + free( hParamMC->diff_proto_info->source_chan_idx[i] ); + hParamMC->diff_proto_info->source_chan_idx[i] = NULL; -/*------------------------------------------------------------------------- - * ivas_param_mc_dec_read_BS() - * - * Read the Parametric MC metadata - *------------------------------------------------------------------------*/ + free( hParamMC->diff_proto_info->proto_fac[i] ); + hParamMC->diff_proto_info->proto_fac[i] = NULL; + } -void ivas_param_mc_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder ParamMC handle */ - int16_t *nb_bits /* o : number of bits written */ -) -{ - int16_t param_frame_idx; - int16_t band_step; - uint16_t bit_buffer[PARAM_MC_MAX_BITS]; - int16_t bits_to_copy; - int16_t bit_pos; - int16_t num_lfe_bands; - int16_t num_param_bands; - int16_t metadata_bit_pos; - int16_t i, j, k; -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t l; -#endif - int16_t icc_map_size; - int16_t icc_map_size_wo_lfe; - int16_t ild_map_size; - int16_t ild_map_size_wo_lfe; - HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC; + free( hParamMC->diff_proto_info->source_chan_idx ); + hParamMC->diff_proto_info->source_chan_idx = NULL; - push_wmops( "param_mc_read_bs" ); + free( hParamMC->diff_proto_info->proto_fac ); + hParamMC->diff_proto_info->proto_fac = NULL; - /* Inits */ - *nb_bits = 0; - hMetadataPMC = hParamMC->hMetadataPMC; - icc_map_size = hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; - icc_map_size_wo_lfe = hMetadataPMC->icc_mapping_conf->icc_map_size_wo_lfe; - ild_map_size = hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; - ild_map_size_wo_lfe = hMetadataPMC->ild_mapping_conf->ild_map_size_wo_lfe; + free( hParamMC->diff_proto_info->proto_index_diff ); + hParamMC->diff_proto_info->proto_index_diff = NULL; - if ( !st->bfi ) - { - metadata_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); - bits_to_copy = (int16_t) min( ivas_total_brate / FRAMES_PER_SEC, PARAM_MC_MAX_BITS ); + free( hParamMC->diff_proto_info->num_source_chan_diff ); + hParamMC->diff_proto_info->num_source_chan_diff = NULL; - /* copy and reverse metadata */ - for ( bit_pos = 0; bit_pos < bits_to_copy; bit_pos++ ) - { - bit_buffer[bit_pos] = st->bit_stream[metadata_bit_pos--]; + free( hParamMC->diff_proto_info ); + hParamMC->diff_proto_info = NULL; } - bit_pos = 0; - - /* read reserved bit */ - hMetadataPMC->lfe_on = bit_buffer[bit_pos++]; - - /* get coded bwidth */ + hParamMC->num_outputs_diff = nchan_out_cov; + if ( ( hParamMC->diff_proto_info = (PARAM_MC_DIFF_PROTO_INFO *) malloc( sizeof( PARAM_MC_DIFF_PROTO_INFO ) ) ) == NULL ) { - int16_t pos; - int16_t bw = 0; - for ( pos = 0; pos < 2; pos++ ) - { - bw += ( bit_buffer[bit_pos++] << pos ); - } - hMetadataPMC->coded_bwidth = bw; + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - /* set tables if coded band width differs from last frame */ - if ( hMetadataPMC->coded_bwidth != hMetadataPMC->last_coded_bwidth ) + if ( ( param_mc_get_diff_proto_info( proto_matrix, nchan_transport, nchan_out_cov, hParamMC->diff_proto_info ) ) != IVAS_ERR_OK ) { - ivas_param_mc_set_coded_bands( hMetadataPMC ); - param_mc_set_num_synth_bands( st->output_Fs, hParamMC ); - hParamMC->max_band_energy_compensation = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; + return error; } - param_frame_idx = bit_buffer[bit_pos++]; - hMetadataPMC->param_frame_idx = param_frame_idx; - num_param_bands = hMetadataPMC->nbands_in_param_frame[param_frame_idx]; + /* decorrelation */ + hParamMC->h_freq_domain_decorr_ap_params = NULL; + hParamMC->h_freq_domain_decorr_ap_state = NULL; - hMetadataPMC->bAttackPresent = bit_buffer[bit_pos++]; - hMetadataPMC->attackIndex = 0; - band_step = 1; - num_lfe_bands = 0; +#ifdef IVAS_FLOAT_FIXED + Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; + ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, hParamMC->num_freq_bands ); - if ( hMetadataPMC->bAttackPresent ) + FOR( i = 0; i < hParamMC->num_freq_bands; i++ ) { - for ( i = 2; i >= 0; i-- ) - { - hMetadataPMC->attackIndex += ( bit_buffer[bit_pos++] << i ); - } - - band_step = PARAM_MC_TRANSIENT_BAND_STEP; - num_lfe_bands = PARAM_MC_MAX_BAND_LFE / band_step + ( PARAM_MC_MAX_BAND_LFE % band_step ) ? 1 : 0; - num_param_bands = hMetadataPMC->nbands_coded / band_step + ( ( hMetadataPMC->nbands_coded % band_step ) ? 1 : 0 ); + frequency_axis[i] = (float) frequency_axis_fx[i]; } - else + + IF( ( error = ivas_dirac_dec_decorr_open_fx( &( hParamMC->h_freq_domain_decorr_ap_params ), &( hParamMC->h_freq_domain_decorr_ap_state ), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis_fx, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) { - for ( j = 0; j < PARAM_MC_MAX_BAND_LFE; j += band_step ) - { - if ( param_frame_idx == hMetadataPMC->coding_band_mapping[j] ) - { - /* LFE ICC is always the last ICC in coding band 0 */ - num_lfe_bands++; - } - } + return error; } +#else + ivas_dirac_dec_get_frequency_axis( frequency_axis, output_Fs, hParamMC->num_freq_bands ); - if ( !hMetadataPMC->lfe_on ) + if ((error = ivas_dirac_dec_decorr_open(&(hParamMC->h_freq_domain_decorr_ap_params), &(hParamMC->h_freq_domain_decorr_ap_state), hParamMC->num_freq_bands, hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, DIRAC_SYNTHESIS_COV_MC_LS, frequency_axis, nchan_transport, output_Fs)) != IVAS_ERR_OK) { - num_lfe_bands = 0; + return error; } - -#ifndef FIX_901_PARAMMC_DEAD_CODE - if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 ) +#endif + hParamMC->h_output_synthesis_params.use_onset_filters = 0; + hParamMC->max_band_decorr = hParamMC->h_freq_domain_decorr_ap_params->max_band_decorr; + /* init decorrelation */ + if ( hParamMC->max_band_decorr > 0 ) { - int16_t icc_mapping_index[PARAM_MC_SZ_ICC_MAP]; - k = 0; - for ( i = 0; i < hMetadataPMC->icc_map_size_full - 1; i++ ) - { - if ( bit_buffer[bit_pos++] == 1 ) - { - icc_mapping_index[k++] = i; - } - } + len = hParamMC->diff_proto_info->num_protos_diff * hParamMC->h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; - /* last one is always C/LFE */ - icc_mapping_index[k] = hMetadataPMC->icc_map_size_full - 1; + /* init onsetDetectionPower */ + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1, len ); + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2, len ); + } + } + hParamMC->max_band_energy_compensation = hParamMC->band_grouping[hParamMC->hMetadataPMC->nbands_coded]; + max_param_band_residual = 0; - /* save icc mapping of the previous frame*/ - /* build icc map for the current frame */ - for ( k = 0; k < icc_map_size; k++ ) - { - hMetadataPMC->icc_mapping[param_frame_idx][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; - hMetadataPMC->icc_mapping[param_frame_idx][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; - } + for ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) + { + if ( hParamMC->band_grouping[k] <= hParamMC->max_band_decorr ) + { + max_param_band_residual = k; + assert( hParamMC->band_grouping[k] == hParamMC->max_band_decorr ); + break; + } + } - if ( hMetadataPMC->bAttackPresent ) + if ( nchan_transport_old != nchan_transport || num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands ) + { + DIRAC_OUTPUT_SYNTHESIS_COV_STATE cov_state_old = hParamMC->h_output_synthesis_cov_state; + DIRAC_OUTPUT_SYNTHESIS_PARAMS params_old = hParamMC->h_output_synthesis_params; + float tmp_buf[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + + set_zero( tmp_buf, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + + /* output synthesis */ + if ( ( error = ivas_dirac_dec_output_synthesis_cov_open( &( hParamMC->h_output_synthesis_params ), &( hParamMC->h_output_synthesis_cov_state ), hParamMC->max_band_decorr, PARAM_MC_MAX_NSLOTS, + hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual, nchan_transport, nchan_out_cov, proto_matrix ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); + + ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); + + /* map old to new parameter banding, only for same number of TCs, needs some more thought for changing number of TCs */ + if ( num_param_bands_old != hParamMC->hMetadataPMC->num_parameter_bands && nchan_transport_old == nchan_transport ) + { + int16_t new_param_band_idx, source_param_idx; + + + for ( new_param_band_idx = 0; new_param_band_idx < hParamMC->hMetadataPMC->num_parameter_bands; new_param_band_idx++ ) { - for ( k = 0; k < icc_map_size; k++ ) + for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) { - for ( l = 0; l < PARAM_MC_PARAMETER_FRAMES; l++ ) - { - hMetadataPMC->icc_mapping[l][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; - hMetadataPMC->icc_mapping[l][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; - } + /* Cx */ + v_multc( cov_state_old.cx_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_transport_old * nchan_transport_old ); + v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.cx_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cx_old[new_param_band_idx], nchan_transport_old * nchan_transport_old ); + /* Cy */ + v_multc( cov_state_old.cy_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_out_cov * nchan_out_cov ); + v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.cy_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.cy_old[new_param_band_idx], nchan_out_cov * nchan_out_cov ); + /* mixing matrix*/ + v_multc( cov_state_old.mixing_matrix_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_transport_old * nchan_out_cov ); + v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[new_param_band_idx], nchan_transport_old * nchan_out_cov ); } } - else + for ( new_param_band_idx = 0; new_param_band_idx < max_param_band_residual; new_param_band_idx++ ) { - for ( k = 0; k < icc_map_size; k++ ) + for ( source_param_idx = 0; source_param_idx < parameter_band_mapping.n_source_bands[new_param_band_idx]; source_param_idx++ ) { - hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; - hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; + /* residual mixing matrix*/ + v_multc( cov_state_old.mixing_matrix_res_old[parameter_band_mapping.source_band_idx[new_param_band_idx][source_param_idx]], parameter_band_mapping.source_band_factor[new_param_band_idx][source_param_idx], tmp_buf, nchan_out_cov * nchan_out_cov ); + v_add( tmp_buf, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[new_param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[new_param_band_idx], nchan_out_cov * nchan_out_cov ); } } } - else + +#ifdef IVAS_FLOAT_FIXED + ivas_dirac_dec_output_synthesis_cov_close_fx( ¶ms_old, &cov_state_old ); +#else + ivas_dirac_dec_output_synthesis_cov_close( ¶ms_old, &cov_state_old ); +#endif + } + + /*-----------------------------------------------------------------* + * memory allocation + *-----------------------------------------------------------------*/ + + if ( hParamMC->max_band_decorr > 0 && nchan_transport_old != nchan_transport ) + { + free( hParamMC->proto_frame_f ); + if ( ( hParamMC->proto_frame_f = (float *) malloc( 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) { - if ( hMetadataPMC->bAttackPresent ) + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); + } + set_zero( hParamMC->proto_frame_f, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); + +#ifdef IVAS_FLOAT_FIXED + free(hParamMC->proto_frame_f_fx); + hParamMC->proto_frame_f_len = 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands; + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n")); + } + + set_zero_fx(hParamMC->proto_frame_f_fx, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands); +#endif + } + + + if ( nchan_transport_old != nchan_transport ) + { + if ( hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + { + int16_t n_cldfb_slots; + + if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) { - for ( l = 0; l < PARAM_MC_PARAMETER_FRAMES; l++ ) - { - ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[param_frame_idx] ); - } + free( hParamMC->Cldfb_RealBuffer_tc ); + hParamMC->Cldfb_RealBuffer_tc = NULL; } - else + if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) { - ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx] ); + free( hParamMC->Cldfb_ImagBuffer_tc ); + hParamMC->Cldfb_ImagBuffer_tc = NULL; } - } -#endif - ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->icc_coding, - icc_map_size_wo_lfe, icc_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icc_q ); - if ( !st->BER_detect ) - { - ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->ild_coding, - ild_map_size_wo_lfe, ild_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icld_q ); + n_cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + n_cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; + } + if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero( hParamMC->Cldfb_RealBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + + if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero( hParamMC->Cldfb_ImagBuffer_tc, n_cldfb_slots * nchan_transport * hParamMC->num_freq_bands ); + } - /* set LFE ILD and ICC to zero above PARAM_MC_MAX_BAND_LFE for attack frames */ - if ( hMetadataPMC->bAttackPresent ) + else { - for ( k = PARAM_MC_MAX_BAND_LFE; k < band_step * num_lfe_bands; k++ ) + if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) { - hParamMC->icc_q[( k + 1 ) * icc_map_size - 1] = 1.0f; - hParamMC->icld_q[( k + 1 ) * ild_map_size - 1] = PARAM_MC_DEFAULT_MIN_ILD; + free( hParamMC->Cldfb_RealBuffer_tc ); + hParamMC->Cldfb_RealBuffer_tc = NULL; + } + if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc ); + hParamMC->Cldfb_ImagBuffer_tc = NULL; } + } + } + return error; +} +#endif - *nb_bits = bit_pos; +/*------------------------------------------------------------------------- + * param_mc_get_num_cldfb_syntheses() + * + * calculate the necessary number of CLDFB synthesis instances + *------------------------------------------------------------------------*/ - } /* if ( !st->bfi ) */ +/*! r: number of cldfb synthesis instances */ +int16_t param_mc_get_num_cldfb_syntheses( + Decoder_Struct *st_ivas /* i : Parametric MC handle */ +) +{ + int16_t num_cldfb_syntheses; - if ( st->bfi ) + num_cldfb_syntheses = 0; + + /* sanity check*/ + if ( st_ivas->hParamMC == NULL ) { - /* for PLC, use the saved ILDs and ICCs from the past and set the transient flag and transient position to zero */ - hMetadataPMC->bAttackPresent = 0; - hMetadataPMC->attackIndex = 0; + assert( 0 && "ParamMC handle does not exist!\n" ); } - pop_wmops(); + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + num_cldfb_syntheses = 2; + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + num_cldfb_syntheses = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + } + else if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC ) + { + num_cldfb_syntheses = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } - return; + return num_cldfb_syntheses; } /*------------------------------------------------------------------------- - * ivas_param_mc_dec_digest_tc() - * + * ivas_param_mc_dec_close() * + * Close Parametric MC memories *------------------------------------------------------------------------*/ - -void ivas_param_mc_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +#ifdef IVAS_FLOAT_FIXED +void ivas_param_mc_dec_close_fx( + PARAM_MC_DEC_HANDLE *hParamMC_out /* i/o: Parametric MC decoder handle */ ) { + UWord16 i; PARAM_MC_DEC_HANDLE hParamMC; - int16_t i, ch; - int16_t slot_idx, param_band_idx; - int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; - int16_t nchan_out_cov; - /*CLDFB*/ - float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float real_part, imag_part; - /* format converter */ - int16_t channel_active[MAX_OUTPUT_CHANNELS]; - IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; - hParamMC = st_ivas->hParamMC; - assert( hParamMC ); + IF( hParamMC_out == NULL || *hParamMC_out == NULL ) + { + return; + } - push_wmops( "param_mc_dec_digest_tc" ); + hParamMC = *hParamMC_out; - set_s( channel_active, 0, MAX_CICP_CHANNELS ); - nchan_transport = st_ivas->nchan_transport; - nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + /* close sub-modules */ + ivas_dirac_dec_output_synthesis_cov_close_fx( &hParamMC->h_output_synthesis_params, &hParamMC->h_output_synthesis_cov_state ); - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + IF( hParamMC->h_freq_domain_decorr_ap_params != NULL || hParamMC->h_freq_domain_decorr_ap_state != NULL ) { - nchan_out_cldfb = BINAURAL_CHANNELS; - set_s( channel_active, 1, nchan_out_cldfb ); - nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; - hSynthesisOutputSetup = &st_ivas->hTransSetup; + ivas_dirac_dec_decorr_close( &hParamMC->h_freq_domain_decorr_ap_params, &hParamMC->h_freq_domain_decorr_ap_state ); } - else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + + /* parameter decoding */ + IF( hParamMC->hMetadataPMC != NULL ) { - nchan_out_cov = nchan_out_transport; - nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - hSynthesisOutputSetup = &st_ivas->hTransSetup; - } - else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) - { - nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - nchan_out_cldfb = nchan_out_cov; - set_s( channel_active, 1, nchan_out_cov ); - hSynthesisOutputSetup = &st_ivas->hOutSetup; - } - else - { - nchan_out_cov = nchan_out_transport; - nchan_out_cldfb = nchan_out_transport; - set_s( channel_active, 1, nchan_out_cov ); - hSynthesisOutputSetup = &st_ivas->hTransSetup; +#ifndef FIX_901_PARAMMC_DEAD_CODE + ivas_param_mc_metadata_close( hParamMC->hMetadataPMC ); +#endif + free( hParamMC->hMetadataPMC ); + hParamMC->hMetadataPMC = NULL; } - - /* adapt transient position */ - if ( hParamMC->hMetadataPMC->bAttackPresent ) + IF( hParamMC->icc_q_fx != NULL ) { - hParamMC->hMetadataPMC->attackIndex = (int16_t) max( 0, hParamMC->hMetadataPMC->attackIndex + ( ( nCldfbSlots - DEFAULT_JBM_CLDFB_TIMESLOTS ) / 2 ) ); + free( hParamMC->icc_q_fx ); + hParamMC->icc_q_fx = NULL; } - /* adapt subframes */ - hParamMC->num_slots = nCldfbSlots; - hParamMC->slots_rendered = 0; - hParamMC->subframes_rendered = 0; - ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); - st_ivas->hTcBuffer->nb_subframes = hParamMC->nb_subframes; - mvs2s( hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hParamMC->nb_subframes ); - - ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); - for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) + IF( hParamMC->icld_q_fx != NULL ) { - set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); - set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + free( hParamMC->icld_q_fx ); + hParamMC->icld_q_fx = NULL; } - - /* slot loop for gathering the input data */ - for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + /* diffuse prototype info */ + IF( hParamMC->diff_proto_info ) { - if ( st_ivas->hDecoderConfig->Opt_tsm ) + FOR( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) { - float RealBuffer[CLDFB_NO_CHANNELS_MAX]; - float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; - - /* CLDFB Analysis*/ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - cldfbAnalysis_ts_ivas( &( transport_channels_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + free( hParamMC->diff_proto_info->source_chan_idx[i] ); + hParamMC->diff_proto_info->source_chan_idx[i] = NULL; - mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); - mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); - } + free( hParamMC->diff_proto_info->proto_fac_fx[i] ); + hParamMC->diff_proto_info->proto_fac_fx[i] = NULL; } - if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED /*TODO: To be removed later(Floating point memory dealloc)------------------------------- */ + FOR( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) { -#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; - } + free( hParamMC->diff_proto_info->proto_fac[i] ); + hParamMC->diff_proto_info->proto_fac[i] = NULL; + } - 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 ); + free( hParamMC->diff_proto_info->proto_fac ); + hParamMC->diff_proto_info->proto_fac = NULL; +#endif /***********************************ends here************************************************/ + free( hParamMC->diff_proto_info->source_chan_idx ); + hParamMC->diff_proto_info->source_chan_idx = NULL; - 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 ); - } - } + free( hParamMC->diff_proto_info->proto_fac_fx ); + hParamMC->diff_proto_info->proto_fac_fx = NULL; - 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; + free( hParamMC->diff_proto_info->proto_index_diff ); + hParamMC->diff_proto_info->proto_index_diff = NULL; - 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 ); - } - } + free( hParamMC->diff_proto_info->num_source_chan_diff ); + hParamMC->diff_proto_info->num_source_chan_diff = NULL; - 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; + free( hParamMC->diff_proto_info ); + hParamMC->diff_proto_info = NULL; + } + /* States */ + /* free prototype signal buffers */ + IF( hParamMC->proto_frame_f_fx != NULL ) + { + free( hParamMC->proto_frame_f_fx ); + hParamMC->proto_frame_f_fx = NULL; + } - 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 ); + IF( hParamMC->proto_frame_dec_f_fx != NULL ) + { + free( hParamMC->proto_frame_dec_f_fx); + hParamMC->proto_frame_dec_f_fx = NULL; + } - 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 - } + IF( hParamMC->ls_conv_dmx_matrix_fx != NULL ) + { + free( hParamMC->ls_conv_dmx_matrix_fx ); + hParamMC->ls_conv_dmx_matrix_fx = NULL; } - /* map from complex input covariance to real values */ - for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + IF( hParamMC->proto_matrix_int_fx != NULL ) { - /* Cx for transport channels */ - for ( i = 0; i < nchan_transport * nchan_transport; i++ ) - { - real_part = cx[param_band_idx][i]; - imag_part = cx_imag[param_band_idx][i]; + free( hParamMC->proto_matrix_int_fx ); + hParamMC->proto_matrix_int_fx = NULL; + } - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ - if ( param_band_idx < hParamMC->max_param_band_abs_cov ) - { - cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); - } - else - { - cx[param_band_idx][i] = real_part; - } - } + IF( hParamMC->hoa_encoder_fx != NULL ) + { + free( hParamMC->hoa_encoder_fx ); + hParamMC->hoa_encoder_fx = NULL; } + IF( hParamMC->Cldfb_RealBuffer_tc_fx != NULL ) + { + free( hParamMC->Cldfb_RealBuffer_tc_fx ); + hParamMC->Cldfb_RealBuffer_tc_fx = NULL; + } + IF( hParamMC->Cldfb_ImagBuffer_tc_fx != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc_fx ); + hParamMC->Cldfb_ImagBuffer_tc_fx = NULL; + } +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED /*TODO: To be removed later(Floating point memory dealloc)------------------------------- */ - /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ - if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) ) + IF( hParamMC->proto_matrix_int != NULL ) { - for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) - { - v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport ); - mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport ); - } + free( hParamMC->proto_matrix_int ); + hParamMC->proto_matrix_int = NULL; } + IF( hParamMC->icc_q != NULL ) + { + free( hParamMC->icc_q ); + hParamMC->icc_q = NULL; + } - if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + IF( hParamMC->icld_q != NULL ) { - ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); + free( hParamMC->icld_q ); + hParamMC->icld_q = NULL; } - else + IF( hParamMC->proto_frame_f != NULL ) { - /* generate mixing matrices */ - ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); + free( hParamMC->proto_frame_f ); + hParamMC->proto_frame_f = NULL; + } + IF( hParamMC->proto_frame_dec_f != NULL ) + { + free( hParamMC->proto_frame_dec_f ); + hParamMC->proto_frame_dec_f = NULL; + } + //IF( hParamMC->ls_conv_dmx_matrix != NULL ) + //{ + // free( hParamMC->ls_conv_dmx_matrix ); + // hParamMC->ls_conv_dmx_matrix = NULL; + //} + IF( hParamMC->hoa_encoder != NULL ) + { + free( hParamMC->hoa_encoder ); + hParamMC->hoa_encoder = NULL; + } + IF( hParamMC->Cldfb_RealBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_RealBuffer_tc ); + hParamMC->Cldfb_RealBuffer_tc = NULL; + } + IF( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc ); + hParamMC->Cldfb_ImagBuffer_tc = NULL; } +#endif /***********************************ends here************************************************/ - pop_wmops(); + free( *hParamMC_out ); + *hParamMC_out = NULL; return; } - - -/*------------------------------------------------------------------------- - * ivas_param_mc_dec() - * - * Parametric MC decoding process - *------------------------------------------------------------------------*/ - -void ivas_param_mc_dec_render( - 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 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ +#else +void ivas_param_mc_dec_close( + PARAM_MC_DEC_HANDLE *hParamMC_out /* i/o: Parametric MC decoder handle */ ) { + uint16_t i; PARAM_MC_DEC_HANDLE hParamMC; - int16_t i, ch; - int16_t subframe_idx; - int16_t slot_idx, slot_idx_start, slot_idx_start_cldfb_synth, first_sf, last_sf, slots_to_render; - int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; - int16_t nchan_out_cov; - /*CLDFB*/ - float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#ifdef IVAS_FLOAT_FIXED - Word32 Cldfb_RealBuffer_fx[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_fx[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#endif - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - /*Decorrelator*/ - float onset_filter[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; - /* format converter */ - int16_t channel_active[MAX_OUTPUT_CHANNELS]; - uint16_t nband_synth, nbands_to_zero; - uint16_t nchan_out_init; - uint32_t output_Fs; - hParamMC = st_ivas->hParamMC; - assert( hParamMC ); + if ( hParamMC_out == NULL || *hParamMC_out == NULL ) + { + return; + } - push_wmops( "param_mc_dec_render" ); + hParamMC = *hParamMC_out; - set_s( channel_active, 0, MAX_CICP_CHANNELS ); - nchan_transport = st_ivas->nchan_transport; - nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; - nchan_out_init = nchan_out_transport; - output_Fs = st_ivas->hDecoderConfig->output_Fs; + /* close sub-modules */ + ivas_dirac_dec_output_synthesis_cov_close( &hParamMC->h_output_synthesis_params, &hParamMC->h_output_synthesis_cov_state ); - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + if ( hParamMC->h_freq_domain_decorr_ap_params != NULL || hParamMC->h_freq_domain_decorr_ap_state != NULL ) { - nchan_out_cldfb = BINAURAL_CHANNELS; - set_s( channel_active, 1, nchan_out_cldfb ); - if ( st_ivas->hCombinedOrientationData ) - { - nchan_out_init = MAX_INTERN_CHANNELS; - } - nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + ivas_dirac_dec_decorr_close( &hParamMC->h_freq_domain_decorr_ap_params, &hParamMC->h_freq_domain_decorr_ap_state ); } - else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + + /* parameter decoding */ + if ( hParamMC->hMetadataPMC != NULL ) { - nchan_out_cov = nchan_out_transport; - nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; +#ifndef FIX_901_PARAMMC_DEAD_CODE + ivas_param_mc_metadata_close( hParamMC->hMetadataPMC ); +#endif + free( hParamMC->hMetadataPMC ); + hParamMC->hMetadataPMC = NULL; } - else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + + if ( hParamMC->icc_q != NULL ) { - nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - nchan_out_cldfb = nchan_out_cov; - set_s( channel_active, 1, nchan_out_cov ); + free( hParamMC->icc_q ); + hParamMC->icc_q = NULL; } - else + + if ( hParamMC->icld_q != NULL ) { - nchan_out_cov = nchan_out_transport; - nchan_out_cldfb = nchan_out_transport; - set_s( channel_active, 1, nchan_out_cov ); + free( hParamMC->icld_q ); + hParamMC->icld_q = NULL; } - /* set everything to zero that will not be decoded */ - nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; - nbands_to_zero = hParamMC->num_freq_bands - nband_synth; - for ( ch = 0; ch < nchan_out_init; ch++ ) + /* diffuse prototype info */ + if ( hParamMC->diff_proto_info ) { - for ( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ ) + for ( i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) { - set_zero( &( Cldfb_RealBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); - set_zero( &( Cldfb_ImagBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); -#ifdef IVAS_FLOAT_FIXED - set32_fx(&(Cldfb_RealBuffer_fx[ch][slot_idx][nband_synth]), 0,nbands_to_zero); - set32_fx(&(Cldfb_ImagBuffer_fx[ch][slot_idx][nband_synth]), 0,nbands_to_zero); -#endif + free( hParamMC->diff_proto_info->source_chan_idx[i] ); + hParamMC->diff_proto_info->source_chan_idx[i] = NULL; + + free( hParamMC->diff_proto_info->proto_fac[i] ); + hParamMC->diff_proto_info->proto_fac[i] = NULL; } + + free( hParamMC->diff_proto_info->source_chan_idx ); + hParamMC->diff_proto_info->source_chan_idx = NULL; + + free( hParamMC->diff_proto_info->proto_fac ); + hParamMC->diff_proto_info->proto_fac = NULL; + + free( hParamMC->diff_proto_info->proto_index_diff ); + hParamMC->diff_proto_info->proto_index_diff = NULL; + + free( hParamMC->diff_proto_info->num_source_chan_diff ); + hParamMC->diff_proto_info->num_source_chan_diff = NULL; + + free( hParamMC->diff_proto_info ); + hParamMC->diff_proto_info = NULL; } - /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - slots_to_render = min( hParamMC->num_slots - hParamMC->slots_rendered, nSamplesAsked / NS2SA( output_Fs, CLDFB_SLOT_NS ) ); - *nSamplesRendered = slots_to_render * NS2SA( output_Fs, CLDFB_SLOT_NS ); - first_sf = hParamMC->subframes_rendered; - last_sf = first_sf; - while ( slots_to_render > 0 ) + /* States */ + /* free prototype signal buffers */ + if ( hParamMC->proto_frame_f != NULL ) { - slots_to_render -= hParamMC->subframe_nbslots[last_sf]; - last_sf++; + free( hParamMC->proto_frame_f ); + hParamMC->proto_frame_f = NULL; } - if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + + if ( hParamMC->proto_frame_dec_f != NULL ) { - for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) - { - slots_to_render += hParamMC->subframe_nbslots[subframe_idx]; - } + free( hParamMC->proto_frame_dec_f ); + hParamMC->proto_frame_dec_f = NULL; } - slot_idx_start = hParamMC->slots_rendered; - slot_idx_start_cldfb_synth = 0; - for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + + if ( hParamMC->ls_conv_dmx_matrix != NULL ) { - for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots[subframe_idx]; slot_idx++, hParamMC->slots_rendered++ ) - { + free( hParamMC->ls_conv_dmx_matrix ); + hParamMC->ls_conv_dmx_matrix = NULL; + } - if ( hParamMC->max_band_decorr > 0 ) - { - /*-----------------------------------------------------------------* - * protoype signal computation - *-----------------------------------------------------------------*/ + if ( hParamMC->proto_matrix_int != NULL ) + { + free( hParamMC->proto_matrix_int ); + hParamMC->proto_matrix_int = NULL; + } - param_mc_protoSignalComputation( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], - &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], - hParamMC->proto_frame_f, hParamMC->diff_proto_info, - hParamMC->num_freq_bands ); + if ( hParamMC->hoa_encoder != NULL ) + { + free( hParamMC->hoa_encoder ); + hParamMC->hoa_encoder = NULL; + } - /*-----------------------------------------------------------------* - * frequency domain decorrelation - *-----------------------------------------------------------------*/ + if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_RealBuffer_tc ); + hParamMC->Cldfb_RealBuffer_tc = NULL; + } + if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc ); + hParamMC->Cldfb_ImagBuffer_tc = NULL; + } - /* decorrelate prototype frame */ - ivas_dirac_dec_decorr_process( hParamMC->num_freq_bands, - hParamMC->num_outputs_diff, - hParamMC->diff_proto_info->num_protos_diff, - DIRAC_SYNTHESIS_COV_MC_LS, - nchan_transport, - hParamMC->proto_frame_f, - hParamMC->diff_proto_info->num_protos_diff, - hParamMC->diff_proto_info->proto_index_diff, - hParamMC->proto_frame_dec_f,//output - onset_filter, - hParamMC->h_freq_domain_decorr_ap_params, - hParamMC->h_freq_domain_decorr_ap_state ); + free( *hParamMC_out ); + *hParamMC_out = NULL; - /* copy decorrelated frame directly to output CLDFB buffer, acts also as intermediate */ - /* memory for the decorrelated signal */ -#ifdef IVAS_FLOAT_FIXED - f2me_buf(hParamMC->proto_frame_dec_f, hParamMC->proto_frame_dec_f_fx, &hParamMC->exp_proto_frame_dec_f, nchan_out_cov * 2 * hParamMC->num_freq_bands); - ivas_param_mc_dec_copy_diffuse_proto(hParamMC, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, nchan_out_cov, slot_idx); - FOR(int k = 0; k < nchan_out_cov; k++) - { - FOR(int l = 0; l < hParamMC->h_output_synthesis_params.max_band_decorr; l++) - { - Cldfb_RealBuffer[k][slot_idx][l] = me2f(Cldfb_RealBuffer_fx[k][slot_idx][l], hParamMC->exp_proto_frame_dec_f); - Cldfb_ImagBuffer[k][slot_idx][l] = me2f(Cldfb_ImagBuffer_fx[k][slot_idx][l], hParamMC->exp_proto_frame_dec_f); - } - } -#else - ivas_param_mc_dec_copy_diffuse_proto( hParamMC, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_out_cov, slot_idx ); + return; +} #endif - } - - /*-----------------------------------------------------------------* - * output synthesis - *-----------------------------------------------------------------*/ - ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], - &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], - Cldfb_RealBuffer, Cldfb_ImagBuffer, - hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, slot_idx, slot_idx + slot_idx_start, - nchan_transport, nchan_out_cov, hParamMC ); +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_read_BS() + * + * Read the Parametric MC metadata + *------------------------------------------------------------------------*/ - if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) - { - if ( - st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) - { -#ifdef IVAS_FLOAT_FIXED -#if 1 - IF( ( hParamMC->hoa_encoder_fx = (Word32 *) malloc(st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( Word32 ) ) ) == NULL ) - { - assert( 0 ); - } - Word16 Q_hoa_encoder = 31; - floatToFixed_arrL(hParamMC->hoa_encoder, hParamMC->hoa_encoder_fx, Q_hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS ); - Word32 Cldfb_RealBuffer_fx[16][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_fx[16][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word16 Q_Cldfb_ImagBuffer, Q_Cldfb_RealBuffer; - Q_Cldfb_ImagBuffer = Q_factor_arrL( &Cldfb_ImagBuffer[0][0][0], 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ) - 5;/*max value =MAX_INTERN_CHANNELS(=16)*Cldfb_ImagBuffer_fx*/ - Q_Cldfb_RealBuffer = Q_factor_arrL( &Cldfb_RealBuffer[0][0][0], 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ) - 5; - floatToFixed_arrL( &Cldfb_ImagBuffer[0][0][0], &Cldfb_ImagBuffer_fx[0][0][0], Q_Cldfb_ImagBuffer, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); - floatToFixed_arrL( &Cldfb_RealBuffer[0][0][0], &Cldfb_RealBuffer_fx[0][0][0], Q_Cldfb_RealBuffer, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); +void ivas_param_mc_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder ParamMC handle */ + int16_t *nb_bits /* o : number of bits written */ +) +{ + int16_t param_frame_idx; + int16_t band_step; + uint16_t bit_buffer[PARAM_MC_MAX_BITS]; + int16_t bits_to_copy; + int16_t bit_pos; + int16_t num_lfe_bands; + int16_t num_param_bands; + int16_t metadata_bit_pos; + int16_t i, j, k; +#ifndef FIX_901_PARAMMC_DEAD_CODE + int16_t l; #endif - ivas_param_mc_mc2sba_cldfb_fx( st_ivas->hTransSetup, hParamMC->hoa_encoder_fx, slot_idx, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, nband_synth, GAIN_LFE_FX ); -#if 1 + int16_t icc_map_size; + int16_t icc_map_size_wo_lfe; + int16_t ild_map_size; + int16_t ild_map_size_wo_lfe; + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC; - fixedToFloat_arrL( &Cldfb_ImagBuffer_fx[0][0][0], &Cldfb_ImagBuffer[0][0][0], Q_Cldfb_ImagBuffer, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); - fixedToFloat_arrL( &Cldfb_RealBuffer_fx[0][0][0], &Cldfb_RealBuffer[0][0][0], Q_Cldfb_RealBuffer, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); - IF(hParamMC->hoa_encoder_fx) - { - free(hParamMC->hoa_encoder_fx); - } -#endif // IVAS_FLOAT_FIXED -#else - ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); -#endif // IVAS_FLOAT_FIXED + push_wmops( "param_mc_read_bs" ); - } - else - { - /* remove LFE */ - uint16_t idx_out; - uint16_t idx_lfe; - IVAS_OUTPUT_SETUP hLsSetup; + /* Inits */ + *nb_bits = 0; + hMetadataPMC = hParamMC->hMetadataPMC; + icc_map_size = hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; + icc_map_size_wo_lfe = hMetadataPMC->icc_mapping_conf->icc_map_size_wo_lfe; + ild_map_size = hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; + ild_map_size_wo_lfe = hMetadataPMC->ild_mapping_conf->ild_map_size_wo_lfe; - hLsSetup = st_ivas->hTransSetup; + if ( !st->bfi ) + { + metadata_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); + bits_to_copy = (int16_t) min( ivas_total_brate / FRAMES_PER_SEC, PARAM_MC_MAX_BITS ); - /* If LFE should be rendered, add it to other channels before removing */ - if ( st_ivas->hBinRenderer->render_lfe ) - { - for ( idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++ ) - { - /* Copy just the first band of LFE*/ - v_multc( Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); - v_multc( Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + /* copy and reverse metadata */ + for ( bit_pos = 0; bit_pos < bits_to_copy; bit_pos++ ) + { + bit_buffer[bit_pos] = st->bit_stream[metadata_bit_pos--]; + } - for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) - { - if ( hLsSetup.index_lfe[idx_lfe] != ch ) - { - v_add( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer[ch][slot_idx], 1 ); - v_add( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], 1 ); - } - } - } - } + bit_pos = 0; - idx_out = 0; - idx_lfe = 0; + /* read reserved bit */ + hMetadataPMC->lfe_on = bit_buffer[bit_pos++]; - for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) - { - if ( ( hLsSetup.num_lfe > 0 ) && ( hLsSetup.index_lfe[idx_lfe] == ch ) ) - { - if ( idx_lfe < ( hLsSetup.num_lfe - 1 ) ) - { - idx_lfe++; - } - } - else if ( ch != idx_out ) - { - mvr2r( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[idx_out][slot_idx], nband_synth ); - mvr2r( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[idx_out][slot_idx], nband_synth ); - idx_out++; - } - else - { - idx_out++; - } - } - } + /* get coded bwidth */ + { + int16_t pos; + int16_t bw = 0; + for ( pos = 0; pos < 2; pos++ ) + { + bw += ( bit_buffer[bit_pos++] << pos ); } + hMetadataPMC->coded_bwidth = bw; } - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + /* set tables if coded band width differs from last frame */ + if ( hMetadataPMC->coded_bwidth != hMetadataPMC->last_coded_bwidth ) { + ivas_param_mc_set_coded_bands( hMetadataPMC ); + param_mc_set_num_synth_bands( st->output_Fs, hParamMC ); + hParamMC->max_band_energy_compensation = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; + } - ivas_binRenderer( st_ivas->hBinRenderer, - st_ivas->hCombinedOrientationData, - hParamMC->subframe_nbslots[subframe_idx], - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + param_frame_idx = bit_buffer[bit_pos++]; + hMetadataPMC->param_frame_idx = param_frame_idx; + num_param_bands = hMetadataPMC->nbands_in_param_frame[param_frame_idx]; + hMetadataPMC->bAttackPresent = bit_buffer[bit_pos++]; + hMetadataPMC->attackIndex = 0; + band_step = 1; + num_lfe_bands = 0; - /* update combined orientation access index */ - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); + if ( hMetadataPMC->bAttackPresent ) + { + for ( i = 2; i >= 0; i-- ) + { + hMetadataPMC->attackIndex += ( bit_buffer[bit_pos++] << i ); + } + + band_step = PARAM_MC_TRANSIENT_BAND_STEP; + num_lfe_bands = PARAM_MC_MAX_BAND_LFE / band_step + ( PARAM_MC_MAX_BAND_LFE % band_step ) ? 1 : 0; + num_param_bands = hMetadataPMC->nbands_coded / band_step + ( ( hMetadataPMC->nbands_coded % band_step ) ? 1 : 0 ); } - else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + else { - /* format conversion*/ -#ifdef IVAS_FLOAT_FIXED - Word32 Cldfb_RealBuffer_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word16 inChannels = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; - Word16 num_timeslots = hParamMC->subframe_nbslots[subframe_idx]; - Word16 j; - FOR( i = 0; i < inChannels; ++i ) + for ( j = 0; j < PARAM_MC_MAX_BAND_LFE; j += band_step ) { - FOR( j = 0; j < num_timeslots; ++j ) + if ( param_frame_idx == hMetadataPMC->coding_band_mapping[j] ) { - floatToFixed_arrL( Cldfb_RealBuffer[i][j], Cldfb_RealBuffer_fx[i][j], Q9, st_ivas->hLsSetUpConversion->sfbCnt ); - floatToFixed_arrL( Cldfb_ImagBuffer[i][j], Cldfb_ImagBuffer_fx[i][j], Q9, st_ivas->hLsSetUpConversion->sfbCnt ); + /* LFE ICC is always the last ICC in coding band 0 */ + num_lfe_bands++; } } - ivas_lssetupconversion_process_param_mc_fx( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, channel_active ); - FOR( i = 0; i < inChannels; ++i ) + } + + if ( !hMetadataPMC->lfe_on ) + { + num_lfe_bands = 0; + } + +#ifndef FIX_901_PARAMMC_DEAD_CODE + if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 ) + { + int16_t icc_mapping_index[PARAM_MC_SZ_ICC_MAP]; + + k = 0; + for ( i = 0; i < hMetadataPMC->icc_map_size_full - 1; i++ ) { - FOR( j = 0; j < num_timeslots; ++j ) + if ( bit_buffer[bit_pos++] == 1 ) { - fixedToFloat_arrL( Cldfb_RealBuffer_fx[i][j], Cldfb_RealBuffer[i][j], Q9, st_ivas->hLsSetUpConversion->sfbCnt ); - fixedToFloat_arrL( Cldfb_ImagBuffer_fx[i][j], Cldfb_ImagBuffer[i][j], Q9, st_ivas->hLsSetUpConversion->sfbCnt ); + icc_mapping_index[k++] = i; } } -#else - ivas_lssetupconversion_process_param_mc( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer, Cldfb_ImagBuffer, channel_active ); -#endif - } - /* CLDFB synthesis */ - for ( ch = 0; ch < nchan_out_cldfb; ch++ ) - { - float *RealBuffer[16]; - float *ImagBuffer[16]; + /* last one is always C/LFE */ + icc_mapping_index[k] = hMetadataPMC->icc_map_size_full - 1; - if ( channel_active[ch] ) + /* save icc mapping of the previous frame*/ + /* build icc map for the current frame */ + for ( k = 0; k < icc_map_size; k++ ) { - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ - for ( i = 0; i < hParamMC->subframe_nbslots[subframe_idx]; i++ ) + hMetadataPMC->icc_mapping[param_frame_idx][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; + hMetadataPMC->icc_mapping[param_frame_idx][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; + } + + if ( hMetadataPMC->bAttackPresent ) + { + for ( k = 0; k < icc_map_size; k++ ) { - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; - ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; - } - else + for ( l = 0; l < PARAM_MC_PARAMETER_FRAMES; l++ ) { - RealBuffer[i] = Cldfb_RealBuffer[ch][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; + hMetadataPMC->icc_mapping[l][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; + hMetadataPMC->icc_mapping[l][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; } } - - cldfbSynthesis_ivas( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), - hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); } else { - set_f( &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0.0f, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); + for ( k = 0; k < icc_map_size; k++ ) + { + hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; + hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; + } + } + } + else + { + if ( hMetadataPMC->bAttackPresent ) + { + for ( l = 0; l < PARAM_MC_PARAMETER_FRAMES; l++ ) + { + ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[param_frame_idx] ); + } + } + else + { + ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx] ); + } + } + +#endif +#ifdef IVAS_FLOAT_FIXED + floatToFixed_arr16( hParamMC->icc_q, hParamMC->icc_q_fx, Q15, hMetadataPMC->nbands_coded * icc_map_size ); + ivas_param_mc_bs_decode_parameter_values_fx( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->icc_coding, + icc_map_size_wo_lfe, icc_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icc_q_fx ); + fixedToFloat_arr( hParamMC->icc_q_fx, hParamMC->icc_q, Q15, hMetadataPMC->nbands_coded*icc_map_size ); +#else + ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->icc_coding, + icc_map_size_wo_lfe, icc_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icc_q ); +#endif // IVAS_FLOAT_FIXED + if ( !st->BER_detect ) + { +#ifdef IVAS_FLOAT_FIXED + floatToFixed_arr16( hParamMC->icld_q, hParamMC->icld_q_fx, Q8, hMetadataPMC->nbands_coded * ild_map_size ); + ivas_param_mc_bs_decode_parameter_values_fx( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->ild_coding, + ild_map_size_wo_lfe, ild_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icld_q_fx ); + fixedToFloat_arr( hParamMC->icld_q_fx, hParamMC->icld_q, Q8, hMetadataPMC->nbands_coded*ild_map_size); +#else + ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->ild_coding, + ild_map_size_wo_lfe, ild_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icld_q ); +#endif // IVAS_FLOAT_FIXED + } + /* set LFE ILD and ICC to zero above PARAM_MC_MAX_BAND_LFE for attack frames */ + if ( hMetadataPMC->bAttackPresent ) + { + for ( k = PARAM_MC_MAX_BAND_LFE; k < band_step * num_lfe_bands; k++ ) + { + hParamMC->icc_q[( k + 1 ) * icc_map_size - 1] = 1.0f; + hParamMC->icld_q[( k + 1 ) * ild_map_size - 1] = PARAM_MC_DEFAULT_MIN_ILD; } } - slot_idx_start += hParamMC->subframe_nbslots[subframe_idx]; - slot_idx_start_cldfb_synth += hParamMC->subframe_nbslots[subframe_idx]; + + *nb_bits = bit_pos; + + } /* if ( !st->bfi ) */ + + if ( st->bfi ) + { + /* for PLC, use the saved ILDs and ICCs from the past and set the transient flag and transient position to zero */ + hMetadataPMC->bAttackPresent = 0; + hMetadataPMC->attackIndex = 0; + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_digest_tc() + * + * + *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +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 */ + Word32 *transport_channels_f_fx[], + Word16 transport_f_e +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + Word16 i, ch; + Word16 slot_idx, param_band_idx; + Word16 nchan_transport, nchan_out_transport, nchan_out_cldfb; + Word16 nchan_out_cov; + /*CLDFB*/ + /* format converter */ + Word16 channel_active[MAX_OUTPUT_CHANNELS]; + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + Word32 cx_fx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word16 cx_buff_e[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word16 cx_e; + + Word32 cx_imag_fx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word16 cx_imag_e, tmp_e; + Word16 cldfb_slots, qout = 0; + + Word32 real_part_fx, imag_part_fx, L_tmp1, L_tmp2; + + Word16 max_e; + + push_wmops( "param_mc_dec_digest_tc" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + + IF ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + move16(); + set_s( channel_active, 1, nchan_out_cldfb ); + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + ELSE IF ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + move16(); + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + ELSE IF ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + move16(); + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hOutSetup; + } + ELSE + { + nchan_out_cov = nchan_out_transport; + move16(); + nchan_out_cldfb = nchan_out_transport; + move16(); + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + + /* adapt transient position */ + IF ( hParamMC->hMetadataPMC->bAttackPresent ) + { + hParamMC->hMetadataPMC->attackIndex = (int16_t) max( 0, hParamMC->hMetadataPMC->attackIndex + ( ( nCldfbSlots - DEFAULT_JBM_CLDFB_TIMESLOTS ) / 2 ) ); + } + /* adapt subframes */ + hParamMC->num_slots = nCldfbSlots; + move16(); + hParamMC->slots_rendered = 0; + move16(); + hParamMC->subframes_rendered = 0; + move16(); + ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); + st_ivas->hTcBuffer->nb_subframes = hParamMC->nb_subframes; + mvs2s( hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hParamMC->nb_subframes ); + + ivas_param_mc_dec_compute_interpolator_fx(hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator_fx); + + FOR (param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++) + { + set_zero_fx(cx_fx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS); + set_zero_fx(cx_imag_fx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS); + } + + cx_e = 0; + move16(); + cx_imag_e = 0; + move16(); + cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; + move16(); + IF (st_ivas->hDecoderConfig->Opt_tsm) + { + cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; + move16(); + } + + /* slot loop for gathering the input data */ + FOR ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + IF ( st_ivas->hDecoderConfig->Opt_tsm ) + { + Word32 RealBuffer_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 ImagBuffer_fx[CLDFB_NO_CHANNELS_MAX]; + + /* CLDFB Analysis*/ + FOR ( ch = 0; ch < nchan_transport; ch++ ) + { + qout = transport_f_e; + move16(); + cldfbAnalysis_ts_fx_fixed_q( &( transport_channels_f_fx[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer_fx, ImagBuffer_fx, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch], &qout ); + + Copy32( RealBuffer_fx, &hParamMC->Cldfb_RealBuffer_tc_fx[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + Copy32( ImagBuffer_fx, &hParamMC->Cldfb_ImagBuffer_tc_fx[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + } + + hParamMC->Cldfb_ImagBuffer_tc_e = qout; + move16(); + } + IF ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) + { + 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 ); + } + } + + /* map from complex input covariance to real values */ + + FOR(param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++) + { + /* Cx for transport channels */ + FOR(i = 0; i < nchan_transport * nchan_transport; i++) + { + + real_part_fx = cx_fx[param_band_idx][i]; + imag_part_fx = cx_imag_fx[param_band_idx][i]; + cx_buff_e[param_band_idx][i] = cx_e; + move16(); + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + IF(LT_16(param_band_idx, hParamMC->max_param_band_abs_cov)) + { + L_tmp1 = Mpy_32_32(real_part_fx, real_part_fx); + L_tmp2 = Mpy_32_32(imag_part_fx, imag_part_fx); + L_tmp1 = BASOP_Util_Add_Mant32Exp(L_tmp1, cx_e + cx_e, L_tmp2, cx_imag_e + cx_imag_e, &tmp_e); + cx_fx[param_band_idx][i] = Sqrt32(L_tmp1, &tmp_e); + cx_buff_e[param_band_idx][i] = tmp_e; + move16(); + } + ELSE + { + cx_fx[param_band_idx][i] = real_part_fx; + move32(); + cx_buff_e[param_band_idx][i] = cx_e; + move16(); + } + } + } + + max_e = cx_buff_e[0][0]; + move16(); + + FOR(param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++) + { + /* Cx for transport channels */ + FOR(i = 0; i < nchan_transport * nchan_transport; i++) + { + + IF( max_e < cx_buff_e[param_band_idx][i] ) + max_e = cx_buff_e[param_band_idx][i]; + } + } + + FOR(param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++) + { + /* Cx for transport channels */ + FOR(i = 0; i < nchan_transport * nchan_transport; i++) + { + + cx_fx[param_band_idx][i] = L_shr(cx_fx[param_band_idx][i], max_e - cx_buff_e[param_band_idx][i]); + } + } + + cx_e = max_e; + move16(); + + + /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ + + IF ( hParamMC->hMetadataPMC->bAttackPresent && ( EQ_32( hParamMC->synthesis_conf, PARAM_MC_SYNTH_LS_CONV_COV ) || EQ_32( hParamMC->synthesis_conf, PARAM_MC_SYNTH_MONO_STEREO ) ) ) + { + FOR ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) + { + v_add_fx( cx_fx[param_band_idx], cx_fx[param_band_idx + 1], cx_fx[param_band_idx], nchan_transport * nchan_transport ); + Copy32( cx_fx[param_band_idx], cx_fx[param_band_idx + 1], nchan_transport * nchan_transport ); + } + } + + IF ( EQ_32( hParamMC->synthesis_conf, PARAM_MC_SYNTH_MONO_STEREO ) ) + { + + // streams not entering into this block + //ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); + } + ELSE + { + /* generate mixing matrices */ + ivas_param_mc_get_mixing_matrices_fx( hParamMC, hSynthesisOutputSetup, cx_fx, cx_e, hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); + } + + pop_wmops(); + + return; +} +#else + +void ivas_param_mc_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t slot_idx, param_band_idx; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float real_part, imag_part; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_digest_tc" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hOutSetup; + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + + /* adapt transient position */ + if ( hParamMC->hMetadataPMC->bAttackPresent ) + { + hParamMC->hMetadataPMC->attackIndex = (int16_t) max( 0, hParamMC->hMetadataPMC->attackIndex + ( ( nCldfbSlots - DEFAULT_JBM_CLDFB_TIMESLOTS ) / 2 ) ); + } + /* adapt subframes */ + hParamMC->num_slots = nCldfbSlots; + hParamMC->slots_rendered = 0; + hParamMC->subframes_rendered = 0; + ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); + st_ivas->hTcBuffer->nb_subframes = hParamMC->nb_subframes; + mvs2s( hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hParamMC->nb_subframes ); + + ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); + + for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) + { + set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + } + + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + float RealBuffer[CLDFB_NO_CHANNELS_MAX]; + float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts_ivas( &( transport_channels_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + + mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + } + } + 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 + } + } + + /* map from complex input covariance to real values */ + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + /* Cx for transport channels */ + for ( i = 0; i < nchan_transport * nchan_transport; i++ ) + { + real_part = cx[param_band_idx][i]; + imag_part = cx_imag[param_band_idx][i]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + if ( param_band_idx < hParamMC->max_param_band_abs_cov ) + { + cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); + } + else + { + cx[param_band_idx][i] = real_part; + } + } + } + + /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ + if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) ) + { + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) + { + v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport ); + mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport ); + } + } + + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); + } + else + { + /* generate mixing matrices */ + ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); + } + + pop_wmops(); + + return; +} +#endif + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec() + * + * Parametric MC decoding process + *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_param_mc_dec_render( + 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 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t subframe_idx; + int16_t slot_idx, slot_idx_start, slot_idx_start_cldfb_synth, first_sf, last_sf, slots_to_render; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; +#ifdef IVAS_FLOAT_FIXED + Word32 Cldfb_RealBuffer_fx[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_fx[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 output_f_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 *p_output_f_fx[MAX_OUTPUT_CHANNELS]; + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++) { + p_output_f_fx[i] = output_f_fx[i]; + } + +#endif + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + /*Decorrelator*/ + float onset_filter[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; + +#ifdef IVAS_FLOAT_FIXED + Word32 onset_filter_fx[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; +#endif + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + uint16_t nband_synth, nbands_to_zero; + uint16_t nchan_out_init; + uint32_t output_Fs; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_render" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + nchan_out_init = nchan_out_transport; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + if ( st_ivas->hCombinedOrientationData ) + { + nchan_out_init = MAX_INTERN_CHANNELS; + } + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + } + + /* set everything to zero that will not be decoded */ + nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; + nbands_to_zero = hParamMC->num_freq_bands - nband_synth; + for ( ch = 0; ch < nchan_out_init; ch++ ) + { + for ( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ ) + { + set_zero( &( Cldfb_RealBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); + set_zero( &( Cldfb_ImagBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); +#ifdef IVAS_FLOAT_FIXED + set32_fx(&(Cldfb_RealBuffer_fx[ch][slot_idx][nband_synth]), 0,nbands_to_zero); + set32_fx(&(Cldfb_ImagBuffer_fx[ch][slot_idx][nband_synth]), 0,nbands_to_zero); +#endif + } + } + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hParamMC->num_slots - hParamMC->slots_rendered, nSamplesAsked / NS2SA( output_Fs, CLDFB_SLOT_NS ) ); + *nSamplesRendered = slots_to_render * NS2SA( output_Fs, CLDFB_SLOT_NS ); + first_sf = hParamMC->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= hParamMC->subframe_nbslots[last_sf]; + last_sf++; + } + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + slots_to_render += hParamMC->subframe_nbslots[subframe_idx]; + } + } + slot_idx_start = hParamMC->slots_rendered; + slot_idx_start_cldfb_synth = 0; + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + Word16 len = slot_idx_start_cldfb_synth * hParamMC->num_freq_bands + hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx]; + for ( i = 0; i < nchan_out_cldfb; i++) + { + floatToFixed_arrL(output_f[i], output_f_fx[i], Q11, len); + } + + for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots[subframe_idx]; slot_idx++, hParamMC->slots_rendered++ ) + { + + if ( hParamMC->max_band_decorr > 0 ) + { + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ + +#ifdef IVAS_FLOAT_FIXED + + floatToFixed_arrL(hParamMC->Cldfb_RealBuffer_tc, hParamMC->Cldfb_RealBuffer_tc_fx, Q12, hParamMC->sz); + + floatToFixed_arrL(hParamMC->Cldfb_ImagBuffer_tc, hParamMC->Cldfb_ImagBuffer_tc_fx, Q12, hParamMC->sz); + + FOR(Word16 x = 0; x < hParamMC->diff_proto_info->num_protos_diff; x++) + { + Word16 num_source_ch = hParamMC->diff_proto_info->num_source_chan_diff[x]; + move16(); + + floatToFixed_arrL(hParamMC->diff_proto_info->proto_fac[x], hParamMC->diff_proto_info->proto_fac_fx[x], Q30, num_source_ch); + } + + param_mc_protoSignalComputation_fx(&hParamMC->Cldfb_RealBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + hParamMC->proto_frame_f_fx, hParamMC->diff_proto_info, + hParamMC->num_freq_bands); + + fixedToFloat_arrL(hParamMC->proto_frame_f_fx, hParamMC->proto_frame_f, Q11, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands); + +#else + param_mc_protoSignalComputation( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + hParamMC->proto_frame_f, hParamMC->diff_proto_info, + hParamMC->num_freq_bands ); +#endif + + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ + /* decorrelate prototype frame */ + +#ifdef IVAS_FLOAT_FIXED + Word16 tmp_e; + f2me_buf(hParamMC->h_freq_domain_decorr_ap_state->decorr_buffer, hParamMC->h_freq_domain_decorr_ap_state->decorr_buffer_fx, &tmp_e, hParamMC->h_freq_domain_decorr_ap_state->decorr_buffer_len ); + hParamMC->h_freq_domain_decorr_ap_state->q_decorr_buffer = 31 - tmp_e; + ivas_dirac_dec_decorr_process_fx( hParamMC->num_freq_bands, + hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, + nchan_transport, + hParamMC->proto_frame_f_fx, + 11, + hParamMC->diff_proto_info->num_protos_diff, + hParamMC->diff_proto_info->proto_index_diff, + hParamMC->proto_frame_dec_f_fx,//output + &hParamMC->exp_proto_frame_dec_f, + onset_filter_fx, + hParamMC->h_freq_domain_decorr_ap_params, + hParamMC->h_freq_domain_decorr_ap_state ); + fixedToFloat_arrL32(onset_filter_fx, onset_filter, 31, MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX); + fixedToFloat_arrL32(hParamMC->proto_frame_dec_f_fx, hParamMC->proto_frame_dec_f, 11, nchan_out_cov * 2 * hParamMC->num_freq_bands); +#else + ivas_dirac_dec_decorr_process( hParamMC->num_freq_bands, + hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, + nchan_transport, + hParamMC->proto_frame_f, + hParamMC->diff_proto_info->num_protos_diff, + hParamMC->diff_proto_info->proto_index_diff, + hParamMC->proto_frame_dec_f,//output + onset_filter, + hParamMC->h_freq_domain_decorr_ap_params, + hParamMC->h_freq_domain_decorr_ap_state ); +#endif + + /* copy decorrelated frame directly to output CLDFB buffer, acts also as intermediate */ + /* memory for the decorrelated signal */ +#ifdef IVAS_FLOAT_FIXED + //f2me_buf(hParamMC->proto_frame_dec_f, hParamMC->proto_frame_dec_f_fx, &hParamMC->exp_proto_frame_dec_f, nchan_out_cov * 2 * hParamMC->num_freq_bands); + ivas_param_mc_dec_copy_diffuse_proto(hParamMC, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, nchan_out_cov, slot_idx); + FOR(int k = 0; k < nchan_out_cov; k++) + { + FOR(int l = 0; l < hParamMC->h_output_synthesis_params.max_band_decorr; l++) + { + Cldfb_RealBuffer[k][slot_idx][l] = me2f(Cldfb_RealBuffer_fx[k][slot_idx][l], hParamMC->exp_proto_frame_dec_f); + Cldfb_ImagBuffer[k][slot_idx][l] = me2f(Cldfb_ImagBuffer_fx[k][slot_idx][l], hParamMC->exp_proto_frame_dec_f); + } + } +#else + ivas_param_mc_dec_copy_diffuse_proto( hParamMC, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_out_cov, slot_idx ); +#endif + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + +#ifdef IVAS_FLOAT_FIXED + Word16 j, k; + + FOR ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + FOR ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + FOR ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) + { + Cldfb_RealBuffer_fx[i][j][k] = (Word32) (floatToFixed( Cldfb_RealBuffer[i][j][k], 6 ) ); + Cldfb_ImagBuffer_fx[i][j][k] = (Word32) (floatToFixed(Cldfb_ImagBuffer[i][j][k], 6 ) ); + } + } + } + + Word16 length = nchan_transport; + FOR (Word16 i = 0; i < 16 * nchan_transport * hParamMC->num_freq_bands; i++) + { + st_ivas->hParamMC->Cldfb_RealBuffer_tc_fx[i] = + floatToFixed(st_ivas->hParamMC->Cldfb_RealBuffer_tc[i], 6); + st_ivas->hParamMC->Cldfb_ImagBuffer_tc_fx[i] = + floatToFixed(st_ivas->hParamMC->Cldfb_ImagBuffer_tc[i], 6); + } + + FOR(Word16 param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++) { + + + f2me_buf(hParamMC->h_output_synthesis_cov_state.mixing_matrix[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx[param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp[param_band_idx], nchan_transport * nchan_out_cov); + + IF(hParamMC->band_grouping[param_band_idx] < hParamMC->h_output_synthesis_params.max_band_decorr) { + f2me_buf(hParamMC->h_output_synthesis_cov_state.mixing_matrix_res[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx[param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp[param_band_idx], nchan_out_cov * nchan_out_cov); + + f2me_buf(hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_exp[param_band_idx], nchan_out_cov * nchan_out_cov); + } + } + + floatToFixed_arr16(hParamMC->h_output_synthesis_params.interpolator, hParamMC->h_output_synthesis_params.interpolator_fx, 15, DEFAULT_JBM_CLDFB_TIMESLOTS); + + + ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( + &hParamMC->Cldfb_RealBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp, slot_idx, slot_idx + slot_idx_start, + nchan_transport, nchan_out_cov, hParamMC ); + + + FOR (i = 0; i < MAX_OUTPUT_CHANNELS; i++) + { + FOR (j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++) + { + FOR (k = 0; k < CLDFB_NO_CHANNELS_MAX; k++) + { + Cldfb_RealBuffer[i][j][k] = ((float)Cldfb_RealBuffer_fx[i][j][k] / ( 1 << 6)); + Cldfb_ImagBuffer[i][j][k] = ((float)Cldfb_ImagBuffer_fx[i][j][k] / ( 1 << 6)); + } + } + } + +#else + ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + Cldfb_RealBuffer, Cldfb_ImagBuffer, + hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, slot_idx, slot_idx + slot_idx_start, + nchan_transport, nchan_out_cov, hParamMC ); +#endif + + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + if ( + st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { +#ifdef IVAS_FLOAT_FIXED +#if 1 + Word16 Q_hoa_encoder = 31; + floatToFixed_arrL(hParamMC->hoa_encoder, hParamMC->hoa_encoder_fx, Q_hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS ); + + Word16 Q_Cldfb_ImagBuffer, Q_Cldfb_RealBuffer; + Q_Cldfb_ImagBuffer = Q_factor_arrL( &Cldfb_ImagBuffer[0][0][0], 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ) - 5;/*max value =MAX_INTERN_CHANNELS(=16)*Cldfb_ImagBuffer_fx*/ + Q_Cldfb_RealBuffer = Q_factor_arrL( &Cldfb_RealBuffer[0][0][0], 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ) - 5; + floatToFixed_arrL( &Cldfb_ImagBuffer[0][0][0], &Cldfb_ImagBuffer_fx[0][0][0], Q_Cldfb_ImagBuffer, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( &Cldfb_RealBuffer[0][0][0], &Cldfb_RealBuffer_fx[0][0][0], Q_Cldfb_RealBuffer, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); +#endif + ivas_param_mc_mc2sba_cldfb_fx( st_ivas->hTransSetup, hParamMC->hoa_encoder_fx, slot_idx, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, nband_synth, GAIN_LFE_FX ); +#if 1 + + fixedToFloat_arrL( &Cldfb_ImagBuffer_fx[0][0][0], &Cldfb_ImagBuffer[0][0][0], Q_Cldfb_ImagBuffer, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); + fixedToFloat_arrL( &Cldfb_RealBuffer_fx[0][0][0], &Cldfb_RealBuffer[0][0][0], Q_Cldfb_RealBuffer, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); +#endif // IVAS_FLOAT_FIXED +#else + ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); +#endif // IVAS_FLOAT_FIXED + + } + else + { + /* remove LFE */ + uint16_t idx_out; + uint16_t idx_lfe; + IVAS_OUTPUT_SETUP hLsSetup; + + hLsSetup = st_ivas->hTransSetup; + + /* If LFE should be rendered, add it to other channels before removing */ + if ( st_ivas->hBinRenderer->render_lfe ) + { + for ( idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++ ) + { + /* Copy just the first band of LFE*/ + v_multc( Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + v_multc( Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + + for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) + { + if ( hLsSetup.index_lfe[idx_lfe] != ch ) + { + v_add( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer[ch][slot_idx], 1 ); + v_add( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], 1 ); + } + } + } + } + + idx_out = 0; + idx_lfe = 0; + + for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) + { + if ( ( hLsSetup.num_lfe > 0 ) && ( hLsSetup.index_lfe[idx_lfe] == ch ) ) + { + if ( idx_lfe < ( hLsSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ch != idx_out ) + { + mvr2r( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[idx_out][slot_idx], nband_synth ); + mvr2r( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[idx_out][slot_idx], nband_synth ); + idx_out++; + } + else + { + idx_out++; + } + } + } + } + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { +#ifdef IVAS_FLOAT_FIXED + Word16 j, k; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + for ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) + { + Cldfb_RealBuffer_fx[i][j][k] = (Word32) floatToFixed( Cldfb_RealBuffer[i][j][k], Q6 ); + Cldfb_ImagBuffer_fx[i][j][k] = (Word32) floatToFixed( Cldfb_ImagBuffer[i][j][k], Q6 ); + } + } + } + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hBinRenderer->rotInCldfb ) + { + if ( st_ivas->hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) + { + for ( i = 0; i < 3; i++ ) + { + for ( j = 0; j < 3; j++ ) + { + st_ivas->hCombinedOrientationData->Rmat_fx[st_ivas->hCombinedOrientationData->subframe_idx][i][j] = (Word32) floatToFixed( st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx][i][j], 30 ); + } + } + } + } + + Word16 input_q = 6; + /* Implement binaural rendering */ + ivas_binRenderer_fx( st_ivas->hBinRenderer, + st_ivas->hCombinedOrientationData, + hParamMC->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, + Cldfb_RealBuffer_fx, + Cldfb_ImagBuffer_fx, &input_q ); + + /* fixed to float */ + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + for ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) + { + Cldfb_RealBuffer[i][j][k] = fixedToFloat( Cldfb_RealBuffer_fx[i][j][k], input_q ); + Cldfb_ImagBuffer[i][j][k] = fixedToFloat( Cldfb_ImagBuffer_fx[i][j][k], input_q ); + } + } + } + + for ( int idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) + { + for ( int idx2 = 0; idx2 < hParamMC->subframe_nbslots[subframe_idx]; idx2++ ) + { + Scale_sig32( Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, 6 - input_q ); + Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, 6 - input_q ); + } + } + + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + for ( j = 0; j < hParamMC->subframe_nbslots[subframe_idx]; j++ ) + { + for ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) + { + Cldfb_RealBuffer_Binaural[i][j][k] = fix_to_float( Cldfb_RealBuffer_Binaural_fx[i][j][k], Q6 ); + Cldfb_ImagBuffer_Binaural[i][j][k] = fix_to_float( Cldfb_ImagBuffer_Binaural_fx[i][j][k], Q6 ); + } + } + } +#else + ivas_binRenderer( st_ivas->hBinRenderer, + st_ivas->hCombinedOrientationData, + hParamMC->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + +#endif + /* update combined orientation access index */ + ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + /* format conversion*/ +#ifdef IVAS_FLOAT_FIXED + Word16 inChannels = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + Word16 num_timeslots = hParamMC->subframe_nbslots[subframe_idx]; + Word16 j; + FOR( i = 0; i < inChannels; ++i ) + { + FOR( j = 0; j < num_timeslots; ++j ) + { + floatToFixed_arrL( Cldfb_RealBuffer[i][j], Cldfb_RealBuffer_fx[i][j], Q9, st_ivas->hLsSetUpConversion->sfbCnt ); + floatToFixed_arrL( Cldfb_ImagBuffer[i][j], Cldfb_ImagBuffer_fx[i][j], Q9, st_ivas->hLsSetUpConversion->sfbCnt ); + } + } + ivas_lssetupconversion_process_param_mc_fx( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, channel_active ); + FOR( i = 0; i < inChannels; ++i ) + { + FOR( j = 0; j < num_timeslots; ++j ) + { + fixedToFloat_arrL( Cldfb_RealBuffer_fx[i][j], Cldfb_RealBuffer[i][j], Q9, st_ivas->hLsSetUpConversion->sfbCnt ); + fixedToFloat_arrL( Cldfb_ImagBuffer_fx[i][j], Cldfb_ImagBuffer[i][j], Q9, st_ivas->hLsSetUpConversion->sfbCnt ); + } + } +#else + ivas_lssetupconversion_process_param_mc( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer, Cldfb_ImagBuffer, channel_active ); +#endif + } + + /* CLDFB synthesis */ +#ifdef IVAS_FLOAT_FIXED + + floatToFixed_arrL( &Cldfb_ImagBuffer[0][0][0], &Cldfb_ImagBuffer_fx[0][0][0], Q6, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( &Cldfb_RealBuffer[0][0][0], &Cldfb_RealBuffer_fx[0][0][0], Q6, 16 * MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); + + /* CLDFB synthesis */ + for ( ch = 0; ch < nchan_out_cldfb; ch++ ) + { + Word32 *RealBuffer_fx[16]; + Word32 *ImagBuffer_fx[16]; + + if ( channel_active[ch] ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hParamMC->subframe_nbslots[subframe_idx]; i++ ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[ch][i]; + ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[ch][i]; + } + else + { + RealBuffer_fx[i] = Cldfb_RealBuffer_fx[ch][i]; + ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[ch][i]; + } + } + + for ( i = 0; i < st_ivas->cldfbSynDec[ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbSynDec[ch]->cldfb_state[i] * ( 1LL << ( 5 ) ) ); + } + scale_sig32( output_f_fx[ch], len, 5 - 11 ); + + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), + hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + + scale_sig32( output_f_fx[ch], len, 11 - 5 ); + for ( i = 0; i < st_ivas->cldfbSynDec[ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[ch]->cldfb_state[i] = ( (float) st_ivas->cldfbSynDec[ch]->cldfb_state_fx[i] / ( 1LL << ( 5 ) ) ); + } + fixedToFloat_arrL( output_f_fx[ch], output_f[ch], Q11, len ); + } + else + { + set32_fx( &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); + fixedToFloat_arrL( output_f_fx[ch], output_f[ch], Q11, len ); + } + } + slot_idx_start += hParamMC->subframe_nbslots[subframe_idx]; + slot_idx_start_cldfb_synth += hParamMC->subframe_nbslots[subframe_idx]; + } +#else + for ( ch = 0; ch < nchan_out_cldfb; ch++ ) + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + if ( channel_active[ch] ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hParamMC->subframe_nbslots[subframe_idx]; i++ ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } + else + { + RealBuffer[i] = Cldfb_RealBuffer[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; + } + } + + cldfbSynthesis_ivas( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), + hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + } + else + { + set_f( &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0.0f, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); + } + } + slot_idx_start += hParamMC->subframe_nbslots[subframe_idx]; + slot_idx_start_cldfb_synth += hParamMC->subframe_nbslots[subframe_idx]; + } +#endif + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { +#ifdef IVAS_FLOAT_FIXED + ivas_mc2sba_fx( st_ivas->hIntSetup, p_output_f_fx, p_output_f_fx, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0 ); +#if 1 + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + fixedToFloat_arrL(output_f_fx[i], output_f[i], Q11 , *nSamplesRendered ); + } +#endif +#else + ivas_mc2sba( st_ivas->hIntSetup, output_f, output_f, hParamMC->num_freq_bands * slots_to_render, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif // IVAS_FLOAT_FIXED + } + + /* update */ + if ( hParamMC->slots_rendered == hParamMC->num_slots ) + { + hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth; +#ifdef IVAS_FLOAT_FIXED + FOR(Word16 param_band_idx = 0; param_band_idx < hParamMC->hMetadataPMC->nbands_coded; param_band_idx++) { + f2me_buf(hParamMC->h_output_synthesis_cov_state.mixing_matrix[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx[param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp[param_band_idx], nchan_transport * nchan_out_cov); + IF(hParamMC->band_grouping[param_band_idx] < hParamMC->h_output_synthesis_params.max_band_decorr) { + f2me_buf(hParamMC->h_output_synthesis_cov_state.mixing_matrix_res[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx[param_band_idx], &hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp[param_band_idx], nchan_transport * nchan_out_cov); + } + } + + param_mc_update_mixing_matrices_fx(hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_exp, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_fx, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_exp, nchan_transport, nchan_out_cov); + + FOR(Word16 param_band_idx = 0; param_band_idx < hParamMC->hMetadataPMC->nbands_coded; param_band_idx++) { + IF( hParamMC->band_grouping[param_band_idx] < hParamMC->h_output_synthesis_params.max_band_decorr) { + mvr2r(hParamMC->h_output_synthesis_cov_state.mixing_matrix_res[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[param_band_idx], nchan_transport * nchan_out_cov ); + } + mvr2r(hParamMC->h_output_synthesis_cov_state.mixing_matrix[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[param_band_idx], nchan_transport * nchan_out_cov); + } + +#else + param_mc_update_mixing_matrices( hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_transport, nchan_out_cov ); +#endif + } + hParamMC->subframes_rendered = last_sf; + *nSamplesAvailableNext = ( hParamMC->num_slots - hParamMC->slots_rendered ) * NS2SA( output_Fs, CLDFB_SLOT_NS ); + //fclose(fp1); + //fclose(fp); + pop_wmops(); + + return; +} + + +#else +void ivas_param_mc_dec_render( + 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 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t subframe_idx; + int16_t slot_idx, slot_idx_start, slot_idx_start_cldfb_synth, first_sf, last_sf, slots_to_render; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + /*Decorrelator*/ + float onset_filter[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + uint16_t nband_synth, nbands_to_zero; + uint16_t nchan_out_init; + uint32_t output_Fs; + + hParamMC = st_ivas->hParamMC; + assert(hParamMC); + + push_wmops("param_mc_dec_render"); + + set_s(channel_active, 0, MAX_CICP_CHANNELS); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + nchan_out_init = nchan_out_transport; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + if (st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s(channel_active, 1, nchan_out_cldfb); + if (st_ivas->hCombinedOrientationData) + { + nchan_out_init = MAX_INTERN_CHANNELS; + } + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + } + else if (hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else if (hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s(channel_active, 1, nchan_out_cov); + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s(channel_active, 1, nchan_out_cov); + } + + /* set everything to zero that will not be decoded */ + nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; + nbands_to_zero = hParamMC->num_freq_bands - nband_synth; + for (ch = 0; ch < nchan_out_init; ch++) + { + for (slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++) + { + set_zero(&(Cldfb_RealBuffer[ch][slot_idx][nband_synth]), nbands_to_zero); + set_zero(&(Cldfb_ImagBuffer[ch][slot_idx][nband_synth]), nbands_to_zero); + } + } + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min(hParamMC->num_slots - hParamMC->slots_rendered, nSamplesAsked / NS2SA(output_Fs, CLDFB_SLOT_NS)); + *nSamplesRendered = slots_to_render * NS2SA(output_Fs, CLDFB_SLOT_NS); + first_sf = hParamMC->subframes_rendered; + last_sf = first_sf; + while (slots_to_render > 0) + { + slots_to_render -= hParamMC->subframe_nbslots[last_sf]; + last_sf++; + } + if (st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC) + { + for (subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++) + { + slots_to_render += hParamMC->subframe_nbslots[subframe_idx]; + } + } + slot_idx_start = hParamMC->slots_rendered; + slot_idx_start_cldfb_synth = 0; + for (subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++) + { + for (slot_idx = 0; slot_idx < hParamMC->subframe_nbslots[subframe_idx]; slot_idx++, hParamMC->slots_rendered++) + { + + if (hParamMC->max_band_decorr > 0) + { + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ + + param_mc_protoSignalComputation(&hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + hParamMC->proto_frame_f, hParamMC->diff_proto_info, + hParamMC->num_freq_bands); + + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ + + /* decorrelate prototype frame */ + ivas_dirac_dec_decorr_process(hParamMC->num_freq_bands, + hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, + nchan_transport, + hParamMC->proto_frame_f, + hParamMC->diff_proto_info->num_protos_diff, + hParamMC->diff_proto_info->proto_index_diff, + hParamMC->proto_frame_dec_f, + onset_filter, + hParamMC->h_freq_domain_decorr_ap_params, + hParamMC->h_freq_domain_decorr_ap_state); + + /* copy decorrelated frame directly to output CLDFB buffer, acts also as intermediate */ + /* memory for the decorrelated signal */ + ivas_param_mc_dec_copy_diffuse_proto(hParamMC, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_out_cov, slot_idx); + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + + ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot(&hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + Cldfb_RealBuffer, Cldfb_ImagBuffer, + hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, slot_idx, slot_idx + slot_idx_start, + nchan_transport, nchan_out_cov, hParamMC); + + if ((st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM)) + { + if ( + st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV) + { + ivas_param_mc_mc2sba_cldfb(st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE); + } + else + { + /* remove LFE */ + uint16_t idx_out; + uint16_t idx_lfe; + IVAS_OUTPUT_SETUP hLsSetup; + + hLsSetup = st_ivas->hTransSetup; + + /* If LFE should be rendered, add it to other channels before removing */ + if (st_ivas->hBinRenderer->render_lfe) + { + for (idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++) + { + /* Copy just the first band of LFE*/ + v_multc(Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], (GAIN_LFE / hLsSetup.nchan_out_woLFE), Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1); + v_multc(Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], (GAIN_LFE / hLsSetup.nchan_out_woLFE), Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1); + + for (ch = 0; ch < (hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe); ch++) + { + if (hLsSetup.index_lfe[idx_lfe] != ch) + { + v_add(Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer[ch][slot_idx], 1); + v_add(Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], 1); + } + } + } + } + + idx_out = 0; + idx_lfe = 0; + + for (ch = 0; ch < (hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe); ch++) + { + if ((hLsSetup.num_lfe > 0) && (hLsSetup.index_lfe[idx_lfe] == ch)) + { + if (idx_lfe < (hLsSetup.num_lfe - 1)) + { + idx_lfe++; + } + } + else if (ch != idx_out) + { + mvr2r(Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[idx_out][slot_idx], nband_synth); + mvr2r(Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[idx_out][slot_idx], nband_synth); + idx_out++; + } + else + { + idx_out++; + } + } + } + } + } + + if (st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) + { + + ivas_binRenderer(st_ivas->hBinRenderer, + st_ivas->hCombinedOrientationData, + hParamMC->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer); + + + /* update combined orientation access index */ + ivas_combined_orientation_update_index(st_ivas->hCombinedOrientationData, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx]); + } + else if (hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB) + { + /* format conversion*/ + ivas_lssetupconversion_process_param_mc(st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer, Cldfb_ImagBuffer, channel_active); + } + + /* CLDFB synthesis */ + for (ch = 0; ch < nchan_out_cldfb; ch++) + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + if (channel_active[ch]) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for (i = 0; i < hParamMC->subframe_nbslots[subframe_idx]; i++) + { + if (st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } + else + { + RealBuffer[i] = Cldfb_RealBuffer[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; + } + } + + cldfbSynthesis_ivas(RealBuffer, ImagBuffer, &(output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands]), + hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch]); + } + else + { + set_f(&(output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands]), 0.0f, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx]); + } + } + slot_idx_start += hParamMC->subframe_nbslots[subframe_idx]; + slot_idx_start_cldfb_synth += hParamMC->subframe_nbslots[subframe_idx]; + } + + if (st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC) + { + ivas_mc2sba(st_ivas->hIntSetup, output_f, output_f, hParamMC->num_freq_bands * slots_to_render, st_ivas->hOutSetup.ambisonics_order, 0.f); + } + + /* update */ + if (hParamMC->slots_rendered == hParamMC->num_slots) + { + hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth; + param_mc_update_mixing_matrices(hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_transport, nchan_out_cov); + } + hParamMC->subframes_rendered = last_sf; + *nSamplesAvailableNext = (hParamMC->num_slots - hParamMC->slots_rendered) * NS2SA(output_Fs, CLDFB_SLOT_NS); + pop_wmops(); + + return; +} + + +#endif +/*------------------------------------------------------------------------- + * ivas_param_mc_dec() + * + * Parametric MC decoding process + *------------------------------------------------------------------------*/ +#if 0 //NO Calling location +void ivas_param_mc_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; + uint16_t nSamplesAsked, nSamplesAvailableNext, nSamplesRendered; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + push_wmops( "param_mc_dec" ); + + /* set some handle pointers to the stack buffers */ + hParamMC->Cldfb_RealBuffer_tc = Cldfb_RealBuffer_in; + hParamMC->Cldfb_ImagBuffer_tc = Cldfb_ImagBuffer_in; + + nSamplesAsked = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + ivas_param_mc_dec_digest_tc( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS, output_f ); + ivas_param_mc_dec_render( st_ivas, nSamplesAsked, &nSamplesRendered, &nSamplesAvailableNext, output_f ); + + /* set handle pointers back to NULL */ + hParamMC->Cldfb_RealBuffer_tc = NULL; + hParamMC->Cldfb_ImagBuffer_tc = NULL; + + pop_wmops(); + return; +} +#endif + +/*------------------------------------------------------------------------- + * param_mc_dec_init() + * + * Parametric MC decoding initialization + *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void ivas_param_mc_dec_init_fx( + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder DirAC handle */ + const Word16 nchan_transport, /* i : number of input (transport) channels */ + const Word16 nchan_cov ) /* i : number of cov synthesis channels */ +{ + Word16 k; + UWord16 max_param_band_residual; + Word16 len; + + /*-----------------------------------------------------------------* + * init sub-modules + *-----------------------------------------------------------------*/ + + /* decorrelation */ + IF ( GT_16(hParamMC->max_band_decorr , 0) ) + { + len = hParamMC->diff_proto_info->num_protos_diff * hParamMC->h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; + + /* init onsetDetectionPower */ + set_zero_fx( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx, len ); + set_zero_fx( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx, len ); +#if 1/*Floating point intialization: to be removed later*/ + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1, len ); + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2, len ); +#endif + } + + max_param_band_residual = 0; + + /* output synthesis */ + FOR ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) + { + IF ( LE_16(hParamMC->band_grouping[k] , hParamMC->max_band_decorr) ) + { + max_param_band_residual = k; + break; + } + } + + ivas_dirac_dec_output_synthesis_cov_init_fx( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); + + /*-----------------------------------------------------------------* + * init proto frames + *-----------------------------------------------------------------*/ + + IF ( GT_16(hParamMC->max_band_decorr , 0) ) + { +#if 1/*TODO: To be removed later*/ + set_zero( hParamMC->proto_frame_f, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); + set_zero( hParamMC->proto_frame_dec_f, 2 * nchan_cov * hParamMC->num_freq_bands ); +#endif + set_zero_fx( hParamMC->proto_frame_f_fx, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); + set32_fx( hParamMC->proto_frame_dec_f_fx, 0, 2 * nchan_cov * hParamMC->num_freq_bands ); + } + + return; +} +#endif // IVAS_FLOAT_FIXED +static void ivas_param_mc_dec_init( + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder DirAC handle */ + const int16_t nchan_transport, /* i : number of input (transport) channels */ + const int16_t nchan_cov ) /* i : number of cov synthesis channels */ +{ + int16_t k; + uint16_t max_param_band_residual; + int16_t len; + + /*-----------------------------------------------------------------* + * init sub-modules + *-----------------------------------------------------------------*/ + + /* decorrelation */ + if ( hParamMC->max_band_decorr > 0 ) + { + len = hParamMC->diff_proto_info->num_protos_diff * hParamMC->h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; + + /* init onsetDetectionPower */ + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1, len ); + set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2, len ); + } + + max_param_band_residual = 0; + + /* output synthesis */ + for ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) + { + if ( hParamMC->band_grouping[k] <= hParamMC->max_band_decorr ) + { + max_param_band_residual = k; + break; + } + } + + ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); + + /*-----------------------------------------------------------------* + * init proto frames + *-----------------------------------------------------------------*/ + + if ( hParamMC->max_band_decorr > 0 ) + { + set_zero( hParamMC->proto_frame_f, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); + set_zero( hParamMC->proto_frame_dec_f, 2 * nchan_cov * hParamMC->num_freq_bands ); +#ifdef IVAS_FLOAT_FIXED + set32_fx(hParamMC->proto_frame_dec_f_fx, 0, 2 * nchan_cov * hParamMC->num_freq_bands); +#endif + } + + return; +} + + +/*------------------------------------------------------------------------- + * Local functions + *-------------------------------------------------------------------------*/ + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_compute_diffuse_proto() + * + * Compute prototypes for decorrelation + *------------------------------------------------------------------------*/ + +static void param_mc_protoSignalComputation( + float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */ + float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */ + float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ + const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ + const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ +) +{ + int16_t band; + int16_t proto_ch_idx, source_ch_cnt; + float *p_proto_frame; + float *p_real_buffer; + float *p_imag_buffer; + + set_zero( proto_frame_f, 2 * num_freq_bands * diff_proto_info->num_protos_diff ); + + for ( proto_ch_idx = 0; proto_ch_idx < diff_proto_info->num_protos_diff; proto_ch_idx++ ) + { + int16_t num_source_ch = diff_proto_info->num_source_chan_diff[proto_ch_idx]; + + for ( source_ch_cnt = 0; source_ch_cnt < num_source_ch; source_ch_cnt++ ) + { + float fac = diff_proto_info->proto_fac[proto_ch_idx][source_ch_cnt]; + int16_t source_ch_idx = diff_proto_info->source_chan_idx[proto_ch_idx][source_ch_cnt]; + + p_proto_frame = &proto_frame_f[proto_ch_idx * num_freq_bands * 2]; + p_real_buffer = &RealBuffer[source_ch_idx * num_freq_bands]; + p_imag_buffer = &ImagBuffer[source_ch_idx * num_freq_bands]; + + for ( band = 0; band < num_freq_bands; band++ ) + { + *( p_proto_frame++ ) += fac * ( *( p_real_buffer++ ) ); + *( p_proto_frame++ ) += fac * ( *( p_imag_buffer++ ) ); + } + } + } + + return; +} + +#ifdef IVAS_FLOAT_FIXED +static void param_mc_protoSignalComputation_fx( + Word32 *RealBuffer_fx, /* i : CLDFB samples of the transport channels (real part) */ + Word32 *ImagBuffer_fx, /* i : CLDFB samples of the transport channels (imaginary part) */ + Word32 *proto_frame_f_fx, /* o : interleaved complex prototype CLDFB samples */ + const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ + const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ +) +{ + Word16 band; + Word16 proto_ch_idx, source_ch_cnt; + + Word32 *p_proto_frame_fx; + Word32 *p_real_buffer_fx; // Q12 + Word32 *p_imag_buffer_fx; // Q12 + + Word16 proto_frame_f_q[ MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS * 120]; + + set32_fx(proto_frame_f_fx, 0, 2 * num_freq_bands * diff_proto_info->num_protos_diff); + + + FOR (proto_ch_idx = 0; proto_ch_idx < diff_proto_info->num_protos_diff; proto_ch_idx++) + { + Word16 num_source_ch = diff_proto_info->num_source_chan_diff[proto_ch_idx]; + move16(); + + FOR (source_ch_cnt = 0; source_ch_cnt < num_source_ch; source_ch_cnt++) + { + + Word32 fac_fx = diff_proto_info->proto_fac_fx[proto_ch_idx][source_ch_cnt]; + move32(); + + Word16 source_ch_idx = diff_proto_info->source_chan_idx[proto_ch_idx][source_ch_cnt]; + move16(); + + p_proto_frame_fx = &proto_frame_f_fx[proto_ch_idx * num_freq_bands * 2]; + p_real_buffer_fx = &RealBuffer_fx[source_ch_idx * num_freq_bands]; + p_imag_buffer_fx = &ImagBuffer_fx[source_ch_idx * num_freq_bands]; + + Word16 i = shl(imult1616(proto_ch_idx, num_freq_bands), 1); + move16(); + + FOR (band = 0; band < num_freq_bands; band++) + { + + Word32 tmp_x = Mpy_32_32(fac_fx, (*(p_real_buffer_fx++))); // Q(30 + 12 - 31) :: Q11 + + *(p_proto_frame_fx) = L_add(*(p_proto_frame_fx), tmp_x); + move32(); + p_proto_frame_fx++; + + tmp_x = Mpy_32_32(fac_fx, (*(p_imag_buffer_fx++))); // Q(30 + 12 - 31) :: Q11 + + *(p_proto_frame_fx) = L_add(*(p_proto_frame_fx), tmp_x); + move32(); + p_proto_frame_fx++; + + } + } + } + + return; +} +#endif + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_compute_diffuse_proto() + * + * Transfer decorrelated signals back from the decorrelator buffer to + * the buffers used in the final synthesis + *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void ivas_param_mc_dec_copy_diffuse_proto( + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + Word32 Cldfb_buffer_real_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (real part) */ + Word32 Cldfb_buffer_imag_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (imaginary part) */ + const Word16 nY, /* i : number of decorrelated channels */ + const Word16 slot_idx /* i : current time slot index */ +) +{ + Word16 k, l; + Word16 num_freq_bands, num_freq_bands_diff; + Word32 *p_proto_diff_fx; + num_freq_bands = hParamMC->num_freq_bands; + num_freq_bands_diff = hParamMC->h_output_synthesis_params.max_band_decorr; + + FOR( k = 0; k < nY; k++ ) + { + p_proto_diff_fx = hParamMC->proto_frame_dec_f_fx + imult1616( shl( k, 1 ), num_freq_bands ); + + FOR( l = 0; l < num_freq_bands_diff; l++ ) + { + Cldfb_buffer_real_fx[k][slot_idx][l] = *( p_proto_diff_fx++ ); + Cldfb_buffer_imag_fx[k][slot_idx][l] = *( p_proto_diff_fx++ ); + } } - if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + return; +} +#else +static void ivas_param_mc_dec_copy_diffuse_proto( + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (real part) */ + float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (imaginary part) */ + const int16_t nY, /* i : number of decorrelated channels */ + const int16_t slot_idx /* i : current time slot index */ +) +{ + int16_t k, l; + int16_t num_freq_bands, num_freq_bands_diff; + float *p_proto_diff; + + num_freq_bands = hParamMC->num_freq_bands; + num_freq_bands_diff = hParamMC->h_output_synthesis_params.max_band_decorr; + + for ( k = 0; k < nY; k++ ) { - ivas_mc2sba( st_ivas->hIntSetup, output_f, output_f, hParamMC->num_freq_bands * slots_to_render, st_ivas->hOutSetup.ambisonics_order, 0.f ); + p_proto_diff = hParamMC->proto_frame_dec_f + k * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands_diff; l++ ) + { + Cldfb_buffer_real[k][slot_idx][l] = *( p_proto_diff++ ); + Cldfb_buffer_imag[k][slot_idx][l] = *( p_proto_diff++ ); + } } - /* update */ - if ( hParamMC->slots_rendered == hParamMC->num_slots ) + return; +} +#endif + +/*------------------------------------------------------------------------- + * ivas_param_mc_bin2dec() + * + * decode a number of bits to an integer + *------------------------------------------------------------------------*/ +/* r : decoded integer */ +static int16_t ivas_param_mc_bin2dec( + uint16_t bits[PARAM_MC_MAX_BITS], /* i : bit buffer */ + const int16_t N /* i : number of bits to decode */ +) +{ + int16_t i; + int16_t out; + + assert( N <= 16 ); + out = 0; + for ( i = 0; i < N; i++ ) { - hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth; - param_mc_update_mixing_matrices( hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_transport, nchan_out_cov ); + out += ( bits[i] << ( N - 1 - i ) ); } - hParamMC->subframes_rendered = last_sf; - *nSamplesAvailableNext = ( hParamMC->num_slots - hParamMC->slots_rendered ) * NS2SA( output_Fs, CLDFB_SLOT_NS ); - pop_wmops(); - return; + return out; } /*------------------------------------------------------------------------- - * ivas_param_mc_dec() + * ivas_param_mc_uniform_decoder() * - * Parametric MC decoding process + * decode a uniformily coded sequence of float values *------------------------------------------------------------------------*/ - -void ivas_param_mc_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +#ifdef IVAS_FLOAT_FIXED +static Word16 ivas_param_mc_uniform_decoder_fx( + Word16 *seq, /* o : decoded sequence of float values */ + const Word16 sz_seq, /* i : number of values to decode */ + const Word16 *alphabet, /* i : codebook */ + const Word16 N, /* i : number of bits per coded index */ + UWord16 bit_buffer[PARAM_MC_MAX_BITS] /* i : bit buffer to decode */ ) { - PARAM_MC_DEC_HANDLE hParamMC; - float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; - uint16_t nSamplesAsked, nSamplesAvailableNext, nSamplesRendered; + Word16 i; + Word16 idx; + Word16 n_bits; - hParamMC = st_ivas->hParamMC; - assert( hParamMC ); - push_wmops( "param_mc_dec" ); + n_bits = 0; + assert( N * sz_seq < PARAM_MC_MAX_BITS ); - /* set some handle pointers to the stack buffers */ - hParamMC->Cldfb_RealBuffer_tc = Cldfb_RealBuffer_in; - hParamMC->Cldfb_ImagBuffer_tc = Cldfb_ImagBuffer_in; + FOR ( i = 0; i < sz_seq; ++i ) + { + idx = ivas_param_mc_bin2dec( &bit_buffer[i * N], N ); + seq[i] = alphabet[idx]; + } - nSamplesAsked = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); - ivas_param_mc_dec_digest_tc( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS, output_f ); - ivas_param_mc_dec_render( st_ivas, nSamplesAsked, &nSamplesRendered, &nSamplesAvailableNext, output_f ); + n_bits = imult1616(N , sz_seq); - /* set handle pointers back to NULL */ - hParamMC->Cldfb_RealBuffer_tc = NULL; - hParamMC->Cldfb_ImagBuffer_tc = NULL; + return n_bits; +} +#endif // IVAS_FLOAT_FIXED - pop_wmops(); - return; +static int16_t ivas_param_mc_uniform_decoder( + float *seq, /* o : decoded sequence of float values */ + const int16_t sz_seq, /* i : number of values to decode */ + const float *alphabet, /* i : codebook */ + const int16_t N, /* i : number of bits per coded index */ + uint16_t bit_buffer[PARAM_MC_MAX_BITS] /* i : bit buffer to decode */ +) +{ + int16_t i; + int16_t idx; + int16_t n_bits; + + n_bits = 0; + assert( N * sz_seq < PARAM_MC_MAX_BITS ); + + for ( i = 0; i < sz_seq; ++i ) + { + idx = ivas_param_mc_bin2dec( &bit_buffer[i * N], N ); + seq[i] = alphabet[idx]; + } + + n_bits = N * sz_seq; + + return n_bits; } /*------------------------------------------------------------------------- - * param_mc_dec_init() + * ivas_param_mc_range_decoder_LC() * - * Parametric MC decoding initialization + * decode a sequency of inidices coded with a range coder *------------------------------------------------------------------------*/ -static void ivas_param_mc_dec_init( - PARAM_MC_DEC_HANDLE hParamMC, /* i/o: decoder DirAC handle */ - const int16_t nchan_transport, /* i : number of input (transport) channels */ - const int16_t nchan_cov ) /* i : number of cov synthesis channels */ +static Word16 ivas_param_mc_range_decoder_LC( + UWord16 *bit_buffer, /* i : bit buffer to read from */ + Word16 *x, /* o : decoded indices */ + Word16 *BER_detect, /* o : flag for indicating a bit error */ + const Word16 sz_seq, /* i : size of the sequence to be decoded */ + const Word16 sz_alphabet, /* i : size of the alphabet */ + const UWord16 *cft, /* i : cumulative frequency table */ + const UWord16 *sft, /* i : symbol frequency table */ + const Word16 tot_shift, /* i : total frequency as a power of 2 */ + const Word16 nbbits /* i : maximum bit budget */ +) { - int16_t k; - uint16_t max_param_band_residual; - int16_t len; + RangeUniDecState rc_st_dec; /* State of the range decoder */ + Word16 cur_bit_pos; + Word16 k; + Word16 r; - /*-----------------------------------------------------------------* - * init sub-modules - *-----------------------------------------------------------------*/ + /* Start Decoding */ + /* Initialize range decoder */ + cur_bit_pos = 0; +#ifdef IVAS_FLOAT_FIXED + rc_uni_dec_init_fx( &rc_st_dec, bit_buffer, nbbits - 32 ); /* (nbbits + 30) entries are read by the decoder */ +#else + rc_uni_dec_init( &rc_st_dec, bit_buffer, nbbits - 32 ); /* (nbbits + 30) entries are read by the decoder */ +#endif // IVAS_FLOAT_FIXED - /* decorrelation */ - if ( hParamMC->max_band_decorr > 0 ) + /* Main Loop through the indices */ + FOR ( k = 0; k < sz_seq; k++ ) { - len = hParamMC->diff_proto_info->num_protos_diff * hParamMC->h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; - - /* init onsetDetectionPower */ - set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1, len ); - set_zero( hParamMC->h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2, len ); - } +#ifdef IVAS_FLOAT_FIXED + r = rc_uni_dec_read_symbol_fastS_fx( &rc_st_dec, cft, sft, sz_alphabet, tot_shift ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */ + /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1} */ +#else + r = rc_uni_dec_read_symbol_fastS( &rc_st_dec, cft, sft, sz_alphabet, tot_shift ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */ + /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1} */ +#endif // IVAS_FLOAT_FIXED - max_param_band_residual = 0; + /* Update bitstream pointer */ + cur_bit_pos = rc_uni_dec_virtual_finish( &rc_st_dec ); - /* output synthesis */ - for ( k = hParamMC->hMetadataPMC->num_parameter_bands; k >= 0; k-- ) - { - if ( hParamMC->band_grouping[k] <= hParamMC->max_band_decorr ) + /* Confirm that there is no overflow */ + IF ( cur_bit_pos > nbbits ) { - max_param_band_residual = k; - break; + *BER_detect |= 1; } - } - ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); + x[k] = r; + } - /*-----------------------------------------------------------------* - * init proto frames - *-----------------------------------------------------------------*/ + /* We don't need to finish because virtual_finish() already does the same */ + /*st->next_bit_pos = rc_uni_dec_finish(&rc_st_dec);*/ - if ( hParamMC->max_band_decorr > 0 ) + /* Check for bitstream errors */ + IF ( rc_st_dec.bit_error_detected != 0 ) { - set_zero( hParamMC->proto_frame_f, 2 * hParamMC->diff_proto_info->num_protos_diff * hParamMC->num_freq_bands ); - set_zero( hParamMC->proto_frame_dec_f, 2 * nchan_cov * hParamMC->num_freq_bands ); -#ifdef IVAS_FLOAT_FIXED - set32_fx(hParamMC->proto_frame_dec_f_fx, 0, 2 * nchan_cov * hParamMC->num_freq_bands); -#endif + *BER_detect |= 1; } - return; + return cur_bit_pos; } /*------------------------------------------------------------------------- - * Local functions - *-------------------------------------------------------------------------*/ - - -/*------------------------------------------------------------------------- - * ivas_param_mc_dec_compute_diffuse_proto() + * param_mc_compute_interpolator() * - * Compute prototypes for decorrelation + * compute the interpolator used in the final synthesis *------------------------------------------------------------------------*/ - -static void param_mc_protoSignalComputation( - float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */ - float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */ - float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ - const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ - const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ +#ifdef IVAS_FLOAT_FIXED +static void ivas_param_mc_dec_compute_interpolator_fx( + const UWord16 bAttackPresent, /* i : flag indicating if we have a transient in the current frame */ + const UWord16 attackPos, /* i : position of the transient */ + const UWord16 interp_length, /* i : number of interpolation values to be calculated */ + Word16 *interpolator /* o : interpolator */ ) { - int16_t band; - int16_t proto_ch_idx, source_ch_cnt; - float *p_proto_frame; - float *p_real_buffer; - float *p_imag_buffer; + Word16 idx; - set_zero( proto_frame_f, 2 * num_freq_bands * diff_proto_info->num_protos_diff ); + IF ( bAttackPresent ) + { + FOR ( idx = 0; idx < 2 * attackPos; idx++ ) + { + interpolator[idx] = 0; + move16(); + } + FOR ( ; idx < interp_length; idx++ ) + { + interpolator[idx] = 32767;/*1.0f Q15*/ + move16(); + } + } + ELSE + { +#ifdef IVAS_FLOAT_FIXED + ivas_jbm_dec_get_adapted_linear_interpolator_fx( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); +#else + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); +#endif // IVAS_FLOAT_FIXED + + } + + return; +} +#endif // IVAS_FLOAT_FIXED + +static void ivas_param_mc_dec_compute_interpolator( + const uint16_t bAttackPresent, /* i : flag indicating if we have a transient in the current frame */ + const uint16_t attackPos, /* i : position of the transient */ + const uint16_t interp_length, /* i : number of interpolation values to be calculated */ + float *interpolator /* o : interpolator */ +) +{ + int16_t idx; - for ( proto_ch_idx = 0; proto_ch_idx < diff_proto_info->num_protos_diff; proto_ch_idx++ ) + if ( bAttackPresent ) { - int16_t num_source_ch = diff_proto_info->num_source_chan_diff[proto_ch_idx]; - - for ( source_ch_cnt = 0; source_ch_cnt < num_source_ch; source_ch_cnt++ ) + for ( idx = 0; idx < 2 * attackPos; idx++ ) { - float fac = diff_proto_info->proto_fac[proto_ch_idx][source_ch_cnt]; - int16_t source_ch_idx = diff_proto_info->source_chan_idx[proto_ch_idx][source_ch_cnt]; - - p_proto_frame = &proto_frame_f[proto_ch_idx * num_freq_bands * 2]; - p_real_buffer = &RealBuffer[source_ch_idx * num_freq_bands]; - p_imag_buffer = &ImagBuffer[source_ch_idx * num_freq_bands]; - - for ( band = 0; band < num_freq_bands; band++ ) - { - *( p_proto_frame++ ) += fac * ( *( p_real_buffer++ ) ); - *( p_proto_frame++ ) += fac * ( *( p_imag_buffer++ ) ); - } + interpolator[idx] = 0.0f; + } + for ( ; idx < interp_length; idx++ ) + { + interpolator[idx] = 1.0f; } } + else + { + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); + } return; } /*------------------------------------------------------------------------- - * ivas_param_mc_dec_compute_diffuse_proto() + * remove_lfe_from_cy() * - * Transfer decorrelated signals back from the decorrelator buffer to - * the buffers used in the final synthesis + * remove all LFE related values from a covariance matrix *------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -static void ivas_param_mc_dec_copy_diffuse_proto( - PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ - Word32 Cldfb_buffer_real_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (real part) */ - Word32 Cldfb_buffer_imag_fx[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (imaginary part) */ - const Word16 nY, /* i : number of decorrelated channels */ - const Word16 slot_idx /* i : current time slot index */ -) + +static void remove_lfe_from_cy( + const int16_t nY, /* i : dimension of the covariance matrix */ + int16_t lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP], /* i : LFE index */ + int16_t num_lfe, /* i : number of LFEs */ + float *cy, /* i : covariance matrix */ + float *cy_woLFE ) /* o : covariance matrix with LFE removed */ { - Word16 k, l; - Word16 num_freq_bands, num_freq_bands_diff; - Word32 *p_proto_diff_fx; - num_freq_bands = hParamMC->num_freq_bands; - num_freq_bands_diff = hParamMC->h_output_synthesis_params.max_band_decorr; + int16_t ch_idx1, ch_idx2; + int16_t lfe_idx1, lfe_idx2; + float *ptrCy; + float *ptrCy_out; - FOR( k = 0; k < nY; k++ ) - { - p_proto_diff_fx = hParamMC->proto_frame_dec_f_fx + imult1616( shl( k, 1 ), num_freq_bands ); + ptrCy = cy; + ptrCy_out = cy_woLFE; - FOR( l = 0; l < num_freq_bands_diff; l++ ) + for ( lfe_idx1 = 0; lfe_idx1 < num_lfe + 1; lfe_idx1++ ) + { + for ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) { - Cldfb_buffer_real_fx[k][slot_idx][l] = *( p_proto_diff_fx++ ); - Cldfb_buffer_imag_fx[k][slot_idx][l] = *( p_proto_diff_fx++ ); + for ( lfe_idx2 = 0; lfe_idx2 < num_lfe + 1; lfe_idx2++ ) + { + for ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) + { + *( ptrCy_out++ ) = *( ptrCy++ ); + } + ptrCy++; + } + ptrCy--; } + ptrCy += nY; } return; } -#else -static void ivas_param_mc_dec_copy_diffuse_proto( - PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ - float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (real part) */ - float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : CLDFB buffer used in the final synthesis (imaginary part) */ - const int16_t nY, /* i : number of decorrelated channels */ - const int16_t slot_idx /* i : current time slot index */ + +#ifdef IVAS_FLOAT_FIXED +static void remove_lfe_from_cy_fx( + const Word16 nY, /* i : dimension of the covariance matrix */ + Word16 lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP], /* i : LFE index */ + Word16 num_lfe, /* i : number of LFEs */ + Word32 *cy, /* i : covariance matrix */ + Word32 *cy_woLFE /* o : covariance matrix with LFE removed */ ) { - int16_t k, l; - int16_t num_freq_bands, num_freq_bands_diff; - float *p_proto_diff; + Word16 ch_idx1, ch_idx2; + Word16 lfe_idx1, lfe_idx2; + Word32 *ptrCy; + Word32 *ptrCy_out; - num_freq_bands = hParamMC->num_freq_bands; - num_freq_bands_diff = hParamMC->h_output_synthesis_params.max_band_decorr; + ptrCy = cy; + ptrCy_out = cy_woLFE; - for ( k = 0; k < nY; k++ ) + FOR ( lfe_idx1 = 0; lfe_idx1 < num_lfe + 1; lfe_idx1++ ) { - p_proto_diff = hParamMC->proto_frame_dec_f + k * 2 * num_freq_bands; - for ( l = 0; l < num_freq_bands_diff; l++ ) + FOR ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) { - Cldfb_buffer_real[k][slot_idx][l] = *( p_proto_diff++ ); - Cldfb_buffer_imag[k][slot_idx][l] = *( p_proto_diff++ ); + FOR ( lfe_idx2 = 0; lfe_idx2 < num_lfe + 1; lfe_idx2++ ) + { + FOR ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) + { + *( ptrCy_out++ ) = *( ptrCy++ ); + move32(); + } + ptrCy++; + } + ptrCy--; } + ptrCy += nY; } return; } #endif + /*------------------------------------------------------------------------- - * ivas_param_mc_bin2dec() + * ivas_param_mc_get_mixing_matrices() * - * decode a number of bits to an integer + * calculate the direct and residual mixing matrices + * using the covariance method *------------------------------------------------------------------------*/ -/* r : decoded integer */ -static int16_t ivas_param_mc_bin2dec( - uint16_t bits[PARAM_MC_MAX_BITS], /* i : bit buffer */ - const int16_t N /* i : number of bits to decode */ + +static void ivas_param_mc_get_mixing_matrices( + PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, + float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ + const int16_t nY_intern, /* i : number of channels in the transported format */ + const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov /* i : number of covariance synthesis output channels */ ) { - int16_t i; - int16_t out; + int16_t param_band_idx; + float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float Cy[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float Cy_diag[MAX_CICP_CHANNELS]; + float Cr[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float Cproto_diag[MAX_CICP_CHANNELS]; + float Cproto[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float mat_mult_buffer1[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float *Cx_state; + float *Cx_old_state; + float Cy_state[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float *Cy_old_state; + int16_t nY_band; + float proto_matrix_noLFE[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; + float *proto_matrix_ptr; + int16_t num_lfe_bands; + int16_t brange[2]; + uint16_t i; + int16_t ch_idx1, ch_idx2, lfe_idx1, lfe_idx2; + float *ptrMM; + float *ptrMM_out; + float Cy_full[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + float mixing_matrix_local[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float mixing_matrix_res_local[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + int16_t remove_lfe; + int16_t lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP]; - assert( N <= 16 ); - out = 0; - for ( i = 0; i < N; i++ ) + set_zero( Cproto, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( mat_mult_buffer1, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + set_zero( proto_matrix_noLFE, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); + + nY_band = nY_cov; + num_lfe_bands = 0; + remove_lfe = 0; + + set_s( lfe_indices, -1, PARAM_MC_LOCAL_SZ_LFE_MAP ); + if ( hSynthesisOutputSetup->num_lfe ) { - out += ( bits[i] << ( N - 1 - i ) ); - } + float *proto_matrix_ptr_in; + for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe; lfe_idx1++ ) + { + lfe_indices[lfe_idx1 + 1] = hSynthesisOutputSetup->index_lfe[lfe_idx1]; + } + lfe_indices[hSynthesisOutputSetup->num_lfe + 1] = nY_cov; + proto_matrix_ptr = &proto_matrix_noLFE[0]; + proto_matrix_ptr_in = &hParamMC->h_output_synthesis_params.proto_matrix[0]; + set_zero( proto_matrix_noLFE, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); - return out; -} + for ( ch_idx1 = 0; ch_idx1 < nX; ch_idx1++ ) + { + for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) + { + for ( ch_idx2 = lfe_indices[lfe_idx1] + 1; ch_idx2 < lfe_indices[lfe_idx1 + 1]; ch_idx2++ ) + { + *( proto_matrix_ptr++ ) = *( proto_matrix_ptr_in++ ); + } + proto_matrix_ptr_in++; + } + proto_matrix_ptr_in--; + } + } + if ( hParamMC->hMetadataPMC->lfe_on ) + { + num_lfe_bands = PARAM_MC_MAX_BAND_LFE; + } -/*------------------------------------------------------------------------- - * ivas_param_mc_uniform_decoder() - * - * decode a uniformily coded sequence of float values - *------------------------------------------------------------------------*/ + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + if ( hSynthesisOutputSetup->num_lfe > 0 && param_band_idx >= num_lfe_bands ) + { + remove_lfe = 1; + nY_band = nY_cov - hSynthesisOutputSetup->num_lfe; + proto_matrix_ptr = proto_matrix_noLFE; + } + else + { + proto_matrix_ptr = hParamMC->h_output_synthesis_params.proto_matrix; + } -static int16_t ivas_param_mc_uniform_decoder( - float *seq, /* o : decoded sequence of float values */ - const int16_t sz_seq, /* i : number of values to decode */ - const float *alphabet, /* i : codebook */ - const int16_t N, /* i : number of bits per coded index */ - uint16_t bit_buffer[PARAM_MC_MAX_BITS] /* i : bit buffer to decode */ -) -{ - int16_t i; - int16_t idx; - int16_t n_bits; + brange[0] = hParamMC->band_grouping[param_band_idx]; + brange[1] = hParamMC->band_grouping[param_band_idx + 1]; - n_bits = 0; - assert( N * sz_seq < PARAM_MC_MAX_BITS ); + Cx_state = Cx_in[param_band_idx]; + Cx_old_state = hParamMC->h_output_synthesis_cov_state.cx_old[param_band_idx]; + Cy_old_state = hParamMC->h_output_synthesis_cov_state.cy_old[param_band_idx]; - for ( i = 0; i < sz_seq; ++i ) - { - idx = ivas_param_mc_bin2dec( &bit_buffer[i * N], N ); - seq[i] = alphabet[idx]; - } + /* Getting mixing mtx */ + /* estimate target cov from input cov and proto_matrix */ + matrix_product( hParamMC->proto_matrix_int, nY_intern, nX, 0, Cx_state, nX, nX, 0, mat_mult_buffer1 ); - n_bits = N * sz_seq; + matrix_product( mat_mult_buffer1, nY_intern, nX, 0, hParamMC->proto_matrix_int, nY_intern, nX, 1, Cproto ); - return n_bits; -} + for ( ch_idx1 = 0; ch_idx1 < nY_intern; ch_idx1++ ) + { + if ( Cproto[ch_idx1 + ch_idx1 * nY_intern] < 0.0f ) + { + Cproto[ch_idx1 + ch_idx1 * nY_intern] = 0.0f; + } + } +#ifdef IVAS_FLOAT_FIXED + Word16 matSize = MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS; + Word16 *icld_q_fx; + Word16 *icc_q_fx; + Word32 *Cx_state_fx; + Word16 Cx_state_e; + Word32 *Cproto_fx; + Word16 Cproto_e; + Word32 *Cy_state_fx; + Word16 Cy_state_e; -/*------------------------------------------------------------------------- - * ivas_param_mc_range_decoder_LC() - * - * decode a sequency of inidices coded with a range coder - *------------------------------------------------------------------------*/ + icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( Word16 ) ); + icc_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( Word16 ) ); -static int16_t ivas_param_mc_range_decoder_LC( - uint16_t *bit_buffer, /* i : bit buffer to read from */ - int16_t *x, /* o : decoded indices */ - int16_t *BER_detect, /* o : flag for indicating a bit error */ - const int16_t sz_seq, /* i : size of the sequence to be decoded */ - const int16_t sz_alphabet, /* i : size of the alphabet */ - const uint16_t *cft, /* i : cumulative frequency table */ - const uint16_t *sft, /* i : symbol frequency table */ - const int16_t tot_shift, /* i : total frequency as a power of 2 */ - const int16_t nbbits /* i : maximum bit budget */ -) -{ - RangeUniDecState rc_st_dec; /* State of the range decoder */ - int16_t cur_bit_pos; - int16_t k; - int16_t r; + Cx_state_fx = (Word32 *) malloc( PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS * sizeof( Word32 ) ); + Cproto_fx = (Word32 *) malloc( MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS * sizeof( Word32 ) ); + Cy_state_fx = (Word32 *) malloc( MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS * sizeof( Word32 ) ); - /* Start Decoding */ - /* Initialize range decoder */ - cur_bit_pos = 0; -#ifdef IVAS_FLOAT_FIXED - rc_uni_dec_init_fx( &rc_st_dec, bit_buffer, nbbits - 32 ); /* (nbbits + 30) entries are read by the decoder */ -#else - rc_uni_dec_init( &rc_st_dec, bit_buffer, nbbits - 32 ); /* (nbbits + 30) entries are read by the decoder */ -#endif // IVAS_FLOAT_FIXED + f2me_buf( Cx_state, Cx_state_fx, &Cx_state_e, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + f2me_buf( Cproto, Cproto_fx, &Cproto_e, MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); - /* Main Loop through the indices */ - for ( k = 0; k < sz_seq; k++ ) - { -#ifdef IVAS_FLOAT_FIXED - r = rc_uni_dec_read_symbol_fastS_fx( &rc_st_dec, cft, sft, sz_alphabet, tot_shift ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */ - /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1} */ -#else - r = rc_uni_dec_read_symbol_fastS( &rc_st_dec, cft, sft, sz_alphabet, tot_shift ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */ - /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1} */ -#endif // IVAS_FLOAT_FIXED + set32_fx( Cy_state_fx, 0, matSize ); + Cy_state_e = 0; - /* Update bitstream pointer */ - cur_bit_pos = rc_uni_dec_virtual_finish( &rc_st_dec ); + //if ( synth_config == PARAM_MC_SYNTH_LS_CONV_COV ) + //{ + // f2me_buf( hParamMC->ls_conv_dmx_matrix, hParamMC->ls_conv_dmx_matrix_fx, &hParamMC->ls_conv_dmx_e, nY_cov * nY_intern ); + //} - /* Confirm that there is no overflow */ - if ( cur_bit_pos > nbbits ) + floatToFixed_arr( hParamMC->icld_q, icld_q_fx, 8, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + for ( int lp = 0; lp < hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; lp++ ) { - *BER_detect |= 1; + icc_q_fx[lp] = (Word16)(hParamMC->icc_q[lp] * 32767); } - x[k] = r; - } + ivas_param_mc_dequantize_cov_fx( hParamMC, + icld_q_fx + param_band_idx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe, + icc_q_fx + param_band_idx * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe, + param_band_idx, nY_cov, + synth_config, + nY_intern, + nX, Cx_state_fx, Cx_state_e, Cproto_fx, Cproto_e, Cy_state_fx, &Cy_state_e ); - /* We don't need to finish because virtual_finish() already does the same */ - /*st->next_bit_pos = rc_uni_dec_finish(&rc_st_dec);*/ + me2f_buf( Cy_state_fx, Cy_state_e, Cy_state, nY_intern * nY_intern ); + // dbgwrite2_txt(Cy_state_fx,nY_intern*nY_intern,"../cy_state_fx.txt"); - /* Check for bitstream errors */ - if ( rc_st_dec.bit_error_detected != 0 ) - { - *BER_detect |= 1; - } + free( icld_q_fx ); + free( icc_q_fx ); + free( Cx_state_fx ); + free( Cproto_fx ); + free( Cy_state_fx ); +#else + ivas_param_mc_dequantize_cov( hParamMC, + hParamMC->icld_q + param_band_idx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe, + hParamMC->icc_q + param_band_idx * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe, + param_band_idx, nY_cov, + synth_config, + nY_intern, + nX, Cx_state, Cproto, Cy_state ); + //dbgwrite2_txt(Cy_state_fx,nY_intern*nY_intern,"../cy_state.txt"); +#endif - return cur_bit_pos; -} + /* Smoothing: Sum over two buffers */ + if ( hParamMC->hMetadataPMC->bAttackPresent ) + { + /* no smoothing on attacks */ + mvr2r( Cx_state, Cx, nX * nX ); + mvr2r( Cy_state, Cy_full, nY_cov * nY_cov ); + } + else + { + /* smoothing gains are now identical to one, simply add up */ + v_add( Cx_state, Cx_old_state, Cx, nX * nX ); + v_add( Cy_state, Cy_old_state, Cy_full, nY_cov * nY_cov ); + } + /* cov buffer update */ + mvr2r( Cx_state, Cx_old_state, nX * nX ); + mvr2r( Cy_state, Cy_old_state, nY_cov * nY_cov ); -/*------------------------------------------------------------------------- - * param_mc_compute_interpolator() - * - * compute the interpolator used in the final synthesis - *------------------------------------------------------------------------*/ + /* remove LFE if necessary */ + if ( remove_lfe ) + { #ifdef IVAS_FLOAT_FIXED -static void ivas_param_mc_dec_compute_interpolator_fx( - const UWord16 bAttackPresent, /* i : flag indicating if we have a transient in the current frame */ - const UWord16 attackPos, /* i : position of the transient */ - const UWord16 interp_length, /* i : number of interpolation values to be calculated */ - Word16 *interpolator /* o : interpolator */ -) -{ - Word16 idx; + Word32 *Cy_full_fx = (Word32 *) malloc( MAX_CICP_CHANNELS * MAX_CICP_CHANNELS * sizeof( Word32 ) ); + Word16 Cy_full_e; + Word32 *Cy_fx = (Word32 *) malloc( MAX_CICP_CHANNELS * MAX_CICP_CHANNELS * sizeof( Word32 ) ); + Word16 Cy_e; - IF ( bAttackPresent ) - { - FOR ( idx = 0; idx < 2 * attackPos; idx++ ) - { - interpolator[idx] = 0; - move16(); + f2me_buf( Cy_full, Cy_full_fx, &Cy_full_e, nY_cov*nY_cov ); + Cy_e = Cy_full_e; + + remove_lfe_from_cy_fx( nY_cov, lfe_indices, hSynthesisOutputSetup->num_lfe, Cy_full_fx, Cy_fx ); + + me2f_buf( Cy_fx, Cy_e, Cy, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + + free( Cy_full_fx ); + free( Cy_fx ); +#else + remove_lfe_from_cy( nY_cov, lfe_indices, hSynthesisOutputSetup->num_lfe, Cy_full, Cy ); +#endif } - FOR ( ; idx < interp_length; idx++ ) + else { - interpolator[idx] = 32767;/*1.0f Q15*/ - move16(); + mvr2r( Cy_full, Cy, nY_band * nY_band ); } - } - ELSE - { + + matrix_product( proto_matrix_ptr, nY_band, nX, 0, Cx, nX, nX, 0, mat_mult_buffer1 ); + #ifdef IVAS_FLOAT_FIXED - ivas_jbm_dec_get_adapted_linear_interpolator_fx( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); -#else - ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); -#endif // IVAS_FLOAT_FIXED + Word32 mat_mult_buffer1_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word32 proto_matrix_ptr_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; + Word32 Cproto_diag_fx[MAX_CICP_CHANNELS]; + Word16 mat_mult_buffer1_e, proto_matrix_ptr_e, Cproto_diag_e; - } + Word16 guard_bits = find_guarded_bits_fx( nY_band + 1 ); - return; -} -#endif // IVAS_FLOAT_FIXED + f2me_buf( mat_mult_buffer1, mat_mult_buffer1_fx, &mat_mult_buffer1_e, nY_band * nX ); + f2me_buf( proto_matrix_ptr, proto_matrix_ptr_fx, &proto_matrix_ptr_e, nY_band * nX ); -static void ivas_param_mc_dec_compute_interpolator( - const uint16_t bAttackPresent, /* i : flag indicating if we have a transient in the current frame */ - const uint16_t attackPos, /* i : position of the transient */ - const uint16_t interp_length, /* i : number of interpolation values to be calculated */ - float *interpolator /* o : interpolator */ -) -{ - int16_t idx; + for ( i = 0; i < nY_band * nX; ++i ) + { + if ( mat_mult_buffer1_e > proto_matrix_ptr_e ) + { + proto_matrix_ptr_fx[i] = L_shr( proto_matrix_ptr_fx[i], guard_bits ); + } + else + { + mat_mult_buffer1_fx[i] = L_shr( mat_mult_buffer1_fx[i], guard_bits ); + } + } - if ( bAttackPresent ) - { - for ( idx = 0; idx < 2 * attackPos; idx++ ) + if ( mat_mult_buffer1_e > proto_matrix_ptr_e ) { - interpolator[idx] = 0.0f; + proto_matrix_ptr_e += guard_bits; } - for ( ; idx < interp_length; idx++ ) + else { - interpolator[idx] = 1.0f; + mat_mult_buffer1_e += guard_bits; } - } - else - { - ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); - } - - return; -} + matrix_product_diag_fx(mat_mult_buffer1_fx, mat_mult_buffer1_e, nY_band, nX, 0, proto_matrix_ptr_fx, proto_matrix_ptr_e, nY_band, nX, 1, Cproto_diag_fx,&Cproto_diag_e); -/*------------------------------------------------------------------------- - * remove_lfe_from_cy() - * - * remove all LFE related values from a covariance matrix - *------------------------------------------------------------------------*/ + me2f_buf(Cproto_diag_fx, Cproto_diag_e, Cproto_diag, nY_band); +#else + matrix_product_diag( mat_mult_buffer1, nY_band, nX, 0, proto_matrix_ptr, nY_band, nX, 1, Cproto_diag ); +#endif -static void remove_lfe_from_cy( - const int16_t nY, /* i : dimension of the covariance matrix */ - int16_t lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP], /* i : LFE index */ - int16_t num_lfe, /* i : number of LFEs */ - float *cy, /* i : covariance matrix */ - float *cy_woLFE ) /* o : covariance matrix with LFE removed */ -{ - int16_t ch_idx1, ch_idx2; - int16_t lfe_idx1, lfe_idx2; - float *ptrCy; - float *ptrCy_out; + /* make sure we have no negative entries in Cproto_diag due to rounding errors */ + for ( ch_idx1 = 0; ch_idx1 < nY_band; ch_idx1++ ) + { + if ( Cproto_diag[ch_idx1] < 0.0f ) + { + Cproto_diag[ch_idx1] = 0.0f; + } + } - ptrCy = cy; - ptrCy_out = cy_woLFE; + /* Computing the mixing matrices */ - for ( lfe_idx1 = 0; lfe_idx1 < num_lfe + 1; lfe_idx1++ ) - { - for ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) + /* bands with decorr */ + if ( brange[0] < hParamMC->h_output_synthesis_params.max_band_decorr ) { - for ( lfe_idx2 = 0; lfe_idx2 < num_lfe + 1; lfe_idx2++ ) + computeMixingMatrices( nX, nY_band, Cx, Cy, proto_matrix_ptr, 0, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_local, Cr ); + + /* Compute mixing matrix for residual */ + computeMixingMatricesResidual( nY_band, Cproto_diag, Cr, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_res_local ); + + if ( remove_lfe ) { - for ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) + set_zero( mixing_matrix_res[param_band_idx], nY_cov * nY_cov ); + + ptrMM = mixing_matrix_res_local; + ptrMM_out = mixing_matrix_res[param_band_idx]; + for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) { - *( ptrCy_out++ ) = *( ptrCy++ ); + for ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) + { + for ( lfe_idx2 = 0; lfe_idx2 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx2++ ) + { + for ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) + { + *( ptrMM_out++ ) = *( ptrMM++ ); + } + ptrMM_out++; + } + ptrMM_out--; + } + ptrMM_out += nY_cov; } - ptrCy++; } - ptrCy--; + else + { + mvr2r( mixing_matrix_res_local, mixing_matrix_res[param_band_idx], nY_cov * nY_cov ); + } } - ptrCy += nY; - } - - return; -} + else if ( brange[0] < hParamMC->max_band_energy_compensation ) + { + /* Compute mixing matrices (energy compensation only) */ + computeMixingMatrices( nX, nY_band, Cx, Cy, proto_matrix_ptr, 1, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_local, Cr ); + } + else + { + /*if neither decorrelation nor energy compensation is applied*/ + for ( i = 0; i < nY_band; i++ ) + { + Cy_diag[i] = Cy[i + nY_band * i]; + Cy_diag[i] = sqrtf( Cy_diag[i] / ( Cproto_diag[i] + EPSILON ) ); + } #ifdef IVAS_FLOAT_FIXED -static void remove_lfe_from_cy_fx( - const Word16 nY, /* i : dimension of the covariance matrix */ - Word16 lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP], /* i : LFE index */ - Word16 num_lfe, /* i : number of LFEs */ - Word32 *cy, /* i : covariance matrix */ - Word32 *cy_woLFE /* o : covariance matrix with LFE removed */ -) -{ - Word16 ch_idx1, ch_idx2; - Word16 lfe_idx1, lfe_idx2; - Word32 *ptrCy; - Word32 *ptrCy_out; + Word32 Cy_diag_fx[MAX_OUTPUT_CHANNELS]; + Word32 mixing_matrix_local_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word16 Cy_diag_e, mixing_matrix_local_e; - ptrCy = cy; - ptrCy_out = cy_woLFE; + f2me_buf( Cy_diag, Cy_diag_fx, &Cy_diag_e, nY_band ); + f2me_buf( proto_matrix_ptr, proto_matrix_ptr_fx, &proto_matrix_ptr_e, nY_band * nX ); - FOR ( lfe_idx1 = 0; lfe_idx1 < num_lfe + 1; lfe_idx1++ ) - { - FOR ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) + diag_matrix_product_fx( Cy_diag_fx, Cy_diag_e, nY_band, proto_matrix_ptr_fx, proto_matrix_ptr_e, nY_band, nX, 0, mixing_matrix_local_fx, &mixing_matrix_local_e ); + + me2f_buf( mixing_matrix_local_fx, mixing_matrix_local_e, mixing_matrix_local, nY_band * nX ); +#else + diag_matrix_product( Cy_diag, nY_band, proto_matrix_ptr, nY_band, nX, 0, mixing_matrix_local ); +#endif + } + if ( remove_lfe ) { - FOR ( lfe_idx2 = 0; lfe_idx2 < num_lfe + 1; lfe_idx2++ ) + set_zero( mixing_matrix[param_band_idx], nX * nY_cov ); + + ptrMM = mixing_matrix_local; + ptrMM_out = mixing_matrix[param_band_idx]; + for ( ch_idx1 = 0; ch_idx1 < nX; ch_idx1++ ) { - FOR ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) + for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) { - *( ptrCy_out++ ) = *( ptrCy++ ); - move32(); + for ( ch_idx2 = lfe_indices[lfe_idx1] + 1; ch_idx2 < lfe_indices[lfe_idx1 + 1]; ch_idx2++ ) + { + *( ptrMM_out++ ) = *( ptrMM++ ); + } + ptrMM_out++; } - ptrCy++; + ptrMM_out--; } - ptrCy--; } - ptrCy += nY; + else + { + mvr2r( mixing_matrix_local, mixing_matrix[param_band_idx], nY_cov * nX ); + } } return; } -#endif -/*------------------------------------------------------------------------- - * ivas_param_mc_get_mixing_matrices() - * - * calculate the direct and residual mixing matrices - * using the covariance method - *------------------------------------------------------------------------*/ - -static void ivas_param_mc_get_mixing_matrices( +#ifdef IVAS_FLOAT_FIXED +static void ivas_param_mc_get_mixing_matrices_fx( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, - float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ - float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ - float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ - const int16_t nY_intern, /* i : number of channels in the transported format */ + Word32 Cx_in_fixed[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ + Word16 Cx_in_e, + Word32 *mixing_matrix_fx[], + Word16 *mixing_matrix_e, + Word32 *mixing_matrix_res_fx[], + Word16 *mixing_matrix_res_e, + const Word16 nY_intern, /* i : number of channels in the transported format */ const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ - const int16_t nX, /* i : number of transport channels */ - const int16_t nY_cov /* i : number of covariance synthesis output channels */ + const Word16 nX, /* i : number of transport channels */ + const Word16 nY_cov /* i : number of covariance synthesis output channels */ ) { - int16_t param_band_idx; - float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float Cy[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float Cy_diag[MAX_CICP_CHANNELS]; - float Cr[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float Cproto_diag[MAX_CICP_CHANNELS]; - float Cproto[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float mat_mult_buffer1[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float *Cx_state; - float *Cx_old_state; - float Cy_state[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float *Cy_old_state; - int16_t nY_band; - float proto_matrix_noLFE[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; - float *proto_matrix_ptr; - int16_t num_lfe_bands; - int16_t brange[2]; + Word16 matSize = MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS; + Word16 param_band_idx; + Word16 nY_band; + Word16 num_lfe_bands; + Word16 brange[2]; uint16_t i; - int16_t ch_idx1, ch_idx2, lfe_idx1, lfe_idx2; - float *ptrMM; - float *ptrMM_out; - float Cy_full[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float mixing_matrix_local[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float mixing_matrix_res_local[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - int16_t remove_lfe; - int16_t lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP]; + Word16 ch_idx1, ch_idx2, lfe_idx1, lfe_idx2; + Word16 remove_lfe; + Word16 lfe_indices[PARAM_MC_LOCAL_SZ_LFE_MAP]; - set_zero( Cproto, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - set_zero( mat_mult_buffer1, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - set_zero( proto_matrix_noLFE, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); + nY_band = nY_cov; + num_lfe_bands = 0; + remove_lfe = 0; + + Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word32 Cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + + Word32 Cy_full_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + + Word32 Cr_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 Cr_e; + Word32 Cy_diag_fx[MAX_OUTPUT_CHANNELS]; + Word16 Cy_diag_buff_e[MAX_OUTPUT_CHANNELS]; + Word32 mixing_matrix_local_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; + Word16 Cy_diag_e = 0, mixing_matrix_local_e = 0; + Word32 Cproto_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 Cproto_buff_e[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 Cproto_e; + Word32 *proto_matrix_ptr_fx; + Word32 *Cx_state_fx; + Word32 *Cx_old_state_fx; + Word32 Cy_state_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word32 *Cy_old_state_fx; + Word16 Cx_state_e; + Word16 Cy_state_e; + Word32 mixing_matrix_res_local_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + Word16 mixing_matrix_res_local_e; + Word32 L_tmp; + Word16 tmp_e, tmp; + + Word16 proto_matrix_e = hParamMC->h_output_synthesis_params.proto_matrix_e; + Word32 proto_matrix_noLFE_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; + + Word32 mat_mult_buffer1_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; + + Word32 Cproto_diag_fx[MAX_CICP_CHANNELS]; + Word16 mat_mult_buffer1_e, proto_matrix_ptr_e, Cproto_diag_e; + + Word32 *ptrMM_fx; + Word32 *ptrMM_out_fx; + + Word16 Cy_e, Cx_e; + Word16 Cy_full_e; + + set_zero_fx(Cproto_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS); + set_zero_fx(mat_mult_buffer1_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS); + set_zero_fx(proto_matrix_noLFE_fx, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS); + Word16 proto_matrix_noLFE_e = 0; + + Word16 guard_bit_cx = find_guarded_bits_fx(nY_intern + 1); + Word16 guard_bit_cy = find_guarded_bits_fx(nY_cov * nY_cov); + Word32 Cx_in_fx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + + + FOR (i = 0; i < PARAM_MC_MAX_PARAMETER_BANDS; i++) + Copy32(Cx_in_fixed[i], Cx_in_fx[i], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS); nY_band = nY_cov; num_lfe_bands = 0; remove_lfe = 0; set_s( lfe_indices, -1, PARAM_MC_LOCAL_SZ_LFE_MAP ); - if ( hSynthesisOutputSetup->num_lfe ) + IF ( hSynthesisOutputSetup->num_lfe ) { - float *proto_matrix_ptr_in; - for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe; lfe_idx1++ ) + Word32 *proto_matrix_ptr_in_fx; + FOR ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe; lfe_idx1++ ) { lfe_indices[lfe_idx1 + 1] = hSynthesisOutputSetup->index_lfe[lfe_idx1]; } lfe_indices[hSynthesisOutputSetup->num_lfe + 1] = nY_cov; - proto_matrix_ptr = &proto_matrix_noLFE[0]; - proto_matrix_ptr_in = &hParamMC->h_output_synthesis_params.proto_matrix[0]; - set_zero( proto_matrix_noLFE, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); + proto_matrix_ptr_fx = &proto_matrix_noLFE_fx[0]; + proto_matrix_ptr_in_fx = &hParamMC->h_output_synthesis_params.proto_matrix_fx[0]; + proto_matrix_noLFE_e = proto_matrix_e; + move16(); - for ( ch_idx1 = 0; ch_idx1 < nX; ch_idx1++ ) + set_zero_fx(proto_matrix_noLFE_fx, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS); + + FOR(ch_idx1 = 0; ch_idx1 < nX; ch_idx1++) { - for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) + FOR(lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++) { - for ( ch_idx2 = lfe_indices[lfe_idx1] + 1; ch_idx2 < lfe_indices[lfe_idx1 + 1]; ch_idx2++ ) + FOR(ch_idx2 = lfe_indices[lfe_idx1] + 1; ch_idx2 < lfe_indices[lfe_idx1 + 1]; ch_idx2++) { - *( proto_matrix_ptr++ ) = *( proto_matrix_ptr_in++ ); + *(proto_matrix_ptr_fx++) = *(proto_matrix_ptr_in_fx++); } - proto_matrix_ptr_in++; + proto_matrix_ptr_in_fx++; } - proto_matrix_ptr_in--; + proto_matrix_ptr_in_fx--; } + + proto_matrix_ptr_e = proto_matrix_e; + move16(); } - if ( hParamMC->hMetadataPMC->lfe_on ) + IF ( hParamMC->hMetadataPMC->lfe_on ) { num_lfe_bands = PARAM_MC_MAX_BAND_LFE; } - for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + FOR ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) { - if ( hSynthesisOutputSetup->num_lfe > 0 && param_band_idx >= num_lfe_bands ) + IF ( hSynthesisOutputSetup->num_lfe > 0 && param_band_idx >= num_lfe_bands ) { remove_lfe = 1; + move16(); nY_band = nY_cov - hSynthesisOutputSetup->num_lfe; - proto_matrix_ptr = proto_matrix_noLFE; + proto_matrix_ptr_fx = proto_matrix_noLFE_fx; + proto_matrix_ptr_e = proto_matrix_noLFE_e; + move16(); } - else + ELSE { - proto_matrix_ptr = hParamMC->h_output_synthesis_params.proto_matrix; + proto_matrix_ptr_fx = hParamMC->h_output_synthesis_params.proto_matrix_fx; + proto_matrix_ptr_e = hParamMC->h_output_synthesis_params.proto_matrix_e; + move16(); } brange[0] = hParamMC->band_grouping[param_band_idx]; + move16(); brange[1] = hParamMC->band_grouping[param_band_idx + 1]; + move16(); + + Cx_state_fx = Cx_in_fx[param_band_idx]; + Cx_old_state_fx = hParamMC->h_output_synthesis_cov_state.cx_old_fx[param_band_idx]; + Cy_old_state_fx = hParamMC->h_output_synthesis_cov_state.cy_old_fx[param_band_idx]; - Cx_state = Cx_in[param_band_idx]; - Cx_old_state = hParamMC->h_output_synthesis_cov_state.cx_old[param_band_idx]; - Cy_old_state = hParamMC->h_output_synthesis_cov_state.cy_old[param_band_idx]; /* Getting mixing mtx */ /* estimate target cov from input cov and proto_matrix */ - matrix_product( hParamMC->proto_matrix_int, nY_intern, nX, 0, Cx_state, nX, nX, 0, mat_mult_buffer1 ); - matrix_product( mat_mult_buffer1, nY_intern, nX, 0, hParamMC->proto_matrix_int, nY_intern, nX, 1, Cproto ); + Cx_state_e = Cx_in_e; + move16(); + matrix_product_fx(hParamMC->proto_matrix_int_fx, nY_intern, nX, 0, Cx_state_fx, nX, nX, 0, mat_mult_buffer1_fx); + mat_mult_buffer1_e = hParamMC->proto_matrix_int_e + Cx_in_e; - for ( ch_idx1 = 0; ch_idx1 < nY_intern; ch_idx1++ ) + matrix_product_fx(mat_mult_buffer1_fx, nY_intern, nX, 0, hParamMC->proto_matrix_int_fx, nY_intern, nX, 1, Cproto_fx); + Cproto_e = mat_mult_buffer1_e + hParamMC->proto_matrix_int_e; + move16(); + + + FOR (ch_idx1 = 0; ch_idx1 < nY_intern; ch_idx1++) { - if ( Cproto[ch_idx1 + ch_idx1 * nY_intern] < 0.0f ) + Cproto_buff_e[ch_idx1 + ch_idx1 * nY_intern] = Cproto_e; + IF (BASOP_Util_Cmp_Mant32Exp( Cproto_fx[ch_idx1 + ch_idx1 * nY_intern], Cproto_e, 0, 0 ) < 0 ) { - Cproto[ch_idx1 + ch_idx1 * nY_intern] = 0.0f; + Cproto_fx[ch_idx1 + ch_idx1 * nY_intern] = 0; + move32(); + Cproto_buff_e[ch_idx1 + ch_idx1 * nY_intern] = 0; + move16(); } } -#ifdef IVAS_FLOAT_FIXED - Word16 matSize = MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS; - Word16 *icld_q_fx; - Word16 *icc_q_fx; - Word32 *Cx_state_fx; - Word16 Cx_state_e; - Word32 *Cproto_fx; - Word16 Cproto_e; - Word32 *Cy_state_fx; - Word16 Cy_state_e; - - icld_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe * sizeof( Word16 ) ); - icc_q_fx = (Word16 *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( Word16 ) ); - - Cx_state_fx = (Word32 *) malloc( PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS * sizeof( Word32 ) ); - Cproto_fx = (Word32 *) malloc( MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS * sizeof( Word32 ) ); - Cy_state_fx = (Word32 *) malloc( MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS * sizeof( Word32 ) ); - - f2me_buf( Cx_state, Cx_state_fx, &Cx_state_e, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); - f2me_buf( Cproto, Cproto_fx, &Cproto_e, MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); - - set32_fx( Cy_state_fx, 0, matSize ); + set_zero_fx( Cy_state_fx, matSize ); Cy_state_e = 0; - - if ( synth_config == PARAM_MC_SYNTH_LS_CONV_COV ) - { - f2me_buf( hParamMC->ls_conv_dmx_matrix, hParamMC->ls_conv_dmx_matrix_fx, &hParamMC->ls_conv_dmx_e, nY_cov * nY_intern ); - } - - floatToFixed_arr( hParamMC->icld_q, icld_q_fx, 8, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - for ( int lp = 0; lp < hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; lp++ ) - { - icc_q_fx[lp] = (Word16)(hParamMC->icc_q[lp] * 32767); - } + move16(); ivas_param_mc_dequantize_cov_fx( hParamMC, - icld_q_fx + param_band_idx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe, - icc_q_fx + param_band_idx * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe, + hParamMC->icld_q_fx + param_band_idx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe, + hParamMC->icc_q_fx + param_band_idx * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe, param_band_idx, nY_cov, synth_config, nY_intern, nX, Cx_state_fx, Cx_state_e, Cproto_fx, Cproto_e, Cy_state_fx, &Cy_state_e ); - me2f_buf( Cy_state_fx, Cy_state_e, Cy_state, nY_intern * nY_intern ); // dbgwrite2_txt(Cy_state_fx,nY_intern*nY_intern,"../cy_state_fx.txt"); - free( icld_q_fx ); - free( icc_q_fx ); - free( Cx_state_fx ); - free( Cproto_fx ); - free( Cy_state_fx ); -#else - ivas_param_mc_dequantize_cov( hParamMC, - hParamMC->icld_q + param_band_idx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe, - hParamMC->icc_q + param_band_idx * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe, - param_band_idx, nY_cov, - synth_config, - nY_intern, - nX, Cx_state, Cproto, Cy_state ); - //dbgwrite2_txt(Cy_state_fx,nY_intern*nY_intern,"../cy_state.txt"); -#endif - /* Smoothing: Sum over two buffers */ - if ( hParamMC->hMetadataPMC->bAttackPresent ) + IF ( hParamMC->hMetadataPMC->bAttackPresent ) { /* no smoothing on attacks */ - mvr2r( Cx_state, Cx, nX * nX ); - mvr2r( Cy_state, Cy_full, nY_cov * nY_cov ); + Copy32(Cx_state_fx, Cx_fx, nX * nX); + Copy32(Cy_state_fx, Cy_full_fx, nY_cov * nY_cov); + Cy_full_e = Cy_state_e; + move16(); + Cx_e = Cx_state_e; + move16(); } - else + ELSE { /* smoothing gains are now identical to one, simply add up */ - v_add( Cx_state, Cx_old_state, Cx, nX * nX ); - v_add( Cy_state, Cy_old_state, Cy_full, nY_cov * nY_cov ); + //v_add( Cy_state, Cy_old_state, Cy_full, nY_cov * nY_cov ); + + tmp_e = max(hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx], Cx_state_e) + guard_bit_cx; + FOR(i = 0; i < nX * nX; i++) + { + Cx_old_state_fx[i] = L_shr(Cx_old_state_fx[i], tmp_e - hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx]); + Cx_state_fx[i] = L_shr(Cx_state_fx[i], tmp_e - Cx_state_e); + } + + hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx] = tmp_e; + Cx_state_e = tmp_e; + move16(); + tmp_e = max(hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx], Cy_state_e) + guard_bit_cy; + FOR(i = 0; i < nY_cov * nY_cov; i++) + { + Cy_old_state_fx[i] = L_shr(Cy_old_state_fx[i], tmp_e - hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx]); + Cy_state_fx[i] = L_shr(Cy_state_fx[i], tmp_e - Cy_state_e); + } + + hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx] = tmp_e; + Cy_state_e = tmp_e; + move16(); + + v_add_32(Cx_state_fx, Cx_old_state_fx, Cx_fx, nX * nX); + v_add_32(Cy_state_fx, Cy_old_state_fx, Cy_full_fx, nY_cov * nY_cov); + + Cy_full_e = Cy_state_e; + move16(); + Cx_e = Cx_state_e; + move16(); + } - /* cov buffer update */ - mvr2r( Cx_state, Cx_old_state, nX * nX ); - mvr2r( Cy_state, Cy_old_state, nY_cov * nY_cov ); + Copy32(Cx_state_fx, Cx_old_state_fx, nX * nX); - /* remove LFE if necessary */ - if ( remove_lfe ) - { -#ifdef IVAS_FLOAT_FIXED - Word32 *Cy_full_fx = (Word32 *) malloc( MAX_CICP_CHANNELS * MAX_CICP_CHANNELS * sizeof( Word32 ) ); - Word16 Cy_full_e; - Word32 *Cy_fx = (Word32 *) malloc( MAX_CICP_CHANNELS * MAX_CICP_CHANNELS * sizeof( Word32 ) ); - Word16 Cy_e; + Copy32(Cy_state_fx, Cy_old_state_fx, nY_cov * nY_cov); - f2me_buf( Cy_full, Cy_full_fx, &Cy_full_e, nY_cov*nY_cov ); - Cy_e = Cy_full_e; + hParamMC->h_output_synthesis_cov_state.cx_old_e[param_band_idx] = Cx_state_e; + move16(); + hParamMC->h_output_synthesis_cov_state.cy_old_e[param_band_idx] = Cy_state_e; + move16(); - remove_lfe_from_cy_fx( nY_cov, lfe_indices, hSynthesisOutputSetup->num_lfe, Cy_full_fx, Cy_fx ); - me2f_buf( Cy_fx, Cy_e, Cy, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); + /* remove LFE IF necessary */ + IF ( remove_lfe ) + { - free( Cy_full_fx ); - free( Cy_fx ); -#else - remove_lfe_from_cy( nY_cov, lfe_indices, hSynthesisOutputSetup->num_lfe, Cy_full, Cy ); -#endif + Cy_e = Cy_full_e; + remove_lfe_from_cy_fx( nY_cov, lfe_indices, hSynthesisOutputSetup->num_lfe, Cy_full_fx, Cy_fx ); } - else + ELSE { - mvr2r( Cy_full, Cy, nY_band * nY_band ); + Copy32(Cy_full_fx, Cy_fx, nY_band * nY_band); + Cy_e = Cy_full_e; + move16(); } - matrix_product( proto_matrix_ptr, nY_band, nX, 0, Cx, nX, nX, 0, mat_mult_buffer1 ); - -#ifdef IVAS_FLOAT_FIXED - Word32 mat_mult_buffer1_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - Word32 proto_matrix_ptr_fx[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; - Word32 Cproto_diag_fx[MAX_CICP_CHANNELS]; - Word16 mat_mult_buffer1_e, proto_matrix_ptr_e, Cproto_diag_e; + matrix_product_fx(proto_matrix_ptr_fx, nY_band, nX, 0, Cx_fx, nX, nX, 0, mat_mult_buffer1_fx); + mat_mult_buffer1_e = proto_matrix_ptr_e + Cx_e; Word16 guard_bits = find_guarded_bits_fx( nY_band + 1 ); - f2me_buf( mat_mult_buffer1, mat_mult_buffer1_fx, &mat_mult_buffer1_e, nY_band * nX ); - f2me_buf( proto_matrix_ptr, proto_matrix_ptr_fx, &proto_matrix_ptr_e, nY_band * nX ); - - for ( i = 0; i < nY_band * nX; ++i ) + FOR ( i = 0; i < nY_band * nX; ++i ) { - if ( mat_mult_buffer1_e > proto_matrix_ptr_e ) - { - proto_matrix_ptr_fx[i] = L_shr( proto_matrix_ptr_fx[i], guard_bits ); - } - else - { - mat_mult_buffer1_fx[i] = L_shr( mat_mult_buffer1_fx[i], guard_bits ); - } + proto_matrix_ptr_fx[i] = L_shr( proto_matrix_ptr_fx[i], guard_bits ); + mat_mult_buffer1_fx[i] = L_shr(mat_mult_buffer1_fx[i], guard_bits); } - if ( mat_mult_buffer1_e > proto_matrix_ptr_e ) - { proto_matrix_ptr_e += guard_bits; - } - else - { mat_mult_buffer1_e += guard_bits; - } matrix_product_diag_fx(mat_mult_buffer1_fx, mat_mult_buffer1_e, nY_band, nX, 0, proto_matrix_ptr_fx, proto_matrix_ptr_e, nY_band, nX, 1, Cproto_diag_fx,&Cproto_diag_e); - me2f_buf(Cproto_diag_fx, Cproto_diag_e, Cproto_diag, nY_band); -#else - matrix_product_diag( mat_mult_buffer1, nY_band, nX, 0, proto_matrix_ptr, nY_band, nX, 1, Cproto_diag ); -#endif + FOR(i = 0; i < nY_band * nX; ++i) + { + proto_matrix_ptr_fx[i] = L_shl(proto_matrix_ptr_fx[i], guard_bits); + mat_mult_buffer1_fx[i] = L_shl(mat_mult_buffer1_fx[i], guard_bits); + } + + proto_matrix_ptr_e -= guard_bits; + mat_mult_buffer1_e -= guard_bits; /* make sure we have no negative entries in Cproto_diag due to rounding errors */ - for ( ch_idx1 = 0; ch_idx1 < nY_band; ch_idx1++ ) + + FOR (ch_idx1 = 0; ch_idx1 < nY_band; ch_idx1++) { - if ( Cproto_diag[ch_idx1] < 0.0f ) + IF (BASOP_Util_Cmp_Mant32Exp( Cproto_diag_fx[ch_idx1], Cproto_diag_e, 0, 0 ) < 0 ) { - Cproto_diag[ch_idx1] = 0.0f; + Cproto_diag_fx[ch_idx1] = 0; + move16(); } } + /* Computing the mixing matrices */ /* bands with decorr */ - if ( brange[0] < hParamMC->h_output_synthesis_params.max_band_decorr ) + IF ( brange[0] < hParamMC->h_output_synthesis_params.max_band_decorr ) { - computeMixingMatrices( nX, nY_band, Cx, Cy, proto_matrix_ptr, 0, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_local, Cr ); - - /* Compute mixing matrix for residual */ - computeMixingMatricesResidual( nY_band, Cproto_diag, Cr, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_res_local ); + computeMixingMatrices_fx( nX, nY_band, Cx_fx, Cx_e, Cy_fx, Cy_e, proto_matrix_ptr_fx, proto_matrix_ptr_e, 0, PARAM_MC_REG_SX_FX, 0, PARAM_MC_REG_GHAT_FX, 0, mixing_matrix_local_fx, &mixing_matrix_local_e, Cr_fx, &Cr_e ); + /* Compute mixing matrix FOR residual */ + computeMixingMatricesResidual_fx( nY_band, Cproto_diag_fx, Cproto_diag_e, Cr_fx, Cr_e, PARAM_MC_REG_SX_FX, 0, PARAM_MC_REG_GHAT_FX, 0, mixing_matrix_res_local_fx, &mixing_matrix_res_local_e); - if ( remove_lfe ) + IF ( remove_lfe ) { - set_zero( mixing_matrix_res[param_band_idx], nY_cov * nY_cov ); + set_zero_fx( mixing_matrix_res_fx[param_band_idx], nY_cov * nY_cov ); - ptrMM = mixing_matrix_res_local; - ptrMM_out = mixing_matrix_res[param_band_idx]; - for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) + ptrMM_fx = mixing_matrix_res_local_fx; + ptrMM_out_fx = mixing_matrix_res_fx[param_band_idx]; + FOR ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) { - for ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) + FOR ( ch_idx1 = lfe_indices[lfe_idx1] + 1; ch_idx1 < lfe_indices[lfe_idx1 + 1]; ch_idx1++ ) { - for ( lfe_idx2 = 0; lfe_idx2 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx2++ ) + FOR ( lfe_idx2 = 0; lfe_idx2 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx2++ ) { - for ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) + FOR ( ch_idx2 = lfe_indices[lfe_idx2] + 1; ch_idx2 < lfe_indices[lfe_idx2 + 1]; ch_idx2++ ) { - *( ptrMM_out++ ) = *( ptrMM++ ); + *( ptrMM_out_fx++ ) = *( ptrMM_fx++ ); } - ptrMM_out++; + ptrMM_out_fx++; } - ptrMM_out--; + ptrMM_out_fx--; } - ptrMM_out += nY_cov; + ptrMM_out_fx += nY_cov; } + mixing_matrix_res_e[param_band_idx] = mixing_matrix_res_local_e; + move16(); } - else + ELSE { - mvr2r( mixing_matrix_res_local, mixing_matrix_res[param_band_idx], nY_cov * nY_cov ); + Copy32(mixing_matrix_res_local_fx, mixing_matrix_res_fx[param_band_idx], nY_cov * nY_cov); + mixing_matrix_res_e[param_band_idx] = mixing_matrix_res_local_e; + move16(); } } - else if ( brange[0] < hParamMC->max_band_energy_compensation ) + ELSE IF ( brange[0] < hParamMC->max_band_energy_compensation ) { /* Compute mixing matrices (energy compensation only) */ - computeMixingMatrices( nX, nY_band, Cx, Cy, proto_matrix_ptr, 1, PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix_local, Cr ); + computeMixingMatrices_fx( nX, nY_band, Cx_fx, Cx_e, Cy_fx, Cy_e, proto_matrix_ptr_fx, proto_matrix_ptr_e, 1, PARAM_MC_REG_SX_FX, 0, PARAM_MC_REG_GHAT_FX, 0, mixing_matrix_local_fx, &mixing_matrix_local_e, Cr_fx, &Cr_e ); } - else + ELSE { - /*if neither decorrelation nor energy compensation is applied*/ - for ( i = 0; i < nY_band; i++ ) + /*IF neither decorrelation nor energy compensation is applied*/ + FOR ( i = 0; i < nY_band; i++ ) { - Cy_diag[i] = Cy[i + nY_band * i]; - Cy_diag[i] = sqrtf( Cy_diag[i] / ( Cproto_diag[i] + EPSILON ) ); + tmp = BASOP_Util_Divide3232_Scale(Cy_fx[i], L_add(Cproto_diag_fx[i], EPSILON_FX) , &tmp_e); + tmp_e = Cy_diag_e + Cproto_diag_e; + L_tmp = Sqrt32(L_deposit_h(tmp), &tmp_e); + Cy_diag_fx[i] = L_tmp; + move32(); + Cy_diag_buff_e[i] = tmp_e; + move16(); } -#ifdef IVAS_FLOAT_FIXED - Word32 Cy_diag_fx[MAX_OUTPUT_CHANNELS]; - Word32 mixing_matrix_local_fx[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word16 Cy_diag_e, mixing_matrix_local_e; + + Cy_diag_e = Cy_diag_buff_e[0]; + move16(); - f2me_buf( Cy_diag, Cy_diag_fx, &Cy_diag_e, nY_band ); - f2me_buf( proto_matrix_ptr, proto_matrix_ptr_fx, &proto_matrix_ptr_e, nY_band * nX ); + FOR (i = 1; i < nY_band; i++) + { + IF (Cy_diag_e < Cy_diag_buff_e[i]) + Cy_diag_e = Cy_diag_buff_e[i]; + } - diag_matrix_product_fx( Cy_diag_fx, Cy_diag_e, nY_band, proto_matrix_ptr_fx, proto_matrix_ptr_e, nY_band, nX, 0, mixing_matrix_local_fx, &mixing_matrix_local_e ); + FOR (i = 0; i < nY_band; i++) + { + Cy_diag_fx[i] = L_shr(Cy_diag_fx[i], Cy_diag_e - Cy_diag_buff_e[i]); + } - me2f_buf( mixing_matrix_local_fx, mixing_matrix_local_e, mixing_matrix_local, nY_band * nX ); -#else - diag_matrix_product( Cy_diag, nY_band, proto_matrix_ptr, nY_band, nX, 0, mixing_matrix_local ); -#endif + diag_matrix_product_fx( Cy_diag_fx, Cy_diag_e, nY_band, proto_matrix_ptr_fx, proto_matrix_ptr_e, nY_band, nX, 0, mixing_matrix_local_fx, &mixing_matrix_local_e ); } - if ( remove_lfe ) - { - set_zero( mixing_matrix[param_band_idx], nX * nY_cov ); - ptrMM = mixing_matrix_local; - ptrMM_out = mixing_matrix[param_band_idx]; - for ( ch_idx1 = 0; ch_idx1 < nX; ch_idx1++ ) + IF ( remove_lfe ) + { + set_zero_fx(mixing_matrix_fx[param_band_idx], nX * nY_cov); + ptrMM_fx = mixing_matrix_local_fx; + ptrMM_out_fx = mixing_matrix_fx[param_band_idx]; + FOR (ch_idx1 = 0; ch_idx1 < nX; ch_idx1++) { - for ( lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++ ) + FOR (lfe_idx1 = 0; lfe_idx1 < hSynthesisOutputSetup->num_lfe + 1; lfe_idx1++) { - for ( ch_idx2 = lfe_indices[lfe_idx1] + 1; ch_idx2 < lfe_indices[lfe_idx1 + 1]; ch_idx2++ ) + FOR (ch_idx2 = lfe_indices[lfe_idx1] + 1; ch_idx2 < lfe_indices[lfe_idx1 + 1]; ch_idx2++) { - *( ptrMM_out++ ) = *( ptrMM++ ); + *(ptrMM_out_fx++) = *(ptrMM_fx++); } - ptrMM_out++; + ptrMM_out_fx++; } - ptrMM_out--; + ptrMM_out_fx--; } + + mixing_matrix_e[param_band_idx] = mixing_matrix_local_e; + move16(); } - else + ELSE { - mvr2r( mixing_matrix_local, mixing_matrix[param_band_idx], nY_cov * nX ); + Copy32( mixing_matrix_local_fx, mixing_matrix_fx[param_band_idx], nY_cov * nX ); + mixing_matrix_e[param_band_idx] = mixing_matrix_local_e; + move16(); } } return; } +#else + + /*------------------------------------------------------------------------- * ivas_param_mc_get_mono_stereo_mixing_matrices() @@ -3797,7 +5863,7 @@ static void ivas_param_mc_get_mono_stereo_mixing_matrices( return; } - +#endif /*------------------------------------------------------------------------- * param_mc_update_mixing_matrices() * @@ -3831,13 +5897,46 @@ static void param_mc_update_mixing_matrices( return; } +#ifdef IVAS_FLOAT_FIXED +static void param_mc_update_mixing_matrices_fx( + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */ + Word32 *mixing_matrix[], /* i : direct mixing matrices for the frame just processed */ + Word16 *mixing_matrix_exp, + Word32 *mixing_matrix_res[], /* i : residual mixing matrices for the frame just processed */ + Word16 *mixing_matrix_res_exp, + const UWord16 nX, /* i : number of transport channels */ + const UWord16 nY ) /* i : number of synthesis channels */ +{ + UWord16 param_band_idx; + + FOR ( param_band_idx = 0; param_band_idx < hParamMC->hMetadataPMC->nbands_coded; param_band_idx++ ) + { + Word16 brange[2]; + + brange[0] = hParamMC->band_grouping[param_band_idx]; + brange[1] = hParamMC->band_grouping[param_band_idx + 1]; + + Copy32( mixing_matrix[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[param_band_idx], nX * nY ); + hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_exp[param_band_idx] = mixing_matrix_exp[param_band_idx]; + + IF ( brange[0] < hParamMC->h_output_synthesis_params.max_band_decorr ) + { + Copy32( mixing_matrix_res[param_band_idx], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[param_band_idx], nY * nY ); + hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_exp[param_band_idx] = mixing_matrix_res_exp[param_band_idx]; + } + } + + return; +} +#endif + /*------------------------------------------------------------------------- * ivas_param_mc_dequantize_cov() * * generate the target covariance matrix *------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ float *ild_q, /* i : sequence of dequantized ILD values */ @@ -3884,7 +5983,7 @@ static void ivas_param_mc_dequantize_cov( } Nrqq[h_ild_mapping->ild_index[k]] = powf( 10.0f, ild_q[k] / 10.0f ) * hParamMC->hMetadataPMC->ild_factors[k] * ref_ener; } - //dbgwrite2_txt(Nrqq,size,"../nrqq.txt"); + //dbgwrite2_txt(Nrqq,size,"../nrqq.txt"); /* estimate ICCs from estimated Cproto */ for ( k = 0; k < nY_int; k++ ) @@ -4000,7 +6099,7 @@ static void ivas_param_mc_dequantize_cov( return; } -#ifdef IVAS_FLOAT_FIXED +#else /*------------------------------------------------------------------------- * ivas_param_mc_dequantize_cov_fx() @@ -4159,8 +6258,8 @@ static void ivas_param_mc_dequantize_cov_fx( #endif } - test(); - test(); + test(); + test(); IF( GE_16(param_band_index , PARAM_MC_MAX_BAND_LFE) || EQ_16(hParamMC->hMetadataPMC->lfe_on,0) ) { FOR( k = 0; k < nY_int; k++ ) @@ -4231,7 +6330,7 @@ static void ivas_param_mc_dequantize_cov_fx( set32_fx( target_ch_ener_fx, 0, MAX_CICP_CHANNELS ); set16_fx( target_ch_ener_e, 0, MAX_CICP_CHANNELS ); set32_fx( dmx_ch_ener_fx, 0, MAX_CICP_CHANNELS ); - set16_fx( ls_conv_dmx_matrix_e, hParamMC->ls_conv_dmx_e, MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); + set16_fx( ls_conv_dmx_matrix_e, 1, MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS ); matrix_product_mant_exp( hParamMC->ls_conv_dmx_matrix_fx, ls_conv_dmx_matrix_e, nY_cov, nY_int, 0, Cy_state_int_fx, Cy_state_int_e, nY_int, nY_int, 0, @@ -4442,8 +6541,8 @@ static ivas_error param_mc_get_diff_proto_info_fx( const Word32 *proto_mtx, /* i : protoype matrix for the synthesis */ const UWord16 nchan_transport, /* i : number of transport channels */ const UWord16 nchan_out_cov, /* i : number if output channels of the covariance synthesis */ - PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info /* o : generated diffuse prototype info */ -) + PARAM_MC_DIFF_PROTO_INFO *p_diff_proto_info, /* o : generated diffuse prototype info */ + Word16 Q_proto_mtx ) { #if FLT_ENABLE float proto_fac[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -4511,7 +6610,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( #if FLT_ENABLE if ( diff < 0.1f ) #else - if ( LT_64( diff_fx * 10, 2147483648 ) ) + if ( LT_64( diff_fx * 10, L_shl_sat(1, Q_proto_mtx)) ) #endif { found = 1; @@ -4697,6 +6796,12 @@ static ivas_error param_mc_get_diff_proto_info( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } +#ifdef IVAS_FLOAT_FIXED + IF ((p_diff_proto_info->proto_fac_fx = (Word32 **)malloc(p_diff_proto_info->num_protos_diff * sizeof(Word32 *))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n")); + } +#endif #ifdef IVAS_FLOAT_FIXED if ( ( p_diff_proto_info->proto_fac_fx = (Word32 **) malloc( p_diff_proto_info->num_protos_diff * sizeof(Word32 * ) ) ) == NULL ) @@ -4723,6 +6828,13 @@ static ivas_error param_mc_get_diff_proto_info( } #endif // IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED + IF ((p_diff_proto_info->proto_fac_fx[cur_diff_proto] = (Word32 *)malloc(max_num_src_chan * sizeof(Word32))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n")); + } +#endif + proto_fac_ptr = proto_fac + cur_diff_proto; for ( cur_transport_ch = 0; cur_transport_ch < nchan_transport; cur_transport_ch++ ) { @@ -4745,6 +6857,124 @@ static ivas_error param_mc_get_diff_proto_info( * * reads and decodes a sequence of Parametric MC parameters from the bitstream *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void ivas_param_mc_bs_decode_parameter_values_fx( + UWord16 bit_buffer[], /* i : bitstream buffer */ + Word16 *bit_pos, /* i/o: current bitstream buffer position */ + const Word16 max_bits, /* i : maximum available bits in the buffer */ + Word16 *BER_detect, /* i/o: bit error detection flag */ + HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC, /* i : Parametric MC metadata information */ + HANDLE_PARAM_MC_PARAMETER_CODING_INFO hParamCodingInfo, /* i : Parametric MC parameter quantization and coding tables */ + const Word16 map_size_wo_lfe, /* i : number of parameters per band (w/o LFEs) */ + const Word16 map_size, /* i : number of parameters per band (total) */ + const Word16 num_lfe_bands, /* i : number of parameter bands with coded LFE */ + const Word16 band_step, /* i : parameter band step */ + const Word16 num_param_bands, /* i : number of parameter bands to decode */ + Word16 *value_buffer /* o : output buffer for decoded parameter values */ +) +{ + Word16 range_coding; + Word16 sz_seq; + Word16 delta_coding; + Word16 delta_idx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + Word16 idx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + Word16 idx_prev; + Word16 idx_offset; + Word16 sz_alphabet; + Word16 i, j, k; + Word16 dequant_seq_fx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + Word16 dequant_ordered_fx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE]; + Word16 n_lfe_idx; + + range_coding = bit_buffer[( *bit_pos )++]; + + /* Decoding the sequence */ + n_lfe_idx = sub(map_size , map_size_wo_lfe); + sz_seq = add(imult1616(num_param_bands , map_size_wo_lfe ) , imult1616(num_lfe_bands , n_lfe_idx)); + + set_s( idx, 0, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE ); + set16_fx( dequant_ordered_fx, 0, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE ); + set16_fx( dequant_seq_fx, 0, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE ); + IF ( range_coding ) + { + delta_coding = bit_buffer[( *bit_pos )++]; + + IF ( delta_coding ) + { + idx_prev = sub(add(shr(hParamCodingInfo->quantizer_size , 1) , hParamCodingInfo->quantizer_size % 2) , 1); + sz_alphabet = sub(shl(hParamCodingInfo->quantizer_size,1) , 1); + idx_offset = sub(hParamCodingInfo->quantizer_size , 1); + + /* read range coded delta ICC indices */ + *bit_pos = add(*bit_pos,ivas_param_mc_range_decoder_LC( &bit_buffer[*bit_pos], delta_idx, BER_detect, sz_seq, sz_alphabet, + hParamCodingInfo->cum_freq_delta, hParamCodingInfo->sym_freq_delta, PARAM_MC_RANGE_CODER_TOT_SHIFT, max_bits - *bit_pos )); + + /* delta index to absolute index */ + FOR ( j = 0; j < sz_seq; j++ ) + { + idx[j] = add(idx_prev , sub(delta_idx[j] , idx_offset)); + idx_prev = idx[j]; + } + } + ELSE + { + /* read range coded absolute ICC indices */ + sz_alphabet = hParamCodingInfo->quantizer_size; + *bit_pos = add(*bit_pos,ivas_param_mc_range_decoder_LC( &bit_buffer[*bit_pos], idx, BER_detect, sz_seq, sz_alphabet, + hParamCodingInfo->cum_freq, hParamCodingInfo->sym_freq, PARAM_MC_RANGE_CODER_TOT_SHIFT, max_bits - *bit_pos )); + } + + /* dequantize */ + FOR ( j = 0; j < sz_seq; j++ ) + { + dequant_seq_fx[j] = hParamCodingInfo->quantizer_fx[idx[j]]; + } + } + ELSE + { + set16_fx( dequant_seq_fx, 0, PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_MAX_VAL_MAP_SIZE ); + /* read uniformly coded ICCs */ + *bit_pos = add(*bit_pos,ivas_param_mc_uniform_decoder_fx( dequant_seq_fx, sz_seq, hParamCodingInfo->quantizer_fx, hParamCodingInfo->uni_bits, &bit_buffer[*bit_pos] )); + } + + /* reorder from sequential to parameter-band-wise */ + k = 0; + FOR ( j = 0; j < map_size_wo_lfe; ++j ) + { + FOR ( i = 0; i < num_param_bands; ++i ) + { + dequant_ordered_fx[j + i * map_size] = dequant_seq_fx[k++]; + } + } + + FOR ( i = 0; i < num_lfe_bands; i++ ) + { + FOR ( j = 0; j < n_lfe_idx; j++ ) + { + dequant_ordered_fx[map_size - n_lfe_idx + j + i * map_size] = dequant_seq_fx[k++]; + } + } + + IF ( !( *BER_detect ) ) + { + j = 0; + FOR ( k = 0; k < hMetadataPMC->nbands_coded; k += band_step ) + { + IF ( hMetadataPMC->bAttackPresent || EQ_16(hMetadataPMC->param_frame_idx , hMetadataPMC->coding_band_mapping[k]) ) + { + Copy( dequant_ordered_fx + j * map_size, value_buffer + k * map_size, map_size ); + j++; + } + IF ( hMetadataPMC->bAttackPresent && k + 1 < hMetadataPMC->nbands_coded ) + { + Copy( value_buffer + k * map_size, value_buffer + ( k + 1 ) * map_size, map_size ); + } + } + } + + return; +} +#endif // IVAS_FLOAT_FIXED static void ivas_param_mc_bs_decode_parameter_values( uint16_t bit_buffer[], /* i : bitstream buffer */ diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 6bcec446d138ad680623d3e33e9fdf3fc2dccb8d..12fbda0d4d8fea87f6130a587ba1c18eff5ae110 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -35,6 +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 "ivas_prot_fx.h" @@ -48,7 +50,7 @@ #include "wmc_auto.h" #include "rom_dec.h" - +#ifdef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------* * Local arrays *-----------------------------------------------------------------------*/ @@ -62,21 +64,23 @@ const int16_t MC_PARAMUPMIX_CHIDX2[MC_PARAMUPMIX_COMBINATIONS] = { 2, 3, 6, 7 }; * Local function prototypes *-----------------------------------------------------------------------*/ -static void ps_pred_process_sf( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, DECODER_TC_BUFFER_HANDLE hTcBuffer, float qmf_mod_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float *param_interpol, const int16_t ch, const int16_t slots_rendered ); +static void ps_pred_process_sf( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, DECODER_TC_BUFFER_HANDLE hTcBuffer, + Word32 qmf_mod_re_fx[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 qmf_mod_im_fx[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 qmf_side_re_fx[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 qmf_side_im_fx[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word16 *param_interpol_fx, const int16_t ch, const int16_t slots_rendered ); -static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS] ); +static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, Word32 *output_fx[MAX_OUTPUT_CHANNELS]); static void ivas_param_upmix_dec_decorr_subframes( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering ); static int16_t huff_read( Decoder_State *st, const int16_t ( *ht )[2] ); -static void huffman_decode( Decoder_State *st, const PAR_TYPE parType, int32_t *vq ); +static void huffman_decode( Decoder_State *st, const PAR_TYPE parType, Word32 *vq ); -static void dequant_alpha( int32_t *vq, float *v ); +static void dequant_alpha(Word32 *vq, Word32 *v); -static void dequant_beta( int32_t *aq, int32_t *bq, float *beta ); +static void dequant_beta(Word32 *aq, Word32 *bq, Word32 *beta); -static void get_ec_data( Decoder_State *st, const PAR_TYPE parType, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS] ); +static void get_ec_data(Decoder_State *st, const PAR_TYPE parType, Word32 *parQ, Word32 *alphaQEnv, Word32 ab[IVAS_MAX_NUM_BANDS]); /*------------------------------------------------------------------------- @@ -86,75 +90,76 @@ static void get_ec_data( Decoder_State *st, const PAR_TYPE parType, int32_t *par *------------------------------------------------------------------------*/ void ivas_mc_paramupmix_dec_read_BS( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Decoder_State *st0, /* i/o: decoder state structure */ - MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ - int16_t *nb_bits /* o : number of bits written */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_State *st0, /* i/o: decoder state structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + Word16 *nb_bits /* o : number of bits written */ ) { - int16_t i, k; - int32_t alpha_quant[IVAS_MAX_NUM_BANDS]; - int16_t nb_bits_read_orig; - int16_t next_bit_pos_orig, last_bit_pos; - uint16_t bstr_meta[MAX_BITS_METADATA], *bit_stream_orig; - - push_wmops( "mc_paramupmix_read_bs" ); - *nb_bits = 0; - - if ( st0->bfi ) + Word16 i, k; + Word32 alpha_quant[IVAS_MAX_NUM_BANDS]; + Word16 nb_bits_read_orig; + Word16 next_bit_pos_orig, last_bit_pos; + UWord16 bstr_meta[MAX_BITS_METADATA], *bit_stream_orig; + + push_wmops("mc_paramupmix_read_bs"); + *nb_bits = 0; + + IF(st0->bfi) + { + FOR(i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) { - for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) - { - for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) - { - hMCParamUpmix->alphas[i][k] = hMCParamUpmix->alpha_prev[i][k]; - hMCParamUpmix->betas[i][k] = hMCParamUpmix->beta_prev[i][k]; - } - } - hMCParamUpmix->first_frame = 1; + FOR(k = 0; k < IVAS_MAX_NUM_BANDS; k++) + { + hMCParamUpmix->alphas_fx[i][k] = hMCParamUpmix->alpha_prev_fx[i][k]; + hMCParamUpmix->betas_fx[i][k] = hMCParamUpmix->beta_prev_fx[i][k]; + } } - else /* if (!st->bfi) */ - { - bit_stream_orig = st0->bit_stream; - next_bit_pos_orig = st0->next_bit_pos; - last_bit_pos = (int16_t) ( ( st_ivas->hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); - nb_bits_read_orig = 0; - last_bit_pos -= nb_bits_read_orig; /* reverse the bitstream for easier reading of indices */ - for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) - { - bstr_meta[i] = st_ivas->bit_stream[last_bit_pos - i]; - } - st0->bit_stream = bstr_meta; - st0->next_bit_pos = 0; - st0->bits_frame = min( MAX_BITS_METADATA, last_bit_pos + 1 ); - st0->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ - - for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) - { - get_ec_data( st0, ALPHA, hMCParamUpmix->alpha_quant[i], alpha_quant, hMCParamUpmix->alphas[i] ); - - get_ec_data( st0, BETA, hMCParamUpmix->beta_quant[i], alpha_quant, hMCParamUpmix->betas[i] ); - } - *nb_bits += st0->next_bit_pos; - st0->bit_stream = bit_stream_orig; - st0->next_bit_pos = next_bit_pos_orig; - - if ( hMCParamUpmix->first_frame ) - { - for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) - { - mvr2r( hMCParamUpmix->alphas[i], hMCParamUpmix->alpha_prev[i], IVAS_MAX_NUM_BANDS ); - mvr2r( hMCParamUpmix->betas[i], hMCParamUpmix->beta_prev[i], IVAS_MAX_NUM_BANDS ); - } - hMCParamUpmix->first_frame = 0; - } - } - - pop_wmops(); - return; + hMCParamUpmix->first_frame = 1; + } + ELSE /* IF (!st->bfi) */ + { + bit_stream_orig = st0->bit_stream; + next_bit_pos_orig = st0->next_bit_pos; + last_bit_pos = (Word16)L_sub((st_ivas->hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC), 1); + nb_bits_read_orig = 0; + last_bit_pos = sub(last_bit_pos, nb_bits_read_orig); /* 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[sub(last_bit_pos, i)]; + } + st0->bit_stream = bstr_meta; + st0->next_bit_pos = 0; + st0->bits_frame = s_min(MAX_BITS_METADATA, add(last_bit_pos, 1)); + st0->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ + + FOR(i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) + { + get_ec_data(st0, ALPHA, hMCParamUpmix->alpha_quant[i], alpha_quant, hMCParamUpmix->alphas_fx[i]); + + get_ec_data(st0, BETA, hMCParamUpmix->beta_quant[i], alpha_quant, hMCParamUpmix->betas_fx[i]); + } + *nb_bits = add(*nb_bits, st0->next_bit_pos); + st0->bit_stream = bit_stream_orig; + st0->next_bit_pos = next_bit_pos_orig; + + IF(hMCParamUpmix->first_frame) + { + FOR(i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) + { + Copy32(hMCParamUpmix->alphas_fx[i], hMCParamUpmix->alpha_prev_fx[i], IVAS_MAX_NUM_BANDS); + Copy32(hMCParamUpmix->betas_fx[i], hMCParamUpmix->beta_prev_fx[i], IVAS_MAX_NUM_BANDS); + } + hMCParamUpmix->first_frame = 0; + } + } + + pop_wmops(); + return; } + /*------------------------------------------------------------------------- * ivas_mc_paramupmix_dec_digest_tc() * @@ -177,7 +182,7 @@ void ivas_mc_paramupmix_dec_digest_tc( /* adapt subframes */ ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hMCParamUpmix->param_interpolator ); + ivas_jbm_dec_get_adapted_linear_interpolator_fx( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hMCParamUpmix->param_interpolator_fx ); pop_wmops(); return; @@ -195,13 +200,13 @@ void ivas_mc_paramupmix_dec_render( 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 */ - float *input_f[], /* i : core-coder transport channels */ - float *output_f[] /* i/o: synthesized core-coder transport channels */ + Word32 *input_fx[], /* i : core-coder transport channels */ + Word32 *output_fx[] /* i/o: synthesized core-coder transport channels */ ) { int16_t slots_to_render, first_sf, last_sf, subframe_idx; uint16_t slot_size, ch; - float *output_f_local[MAX_OUTPUT_CHANNELS]; + Word32 *output_local_fx[MAX_OUTPUT_CHANNELS]; MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; hMCParamUpmix = st_ivas->hMCParamUpmix; @@ -211,7 +216,7 @@ void ivas_mc_paramupmix_dec_render( for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) { - output_f_local[ch] = output_f[ch]; + output_local_fx[ch] = output_fx[ch]; } slot_size = st_ivas->hTcBuffer->n_samples_granularity; @@ -224,7 +229,7 @@ void ivas_mc_paramupmix_dec_render( for ( ch = 0; ch < MAX_TRANSPORT_CHANNELS; ch++ ) { - mvr2r( input_f[ch], output_f_local[ch], *nSamplesRendered ); + Copy32( input_fx[ch], output_local_fx[ch], *nSamplesRendered ); } while ( slots_to_render > 0 ) @@ -236,29 +241,28 @@ void ivas_mc_paramupmix_dec_render( for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - mvr2r( hMCParamUpmix->alpha_prev[ch], hMCParamUpmix->alpha_sf[ch], IVAS_MAX_NUM_BANDS ); - mvr2r( hMCParamUpmix->beta_prev[ch], hMCParamUpmix->beta_sf[ch], IVAS_MAX_NUM_BANDS ); + Copy32(hMCParamUpmix->alpha_prev_fx[ch], hMCParamUpmix->alpha_sf_fx[ch], IVAS_MAX_NUM_BANDS); + Copy32(hMCParamUpmix->beta_prev_fx[ch], hMCParamUpmix->beta_sf_fx[ch], IVAS_MAX_NUM_BANDS); } for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; - ivas_mc_paramupmix_dec_sf( st_ivas, output_f_local ); + ivas_mc_paramupmix_dec_sf( st_ivas, output_local_fx ); for ( ch = 0; ch < min( MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ) ); ch++ ) { - output_f_local[ch] += n_samples_sf; + output_local_fx[ch] += n_samples_sf; } /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf ); } - for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - mvr2r( hMCParamUpmix->alphas[ch], hMCParamUpmix->alpha_prev[ch], IVAS_MAX_NUM_BANDS ); - mvr2r( hMCParamUpmix->betas[ch], hMCParamUpmix->beta_prev[ch], IVAS_MAX_NUM_BANDS ); + Copy32(hMCParamUpmix->alphas_fx[ch], hMCParamUpmix->alpha_prev_fx[ch], IVAS_MAX_NUM_BANDS); + Copy32(hMCParamUpmix->betas_fx[ch], hMCParamUpmix->beta_prev_fx[ch], IVAS_MAX_NUM_BANDS); } } @@ -280,18 +284,19 @@ ivas_error ivas_mc_paramupmix_dec_open( ) { MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; - int32_t output_Fs; - int16_t nchan_transport; - uint16_t i; + Word32 output_Fs; + Word16 nchan_transport; + UWord16 i; ivas_error error; error = IVAS_ERR_OK; + /*-----------------------------------------------------------------* * prepare library opening *-----------------------------------------------------------------*/ - if ( ( hMCParamUpmix = (MC_PARAMUPMIX_DEC_HANDLE) malloc( sizeof( MC_PARAMUPMIX_DEC_DATA ) ) ) == NULL ) + IF( ( hMCParamUpmix = (MC_PARAMUPMIX_DEC_HANDLE) malloc( sizeof( MC_PARAMUPMIX_DEC_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param-Upmix MC\n" ) ); } @@ -300,16 +305,16 @@ ivas_error ivas_mc_paramupmix_dec_open( st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; nchan_transport = st_ivas->nchan_transport; - switch ( nchan_transport ) + SWITCH( nchan_transport ) { case 8: st_ivas->nCPE = 4; st_ivas->nSCE = 0; st_ivas->element_mode_init = IVAS_CPE_MDCT; - break; + BREAK; } - hMCParamUpmix->hoa_encoder = NULL; + hMCParamUpmix->hoa_encoder_fx = NULL; /*-----------------------------------------------------------------* * set input parameters @@ -319,43 +324,41 @@ ivas_error ivas_mc_paramupmix_dec_open( for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { -#ifdef IVAS_FLOAT_FIXED ivas_td_decorr_dec_open_fx( &( hMCParamUpmix->hTdDecorr[i] ), output_Fs, 2, 1 ); -#else - ivas_td_decorr_dec_open( &( hMCParamUpmix->hTdDecorr[i] ), output_Fs, 2, 1 ); -#endif } - for ( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ ) + FOR( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ ) { - if ( ( hMCParamUpmix->pcm_delay[i] = (float *) malloc( NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) * sizeof( float ) ) ) == NULL ) + IF( ( hMCParamUpmix->pcm_delay_fx[i] = (Word32 *) malloc( NS2SA_fx2( output_Fs, IVAS_FB_DEC_DELAY_NS ) * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for delay buffer\n" ) ); } - set_zero( hMCParamUpmix->pcm_delay[i], NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) ); + set32_fx( hMCParamUpmix->pcm_delay_fx[i], 0, NS2SA_fx2( output_Fs, IVAS_FB_DEC_DELAY_NS ) ); } /* Head or external rotation */ - if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) { - if ( ( hMCParamUpmix->hoa_encoder = (float *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( float ) ) ) == NULL ) + + IF( ( hMCParamUpmix->hoa_encoder_fx = (Word32 *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } - compute_hoa_encoder_mtx( st_ivas->hTransSetup.ls_azimuth, st_ivas->hTransSetup.ls_elevation, hMCParamUpmix->hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER ); + compute_hoa_encoder_mtx_fx( st_ivas->hTransSetup.ls_azimuth_fx, st_ivas->hTransSetup.ls_elevation_fx, hMCParamUpmix->hoa_encoder_fx, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER ); + // compute_hoa_encoder_mtx( st_ivas->hTransSetup.ls_azimuth, st_ivas->hTransSetup.ls_elevation, hMCParamUpmix->hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER ); + Scale_sig32(hMCParamUpmix->hoa_encoder_fx, st_ivas->hTransSetup.nchan_out_woLFE*MAX_INTERN_CHANNELS, Q2);//Q29=>Q31 } /* allocate transport channels*/ hMCParamUpmix->free_param_interpolator = 0; - hMCParamUpmix->param_interpolator = NULL; - - if ( ( hMCParamUpmix->param_interpolator = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for interpolator\n" ) ); - } - hMCParamUpmix->free_param_interpolator = 1; - ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, DEFAULT_JBM_CLDFB_TIMESLOTS, hMCParamUpmix->param_interpolator ); + IF((hMCParamUpmix->param_interpolator_fx = (Word16 *)malloc(MAX_JBM_CLDFB_TIMESLOTS * sizeof(Word16))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for interpolator\n")); + } + hMCParamUpmix->free_param_interpolator = 1; + + ivas_jbm_dec_get_adapted_linear_interpolator_fx( DEFAULT_JBM_CLDFB_TIMESLOTS, DEFAULT_JBM_CLDFB_TIMESLOTS, hMCParamUpmix->param_interpolator_fx ); if ( st_ivas->hTcBuffer == NULL ) { @@ -378,11 +381,7 @@ ivas_error ivas_mc_paramupmix_dec_open( nchan_to_allocate = MC_PARAMUPMIX_MAX_INPUT_CHANS; } -#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, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -415,22 +414,22 @@ void ivas_mc_paramupmix_dec_close( } for ( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ ) { - if ( ( *hMCParamUpmix )->pcm_delay[i] != NULL ) + IF( ( *hMCParamUpmix )->pcm_delay_fx[i] != NULL ) { - free( ( *hMCParamUpmix )->pcm_delay[i] ); + free( ( *hMCParamUpmix )->pcm_delay_fx[i] ); } } - if ( ( *hMCParamUpmix )->param_interpolator != NULL ) + if ((*hMCParamUpmix)->param_interpolator_fx != NULL) { - if ( ( *hMCParamUpmix )->free_param_interpolator == 1 ) - { - free( ( *hMCParamUpmix )->param_interpolator ); - } + if ((*hMCParamUpmix)->free_param_interpolator == 1) + { + free((*hMCParamUpmix)->param_interpolator_fx); + } } - if ( ( *hMCParamUpmix )->hoa_encoder != NULL ) + if ((*hMCParamUpmix)->hoa_encoder_fx != NULL) { - free( ( *hMCParamUpmix )->hoa_encoder ); - ( *hMCParamUpmix )->hoa_encoder = NULL; + free((*hMCParamUpmix)->hoa_encoder_fx); + (*hMCParamUpmix)->hoa_encoder_fx = NULL; } free( *hMCParamUpmix ); @@ -439,7 +438,7 @@ void ivas_mc_paramupmix_dec_close( return; } -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- * paramupmix_td_decorr_process_jbm_fx() * @@ -494,59 +493,6 @@ static void paramupmix_td_decorr_process_jbm_fx( return; } -#else -/*------------------------------------------------------------------------- - * paramupmix_td_decorr_process_jbm() - * - * - *------------------------------------------------------------------------*/ - -static void paramupmix_td_decorr_process_jbm( - ivas_td_decorr_state_t *hTdDecorr[], /* i/o: SPAR Covar. decoder handle */ - float *pcm_in[], /* i : input audio channels */ - float **pp_out_pcm, /* o : output audio channels */ - const int16_t output_frame /* i : output frame length */ -) -{ - int16_t j, k; - int16_t offset; - float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; - - offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); - - /* Look-ahead delay */ - for ( k = 0; k < MC_PARAMUPMIX_COMBINATIONS; k++ ) - { - mvr2r( pcm_in[k], pp_out_pcm[k], output_frame ); - delay_signal_float( pp_out_pcm[k], output_frame, hTdDecorr[k]->look_ahead_buf, offset ); - - /* In ducking gains */ - if ( hTdDecorr[k]->ducking_flag ) - { - ivas_td_decorr_get_ducking_gains( hTdDecorr[k]->pTrans_det, pcm_in[k], in_duck_gain, out_duck_gain, output_frame, 0 ); - - for ( j = 0; j < output_frame; j++ ) - { - pp_out_pcm[k][j] = pp_out_pcm[k][j] * in_duck_gain[j]; - } - } - - /* All pass delay section */ - ivas_td_decorr_APD_iir_filter( &hTdDecorr[k]->APD_filt_state[0], pp_out_pcm[k], hTdDecorr[k]->num_apd_sections, output_frame ); - - /* Out ducking gains */ - if ( hTdDecorr[k]->ducking_flag ) - { - for ( j = 0; j < output_frame; j++ ) - { - pp_out_pcm[k][j] = pp_out_pcm[k][j] * out_duck_gain[j]; - } - } - } - - return; -} -#endif /*------------------------------------------------------------------------- * ivas_param_upmix_dec_decorr_subframes() @@ -559,8 +505,8 @@ static void ivas_param_upmix_dec_decorr_subframes( const int16_t nSamplesForRendering ) { MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; - float *pPcm_tmp[MC_PARAMUPMIX_COMBINATIONS]; - float *p_tc[MC_PARAMUPMIX_COMBINATIONS]; + Word32 *pPcm_tmp_fx[MC_PARAMUPMIX_COMBINATIONS]; + Word32 *p_tc_fx[MC_PARAMUPMIX_COMBINATIONS]; int16_t nchan_internal, ch; int16_t nSamplesLeftForTD, default_frame; @@ -576,60 +522,32 @@ static void ivas_param_upmix_dec_decorr_subframes( for ( ch = 0; ch < nchan_internal; ch++ ) { - pPcm_tmp[ch] = st_ivas->hTcBuffer->tc[ch + 8]; - p_tc[ch] = st_ivas->hTcBuffer->tc[ch + 4]; + pPcm_tmp_fx[ch] = st_ivas->hTcBuffer->tc_fx[ch + 8]; + p_tc_fx[ch] = st_ivas->hTcBuffer->tc_fx[ch + 4]; } while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); -#ifdef IVAS_FLOAT_FIXED { - Word32 *pPcm_tmp_fx[MC_PARAMUPMIX_COMBINATIONS]; - Word32 *p_tc_fx[MC_PARAMUPMIX_COMBINATIONS]; - Word32 tmp_fx[MC_PARAMUPMIX_COMBINATIONS][L_FRAME48k]; - Word32 tc_fx[MC_PARAMUPMIX_COMBINATIONS][L_FRAME48k]; - Word32 i, j, q_format[MC_PARAMUPMIX_COMBINATIONS]; + Word32 i, q_format[MC_PARAMUPMIX_COMBINATIONS]; - FOR( i = 0; i < nchan_internal; i++ ) + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { - pPcm_tmp_fx[i] = tmp_fx[i]; - p_tc_fx[i] = tc_fx[i]; - q_format[i] = Q14; - FOR( j = 0; j < nSamplesToDecorr; j++ ) - { - pPcm_tmp_fx[i][j] = (Word32) ( pPcm_tmp[i][j] * ( 1 << q_format[i] ) ); - p_tc_fx[i][j] = (Word32) ( p_tc[i][j] * ( 1 << q_format[i] ) ); - } + q_format[i] = Q11; } paramupmix_td_decorr_process_jbm_fx( hMCParamUpmix->hTdDecorr, p_tc_fx, pPcm_tmp_fx, nSamplesToDecorr, q_format ); FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { - FOR( j = 0; j < nSamplesToDecorr; j++ ) - { - pPcm_tmp[i][j] = pPcm_tmp_fx[i][j] / (float) ( 1 << q_format[i] ); - } -#ifdef DUMPS_ENABLED - dbgwrite_txt( pp_out_pcm[k], nSamplesToDecorr, "fixed.txt", NULL ); -#endif + Scale_sig32(pPcm_tmp_fx[i], nSamplesToDecorr, Q11- extract_l(q_format[i])); } } -#else - paramupmix_td_decorr_process_jbm( hMCParamUpmix->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); - -#ifdef DUMPS_ENABLED - for ( j = 0; j < MC_PARAMUPMIX_COMBINATIONS; j++ ) - { - dbgwrite_txt( pp_out_pcm[k], nSamplesToDecorr, "float.txt", NULL ); - } -#endif -#endif for ( ch = 0; ch < nchan_internal; ch++ ) { - p_tc[ch] += nSamplesToDecorr; + p_tc_fx[ch] += nSamplesToDecorr; } nSamplesLeftForTD -= nSamplesToDecorr; @@ -647,26 +565,27 @@ static void ivas_param_upmix_dec_decorr_subframes( static void ps_pred_process_sf( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, DECODER_TC_BUFFER_HANDLE hTcBuffer, - float qmf_mod_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* in/out */ - float qmf_mod_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float qmf_side_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* in/out */ - float qmf_side_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float *param_interpol, + Word32 qmf_mod_re_fx[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* in/out */ + Word32 qmf_mod_im_fx[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 qmf_side_re_fx[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* in/out */ + Word32 qmf_side_im_fx[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word16 *param_interpol_fx, const int16_t ch, const int16_t slots_rendered ) { - float vmre, vmim, vsre, vsim; + Word32 vmre_fx, vmim_fx, vsre_fx, vsim_fx; int16_t iqmf, ipar, ismp, iismp; - float alpha_smp, beta_smp; - float *alpha1, *alpha2; - float *beta1, *beta2; - float *alpha_prev = hMCParamUpmix->alpha_prev[ch]; - float *beta_prev = hMCParamUpmix->beta_prev[ch]; - float *alpha_sf = hMCParamUpmix->alpha_sf[ch]; - float *beta_sf = hMCParamUpmix->beta_sf[ch]; - float dalpha, dbeta, ifac; - float alpha_start[IVAS_MAX_NUM_BANDS], beta_start[IVAS_MAX_NUM_BANDS]; - + Word32 alpha_smp_fx, beta_smp_fx; + Word32 *alpha1_fx, *alpha2_fx; + Word32 *beta1_fx, *beta2_fx; + Word32 *alpha_prev_fx = hMCParamUpmix->alpha_prev_fx[ch]; + Word32 *beta_prev_fx = hMCParamUpmix->beta_prev_fx[ch]; + Word32 *alpha_sf_fx = hMCParamUpmix->alpha_sf_fx[ch]; + Word32 *beta_sf_fx = hMCParamUpmix->beta_sf_fx[ch]; + Word32 dalpha_fx, dbeta_fx; + Word16 ifac_fx; + Word32 alpha_start_fx[IVAS_MAX_NUM_BANDS], beta_start_fx[IVAS_MAX_NUM_BANDS]; + Word32 res_a, res_b; const int16_t qmf_to_par_band[] = { 0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, @@ -676,48 +595,53 @@ static void ps_pred_process_sf( 11, 11, 11, 11, 11, 11, 11, 11, 11, 11 }; - mvr2r( alpha_sf, alpha_start, IVAS_MAX_NUM_BANDS ); - mvr2r( beta_sf, beta_start, IVAS_MAX_NUM_BANDS ); + Copy32(alpha_sf_fx, alpha_start_fx, IVAS_MAX_NUM_BANDS); + Copy32(beta_sf_fx, beta_start_fx, IVAS_MAX_NUM_BANDS); for ( iqmf = 0; iqmf < CLDFB_NO_CHANNELS_MAX; iqmf++ ) { ipar = qmf_to_par_band[iqmf]; - alpha1 = alpha_prev; - beta1 = beta_prev; + alpha1_fx = alpha_prev_fx; + beta1_fx = beta_prev_fx; ismp = 0; - alpha2 = hMCParamUpmix->alphas[ch]; - beta2 = hMCParamUpmix->betas[ch]; - alpha_smp = alpha_start[ipar]; - beta_smp = beta_start[ipar]; + alpha2_fx = hMCParamUpmix->alphas_fx[ch]; + beta2_fx = hMCParamUpmix->betas_fx[ch]; + alpha_smp_fx = alpha_start_fx[ipar]; + beta_smp_fx = beta_start_fx[ipar]; for ( iismp = 0; iismp < hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered]; iismp++ ) { if ( ( slots_rendered == 0 ) && ( iismp == 0 ) ) { - ifac = param_interpol[iismp]; + ifac_fx = param_interpol_fx[iismp]; } else { - ifac = param_interpol[iismp] - param_interpol[iismp - 1]; + ifac_fx = sub(param_interpol_fx[iismp], param_interpol_fx[iismp - 1]); } - dalpha = ( alpha2[ipar] - alpha1[ipar] ) * ifac; - dbeta = ( beta2[ipar] - beta1[ipar] ) * ifac; + dalpha_fx = Mpy_32_16_1(L_sub( alpha2_fx[ipar], alpha1_fx[ipar] ), ifac_fx); + dbeta_fx = Mpy_32_16_1(L_sub( beta2_fx[ipar], beta1_fx[ipar] ), ifac_fx); + + alpha_smp_fx = L_add(alpha_smp_fx, dalpha_fx); + beta_smp_fx = L_add(dbeta_fx, beta_smp_fx); - alpha_smp += dalpha; - beta_smp += dbeta; + vmre_fx = qmf_mod_re_fx[ismp][iqmf]; + vmim_fx = qmf_mod_im_fx[ismp][iqmf]; + vsre_fx = qmf_side_re_fx[ismp][iqmf]; + vsim_fx = qmf_side_im_fx[ismp][iqmf]; - vmre = qmf_mod_re[ismp][iqmf]; - vmim = qmf_mod_im[ismp][iqmf]; - vsre = qmf_side_re[ismp][iqmf]; - vsim = qmf_side_im[ismp][iqmf]; + res_a = L_shl_sat(Mpy_32_32(alpha_smp_fx, vmre_fx), Q31 - Q28); + res_b = L_shl_sat(Mpy_32_32(beta_smp_fx, vsre_fx), Q31 - Q28); + qmf_side_re_fx[ismp][iqmf] = L_add_sat(res_a, res_b); - qmf_side_re[ismp][iqmf] = alpha_smp * vmre + beta_smp * vsre; - qmf_side_im[ismp][iqmf] = alpha_smp * vmim + beta_smp * vsim; + 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); ismp++; } - alpha_sf[ipar] = alpha_smp; - beta_sf[ipar] = beta_smp; + alpha_sf_fx[ipar] = alpha_smp_fx; + beta_sf_fx[ipar] = beta_smp_fx; } return; @@ -726,21 +650,22 @@ static void ps_pred_process_sf( static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output_f[MAX_OUTPUT_CHANNELS] /* i/o: synthesized core-coder transport channels */ + Word32 *output_fx[MAX_OUTPUT_CHANNELS] /* i/o: synthesized core-coder transport channels */ ) { int16_t i, ch, slot_idx, k; - float *pPcm_temp[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/ + Word32 *pPcm_temp_fx[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/ /*CLDFB*/ - float Cldfb_RealBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_fx[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] = { 0 }; + Word32 Cldfb_ImagBuffer_fx[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX] = { 0 }; + int16_t noparamupmix_delay, n_samples_rendered; MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; int16_t subframeIdx, idx_in, maxBand; - float Cldfb_RealBuffer_subfr[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_subfr[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_subfr_fx[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_subfr_fx[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; hMCParamUpmix = st_ivas->hMCParamUpmix; assert( hMCParamUpmix ); @@ -748,8 +673,8 @@ static void ivas_mc_paramupmix_dec_sf( for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { - pPcm_temp[2 * i] = output_f[i + 4]; /* un-decorrelated */ - pPcm_temp[2 * i + 1] = output_f[i + 8]; /* decorrelated */ + pPcm_temp_fx[2 * i] = output_fx[i + 4]; /* un-decorrelated */ + pPcm_temp_fx[2 * i + 1] = output_fx[i + 8]; /* decorrelated */ } /* CLDFB Analysis*/ @@ -758,18 +683,26 @@ static void ivas_mc_paramupmix_dec_sf( /* slot loop for gathering the input data */ for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) { - cldfbAnalysis_ts_ivas( &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), Cldfb_RealBuffer[ch][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], hMCParamUpmix->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + for (i = 0; i < st_ivas->cldfbAnaDec[ch]->p_filter_length - st_ivas->cldfbAnaDec[ch]->no_channels; i++) { + st_ivas->cldfbAnaDec[ch]->cldfb_state_fx[i] = (Word32)(st_ivas->cldfbAnaDec[ch]->cldfb_state[i] * (1LL << (11))); + } + Word16 q_cldfb = 11; + cldfbAnalysis_ts_fx_fixed_q( &( pPcm_temp_fx[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), Cldfb_RealBuffer_fx[ch][slot_idx], Cldfb_ImagBuffer_fx[ch][slot_idx], hMCParamUpmix->num_freq_bands, st_ivas->cldfbAnaDec[ch], &q_cldfb); + for (i = 0; i < st_ivas->cldfbAnaDec[ch]->p_filter_length - st_ivas->cldfbAnaDec[ch]->no_channels; i++) { + st_ivas->cldfbAnaDec[ch]->cldfb_state[i] = ((float)st_ivas->cldfbAnaDec[ch]->cldfb_state_fx[i]/ (1LL << (11))); + } } } + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { ps_pred_process_sf( hMCParamUpmix, st_ivas->hTcBuffer, - Cldfb_RealBuffer[2 * ch], /* in/out */ - Cldfb_ImagBuffer[2 * ch], - Cldfb_RealBuffer[2 * ch + 1], /* in/out decorr */ - Cldfb_ImagBuffer[2 * ch + 1], - &hMCParamUpmix->param_interpolator[st_ivas->hTcBuffer->slots_rendered], + Cldfb_RealBuffer_fx[2 * ch], /* in/out */ + Cldfb_ImagBuffer_fx[2 * ch], + Cldfb_RealBuffer_fx[2 * ch + 1], /* in/out decorr */ + Cldfb_ImagBuffer_fx[2 * ch + 1], + &hMCParamUpmix->param_interpolator_fx[st_ivas->hTcBuffer->slots_rendered], ch, st_ivas->hTcBuffer->slots_rendered ); @@ -778,15 +711,15 @@ static void ivas_mc_paramupmix_dec_sf( { for ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) { - float qlre = Cldfb_RealBuffer[2 * ch][slot_idx][k]; - float qlim = Cldfb_ImagBuffer[2 * ch][slot_idx][k]; - float qrre = Cldfb_RealBuffer[2 * ch + 1][slot_idx][k]; - float qrim = Cldfb_ImagBuffer[2 * ch + 1][slot_idx][k]; - - Cldfb_RealBuffer[2 * ch][slot_idx][k] = qlre + qrre; - Cldfb_ImagBuffer[2 * ch][slot_idx][k] = qlim + qrim; - Cldfb_RealBuffer[2 * ch + 1][slot_idx][k] = qlre - qrre; - Cldfb_ImagBuffer[2 * ch + 1][slot_idx][k] = qlim - qrim; + Word32 qlre_fx = Cldfb_RealBuffer_fx[2 * ch][slot_idx][k]; + Word32 qlim_fx = Cldfb_ImagBuffer_fx[2 * ch][slot_idx][k]; + Word32 qrre_fx = Cldfb_RealBuffer_fx[2 * ch + 1][slot_idx][k]; + Word32 qrim_fx = Cldfb_ImagBuffer_fx[2 * ch + 1][slot_idx][k]; + + Cldfb_RealBuffer_fx[2 * ch][slot_idx][k] = L_add_sat(qlre_fx, qrre_fx); + Cldfb_ImagBuffer_fx[2 * ch][slot_idx][k] = L_add_sat(qlim_fx, qrim_fx); + Cldfb_RealBuffer_fx[2 * ch + 1][slot_idx][k] = L_sub_sat(qlre_fx, qrre_fx); + Cldfb_ImagBuffer_fx[2 * ch + 1][slot_idx][k] = L_sub_sat(qlim_fx, qrim_fx); } } } @@ -802,28 +735,37 @@ static void ivas_mc_paramupmix_dec_sf( { if ( st_ivas->hIntSetup.index_lfe[0] != ch ) { - pPcm_temp[ch] = output_f[ch]; + pPcm_temp_fx[ch] = output_fx[ch]; /* slot loop for gathering the input data */ for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) { - cldfbAnalysis_ts_ivas( &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), - Cldfb_RealBuffer_subfr[idx_in][slot_idx], - Cldfb_ImagBuffer_subfr[idx_in][slot_idx], - maxBand, st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in] ); + for (i = 0; i < st_ivas->cldfbAnaDec[ch]->p_filter_length - st_ivas->cldfbAnaDec[ch]->no_channels; i++) { + st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in]->cldfb_state_fx[i] = (Word32)(st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in]->cldfb_state[i] * (1LL << (11))); + } + Word16 q_cldfb = 11; + + cldfbAnalysis_ts_fx_fixed_q(&(pPcm_temp_fx[ch][hMCParamUpmix->num_freq_bands * slot_idx]), + Cldfb_RealBuffer_subfr_fx[idx_in][slot_idx], + Cldfb_ImagBuffer_subfr_fx[idx_in][slot_idx], + maxBand, st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in],&q_cldfb); + for (i = 0; i < st_ivas->cldfbAnaDec[ch]->p_filter_length - st_ivas->cldfbAnaDec[ch]->no_channels; i++) { + st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in]->cldfb_state[i] = ((float)st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in]->cldfb_state_fx[i]/ (1LL << (11))); + } } idx_in++; } } + /* copy and reorder cldfb analysis of coupled channels */ for ( ch = 0; ch < MAX_PARAM_SPATIAL_SUBFRAMES; ch++ ) { for ( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) { - mvr2r( Cldfb_RealBuffer[MC_PARAMUPMIX_CHIDX1[ch]][slot_idx], Cldfb_RealBuffer_subfr[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX ); - mvr2r( Cldfb_ImagBuffer[MC_PARAMUPMIX_CHIDX1[ch]][slot_idx], Cldfb_ImagBuffer_subfr[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX ); - mvr2r( Cldfb_RealBuffer[MC_PARAMUPMIX_CHIDX2[ch]][slot_idx], Cldfb_RealBuffer_subfr[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX ); - mvr2r( Cldfb_ImagBuffer[MC_PARAMUPMIX_CHIDX2[ch]][slot_idx], Cldfb_ImagBuffer_subfr[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX ); + Copy32(Cldfb_RealBuffer_fx[MC_PARAMUPMIX_CHIDX1[ch]][slot_idx], Cldfb_RealBuffer_subfr_fx[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX); + Copy32(Cldfb_ImagBuffer_fx[MC_PARAMUPMIX_CHIDX1[ch]][slot_idx], Cldfb_ImagBuffer_subfr_fx[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX); + Copy32(Cldfb_RealBuffer_fx[MC_PARAMUPMIX_CHIDX2[ch]][slot_idx], Cldfb_RealBuffer_subfr_fx[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX); + Copy32(Cldfb_ImagBuffer_fx[MC_PARAMUPMIX_CHIDX2[ch]][slot_idx], Cldfb_ImagBuffer_subfr_fx[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX); } idx_in += 2; } @@ -832,60 +774,107 @@ static void ivas_mc_paramupmix_dec_sf( { for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) { - ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hMCParamUpmix->hoa_encoder, slot_idx, Cldfb_RealBuffer_subfr, Cldfb_ImagBuffer_subfr, maxBand, GAIN_LFE ); + ivas_param_mc_mc2sba_cldfb_fx( st_ivas->hTransSetup, hMCParamUpmix->hoa_encoder_fx, slot_idx, Cldfb_RealBuffer_subfr_fx, Cldfb_ImagBuffer_subfr_fx, maxBand, GAIN_LFE_FX); } } - /* Implement binaural rendering */ - ivas_binRenderer( st_ivas->hBinRenderer, - st_ivas->hCombinedOrientationData, - st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, - Cldfb_RealBuffer_subfr, - Cldfb_ImagBuffer_subfr ); + //to be deleted + if (st_ivas->hCombinedOrientationData) + { + for ( i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + st_ivas->hCombinedOrientationData->Rmat_fx[st_ivas->hCombinedOrientationData->subframe_idx][i][j] = (Word32)float_to_fix(st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx][i][j], 30); + } + } + } + /* Implement binaural rendering */ + + Word16 input_q = 6; + /* Implement binaural rendering */ + ivas_binRenderer_fx(st_ivas->hBinRenderer, + st_ivas->hCombinedOrientationData, + st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], + Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, + Cldfb_RealBuffer_subfr_fx, + Cldfb_ImagBuffer_subfr_fx,&input_q); + + for (int idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++) + { + for (int idx2 = 0; idx2 < MAX_PARAM_SPATIAL_SUBFRAMES; idx2++) + { + Scale_sig32(Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, 6- input_q); + Scale_sig32(Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, 6- input_q); + } + } /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *RealBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *ImagBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) { - RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch][slot_idx]; - ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch][slot_idx]; + RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[ch][slot_idx]; + ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch][slot_idx]; + } + for (i = 0; i < st_ivas->cldfbSynDec[ch]->p_filter_length; i++) { + st_ivas->cldfbSynDec[ch]->cldfb_state_fx[i] = (Word32)(st_ivas->cldfbSynDec[ch]->cldfb_state[i] * (1LL << (5))); + } + cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], st_ivas->cldfbSynDec[ch] ); + for (i = 0; i < st_ivas->cldfbSynDec[ch]->p_filter_length; i++) + { + st_ivas->cldfbSynDec[ch]->cldfb_state[i] = ((float)st_ivas->cldfbSynDec[ch]->cldfb_state_fx[i] / (1LL << (5))); } - - cldfbSynthesis_ivas( RealBuffer, ImagBuffer, &( output_f[ch][0] ), maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], st_ivas->cldfbSynDec[ch] ); + } + for (ch = 0; ch < BINAURAL_CHANNELS; ch++) + { + Scale_sig32(output_fx[ch], maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], 6); } } else { /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ - pPcm_temp[0] = output_f[4]; - pPcm_temp[1] = output_f[6]; - pPcm_temp[2] = output_f[5]; - pPcm_temp[3] = output_f[7]; - pPcm_temp[4] = output_f[8]; - pPcm_temp[5] = output_f[10]; - pPcm_temp[6] = output_f[9]; - pPcm_temp[7] = output_f[11]; + pPcm_temp_fx[0] = output_fx[4]; + pPcm_temp_fx[1] = output_fx[6]; + pPcm_temp_fx[2] = output_fx[5]; + pPcm_temp_fx[3] = output_fx[7]; + pPcm_temp_fx[4] = output_fx[8]; + pPcm_temp_fx[5] = output_fx[10]; + pPcm_temp_fx[6] = output_fx[9]; + pPcm_temp_fx[7] = output_fx[11]; /* CLDFB synthesis */ for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ ) { for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++ ) { - float *ptr_im[1], *ptr_re[1]; - ptr_re[0] = Cldfb_RealBuffer[ch][slot_idx]; - ptr_im[0] = Cldfb_ImagBuffer[ch][slot_idx]; + Word32 *ptr_im_fx[1], *ptr_re_fx[1]; + + ptr_re_fx[0] = Cldfb_RealBuffer_fx[ch][slot_idx]; + ptr_im_fx[0] = Cldfb_ImagBuffer_fx[ch][slot_idx]; - cldfbSynthesis_ivas( ptr_re, ptr_im, &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), - hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch] ); + for (i = 0; i < st_ivas->cldfbSynDec[ch]->p_filter_length; i++) { + st_ivas->cldfbSynDec[ch]->cldfb_state_fx[i] = (Word32)(st_ivas->cldfbSynDec[ch]->cldfb_state[i] * (1LL << (5))); + } + + cldfbSynthesis_ivas_fx(ptr_re_fx, ptr_im_fx, &(pPcm_temp_fx[ch][hMCParamUpmix->num_freq_bands * slot_idx]), + hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch]); + for (i = 0; i < st_ivas->cldfbSynDec[ch]->p_filter_length; i++) + { + st_ivas->cldfbSynDec[ch]->cldfb_state[i] = ((float)st_ivas->cldfbSynDec[ch]->cldfb_state_fx[i] / (1LL << (5))); + } } } + //Done to keep entire buffer in q11 + for (ch = 4; ch < 12; ch++) + { + Scale_sig32(output_fx[ch], hMCParamUpmix->num_freq_bands * st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered], 6); + } /* adjust delay of other channels */ noparamupmix_delay = NS2SA( st_ivas->hDecoderConfig->output_Fs, IVAS_FB_DEC_DELAY_NS ); n_samples_rendered = st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered] * hMCParamUpmix->num_freq_bands; @@ -893,24 +882,25 @@ static void ivas_mc_paramupmix_dec_sf( { for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - float tmp_buf[L_SUBFRAME5MS_48k]; - mvr2r( &output_f[ch][n_samples_rendered - noparamupmix_delay], tmp_buf, noparamupmix_delay ); - mvr2r( output_f[ch], &output_f[ch][noparamupmix_delay], n_samples_rendered - noparamupmix_delay ); - mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], noparamupmix_delay ); - mvr2r( tmp_buf, hMCParamUpmix->pcm_delay[ch], noparamupmix_delay ); + Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; + Copy32(&output_fx[ch][n_samples_rendered - noparamupmix_delay], tmp_buf_fx, noparamupmix_delay); + Copy32(output_fx[ch], &output_fx[ch][noparamupmix_delay], n_samples_rendered - noparamupmix_delay); + Copy32(hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], noparamupmix_delay); + Copy32(tmp_buf_fx, hMCParamUpmix->pcm_delay_fx[ch], noparamupmix_delay); } } else { for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - float tmp_buf[L_SUBFRAME5MS_48k]; - mvr2r( &output_f[ch][0], tmp_buf, n_samples_rendered ); - mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], n_samples_rendered ); - mvr2r( &hMCParamUpmix->pcm_delay[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay[ch][0], noparamupmix_delay - n_samples_rendered ); - mvr2r( tmp_buf, &hMCParamUpmix->pcm_delay[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered ); + Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; + Copy32(&output_fx[ch][0], tmp_buf_fx, n_samples_rendered); + Copy32(hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], n_samples_rendered); + Copy32(&hMCParamUpmix->pcm_delay_fx[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay_fx[ch][0], noparamupmix_delay - n_samples_rendered); + Copy32(tmp_buf_fx, &hMCParamUpmix->pcm_delay_fx[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered); } } + } st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; @@ -921,135 +911,1042 @@ static void ivas_mc_paramupmix_dec_sf( } -static int16_t huff_read( - Decoder_State *st, - const int16_t ( *ht )[2] ) +static Word16 huff_read( + Decoder_State *st, + const Word16(*ht)[2]) { - int16_t node = 0; - uint16_t next_bit = 0; - - do - { - next_bit = st->bit_stream[st->next_bit_pos]; - st->next_bit_pos++; - node = ht[node][next_bit]; - } while ( node > 0 ); - - return -( node + 1 ); + Word16 node = 0; + UWord16 next_bit = 0; + + DO + { + next_bit = st->bit_stream[st->next_bit_pos]; + st->next_bit_pos++; + node = ht[node][next_bit]; + } + WHILE(GT_16(node, 0)); + + return negate(add(node, 1)); } static void huffman_decode( - Decoder_State *st, - const PAR_TYPE parType, - int32_t *vq ) + Decoder_State *st, + const PAR_TYPE parType, + Word32 *vq) { - const int16_t( *huff_node_table )[2]; - int16_t iv, nquant, offset; + const Word16(*huff_node_table)[2]; + Word16 iv, nquant, offset; - nquant = 0; - switch ( parType ) - { + nquant = 0; + SWITCH(parType) + { case ALPHA: - nquant = ivas_mc_paramupmix_alpha_quant_table.nquant; - break; + nquant = ivas_mc_paramupmix_alpha_quant_table_fx.nquant; + BREAK; case BETA: - nquant = ivas_mc_paramupmix_beta_quant_table[0].nquant; - break; + nquant = ivas_mc_paramupmix_beta_quant_table_fx[0].nquant; + BREAK; default: - assert( 0 ); - } + assert(0); + } - offset = nquant - 1; /* range of df [-(nquant - 1), nquant - 1] */ + offset = sub(nquant, 1); /* range of df [-(nquant - 1), nquant - 1] */ - st->next_bit_pos++; - switch ( parType ) - { + st->next_bit_pos++; + SWITCH(parType) + { case ALPHA: - huff_node_table = ivas_mc_paramupmix_huff_nodes_df0.alpha; - break; + huff_node_table = ivas_mc_paramupmix_huff_nodes_df0.alpha; + BREAK; case BETA: - huff_node_table = ivas_mc_paramupmix_huff_nodes_df0.beta; - break; + huff_node_table = ivas_mc_paramupmix_huff_nodes_df0.beta; + BREAK; default: - huff_node_table = NULL; - assert( 0 ); - } - vq[0] = huff_read( st, huff_node_table ); + huff_node_table = NULL; + assert(0); + } + vq[0] = huff_read(st, huff_node_table); - switch ( parType ) - { + SWITCH(parType) + { case ALPHA: - huff_node_table = ivas_mc_paramupmix_huff_nodes_df.alpha; - break; + huff_node_table = ivas_mc_paramupmix_huff_nodes_df.alpha; + BREAK; case BETA: - huff_node_table = ivas_mc_paramupmix_huff_nodes_df.beta; - break; + huff_node_table = ivas_mc_paramupmix_huff_nodes_df.beta; + BREAK; default: - assert( 0 ); + assert(0); + } + + FOR(iv = 1; iv < IVAS_MAX_NUM_BANDS; iv++) + { + vq[iv] = L_sub(L_add(huff_read(st, huff_node_table), vq[sub(iv, 1)]), offset); + } + + return; +} + + +static void dequant_alpha( + Word32 *vq, + Word32 *v) +{ + Word16 iv; + const ACPL_QUANT_TABLE_FX *quant_table = &ivas_mc_paramupmix_alpha_quant_table_fx; + + FOR(iv = 0; iv < IVAS_MAX_NUM_BANDS; iv++) + { + v[iv] = quant_table->data[vq[iv]]; + } + + return; +} + + +static void dequant_beta( + Word32 *aq, + Word32 *bq, + Word32 *beta) +{ + Word16 iv; + const ACPL_QUANT_TABLE_FX *quant_table; + + FOR(iv = 0; iv < IVAS_MAX_NUM_BANDS; iv++) + { + quant_table = &ivas_mc_paramupmix_beta_quant_table_fx[ivas_param_upmx_mx_qmap[aq[iv]]]; + beta[iv] = quant_table->data[bq[iv]]; + } + + return; +} + + +static void get_ec_data( + Decoder_State *st, + const PAR_TYPE parType, + Word32 *parQ, + Word32 *alphaQEnv, + Word32 ab[IVAS_MAX_NUM_BANDS]) +{ + huffman_decode(st, parType, parQ); + + IF(EQ_32(parType, ALPHA)) + { + dequant_alpha(parQ, ab); + mvl2l(parQ, alphaQEnv, (Word16)IVAS_MAX_NUM_BANDS); + } + ELSE + { + dequant_beta(alphaQEnv, parQ, ab); + } + + return; +} +#else + + +/*-----------------------------------------------------------------------* + * Local arrays + *-----------------------------------------------------------------------*/ + + /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ +const int16_t MC_PARAMUPMIX_CHIDX1[MC_PARAMUPMIX_COMBINATIONS] = { 0, 1, 4, 5 }; +const int16_t MC_PARAMUPMIX_CHIDX2[MC_PARAMUPMIX_COMBINATIONS] = { 2, 3, 6, 7 }; + + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void ps_pred_process_sf(MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, DECODER_TC_BUFFER_HANDLE hTcBuffer, float qmf_mod_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float *param_interpol, const int16_t ch, const int16_t slots_rendered); + +static void ivas_mc_paramupmix_dec_sf(Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS]); + +static void ivas_param_upmix_dec_decorr_subframes(Decoder_Struct *st_ivas, const int16_t nSamplesForRendering); + +static int16_t huff_read(Decoder_State *st, const int16_t(*ht)[2]); + +static void huffman_decode(Decoder_State *st, const PAR_TYPE parType, int32_t *vq); + +static void dequant_alpha(int32_t *vq, float *v); + +static void dequant_beta(int32_t *aq, int32_t *bq, float *beta); + +static void get_ec_data(Decoder_State *st, const PAR_TYPE parType, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS]); + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_read_BS() + * + * Read the ParamUpmix MC metadata + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_read_BS( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_State *st0, /* i/o: decoder state structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ +) +{ + int16_t i, k; + int32_t alpha_quant[IVAS_MAX_NUM_BANDS]; + int16_t nb_bits_read_orig; + int16_t next_bit_pos_orig, last_bit_pos; + uint16_t bstr_meta[MAX_BITS_METADATA], *bit_stream_orig; + + push_wmops("mc_paramupmix_read_bs"); + *nb_bits = 0; + + if (st0->bfi) + { + for (i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) + { + for (k = 0; k < IVAS_MAX_NUM_BANDS; k++) + { + hMCParamUpmix->alphas[i][k] = hMCParamUpmix->alpha_prev[i][k]; + hMCParamUpmix->betas[i][k] = hMCParamUpmix->beta_prev[i][k]; + } + } + hMCParamUpmix->first_frame = 1; + } + else /* if (!st->bfi) */ + { + bit_stream_orig = st0->bit_stream; + next_bit_pos_orig = st0->next_bit_pos; + last_bit_pos = (int16_t)((st_ivas->hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC) - 1); + nb_bits_read_orig = 0; + last_bit_pos -= nb_bits_read_orig; /* reverse the bitstream for easier reading of indices */ + for (i = 0; i < min(MAX_BITS_METADATA, last_bit_pos); i++) + { + bstr_meta[i] = st_ivas->bit_stream[last_bit_pos - i]; } + st0->bit_stream = bstr_meta; + st0->next_bit_pos = 0; + st0->bits_frame = min(MAX_BITS_METADATA, last_bit_pos + 1); + st0->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ - for ( iv = 1; iv < IVAS_MAX_NUM_BANDS; iv++ ) + for (i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) { - vq[iv] = huff_read( st, huff_node_table ) + vq[iv - 1] - offset; + get_ec_data(st0, ALPHA, hMCParamUpmix->alpha_quant[i], alpha_quant, hMCParamUpmix->alphas[i]); + + get_ec_data(st0, BETA, hMCParamUpmix->beta_quant[i], alpha_quant, hMCParamUpmix->betas[i]); } + *nb_bits += st0->next_bit_pos; + st0->bit_stream = bit_stream_orig; + st0->next_bit_pos = next_bit_pos_orig; - return; + if (hMCParamUpmix->first_frame) + { + for (i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) + { + mvr2r(hMCParamUpmix->alphas[i], hMCParamUpmix->alpha_prev[i], IVAS_MAX_NUM_BANDS); + mvr2r(hMCParamUpmix->betas[i], hMCParamUpmix->beta_prev[i], IVAS_MAX_NUM_BANDS); + } + hMCParamUpmix->first_frame = 0; + } + } + + pop_wmops(); + return; } -static void dequant_alpha( - int32_t *vq, - float *v ) +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_digest_tc() + * + * + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels*/ + const int16_t nSamplesForRendering /* i : number of samples provided */ +) { - int16_t iv; - const ACPL_QUANT_TABLE *quant_table = &ivas_mc_paramupmix_alpha_quant_table; + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert(hMCParamUpmix); + push_wmops("ivas_mc_paramupmix_dec_digest_tc"); + + ivas_param_upmix_dec_decorr_subframes(st_ivas, nSamplesForRendering); - for ( iv = 0; iv < IVAS_MAX_NUM_BANDS; iv++ ) + /* adapt subframes */ + ivas_jbm_dec_td_renderers_adapt_subframes(st_ivas); + + ivas_jbm_dec_get_adapted_linear_interpolator(DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hMCParamUpmix->param_interpolator); + + pop_wmops(); + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_render() + * + * + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_render( + 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 */ + float *input_f[], /* i : core-coder transport channels */ + float *output_f[] /* i/o: synthesized core-coder transport channels */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, ch; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert(hMCParamUpmix); + + push_wmops("ivas_mc_paramupmix_dec_render"); + + for (ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) + { + output_f_local[ch] = output_f[ch]; + } + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min(st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, nSamplesAsked / slot_size); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + + for (ch = 0; ch < MAX_TRANSPORT_CHANNELS; ch++) + { + mvr2r(input_f[ch], output_f_local[ch], *nSamplesRendered); + } + + while (slots_to_render > 0) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + { + + for (ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++) { - v[iv] = quant_table->data[vq[iv]]; + mvr2r(hMCParamUpmix->alpha_prev[ch], hMCParamUpmix->alpha_sf[ch], IVAS_MAX_NUM_BANDS); + mvr2r(hMCParamUpmix->beta_prev[ch], hMCParamUpmix->beta_sf[ch], IVAS_MAX_NUM_BANDS); } - return; + for (subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++) + { + int16_t n_samples_sf = slot_size * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; + + ivas_mc_paramupmix_dec_sf(st_ivas, output_f_local); + + for (ch = 0; ch < min(MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec(st_ivas, -1, -1)); ch++) + { + output_f_local[ch] += n_samples_sf; + } + + /* update combined orientation access index */ + ivas_combined_orientation_update_index(st_ivas->hCombinedOrientationData, n_samples_sf); + } + + for (ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++) + { + mvr2r(hMCParamUpmix->alphas[ch], hMCParamUpmix->alpha_prev[ch], IVAS_MAX_NUM_BANDS); + mvr2r(hMCParamUpmix->betas[ch], hMCParamUpmix->beta_prev[ch], IVAS_MAX_NUM_BANDS); + } + } + + *nSamplesAvailable = (st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered) * slot_size; + + pop_wmops(); + return; } -static void dequant_beta( - int32_t *aq, - int32_t *bq, - float *beta ) +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_open() + * + * Open Parametric MC decoder handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_mc_paramupmix_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) { - int16_t iv; - const ACPL_QUANT_TABLE *quant_table; + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + int32_t output_Fs; + int16_t nchan_transport; + uint16_t i; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ((hMCParamUpmix = (MC_PARAMUPMIX_DEC_HANDLE)malloc(sizeof(MC_PARAMUPMIX_DEC_DATA))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param-Upmix MC\n")); + } + output_Fs = st_ivas->hDecoderConfig->output_Fs; + hMCParamUpmix->first_frame = 1; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + nchan_transport = st_ivas->nchan_transport; + + switch (nchan_transport) + { + case 8: + st_ivas->nCPE = 4; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; + } + + hMCParamUpmix->hoa_encoder = NULL; + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + hMCParamUpmix->num_freq_bands = (int16_t)(output_Fs * INV_CLDFB_BANDWIDTH + 0.5f); + + for (i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) + { + ivas_td_decorr_dec_open(&(hMCParamUpmix->hTdDecorr[i]), output_Fs, 2, 1); + } + + for (i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++) + { + if ((hMCParamUpmix->pcm_delay[i] = (float *)malloc(NS2SA(output_Fs, IVAS_FB_DEC_DELAY_NS) * sizeof(float))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for delay buffer\n")); + } + set_zero(hMCParamUpmix->pcm_delay[i], NS2SA(output_Fs, IVAS_FB_DEC_DELAY_NS)); + } - for ( iv = 0; iv < IVAS_MAX_NUM_BANDS; iv++ ) + /* Head or external rotation */ + if ((st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) && (st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation)) + { + if ((hMCParamUpmix->hoa_encoder = (float *)malloc(st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof(float))) == NULL) { - quant_table = &ivas_mc_paramupmix_beta_quant_table[ivas_param_upmx_mx_qmap[aq[iv]]]; - beta[iv] = quant_table->data[bq[iv]]; + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n")); } + compute_hoa_encoder_mtx(st_ivas->hTransSetup.ls_azimuth, st_ivas->hTransSetup.ls_elevation, hMCParamUpmix->hoa_encoder, st_ivas->hTransSetup.nchan_out_woLFE, HEAD_ROTATION_HOA_ORDER); + } + + /* allocate transport channels*/ + hMCParamUpmix->free_param_interpolator = 0; + hMCParamUpmix->param_interpolator = NULL; + + if ((hMCParamUpmix->param_interpolator = (float *)malloc(MAX_JBM_CLDFB_TIMESLOTS * sizeof(float))) == NULL) + { + return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for interpolator\n")); + } + hMCParamUpmix->free_param_interpolator = 1; + + ivas_jbm_dec_get_adapted_linear_interpolator(DEFAULT_JBM_CLDFB_TIMESLOTS, DEFAULT_JBM_CLDFB_TIMESLOTS, hMCParamUpmix->param_interpolator); + + if (st_ivas->hTcBuffer == NULL) + { + int16_t nchan_to_allocate; + int16_t nchan_tc; + TC_BUFFER_MODE buffer_mode; + buffer_mode = TC_BUFFER_MODE_RENDERER; + nchan_tc = ivas_jbm_dec_get_num_tc_channels(st_ivas); + nchan_to_allocate = MC_PARAMUPMIX_MAX_INPUT_CHANS; + + if (st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + nchan_tc = st_ivas->hDecoderConfig->nchan_out; + nchan_to_allocate = nchan_tc; + } + else if (st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC) + { + nchan_to_allocate = MC_PARAMUPMIX_MAX_INPUT_CHANS; + } + + if ((error = ivas_jbm_dec_tc_buffer_open(st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, NS2SA(st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS))) != IVAS_ERR_OK) + { + return error; + } + } + st_ivas->hMCParamUpmix = hMCParamUpmix; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_close() + * + * Close ParamUpmix MC memories + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_close( + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix /* i/o: Parametric MC decoder handle */ +) +{ + int16_t i; + + if (hMCParamUpmix == NULL || *hMCParamUpmix == NULL) + { return; + } + for (i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) + { + ivas_td_decorr_dec_close(&((*hMCParamUpmix)->hTdDecorr[i])); + } + for (i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++) + { + if ((*hMCParamUpmix)->pcm_delay[i] != NULL) + { + free((*hMCParamUpmix)->pcm_delay[i]); + } + } + if ((*hMCParamUpmix)->param_interpolator != NULL) + { + if ((*hMCParamUpmix)->free_param_interpolator == 1) + { + free((*hMCParamUpmix)->param_interpolator); + } + } + if ((*hMCParamUpmix)->hoa_encoder != NULL) + { + free((*hMCParamUpmix)->hoa_encoder); + (*hMCParamUpmix)->hoa_encoder = NULL; + } + free(*hMCParamUpmix); + + *hMCParamUpmix = NULL; + + return; } -static void get_ec_data( - Decoder_State *st, - const PAR_TYPE parType, - int32_t *parQ, - int32_t *alphaQEnv, - float ab[IVAS_MAX_NUM_BANDS] ) +/*------------------------------------------------------------------------- + * paramupmix_td_decorr_process_jbm() + * + * + *------------------------------------------------------------------------*/ + +static void paramupmix_td_decorr_process_jbm( + ivas_td_decorr_state_t *hTdDecorr[], /* i/o: SPAR Covar. decoder handle */ + float *pcm_in[], /* i : input audio channels */ + float **pp_out_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t j, k; + int16_t offset; + float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; + + offset = (int16_t)(output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU); + + /* Look-ahead delay */ + for (k = 0; k < MC_PARAMUPMIX_COMBINATIONS; k++) + { + mvr2r(pcm_in[k], pp_out_pcm[k], output_frame); + delay_signal_float(pp_out_pcm[k], output_frame, hTdDecorr[k]->look_ahead_buf, offset); + + /* In ducking gains */ + if (hTdDecorr[k]->ducking_flag) + { + ivas_td_decorr_get_ducking_gains(hTdDecorr[k]->pTrans_det, pcm_in[k], in_duck_gain, out_duck_gain, output_frame, 0); + + for (j = 0; j < output_frame; j++) + { + pp_out_pcm[k][j] = pp_out_pcm[k][j] * in_duck_gain[j]; + } + } + + /* All pass delay section */ + ivas_td_decorr_APD_iir_filter(&hTdDecorr[k]->APD_filt_state[0], pp_out_pcm[k], hTdDecorr[k]->num_apd_sections, output_frame); + + /* Out ducking gains */ + if (hTdDecorr[k]->ducking_flag) + { + for (j = 0; j < output_frame; j++) + { + pp_out_pcm[k][j] = pp_out_pcm[k][j] * out_duck_gain[j]; + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_upmix_dec_decorr_subframes() + * + * + *------------------------------------------------------------------------*/ + +static void ivas_param_upmix_dec_decorr_subframes( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nSamplesForRendering) +{ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + float *pPcm_tmp[MC_PARAMUPMIX_COMBINATIONS]; + float *p_tc[MC_PARAMUPMIX_COMBINATIONS]; + int16_t nchan_internal, ch; + int16_t nSamplesLeftForTD, default_frame; + + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert(hMCParamUpmix); + + push_wmops("ivas_param_upmix_dec_decorr_subframes"); + + /* TD decorrelator */ + default_frame = (int16_t)(st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC); + nSamplesLeftForTD = nSamplesForRendering; + nchan_internal = MC_PARAMUPMIX_COMBINATIONS; + + for (ch = 0; ch < nchan_internal; ch++) + { + pPcm_tmp[ch] = st_ivas->hTcBuffer->tc[ch + 8]; + p_tc[ch] = st_ivas->hTcBuffer->tc[ch + 4]; + } + + while (nSamplesLeftForTD) + { + int16_t nSamplesToDecorr = min(nSamplesLeftForTD, default_frame); + + paramupmix_td_decorr_process_jbm(hMCParamUpmix->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr); + + for (ch = 0; ch < nchan_internal; ch++) + { + p_tc[ch] += nSamplesToDecorr; + } + + nSamplesLeftForTD -= nSamplesToDecorr; + } + + pop_wmops(); + return; +} + + +/*****************************************************************************************/ +/* local functions */ +/*****************************************************************************************/ + +static void ps_pred_process_sf( + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, + DECODER_TC_BUFFER_HANDLE hTcBuffer, + float qmf_mod_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* in/out */ + float qmf_mod_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float qmf_side_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* in/out */ + float qmf_side_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float *param_interpol, + const int16_t ch, + const int16_t slots_rendered) { - huffman_decode( st, parType, parQ ); + float vmre, vmim, vsre, vsim; + int16_t iqmf, ipar, ismp, iismp; + float alpha_smp, beta_smp; + float *alpha1, *alpha2; + float *beta1, *beta2; + float *alpha_prev = hMCParamUpmix->alpha_prev[ch]; + float *beta_prev = hMCParamUpmix->beta_prev[ch]; + float *alpha_sf = hMCParamUpmix->alpha_sf[ch]; + float *beta_sf = hMCParamUpmix->beta_sf[ch]; + float dalpha, dbeta, ifac; + float alpha_start[IVAS_MAX_NUM_BANDS], beta_start[IVAS_MAX_NUM_BANDS]; + + const int16_t qmf_to_par_band[] = { + 0, 1, 2, 3, 4, 5, 5, 6, 6, 7, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11 + }; + + mvr2r(alpha_sf, alpha_start, IVAS_MAX_NUM_BANDS); + mvr2r(beta_sf, beta_start, IVAS_MAX_NUM_BANDS); + for (iqmf = 0; iqmf < CLDFB_NO_CHANNELS_MAX; iqmf++) + { + ipar = qmf_to_par_band[iqmf]; + alpha1 = alpha_prev; + beta1 = beta_prev; + + ismp = 0; + alpha2 = hMCParamUpmix->alphas[ch]; + beta2 = hMCParamUpmix->betas[ch]; + alpha_smp = alpha_start[ipar]; + beta_smp = beta_start[ipar]; + + for (iismp = 0; iismp < hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered]; iismp++) + { + if ((slots_rendered == 0) && (iismp == 0)) + { + ifac = param_interpol[iismp]; + } + else + { + ifac = param_interpol[iismp] - param_interpol[iismp - 1]; + } + dalpha = (alpha2[ipar] - alpha1[ipar]) * ifac; + dbeta = (beta2[ipar] - beta1[ipar]) * ifac; + + alpha_smp += dalpha; + beta_smp += dbeta; + + vmre = qmf_mod_re[ismp][iqmf]; + vmim = qmf_mod_im[ismp][iqmf]; + vsre = qmf_side_re[ismp][iqmf]; + vsim = qmf_side_im[ismp][iqmf]; + + qmf_side_re[ismp][iqmf] = alpha_smp * vmre + beta_smp * vsre; + qmf_side_im[ismp][iqmf] = alpha_smp * vmim + beta_smp * vsim; + + ismp++; + } + alpha_sf[ipar] = alpha_smp; + beta_sf[ipar] = beta_smp; + } - if ( parType == ALPHA ) + return; +} + + +static void ivas_mc_paramupmix_dec_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[MAX_OUTPUT_CHANNELS] /* i/o: synthesized core-coder transport channels */ +) +{ + int16_t i, ch, slot_idx, k; + float *pPcm_temp[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/ + /*CLDFB*/ + float Cldfb_RealBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + int16_t noparamupmix_delay, n_samples_rendered; + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + int16_t subframeIdx, idx_in, maxBand; + float Cldfb_RealBuffer_subfr[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_subfr[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert(hMCParamUpmix); + push_wmops("ivas_mc_paramupmix_dec_sf"); + + for (i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++) + { + pPcm_temp[2 * i] = output_f[i + 4]; /* un-decorrelated */ + pPcm_temp[2 * i + 1] = output_f[i + 8]; /* decorrelated */ + } + + /* CLDFB Analysis*/ + for (ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++) + { + /* slot loop for gathering the input data */ + for (slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++) { - dequant_alpha( parQ, ab ); - mvl2l( parQ, alphaQEnv, (int16_t) IVAS_MAX_NUM_BANDS ); + cldfbAnalysis_ts_ivas(&(pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx]), Cldfb_RealBuffer[ch][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], hMCParamUpmix->num_freq_bands, st_ivas->cldfbAnaDec[ch]); + } + } + for (ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++) + { + ps_pred_process_sf(hMCParamUpmix, + st_ivas->hTcBuffer, + Cldfb_RealBuffer[2 * ch], /* in/out */ + Cldfb_ImagBuffer[2 * ch], + Cldfb_RealBuffer[2 * ch + 1], /* in/out decorr */ + Cldfb_ImagBuffer[2 * ch + 1], + &hMCParamUpmix->param_interpolator[st_ivas->hTcBuffer->slots_rendered], + ch, + st_ivas->hTcBuffer->slots_rendered); + + /*-- m, s -> l, r ----------------------------*/ + for (slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++) + { + for (k = 0; k < CLDFB_NO_CHANNELS_MAX; k++) + { + float qlre = Cldfb_RealBuffer[2 * ch][slot_idx][k]; + float qlim = Cldfb_ImagBuffer[2 * ch][slot_idx][k]; + float qrre = Cldfb_RealBuffer[2 * ch + 1][slot_idx][k]; + float qrim = Cldfb_ImagBuffer[2 * ch + 1][slot_idx][k]; + + Cldfb_RealBuffer[2 * ch][slot_idx][k] = qlre + qrre; + Cldfb_ImagBuffer[2 * ch][slot_idx][k] = qlim + qrim; + Cldfb_RealBuffer[2 * ch + 1][slot_idx][k] = qlre - qrre; + Cldfb_ImagBuffer[2 * ch + 1][slot_idx][k] = qlim - qrim; + } + } + } + + if (st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM) + { + maxBand = (int16_t)((CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs) / 48000); + subframeIdx = st_ivas->hTcBuffer->subframes_rendered; + /* fastconv binaural rendering and CLDFB synthesis */ + /* cldfb analysis of non-coupled, non-LFE channels */ + idx_in = 0; + for (ch = 0; ch < MC_PARAMUPMIX_MAX_INPUT_CHANS - 2 * MC_PARAMUPMIX_COMBINATIONS; ch++) + { + if (st_ivas->hIntSetup.index_lfe[0] != ch) + { + pPcm_temp[ch] = output_f[ch]; + /* slot loop for gathering the input data */ + for (slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++) + { + cldfbAnalysis_ts_ivas(&(pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx]), + Cldfb_RealBuffer_subfr[idx_in][slot_idx], + Cldfb_ImagBuffer_subfr[idx_in][slot_idx], + maxBand, st_ivas->cldfbAnaDec[2 * MC_PARAMUPMIX_COMBINATIONS + idx_in]); + } + idx_in++; + } + } + + /* copy and reorder cldfb analysis of coupled channels */ + for (ch = 0; ch < MAX_PARAM_SPATIAL_SUBFRAMES; ch++) + { + for (slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++) + { + mvr2r(Cldfb_RealBuffer[MC_PARAMUPMIX_CHIDX1[ch]][slot_idx], Cldfb_RealBuffer_subfr[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX); + mvr2r(Cldfb_ImagBuffer[MC_PARAMUPMIX_CHIDX1[ch]][slot_idx], Cldfb_ImagBuffer_subfr[idx_in][slot_idx], CLDFB_NO_CHANNELS_MAX); + mvr2r(Cldfb_RealBuffer[MC_PARAMUPMIX_CHIDX2[ch]][slot_idx], Cldfb_RealBuffer_subfr[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX); + mvr2r(Cldfb_ImagBuffer[MC_PARAMUPMIX_CHIDX2[ch]][slot_idx], Cldfb_ImagBuffer_subfr[idx_in + 1][slot_idx], CLDFB_NO_CHANNELS_MAX); + } + idx_in += 2; + } + + if (st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV) + { + for (slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++) + { + ivas_param_mc_mc2sba_cldfb(st_ivas->hTransSetup, hMCParamUpmix->hoa_encoder, slot_idx, Cldfb_RealBuffer_subfr, Cldfb_ImagBuffer_subfr, maxBand, GAIN_LFE); + } + } + + + /* Implement binaural rendering */ + ivas_binRenderer(st_ivas->hBinRenderer, + st_ivas->hCombinedOrientationData, + st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, + Cldfb_RealBuffer_subfr, + Cldfb_ImagBuffer_subfr); + + + /* Implement CLDFB synthesis */ + for (ch = 0; ch < BINAURAL_CHANNELS; ch++) + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + + for (slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++) + { + RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch][slot_idx]; + ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch][slot_idx]; + } + + cldfbSynthesis_ivas(RealBuffer, ImagBuffer, &(output_f[ch][0]), maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], st_ivas->cldfbSynDec[ch]); + } + } + else + { + /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ + pPcm_temp[0] = output_f[4]; + pPcm_temp[1] = output_f[6]; + pPcm_temp[2] = output_f[5]; + pPcm_temp[3] = output_f[7]; + pPcm_temp[4] = output_f[8]; + pPcm_temp[5] = output_f[10]; + pPcm_temp[6] = output_f[9]; + pPcm_temp[7] = output_f[11]; + + /* CLDFB synthesis */ + for (ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++) + { + for (slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; slot_idx++) + { + float *ptr_im[1], *ptr_re[1]; + ptr_re[0] = Cldfb_RealBuffer[ch][slot_idx]; + ptr_im[0] = Cldfb_ImagBuffer[ch][slot_idx]; + + cldfbSynthesis_ivas(ptr_re, ptr_im, &(pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx]), + hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch]); + } + } + /* adjust delay of other channels */ + noparamupmix_delay = NS2SA(st_ivas->hDecoderConfig->output_Fs, IVAS_FB_DEC_DELAY_NS); + n_samples_rendered = st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered] * hMCParamUpmix->num_freq_bands; + if (n_samples_rendered > noparamupmix_delay) + { + for (ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++) + { + float tmp_buf[L_SUBFRAME5MS_48k]; + mvr2r(&output_f[ch][n_samples_rendered - noparamupmix_delay], tmp_buf, noparamupmix_delay); + mvr2r(output_f[ch], &output_f[ch][noparamupmix_delay], n_samples_rendered - noparamupmix_delay); + mvr2r(hMCParamUpmix->pcm_delay[ch], output_f[ch], noparamupmix_delay); + mvr2r(tmp_buf, hMCParamUpmix->pcm_delay[ch], noparamupmix_delay); + } } else { - dequant_beta( alphaQEnv, parQ, ab ); + for (ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++) + { + float tmp_buf[L_SUBFRAME5MS_48k]; + mvr2r(&output_f[ch][0], tmp_buf, n_samples_rendered); + mvr2r(hMCParamUpmix->pcm_delay[ch], output_f[ch], n_samples_rendered); + mvr2r(&hMCParamUpmix->pcm_delay[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay[ch][0], noparamupmix_delay - n_samples_rendered); + mvr2r(tmp_buf, &hMCParamUpmix->pcm_delay[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered); + } } + } - return; + st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->subframes_rendered]; + st_ivas->hTcBuffer->subframes_rendered++; + + pop_wmops(); + return; +} + + +static int16_t huff_read( + Decoder_State *st, + const int16_t(*ht)[2]) +{ + int16_t node = 0; + uint16_t next_bit = 0; + + do + { + next_bit = st->bit_stream[st->next_bit_pos]; + st->next_bit_pos++; + node = ht[node][next_bit]; + } while (node > 0); + + return -(node + 1); } + + +static void huffman_decode( + Decoder_State *st, + const PAR_TYPE parType, + int32_t *vq) +{ + const int16_t(*huff_node_table)[2]; + int16_t iv, nquant, offset; + + nquant = 0; + switch (parType) + { + case ALPHA: + nquant = ivas_mc_paramupmix_alpha_quant_table.nquant; + break; + case BETA: + nquant = ivas_mc_paramupmix_beta_quant_table[0].nquant; + break; + default: + assert(0); + } + + offset = nquant - 1; /* range of df [-(nquant - 1), nquant - 1] */ + + st->next_bit_pos++; + switch (parType) + { + case ALPHA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_df0.alpha; + break; + case BETA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_df0.beta; + break; + default: + huff_node_table = NULL; + assert(0); + } + vq[0] = huff_read(st, huff_node_table); + + switch (parType) + { + case ALPHA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_df.alpha; + break; + case BETA: + huff_node_table = ivas_mc_paramupmix_huff_nodes_df.beta; + break; + default: + assert(0); + } + + for (iv = 1; iv < IVAS_MAX_NUM_BANDS; iv++) + { + vq[iv] = huff_read(st, huff_node_table) + vq[iv - 1] - offset; + } + + return; +} + + +static void dequant_alpha( + int32_t *vq, + float *v) +{ + int16_t iv; + const ACPL_QUANT_TABLE *quant_table = &ivas_mc_paramupmix_alpha_quant_table; + + for (iv = 0; iv < IVAS_MAX_NUM_BANDS; iv++) + { + v[iv] = quant_table->data[vq[iv]]; + } + + return; +} + + +static void dequant_beta( + int32_t *aq, + int32_t *bq, + float *beta) +{ + int16_t iv; + const ACPL_QUANT_TABLE *quant_table; + + for (iv = 0; iv < IVAS_MAX_NUM_BANDS; iv++) + { + quant_table = &ivas_mc_paramupmix_beta_quant_table[ivas_param_upmx_mx_qmap[aq[iv]]]; + beta[iv] = quant_table->data[bq[iv]]; + } + + return; +} + + +static void get_ec_data( + Decoder_State *st, + const PAR_TYPE parType, + int32_t *parQ, + int32_t *alphaQEnv, + float ab[IVAS_MAX_NUM_BANDS]) +{ + huffman_decode(st, parType, parQ); + + if (parType == ALPHA) + { + dequant_alpha(parQ, ab); + mvl2l(parQ, alphaQEnv, (int16_t)IVAS_MAX_NUM_BANDS); + } + else + { + dequant_beta(alphaQEnv, parQ, ab); + } + + return; +} + + +#endif \ No newline at end of file diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index a096ee901e60d6e646eb2b954aec306aff29236c..f169d7e55ba9cbf48472de7edb89e4980f969651 100644 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -80,14 +80,14 @@ ivas_error ivas_mcmasa_dec_reconfig( { IF ( st_ivas->hDirAC == NULL ) { - IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) { return error; } } ELSE { - IF ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_mct_core_dec.c b/lib_dec/ivas_mct_core_dec.c index d6af26d16d63f403090edb24798dcb3a99265a48..cc2281d50972c4038149ac7f608d87ebd72dc3cf 100644 --- a/lib_dec/ivas_mct_core_dec.c +++ b/lib_dec/ivas_mct_core_dec.c @@ -354,7 +354,7 @@ void ivas_mct_core_dec( x_e = 31 - q_x[ch]; decoder_tcx_IGF_mono_fx( st, x_fx[ch][k], &x_e, &x_len, L_frame, left_rect, bfi, k ); q_x[ch] = 31 - x_e; - for ( int i = 0; i < x_len; i++ ) + for ( i = 0; i < x_len; i++ ) { x_fx[ch][k][i] = L_shr( x_fx[ch][k][i], q_x[ch] - Q12 ); } @@ -377,7 +377,7 @@ void ivas_mct_core_dec( apply_MCT_dec_fx( hMCT, sts, x_fx, q_x ); FOR( ch = 0; ch < nChannels; ch++ ) { - for ( int i = 0; i < L_FRAME48k / 2; i++ ) + for ( i = 0; i < L_FRAME48k / 2; i++ ) { x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], q_x[ch] - Q12 ); x_fx[ch][1][i] = L_shr( x_fx[ch][1][i], q_x[ch] - Q12 ); diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index f6728e20a40b4526f518bb4edd8d02112d5150ed..9aa0a7109c467b3a5a5d505927642f8eacd75cb6 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -64,74 +64,295 @@ static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas, uint16_t *nSamp #ifndef IVAS_FLOAT_FIXED ivas_error ivas_mct_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* o : output synthesis signal */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + int16_t n, nCPE, cpe_id; + MCT_DEC_HANDLE hMCT; + CPE_DEC_HANDLE hCPE; + float *x[CPE_CHANNELS][NB_DIV]; + int16_t param[MCT_MAX_BLOCKS][CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV]; + int16_t param_lpc[MCT_MAX_BLOCKS][CPE_CHANNELS][NPRM_LPC_NEW]; + int16_t p_param[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + int16_t nTnsBitsTCX10[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + float Aq[MCT_MAX_BLOCKS][CPE_CHANNELS][(NB_SUBFR16k + 1) * (M + 1)]; + int16_t fUseTns[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + STnsData tnsData[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + Decoder_State **sts; + float synth[CPE_CHANNELS][L_FRAME_PLUS]; + float output_lfe_ch[L_FRAME48k]; + int32_t ivas_total_brate; + ivas_error error; + + push_wmops("ivas_mct_dec"); + + error = IVAS_ERR_OK; + nCPE = st_ivas->nCPE; + hMCT = st_ivas->hMCT; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + if (st_ivas->ivas_format == MC_FORMAT && (st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX)) + { + /* save LFE channel */ + mvr2r(output[LFE_CHANNEL], output_lfe_ch, output_frame); + } + + if (st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && !st_ivas->bfi) + { + /* get the number of channels from the signalled MC LS setup */ + n = ivas_mc_ls_setup_get_num_channels(ivas_mc_map_output_config_to_mc_ls_setup(st_ivas->transport_config)); + + if (n != st_ivas->nchan_transport) + { + /* IVAS_fmToDo: more work needed for switching the number of transport channels */ + return IVAS_ERROR(IVAS_ERR_INTERNAL_FATAL, "Error: wrong number of transport channels signalled in MC format!"); + } + } + + for (cpe_id = 0; cpe_id < nCPE; cpe_id++) + { + /*initialize param_lpc buffer*/ + for (n = 0; n < CPE_CHANNELS; n++) + { + set_s(param_lpc[cpe_id][n], 0, NPRM_LPC_NEW); + } + + if ((error = ivas_cpe_dec(st_ivas, cpe_id, output, output_frame, 0)) != IVAS_ERR_OK) + { + return error; + } + + if (cpe_id == 0) + { + st_ivas->hCPE[0]->hCoreCoder[0]->total_brate = ivas_total_brate; /* set high enough to read the whole side-info; total_brate is rewritten later in ivas_mdct_core_invQ() */ + } + + if (!st_ivas->bfi) + { + ivas_mdct_dec_side_bits_frame_channel(st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], nTnsBitsTCX10[cpe_id], param[cpe_id], 1, + ((cpe_id + 1) * CPE_CHANNELS > hMCT->nchan_out_woLFE)); + + st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect; + st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect; + } + } + + /* MCT side bits decoder */ + ivas_mct_side_bits(hMCT, st_ivas->hCPE, nCPE, st_ivas->hCPE[0]->hCoreCoder[0], st_ivas->bfi, st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream, ivas_total_brate, nb_bits_metadata); + + for (cpe_id = 0; cpe_id < nCPE; cpe_id++) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect |= st_ivas->BER_detect; + st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect |= st_ivas->BER_detect; + + for (n = 0; n < CPE_CHANNELS; n++) + { + x[n][0] = output[n + cpe_id * CPE_CHANNELS]; + x[n][1] = output[n + cpe_id * CPE_CHANNELS] + (L_FRAME48k / 2); + set_zero(x[n][0], L_FRAME48k / 2); + set_zero(x[n][1], L_FRAME48k / 2); + } + + ivas_mdct_core_invQ(st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], + fUseTns[cpe_id], tnsData[cpe_id], x, x, Aq[cpe_id], NULL, 1); + + st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect; + st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect; + } + + /* MCT core decoder */ + ivas_mct_core_dec(hMCT, st_ivas->hCPE, nCPE, output); + + /* for sba to stereo output disable any further processing for TCs > 2 as it is not needed*/ + if (st_ivas->sba_dirac_stereo_flag && st_ivas->ivas_format != SBA_ISM_FORMAT) + { + for (cpe_id = 1; cpe_id < nCPE; cpe_id++) + { + for (n = 0; n < CPE_CHANNELS; n++) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + } + } + + /* MCT reconstruction and CoreCoder updates */ + for (cpe_id = 0; cpe_id < nCPE; cpe_id++) + { + hCPE = st_ivas->hCPE[cpe_id]; + + for (n = 0; n < CPE_CHANNELS; n++) + { + x[n][0] = output[n + cpe_id * CPE_CHANNELS]; + x[n][1] = output[n + cpe_id * CPE_CHANNELS] + (L_FRAME48k / 2); + } + + ivas_mdct_core_tns_ns(hCPE, fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1); + } + + if (st_ivas->renderer_type == RENDERER_MC) + { + /* Equalization in MDCT Domain */ + ivas_ls_setup_conversion_process_mdct(st_ivas, output); + } + + else 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)) + { + float *x_all[MAX_CICP_CHANNELS][NB_DIV]; + + for (cpe_id = 0; cpe_id < nCPE; cpe_id++) + { + for (n = 0; n < CPE_CHANNELS; n++) + { + x_all[n + cpe_id * CPE_CHANNELS][0] = output[n + cpe_id * CPE_CHANNELS]; + x_all[n + cpe_id * CPE_CHANNELS][1] = output[n + cpe_id * CPE_CHANNELS] + (L_FRAME48k / 2); + } + } + + ivas_ls_setup_conversion_process_mdct_param_mc(st_ivas, x_all); + } + + for (cpe_id = 0; cpe_id < nCPE; cpe_id++) + { + hCPE = st_ivas->hCPE[cpe_id]; + sts = hCPE->hCoreCoder; + + for (n = 0; n < CPE_CHANNELS; n++) + { + x[n][0] = output[n + cpe_id * CPE_CHANNELS]; + x[n][1] = output[n + cpe_id * CPE_CHANNELS] + (L_FRAME48k / 2); + } + + ivas_mdct_core_reconstruct(hCPE, x, synth, fUseTns[cpe_id], 1); + + /*----------------------------------------------------------------* + * CoreCoder Post-processing and updates + *----------------------------------------------------------------*/ + + for (n = 0; n < CPE_CHANNELS; n++) + { + if (st_ivas->sba_dirac_stereo_flag && (st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2)) + { + ivas_post_proc(NULL, hCPE, n, synth[n], NULL, output_frame, 1); + } + + /* Postprocessing for ACELP/MDCT core switching and synchronization */ + if ((error = core_switching_post_dec(sts[n], synth[n], output[cpe_id * CPE_CHANNELS + n], hCPE->output_mem[1], st_ivas->ivas_format, 0, output_frame, 0 /*core_switching_flag*/, (st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2) ? st_ivas->sba_dirac_stereo_flag : 0, -1, hCPE->last_element_mode)) != IVAS_ERR_OK) + { + return error; + } + + /* final output of synthesis signal */ + mvr2r(synth[n], output[cpe_id * CPE_CHANNELS + n], output_frame); + + /* Save synthesis for HQ FEC */ + save_synthesis_hq_fec(sts[n], output[cpe_id * CPE_CHANNELS + n], output_frame, hCPE); + + /* CoreCoder common updates */ + updt_dec_common(sts[n], NORMAL_HQ_CORE, -1, output[cpe_id * CPE_CHANNELS + n]); + + } /* n_channels loop */ + + + /* synthesis synchronization between stereo modes */ + if (!st_ivas->sba_dirac_stereo_flag || (st_ivas->ivas_format == SBA_ISM_FORMAT && cpe_id < nCPE - 2)) + { + synchro_synthesis(ivas_total_brate, hCPE, output + cpe_id * CPE_CHANNELS, output_frame, 0); + } + + } + + /* move channels after LFE to correct output for multi-channel MCT */ + if (st_ivas->ivas_format == MC_FORMAT && (st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX)) + { + float tmp[L_FRAME48k]; + + /*save center channel output*/ + mvr2r(output[hMCT->nchan_out_woLFE - 1], tmp, output_frame); + + for (n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n--) + { + mvr2r(output[n - 1], output[n + 1], output_frame); + } + mvr2r(tmp, output[LFE_CHANNEL - 1], output_frame); + + /* save LFE channel */ + mvr2r(output_lfe_ch, output[LFE_CHANNEL], output_frame); + } + + + pop_wmops(); + return error; +} +#else +ivas_error ivas_mct_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[], /* o : output synthesis signal */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ + Word32 *output_fx[], /* o : output synthesis signal */ + const Word16 output_frame, /* i : output frame length per channel */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ ) { - int16_t n, nCPE, cpe_id; + Word16 ch, nCPE, cpe_id; MCT_DEC_HANDLE hMCT; CPE_DEC_HANDLE hCPE; - float *x[CPE_CHANNELS][NB_DIV]; - int16_t param[MCT_MAX_BLOCKS][CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV]; - int16_t param_lpc[MCT_MAX_BLOCKS][CPE_CHANNELS][NPRM_LPC_NEW]; - int16_t p_param[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; - int16_t nTnsBitsTCX10[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; - float Aq[MCT_MAX_BLOCKS][CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; - int16_t fUseTns[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + Word16 param[MCT_MAX_BLOCKS][CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV]; + Word16 param_lpc[MCT_MAX_BLOCKS][CPE_CHANNELS][NPRM_LPC_NEW]; + Word16 p_param[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + Word16 nTnsBitsTCX10[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + Word16 fUseTns[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; STnsData tnsData[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; + Word16 Aq_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; + Word32 output_lfe_ch_fx[L_FRAME48k]; + Word16 q_output = 11; + Word16 n, k, i; + + Word32 *x_fx[CPE_CHANNELS][NB_DIV]; + Word16 x_e[MAX_CICP_CHANNELS][NB_DIV]; + Word16 x_len[CPE_CHANNELS][NB_DIV] = { 0 }; Decoder_State **sts; - float synth[CPE_CHANNELS][L_FRAME_PLUS]; - float output_lfe_ch[L_FRAME48k]; + Word16 synth_fx[CPE_CHANNELS][L_FRAME_PLUS]; int32_t ivas_total_brate; ivas_error error; -#ifdef IVAS_FLOAT_FIXED - /* TODO: Temporary fix to avoid garbage values while calculating its q-factor - when not initialised. */ - set_zero((float *)Aq, MCT_MAX_BLOCKS*CPE_CHANNELS*(NB_SUBFR16k + 1) * (M + 1)); -#endif - push_wmops( "ivas_mct_dec" ); error = IVAS_ERR_OK; nCPE = st_ivas->nCPE; + move16(); hMCT = st_ivas->hMCT; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); - if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + IF ( EQ_16(st_ivas->ivas_format, MC_FORMAT) && ( EQ_16(st_ivas->mc_mode, MC_MODE_MCT) || EQ_16(st_ivas->mc_mode, MC_MODE_PARAMUPMIX) ) ) { /* save LFE channel */ - mvr2r( output[LFE_CHANNEL], output_lfe_ch, output_frame ); + mvl2l( output_fx[LFE_CHANNEL], output_lfe_ch_fx, output_frame ); } - if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && !st_ivas->bfi ) + IF ( EQ_16(st_ivas->ivas_format, MC_FORMAT) && EQ_16(st_ivas->mc_mode, MC_MODE_MCT) && EQ_16(st_ivas->bfi, 0) ) { /* get the number of channels from the signalled MC LS setup */ n = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); - if ( n != st_ivas->nchan_transport ) + IF ( NE_16(n, st_ivas->nchan_transport) ) { /* IVAS_fmToDo: more work needed for switching the number of transport channels */ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: wrong number of transport channels signalled in MC format!" ); } } - for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + FOR ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { /*initialize param_lpc buffer*/ - for ( n = 0; n < CPE_CHANNELS; n++ ) + FOR ( n = 0; n < CPE_CHANNELS; n++ ) { set_s( param_lpc[cpe_id][n], 0, NPRM_LPC_NEW ); } -#ifdef IVAS_FLOAT_FIXED - Word32 *output_fx[2]; - Word16 q_output = 11; - output_fx[0] = malloc( sizeof( Word32 ) * L_FRAME48k ); - output_fx[1] = malloc( sizeof( Word32 ) * L_FRAME48k ); set32_fx( &output_fx[0][0], 0, L_FRAME48k ); set32_fx( &output_fx[1][0], 0, L_FRAME48k ); @@ -140,1745 +361,1839 @@ ivas_error ivas_mct_dec( return error; } - for ( int k = 0; k < L_FRAME48k; k++ ) - { - output[0][k] = (float) output_fx[0][k] / ( 1 << q_output ); - output[1][k] = (float) output_fx[1][k] / ( 1 << q_output ); - } - free( output_fx[0] ); - free( output_fx[1] ); -#else - if ( ( error = ivas_cpe_dec( st_ivas, cpe_id, output, output_frame, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif // IVAS_FLOAT_FIXED - - if ( cpe_id == 0 ) + IF ( EQ_16(cpe_id, 0) ) { st_ivas->hCPE[0]->hCoreCoder[0]->total_brate = ivas_total_brate; /* set high enough to read the whole side-info; total_brate is rewritten later in ivas_mdct_core_invQ() */ + move32(); } - if ( !st_ivas->bfi ) + IF ( EQ_16(st_ivas->bfi, 0) ) { - ivas_mdct_dec_side_bits_frame_channel( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], nTnsBitsTCX10[cpe_id], param[cpe_id], 1, - ( ( cpe_id + 1 ) * CPE_CHANNELS > hMCT->nchan_out_woLFE ) ); + ivas_mdct_dec_side_bits_frame_channel_fx( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], nTnsBitsTCX10[cpe_id], param[cpe_id], 1, + (Word16) GT_16( i_mult(add( cpe_id, 1 ), CPE_CHANNELS ), hMCT->nchan_out_woLFE ) ); - st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect; - st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect; + st_ivas->BER_detect = s_or(st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect); + test(); + st_ivas->BER_detect = s_or(st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect); + test(); } } /* MCT side bits decoder */ - ivas_mct_side_bits( hMCT, st_ivas->hCPE, nCPE, st_ivas->hCPE[0]->hCoreCoder[0], st_ivas->bfi, st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream, ivas_total_brate, nb_bits_metadata ); + ivas_mct_side_bits_fx( hMCT, st_ivas->hCPE, nCPE, st_ivas->hCPE[0]->hCoreCoder[0], st_ivas->bfi, st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream, ivas_total_brate, nb_bits_metadata ); - for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + FOR ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { - st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect |= st_ivas->BER_detect; - st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect |= st_ivas->BER_detect; - - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - x[n][0] = output[n + cpe_id * CPE_CHANNELS]; - x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); - set_zero( x[n][0], L_FRAME48k / 2 ); - set_zero( x[n][1], L_FRAME48k / 2 ); - } - -#ifdef IVAS_FLOAT_FIXED -#ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - hCPE = st_ivas->hCPE[cpe_id]; - sts = hCPE->hCoreCoder; - - Word16 Aq_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; - Word16 ch, k, l, i, j; - - Word32 *x_fx[CPE_CHANNELS][NB_DIV]; - Word16 x_e[CPE_CHANNELS][NB_DIV]; - Word16 x_len[CPE_CHANNELS][NB_DIV] = { 0 }; + st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect = s_or(st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect, st_ivas->BER_detect); + test(); + st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect = s_or(st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect, st_ivas->BER_detect); + test(); - FOR( i = 0; i < CPE_CHANNELS; ++i ) + FOR ( n = 0; n < CPE_CHANNELS; n++ ) { - x_fx[i][0] = malloc( L_FRAME48k * sizeof( Word32 ) ); - x_fx[i][1] = x_fx[i][0] + L_FRAME48k / 2; - floatToFixed_arrL( x[i][0], x_fx[i][0], 0, L_FRAME48k / 2 ); - floatToFixed_arrL( x[i][1], x_fx[i][1], 0, L_FRAME48k / 2 ); - - FOR( j = 0; j < NB_DIV; ++j ) - { - x_e[i][j] = 31; - } + x_fx[n][0] = output_fx[n + cpe_id * CPE_CHANNELS]; + x_e[n][0] = 20; + x_fx[n][1] = output_fx[n + cpe_id * CPE_CHANNELS] + shr( L_FRAME48k, 1 ); + x_e[n][1] = 20; + move16(); + move16(); + + set32_fx( x_fx[n][0], 0, shr(L_FRAME48k, 1) ); + set32_fx( x_fx[n][1], 0, shr(L_FRAME48k, 1) ); } - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) - { - sts[ch]->gamma = float_to_fix16( sts[ch]->gamma_float, Q15 ); - sts[ch]->preemph_fac = float_to_fix16( sts[ch]->preemph_fac_float, Q15 ); - sts[ch]->Mode2_lp_gainp = float_to_fix( sts[ch]->lp_gainp, Q16 ); - sts[ch]->hTcxLtpDec->tcxltp_gain = float_to_fix16( sts[ch]->hTcxLtpDec->tcxltp_gain_float, Q15 ); - sts[ch]->inv_gamma = float_to_fix16( 1 / sts[ch]->gamma_float, Q14 ); - f2me_16( sts[ch]->last_gain_syn_deemph_float, &sts[ch]->last_gain_syn_deemph, &sts[ch]->last_gain_syn_deemph_e ); - f2me_16( sts[ch]->last_concealed_gain_syn_deemph_float, &sts[ch]->last_concealed_gain_syn_deemph, &sts[ch]->last_concealed_gain_syn_deemph_e ); - f2me_16( sts[ch]->hTcxDec->old_gaintcx_bfi_float, &sts[ch]->hTcxDec->old_gaintcx_bfi, &sts[ch]->hTcxDec->old_gaintcx_bfi_e ); - floatToFixed_arr( Aq[cpe_id][ch], Aq_fx[cpe_id][ch], Q12, ( NB_SUBFR16k + 1 ) * ( M + 1 ) ); - - sts[ch]->hTcxDec->tcxltp_last_gain_unmodified = float_to_fix16( sts[ch]->hTcxDec->tcxltp_last_gain_unmodified_float, Q15 ); - sts[ch]->old_fpitch = float_to_fix( sts[ch]->old_fpitch_float, Q16 ); - //sts[ch]->hTonalMDCTConc->lastPitchLag = float_to_fix( sts[ch]->hTonalMDCTConc->lastPitchLag_float, Q16 ); - // u8bit to 16bit - FOR( l = 0; l < IGF_START_MX; l++ ) - { - sts[ch]->hIGFDec->infoTCXNoise_evs[l] = (Word16) sts[ch]->hIGFDec->infoTCXNoise[l]; - } - FOR( l = 0; l < N_LTP_GAIN_MEMS; l++ ) - { - sts[ch]->hTcxDec->ltpGainMemory_fx[l] = float_to_fix16( sts[ch]->hTcxDec->ltpGainMemory[l], Q15 ); - } - sts[ch]->hTcxDec->cummulative_damping_tcx = float_to_fix16( sts[ch]->hTcxDec->cummulative_damping_tcx_float, Q15 ); - } - } - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - IF( sts[ch]->rate_switching_reset ) - { - floatToFixed_arr( sts[ch]->lsp_old, sts[ch]->lsp_old_fx, Q15, M ); - } - } -#endif ivas_mdct_core_invQ_fx( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], fUseTns[cpe_id], tnsData[cpe_id], x_fx, x_e, x_fx, x_e, x_len, Aq_fx[cpe_id], NULL, 1 ); -#ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - IF( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - me2f_buf( x_fx[ch][0], x_e[ch][0], x[ch][0], sts[ch]->hTcxCfg->tcx_coded_lines ); - sts[ch]->hTcxDec->damping_float = fix16_to_float( sts[ch]->hTcxDec->damping, Q14 ); - sts[ch]->hTcxDec->gainHelper_float = me2f_16( sts[ch]->hTcxDec->gainHelper, sts[ch]->hTcxDec->gainHelper_e ); - sts[ch]->hTcxDec->stepCompensate_float = me2f_16( sts[ch]->hTcxDec->stepCompensate, sts[ch]->hTcxDec->stepCompensate_e ); - } - IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) - { - sts[ch]->lp_gainp = fix_to_float( sts[ch]->Mode2_lp_gainp, Q16 ); - //sts[ch]->hTonalMDCTConc->lastPitchLag_float = fix_to_float( sts[ch]->hTonalMDCTConc->lastPitchLag, Q16 ); - sts[ch]->hTonalMDCTConc->nFramesLost_float = fix16_to_float( sts[ch]->hTonalMDCTConc->nFramesLost, Q1 ); - sts[ch]->hTcxDec->damping_float = fix16_to_float( sts[ch]->hTcxDec->damping, Q14 ); - sts[ch]->hTcxDec->stepCompensate_float = me2f_16( sts[ch]->hTcxDec->stepCompensate, sts[ch]->hTcxDec->stepCompensate_e ); - sts[ch]->hTcxDec->gainHelper_float = me2f_16( sts[ch]->hTcxDec->gainHelper, sts[ch]->hTcxDec->gainHelper_e ); - sts[ch]->last_concealed_gain_syn_deemph_float = me2f_16( sts[ch]->last_concealed_gain_syn_deemph, sts[ch]->last_concealed_gain_syn_deemph_e ); - sts[ch]->last_gain_syn_deemph_float = me2f_16( sts[ch]->last_gain_syn_deemph, sts[ch]->last_gain_syn_deemph_e ); - sts[ch]->hTcxDec->old_gaintcx_bfi_float = me2f_16( sts[ch]->hTcxDec->old_gaintcx_bfi, sts[ch]->hTcxDec->old_gaintcx_bfi_e ); - fixedToFloat_arr( Aq_fx[cpe_id][ch], Aq[cpe_id][ch], Q12, ( NB_SUBFR16k + 1 ) * ( M + 1 ) ); - // 16bit to u8bit - FOR( Word16 l = 0; l < IGF_START_MX; l++ ) - { - sts[ch]->hIGFDec->infoTCXNoise[l] = (uint8_t) sts[ch]->hIGFDec->infoTCXNoise_evs[l]; - } - FOR( Word16 l = 0; l < N_LTP_GAIN_MEMS; l++ ) - { - sts[ch]->hTcxDec->ltpGainMemory[l] = fix16_to_float( sts[ch]->hTcxDec->ltpGainMemory_fx[l], Q15 ); - } - Word16 subFrames = ( sts[ch]->core == TCX_10_CORE ) ? NB_DIV : 1; - FOR( k = 0; k < subFrames; ++k ) - { - me2f_buf( x_fx[ch][k], x_e[ch][k], x[ch][k], x_len[ch][k] ); - // To be made into Q11 - // me2f_buf(x_fx[ch][k], x_e[ch][k], x[ch][k], L_FRAME48k / 2); - } - IF( !sts[0]->bfi || ( sts[0]->bfi && sts[ch]->core != ACELP_CORE ) ) - { - me2f_buf( sts[ch]->hIGFDec->virtualSpec, sts[ch]->hIGFDec->virtualSpec_e, sts[ch]->hIGFDec->virtualSpec_float, ( N_MAX_TCX - IGF_START_MN ) ); - } - sts[ch]->hTcxDec->cummulative_damping_tcx_float = fix16_to_float( sts[ch]->hTcxDec->cummulative_damping_tcx, Q15 ); - } - } - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR(ch = 0; ch < CPE_CHANNELS; ch++) { - IF( sts[ch]->rate_switching_reset ) + Word16 subFrames = (st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->core == TCX_10_CORE) ? NB_DIV : 1; + FOR(k = 0; k < subFrames; ++k) { - Word16 old_Aq_12_8_e = norm_s( sts[ch]->old_Aq_12_8_fx[0] ); - fixedToFloat_arr( sts[ch]->old_Aq_12_8_fx, sts[ch]->old_Aq_12_8, ( 15 - old_Aq_12_8_e ), M + 1 ); + Scale_sig32(x_fx[ch][k], shr(L_FRAME48k, subFrames - 1), sub(x_e[ch][k], 20)); } } - - FOR( i = 0; i < CPE_CHANNELS; ++i ) - { - free( x_fx[i][0] ); - } - -#endif -#else - ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], - fUseTns[cpe_id], tnsData[cpe_id], x, x, Aq[cpe_id], NULL, 1 ); -#endif - - st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect; - st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect; - } - - /* MCT core decoder */ -#ifdef IVAS_FLOAT_FIXED -#if 1 - Word32 *signal_out_fx[MAX_TRANSPORT_CHANNELS]; - Decoder_State *st, *sts_tmp[MAX_TRANSPORT_CHANNELS]; - int i = 0; - for (cpe_id = 0; cpe_id < nCPE; cpe_id++) - { - for (int ch = 0; ch < CPE_CHANNELS; ch++) - { - sts_tmp[i] = st_ivas->hCPE[cpe_id]->hCoreCoder[ch]; - i++; - } + + st_ivas->BER_detect = s_or(st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect); + test(); + st_ivas->BER_detect = s_or(st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect); + test(); } - i = 0; - for (int ch = 0; ch < hMCT->nchan_out_woLFE; ch++) - { - if (sts_tmp[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE) - { - continue; - } - i++; - } - for (int i = 0; i < hMCT->nchan_out_woLFE; ++i) - { - signal_out_fx[i] = malloc(L_FRAME48k * sizeof(Word32)); - floatToFixed_arrL(output[i], signal_out_fx[i], Q12, L_FRAME48k); - } + /* MCT core decoder */ Word16 q_x[MAX_TRANSPORT_CHANNELS]; set16_fx(q_x, Q12, MAX_TRANSPORT_CHANNELS); -#endif - - ivas_mct_core_dec(hMCT, st_ivas->hCPE, nCPE, signal_out_fx, q_x); - - for (int ch = 0; ch < hMCT->nchan_out_woLFE; ch++) + // Scaling output buffer to q_x + FOR ( i = 0; i < hMCT->nchan_out_woLFE; ++i) { - fixedToFloat_arrL(signal_out_fx[ch], output[ch], q_x[ch], L_FRAME48k); - free(signal_out_fx[ch]); + Scale_sig32(output_fx[i], L_FRAME48k, sub(q_x[i], Q11) ); } - /*for (int ch = 0; ch < hMCT->nchan_out_woLFE; ch++) - { - dbgwrite_txt(output[ch] , L_FRAME48k, "Fixed_code_mct_core.txt", NULL); - for (int k = 0; k < L_FRAME48k; k++) - { - k = k; - } - }*/ -#if 1 - if (sts_tmp[0]->igf) + ivas_mct_core_dec(hMCT, st_ivas->hCPE, nCPE, output_fx, q_x); + // Scaling output buffer back to Q11 + FOR ( i = 0; i < hMCT->nchan_out_woLFE; ++i) { - if (!hMCT->currBlockDataCnt) - { - for (int ch = 0; ch < hMCT->nchan_out_woLFE; ch++) - { - st = sts_tmp[ch]; - - IF(st->igf) - { - me2f_buf(st->hIGFDec->virtualSpec, st->hIGFDec->virtualSpec_e, st->hIGFDec->virtualSpec_float, (N_MAX_TCX - IGF_START_MN)); - FOR(Word16 l = 0; l < IGF_START_MX; l++) - { - st->hIGFDec->infoTCXNoise[l] = (uint8_t)st->hIGFDec->infoTCXNoise_evs[l]; - } - } - } - } + Scale_sig32(output_fx[i], L_FRAME48k, sub(Q11, q_x[i]) ); } -#endif -#else - ivas_mct_core_dec( hMCT, st_ivas->hCPE, nCPE, output ); - /*for (int ch = 0; ch < hMCT->nchan_out_woLFE; ch++) - { - dbgwrite_txt(output[ch], L_FRAME48k, "Float_code_mct_core.txt", NULL); - }*/ -#endif + /* for sba to stereo output disable any further processing for TCs > 2 as it is not needed*/ - if ( st_ivas->sba_dirac_stereo_flag && st_ivas->ivas_format != SBA_ISM_FORMAT ) + IF ( NE_16(st_ivas->sba_dirac_stereo_flag, 0) && NE_16(st_ivas->ivas_format, SBA_ISM_FORMAT) ) { - for ( cpe_id = 1; cpe_id < nCPE; cpe_id++ ) + FOR ( cpe_id = 1; cpe_id < nCPE; cpe_id++ ) { - for ( n = 0; n < CPE_CHANNELS; n++ ) + FOR ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; } } } + Word32 Aq_fx_32[6][2][102]; /* MCT reconstruction and CoreCoder updates */ - for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + FOR(cpe_id = 0; cpe_id < nCPE; cpe_id++) { hCPE = st_ivas->hCPE[cpe_id]; - for ( n = 0; n < CPE_CHANNELS; n++ ) + FOR(n = 0; n < CPE_CHANNELS; n++) { - x[n][0] = output[n + cpe_id * CPE_CHANNELS]; - x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); + Copy_Scale_sig_16_32(Aq_fx[cpe_id][n], Aq_fx_32[cpe_id][n], 102, sub(Q16, Q12)); + x_fx[n][0] = output_fx[n + cpe_id * CPE_CHANNELS]; + x_fx[n][1] = output_fx[n + cpe_id * CPE_CHANNELS] + (L_FRAME48k / 2); + x_e[n][0] = 20; + move16(); + x_e[n][1] = 20; + move16(); } - ivas_mdct_core_tns_ns( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1 ); - } + ivas_mdct_core_tns_ns_fx(hCPE, fUseTns[cpe_id], tnsData[cpe_id], x_fx, Aq_fx_32[cpe_id], 1, x_e); - if ( st_ivas->renderer_type == RENDERER_MC ) - { - /* Equalization in MDCT Domain */ -#ifdef IVAS_FLOAT_FIXED - Word32 *output_fx[MAX_TRANSPORT_CHANNELS]; - for ( int i = 0; i < st_ivas->nchan_transport; ++i ) - { - output_fx[i] = malloc( L_FRAME48k * sizeof( Word32 ) ); - floatToFixed_arrL( output[i], output_fx[i], Q11, L_FRAME48k ); - } - ivas_ls_setup_conversion_process_mdct_fx( st_ivas, output_fx); - for ( int i = 0; i < st_ivas->nchan_transport; ++i ) + FOR(Word16 ind = 0; ind < 2; ind++) { - fixedToFloat_arrL( output_fx[i], output[i], Q11, L_FRAME48k ); - free(output_fx[i]); + Word16 nSubFrames = EQ_16(hCPE->hCoreCoder[ind]->core, TCX_20_CORE) ? 1 : NB_DIV; + Scale_sig32(x_fx[ind][0], shr(L_FRAME48k, sub(nSubFrames, 1)), sub(x_e[ind][0], 20)); + IF(nSubFrames == 2) { + Scale_sig32(x_fx[ind][1], shr(L_FRAME48k, 1), sub(x_e[ind][1], 20)); + } } -#else - ivas_ls_setup_conversion_process_mdct( st_ivas, output ); -#endif } - else 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 ) ) - { - float *x_all[MAX_CICP_CHANNELS][NB_DIV]; - - for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) - { - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - x_all[n + cpe_id * CPE_CHANNELS][0] = output[n + cpe_id * CPE_CHANNELS]; - x_all[n + cpe_id * CPE_CHANNELS][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); - } - } -#ifdef IVAS_FLOAT_FIXED - Word32 **output_fx; + IF ( EQ_16(st_ivas->renderer_type, RENDERER_MC) ) + { + /* Equalization in MDCT Domain */ + ivas_ls_setup_conversion_process_mdct_fx( st_ivas, output_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 }; Word32 *x_all_fx[MAX_CICP_CHANNELS][NB_DIV]; - IF( ( output_fx = (Word32 **) malloc( MAX_CICP_CHANNELS * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + FOR(cpe_id = 0; cpe_id < nCPE; cpe_id++) { - FOR( n = 0; n < CPE_CHANNELS; n++ ) + FOR(n = 0; n < CPE_CHANNELS; n++) { - IF( ( output_fx[n + cpe_id * CPE_CHANNELS] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); - } - f2me_buf( output[n + cpe_id * CPE_CHANNELS], output_fx[n + cpe_id * CPE_CHANNELS], &x_all_e[n + cpe_id * CPE_CHANNELS][0], 960 ); - Scale_sig32( output_fx[n + cpe_id * CPE_CHANNELS], L_FRAME48k, -1 ); /*Scaling the signal down by 1 because of overflow*/ - x_all_e[n + cpe_id * CPE_CHANNELS][0]++; x_all_fx[n + cpe_id * CPE_CHANNELS][0] = output_fx[n + cpe_id * CPE_CHANNELS]; - x_all_fx[n + cpe_id * CPE_CHANNELS][1] = output_fx[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); - x_all_e[n + cpe_id * CPE_CHANNELS][1] = x_all_e[n + cpe_id * CPE_CHANNELS][0]; - } - } - f2me_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - f2me_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], &st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->sfbCnt ); - PARAM_MC_DEC_HANDLE hParamMC; - hParamMC = st_ivas->hParamMC; - floatToFixed_arr16( hParamMC->icld_q, hParamMC->icld_q_fx, 8, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - floatToFixed_arr32( hParamMC->ls_conv_dmx_matrix, hParamMC->ls_conv_dmx_matrix_fx, 15, st_ivas->hDecoderConfig->nchan_out * ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) ); - FOR(Word16 chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++) - { - FOR(Word16 chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++) - { - st_ivas->hLsSetUpConversion->dmxMtx_fx[chInIdx][chOutIdx] = float_to_fix(st_ivas->hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx], 30); /*Q30*/ - } - } - ivas_ls_setup_conversion_process_mdct_param_mc_fx( st_ivas, x_all_fx, x_all_e ); - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) - { - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - me2f_buf( &x_all_fx[n + cpe_id * CPE_CHANNELS][0][0], x_all_e[n + cpe_id * CPE_CHANNELS][0], &x_all[n + cpe_id * CPE_CHANNELS][0][0], L_FRAME48k / 2 ); - me2f_buf( &x_all_fx[n + cpe_id * CPE_CHANNELS][1][0], x_all_e[n + cpe_id * CPE_CHANNELS][1], &x_all[n + cpe_id * CPE_CHANNELS][1][0], L_FRAME48k / 2 ); + x_all_fx[n + cpe_id * CPE_CHANNELS][1] = output_fx[n + cpe_id * CPE_CHANNELS] + (L_FRAME48k / 2); + x_all_e[n + cpe_id * CPE_CHANNELS][1] = 20; + move16(); + x_all_e[n + cpe_id * CPE_CHANNELS][0] = 20; + move16(); } } - me2f_buf( st_ivas->hLsSetUpConversion->targetEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->te_prev_exp, st_ivas->hLsSetUpConversion->targetEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - me2f_buf( st_ivas->hLsSetUpConversion->dmxEnergyPrev_fx[0], st_ivas->hLsSetUpConversion->dmx_prev_exp, st_ivas->hLsSetUpConversion->dmxEnergyPrev[0], st_ivas->hLsSetUpConversion->sfbCnt ); - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + ivas_ls_setup_conversion_process_mdct_param_mc_fx(st_ivas, x_all_fx, x_all_e); + + FOR(cpe_id = 0; cpe_id < nCPE; cpe_id++) { - FOR( n = 0; n < CPE_CHANNELS; n++ ) + FOR(n = 0; n < CPE_CHANNELS; n++) { - free( output_fx[n + cpe_id * CPE_CHANNELS] ); + Scale_sig32(x_all_fx[n + cpe_id * CPE_CHANNELS][0], shr(L_FRAME48k, 1), sub(x_all_e[n + cpe_id * CPE_CHANNELS][0], 20)); + Scale_sig32(x_all_fx[n + cpe_id * CPE_CHANNELS][1], shr(L_FRAME48k, 1), sub(x_all_e[n + cpe_id * CPE_CHANNELS][1], 20)); } } -#else - ivas_ls_setup_conversion_process_mdct_param_mc( st_ivas, x_all ); -#endif // + } - for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + FOR ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { hCPE = st_ivas->hCPE[cpe_id]; sts = hCPE->hCoreCoder; - for ( n = 0; n < CPE_CHANNELS; n++ ) + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + x_fx[n][0] = output_fx[n + cpe_id * CPE_CHANNELS]; + x_fx[n][1] = output_fx[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); + } + FOR(n = 0; n < CPE_CHANNELS; n++) { - x[n][0] = output[n + cpe_id * CPE_CHANNELS]; - x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); + IF(NE_16(hCPE->hCoreCoder[n]->Q_syn, 0)) + { + Scale_sig(hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, L_FRAME48k, hCPE->hCoreCoder[n]->Q_syn); + } + if ( sts[n]->hTcxDec && sts[n]->hTcxDec->conCngLevelBackgroundTrace_e < 0 ) + { + sts[n]->hTcxDec->conCngLevelBackgroundTrace_e = 0; + } } + + Copy_Scale_sig_16_32(hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, M + 1, (28 - norm_s(hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0] - 1))); + Copy_Scale_sig_16_32(hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, M + 1, (28 - norm_s(hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0] - 1))); + ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, 15 ); + + FOR(n = 0; n < CPE_CHANNELS; n++) + { + IF(NE_16(hCPE->hCoreCoder[n]->Q_syn, 0)) + { + Scale_sig(hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, L_FRAME48k, negate(hCPE->hCoreCoder[n]->Q_syn)); + } + IF(hCPE->hCoreCoder[n]->hBPF) + { + hCPE->hCoreCoder[n]->hBPF->pst_mem_deemp_err_fx = extract_l( L_shr( hCPE->hCoreCoder[n]->mem_error, sub(Q16, hCPE->hCoreCoder[n]->Q_syn2 - 1) ) ); + Scale_sig(hCPE->hCoreCoder[n]->hBPF->pst_old_syn_fx, NBPSF_PIT_MAX, hCPE->hCoreCoder[n]->Q_syn2 - 1); + } + IF(hCPE->hCoreCoder[n]->hTcxDec) + { + //Scale_sig(hCPE->hCoreCoder[n]->hTcxDec->synth_history_fx, NS2SA(hCPE->hCoreCoder[n]->output_Fs, PH_ECU_MEM_NS), negate(hCPE->hCoreCoder[n]->Q_syn)); + } + IF(hCPE->hCoreCoder[n]->hHQ_core) + { + Scale_sig(hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, L_FRAME48k, negate(hCPE->hCoreCoder[n]->Q_syn)); + } - ivas_mdct_core_reconstruct( hCPE, x, synth, fUseTns[cpe_id], 1 ); + } + /*----------------------------------------------------------------* * CoreCoder Post-processing and updates *----------------------------------------------------------------*/ + Word32 synth_fx_32[CPE_CHANNELS][L_FRAME48k]; - for ( n = 0; n < CPE_CHANNELS; n++ ) + FOR ( n = 0; n < CPE_CHANNELS; n++ ) { - if ( st_ivas->sba_dirac_stereo_flag && ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) ) + IF ( NE_16(st_ivas->sba_dirac_stereo_flag, 0) && ( NE_16(st_ivas->ivas_format, SBA_ISM_FORMAT) || GE_16(cpe_id, sub(nCPE, 2)) ) ) { -#ifdef IVAS_FLOAT_FIXED - Word32 synth_fx[CPE_CHANNELS][L_FRAME48k]; - Word16 q = 11; - for ( int p = 0; p < L_FRAME48k; p++ ) - { - synth_fx[n][p] = (Word32) ( synth[n][p] * ( 1u << q ) ); - - if ( p < NS2SA( hCPE->hCoreCoder[n]->output_Fs, STEREO_DFT32MS_OVL_NS ) ) - { - hCPE->output_mem_fx[0][p] = (Word32) ( hCPE->output_mem[0][p] * ( 1u << q ) ); - hCPE->output_mem_fx[1][p] = (Word32) ( hCPE->output_mem[1][p] * ( 1u << q ) ); - } - - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q ) ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q ) ); - } - } - if ( !( NE_16( hCPE->hCoreCoder[n]->core, TCX_20_CORE ) && NE_16( hCPE->hCoreCoder[n]->core, TCX_10_CORE ) ) ) - { - for ( int k = 0; k < output_frame; k++ ) - { - hCPE->hCoreCoder[n]->hHQ_core->oldOut_fx[k] = (Word32) ( hCPE->hCoreCoder[n]->hHQ_core->old_out[k] * ( 1u << q ) ); - //if ( k < 111 ) - //{ - // hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] = (Word32) ( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] * ( 1u << q ) ); - //} - if ( k < HQ_DELTA_MAX * HQ_DELAY_COMP ) - { - hCPE->hCoreCoder[n]->delay_buf_out32_fx[k] = (Word32) ( hCPE->hCoreCoder[n]->delay_buf_out[k] * ( 1u << q ) ); - } - } - } - if ( !( ( hCPE->hCoreCoder[n]->element_mode != IVAS_CPE_DFT && !( st_ivas->sba_dirac_stereo_flag && hCPE->hCoreCoder[n]->element_mode != IVAS_CPE_MDCT ) ) || ( hCPE->hCoreCoder[n]->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) ) - { - for ( int p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q ) ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q ) ); - } - } - hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain_post_prev = (Word16) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain_post_prev_float * ONE_IN_Q15 ); - hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain = (Word16) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain_float * ONE_IN_Q15 ); - } - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain_post_prev = (Word16) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain_post_prev_float * ONE_IN_Q15 ); - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain = (Word16) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain_float * ONE_IN_Q15 ); - //for ( int p = 0; p < 111; p++ ) - //{ - // hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[p] = (Word32) ( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[p] * ( 1u << q ) ); - //} - ivas_post_proc_fx( NULL, hCPE, n, synth_fx[n], NULL, output_frame, 1 ); - - for ( int p = 0; p < L_FRAME48k; p++ ) - { - synth[n][p] = (float) synth_fx[n][p] / ( 1u << q ); - - if ( p < NS2SA( hCPE->hCoreCoder[n]->output_Fs, STEREO_DFT32MS_OVL_NS ) ) - { - hCPE->output_mem[0][p] = (float) hCPE->output_mem_fx[0][p] / ( 1u << q ); - hCPE->output_mem[1][p] = (float) hCPE->output_mem_fx[1][p] / ( 1u << q ); - } + Copy_Scale_sig_16_32(synth_fx[n], synth_fx_32[n], L_FRAME48k, sub(Q11, 0)); + Copy_Scale_sig_16_32(hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->oldOut_fx, output_frame, Q11); + ivas_post_proc_fx( NULL, hCPE, n, synth_fx_32[n], NULL, output_frame, 1 ); + Copy_Scale_sig_32_16(synth_fx_32[n], synth_fx[n], L_FRAME48k, sub(0, Q11)); - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q ); - } - } - //if ( !( NE_16( hCPE->hCoreCoder[n]->core, TCX_20_CORE ) && NE_16( hCPE->hCoreCoder[n]->core, TCX_10_CORE ) ) ) - //{ - // for ( int k = 0; k < 111; k++ ) - // { - // hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] = (float) hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] / ( 1u << q ); - // } - //} - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain_post_prev_float = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain_post_prev / ONE_IN_Q15; - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain_float = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain / ONE_IN_Q15; - if ( !( ( hCPE->hCoreCoder[n]->element_mode != IVAS_CPE_DFT && !( st_ivas->sba_dirac_stereo_flag && hCPE->hCoreCoder[n]->element_mode != IVAS_CPE_MDCT ) ) || ( hCPE->hCoreCoder[n]->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) ) - { - for ( int p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q ); - } - } - hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain_post_prev_float = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain_post_prev / ONE_IN_Q15; - hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain_float = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain / ONE_IN_Q15; - } -#else - ivas_post_proc( NULL, hCPE, n, synth[n], NULL, output_frame, 1 ); -#endif // IVAS_FLOAT_FIXED } /* Postprocessing for ACELP/MDCT core switching and synchronization */ - if ( ( error = core_switching_post_dec( sts[n], synth[n], output[cpe_id * CPE_CHANNELS + n], hCPE->output_mem[1], st_ivas->ivas_format, 0, output_frame, 0 /*core_switching_flag*/, ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) ? st_ivas->sba_dirac_stereo_flag : 0, -1, hCPE->last_element_mode ) ) != IVAS_ERR_OK ) + Word16 output_mem_fx[L_FRAME48k]; + IF( hCPE->output_mem_fx[1] != NULL ) { - return error; + Copy_Scale_sig_32_16( hCPE->output_mem_fx[1], output_mem_fx, NS2SA( sts[n]->output_Fs, 3125000 ), sub(0, Q11) ); } - - /* final output of synthesis signal */ - mvr2r( synth[n], output[cpe_id * CPE_CHANNELS + n], output_frame ); - - /* Save synthesis for HQ FEC */ -#ifdef IVAS_FLOAT_FIXED - Word32 exp_max = 0, i; - Word32 output_fx[L_FRAME48k]; - if ( ( sts[n]->codec_mode == MODE1 && sts[n]->hTcxDec != NULL ) && ( ( sts[n]->core == ACELP_CORE && !( sts[n]->bfi == 1 && sts[n]->con_tcx == 1 ) ) || sts[n]->core == HQ_CORE ) ) + ELSE { - double max_prev_synth_buffer = 0.0f, max_old_out = 0.0f, max_delay_buf_out = 0.0f, max_ouput = 0.0f, max_synth_history = 0.0f; - Word32 exp_prev_synth_buffer = 0, exp_old_out = 0, exp_delay_buf_out = 0, exp_ouput = 0, exp_synth_history = 0; - - /*Find maximum values for all the buffers*/ - for ( i = 0; i < NS2SA( 48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ); i++ ) - { - max_prev_synth_buffer = max( max_prev_synth_buffer, fabs( sts[n]->prev_synth_buffer[i] ) ); - } - if ( (Word16) max_prev_synth_buffer != 0 ) - { - frexp( max_prev_synth_buffer, &exp_prev_synth_buffer ); - } - - for ( i = NS2SA( sts[n]->output_Fs, N_ZERO_MDCT_NS ); i < NS2SA( sts[n]->output_Fs, N_ZERO_MDCT_NS ) + NS2SA( sts[n]->output_Fs, PH_ECU_LOOKAHEAD_NS ); i++ ) - { - max_old_out = max( max_old_out, fabs( sts[n]->hHQ_core->old_out[i] ) ); - } - if ( (Word16) max_old_out != 0 ) - { - frexp( max_old_out, &exp_old_out ); - } - - for ( i = 0; i < NS2SA( sts[n]->output_Fs, DELAY_CLDFB_NS ); i++ ) - { - max_delay_buf_out = max( max_delay_buf_out, fabs( sts[n]->delay_buf_out[i] ) ); - } - if ( (Word16) max_delay_buf_out != 0 ) - { - frexp( max_delay_buf_out, &exp_delay_buf_out ); - } - - for ( i = 0; i < output_frame; i++ ) - { - max_ouput = max( max_ouput, fabs( output[cpe_id * CPE_CHANNELS + n][i] ) ); - } - if ( (Word16) max_ouput != 0 ) - { - frexp( max_ouput, &exp_ouput ); - } - - for ( i = output_frame; i < 2 * output_frame - NS2SA( sts[n]->output_Fs, DELAY_CLDFB_NS ) + NS2SA( sts[n]->output_Fs, PH_ECU_MEM_NS ); i++ ) - { - max_synth_history = max( max_synth_history, fabs( sts[n]->hTcxDec->synth_history[i] ) ); - } - - if ( (Word16) max_synth_history != 0 ) - { - frexp( max_synth_history, &exp_synth_history ); - } - - /*Find a commen maximum exp*/ - exp_max = max( exp_synth_history, exp_ouput ); - exp_max = max( exp_max, exp_prev_synth_buffer ); - exp_max = max( exp_max, exp_old_out ); - exp_max = max( exp_max, exp_delay_buf_out ); - - for ( i = 0; i < NS2SA( sts[n]->output_Fs, DELAY_CLDFB_NS ); i++ ) - { - f2fix_16( &sts[n]->delay_buf_out[i], &sts[n]->delay_buf_out_fx[i], exp_max ); - } - for ( i = NS2SA( sts[n]->output_Fs, N_ZERO_MDCT_NS ); i < NS2SA( sts[n]->output_Fs, PH_ECU_LOOKAHEAD_NS ); i++ ) - { - f2fix_16( &sts[n]->hHQ_core->old_out[i], &sts[n]->hHQ_core->old_out_fx[i], exp_max ); - } - for ( i = 0; i < NS2SA( 48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ); i++ ) - { - f2fix_16( &sts[n]->prev_synth_buffer[i], &sts[n]->prev_synth_buffer_fx[i], exp_max ); - } - for ( i = output_frame; i < 2 * output_frame - NS2SA( sts[n]->output_Fs, DELAY_CLDFB_NS ) + NS2SA( sts[n]->output_Fs, PH_ECU_MEM_NS ); i++ ) - { - f2fix_16( &sts[n]->hTcxDec->synth_history[i], &sts[n]->hTcxDec->synth_history_fx[i], exp_max ); - } - for ( i = 0; i < output_frame; i++ ) - { - f2fix( &output[cpe_id * CPE_CHANNELS + n][i], &output_fx[i], exp_max ); - } + set16_fx( output_mem_fx, 0, NS2SA( sts[n]->output_Fs, 3125000 ) ); } + + Word16 Q_synth = 0; - save_synthesis_hq_fec_fx( sts[n], output_fx, output_frame, hCPE ); - save_synthesis_hq_fec(sts[n], output[cpe_id * CPE_CHANNELS + n], output_frame, hCPE); - if ( ( sts[n]->codec_mode == MODE1 && sts[n]->hTcxDec != NULL ) && ( ( sts[n]->core == ACELP_CORE && !( sts[n]->bfi == 1 && sts[n]->con_tcx == 1 ) ) || sts[n]->core == HQ_CORE ) ) + IF ( ( error = core_switching_post_dec_ivas_fx( sts[n], synth_fx[n], output_fx[cpe_id * CPE_CHANNELS + n], output_mem_fx, st_ivas->ivas_format, 0, output_frame, 0 /*core_switching_flag*/, ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) ? st_ivas->sba_dirac_stereo_flag : 0, -1, hCPE->last_element_mode, &Q_synth ) ) != IVAS_ERR_OK ) { - /*dumps*/ - float track = 0; - for ( i = 0; i < 2 * output_frame; i++ ) - { - fix2f_16( &sts[n]->hTcxDec->synth_history_fx[i], &track, exp_max ); - fix2f_16( &sts[n]->hTcxDec->synth_history_fx[i], &sts[n]->hTcxDec->synth_history[i], exp_max ); -#ifdef DUMPS_ENABLED - dbgwrite_txt( &track, 1, "Fixed_code_synth_history_fx.txt", NULL ); - dbgwrite_txt( &sts[n]->hTcxDec->synth_history[i], 1, "Float_code_synth_history_fx.txt", NULL ); -#endif - } + return error; } -#else - save_synthesis_hq_fec( sts[n], output[cpe_id * CPE_CHANNELS + n], output_frame, hCPE ); -#endif + Copy_Scale_sig_16_32(synth_fx[n], output_fx[cpe_id * CPE_CHANNELS + n], output_frame, sub(Q11, Q_synth)); + + /* Save synthesis for HQ FEC */ + Word32 output_fx_[L_FRAME48k]; + mvl2l(output_fx[cpe_id * CPE_CHANNELS + n], output_fx_, L_FRAME48k); + Scale_sig32(output_fx_, L_FRAME48k, sub(Q16, Q11)); + Copy_Scale_sig32_16(sts[n]->prev_synth_buffer32_fx, sts[n]->prev_synth_buffer_fx, NS2SA(48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS), -11); + sts[n]->q_prev_synth_buffer_fx = 0; + + save_synthesis_hq_fec_fx( sts[n], output_fx_, output_frame, hCPE ); + /* CoreCoder common updates */ - updt_dec_common( sts[n], NORMAL_HQ_CORE, -1, output[cpe_id * CPE_CHANNELS + n] ); + ivas_updt_dec_common_fx( hCPE->hCoreCoder[n], NORMAL_HQ_CORE, -1, output_fx[cpe_id * CPE_CHANNELS + n], 11 ); } /* n_channels loop */ + FOR(n = 0; n < 2; n++) { + IF(hCPE->hCoreCoder[n]) + { + Copy_Scale_sig_16_32(hCPE->hCoreCoder[n]->delay_buf_out_fx, hCPE->hCoreCoder[n]->delay_buf_out32_fx, HQ_DELTA_MAX * HQ_DELAY_COMP, Q11); + } + } /* synthesis synchronization between stereo modes */ - if ( !st_ivas->sba_dirac_stereo_flag || ( st_ivas->ivas_format == SBA_ISM_FORMAT && cpe_id < nCPE - 2 ) ) + IF ( EQ_16(st_ivas->sba_dirac_stereo_flag, 0) || ( EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT) && LE_16(cpe_id, sub(nCPE, 2)) ) ) { -#ifdef IVAS_FLOAT_FIXED - synchro_synthesis_fixed( ivas_total_brate, hCPE, output + cpe_id * CPE_CHANNELS, output_frame, 0 ); -#else - synchro_synthesis( ivas_total_brate, hCPE, output + cpe_id * CPE_CHANNELS, output_frame, 0 ); -#endif - - //Todo use below once input is fixed not done due to complication in pointer - //synchro_synthesis_fixed_clean( ivas_total_brate, hCPE, output + cpe_id * CPE_CHANNELS, output_frame, 0 ); + synchro_synthesis_fx( ivas_total_brate, hCPE, output_fx + cpe_id * CPE_CHANNELS, output_frame, 0 ); } - } /* move channels after LFE to correct output for multi-channel MCT */ - if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + IF ( EQ_16(st_ivas->ivas_format, MC_FORMAT) && ( EQ_16(st_ivas->mc_mode, MC_MODE_MCT) || EQ_16(st_ivas->mc_mode, MC_MODE_PARAMUPMIX) ) ) { - float tmp[L_FRAME48k]; + Word32 tmp[L_FRAME48k]; /*save center channel output*/ - mvr2r( output[hMCT->nchan_out_woLFE - 1], tmp, output_frame ); + mvl2l( output_fx[hMCT->nchan_out_woLFE - 1], tmp, output_frame ); - for ( n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n-- ) + FOR ( n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n-- ) { - mvr2r( output[n - 1], output[n + 1], output_frame ); + mvl2l( output_fx[n - 1], output_fx[n + 1], output_frame ); } - mvr2r( tmp, output[LFE_CHANNEL - 1], output_frame ); + mvl2l( tmp, output_fx[LFE_CHANNEL - 1], output_frame ); /* save LFE channel */ - mvr2r( output_lfe_ch, output[LFE_CHANNEL], output_frame ); + mvl2l( output_lfe_ch_fx, output_fx[LFE_CHANNEL], output_frame ); } - pop_wmops(); return error; + } -#else -ivas_error ivas_mct_dec_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* o : output synthesis signal */ - const Word16 output_frame, /* i : output frame length per channel */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ +#endif + + +/*------------------------------------------------------------------------- + * create_mct_dec() + * + * Create, allocate and initialize IVAS decoder MCT handle + *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error create_mct_dec_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { - Word16 ch, nCPE, cpe_id; MCT_DEC_HANDLE hMCT; - CPE_DEC_HANDLE hCPE; - Word16 param[MCT_MAX_BLOCKS][CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV]; - Word16 param_lpc[MCT_MAX_BLOCKS][CPE_CHANNELS][NPRM_LPC_NEW]; - Word16 p_param[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; - Word16 nTnsBitsTCX10[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; - Word16 fUseTns[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; - STnsData tnsData[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; - Word16 Aq_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; - Word32 output_lfe_ch_fx[L_FRAME48k]; - Word16 q_output = 11; - Word16 n, k, l, i, j; - - Word32 *x_fx[CPE_CHANNELS][NB_DIV]; - Word16 x_e[MAX_CICP_CHANNELS][NB_DIV]; - Word16 x_len[CPE_CHANNELS][NB_DIV] = { 0 }; - Decoder_State **sts; - Word16 synth_fx[CPE_CHANNELS][L_FRAME_PLUS]; - int32_t ivas_total_brate; - ivas_error error; + Word16 n; + Word32 cp_bitrate; + Word16 max_blocks; + Word16 cpe_id; - push_wmops( "ivas_mct_dec" ); + /*--------------------------------------------------------- --------* + * Allocate MCT handle + *-----------------------------------------------------------------*/ - error = IVAS_ERR_OK; - nCPE = st_ivas->nCPE; - move16(); - hMCT = st_ivas->hMCT; + IF( ( hMCT = (MCT_DEC_HANDLE) malloc( sizeof( MCT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CPE\n" ) ); + } - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); + /*-----------------------------------------------------------------* + * Allocate MCT BlockData handles + *-----------------------------------------------------------------*/ - IF ( EQ_16(st_ivas->ivas_format, MC_FORMAT) && ( EQ_16(st_ivas->mc_mode, MC_MODE_MCT) || EQ_16(st_ivas->mc_mode, MC_MODE_PARAMUPMIX) ) ) + /* Determine active channels */ + IF( ( EQ_16(st_ivas->ivas_format , MC_FORMAT) && EQ_16(st_ivas->mc_mode , MC_MODE_PARAMMC) ) || EQ_16(st_ivas->ivas_format , SBA_FORMAT) || EQ_16(st_ivas->ivas_format , SBA_ISM_FORMAT) ) { - /* save LFE channel */ - mvl2l( output_fx[LFE_CHANNEL], output_lfe_ch_fx, output_frame ); + hMCT->nchan_out_woLFE = st_ivas->nchan_transport; + IF( EQ_16(st_ivas->ism_mode , ISM_SBA_MODE_DISC) ) + { + hMCT->nchan_out_woLFE = add(hMCT->nchan_out_woLFE,st_ivas->nchan_ism); + } + } + ELSE IF( EQ_16(st_ivas->mc_mode , MC_MODE_MCT) ) + { + hMCT->nchan_out_woLFE = sub(st_ivas->nchan_transport , st_ivas->hTransSetup.num_lfe); + } + ELSE IF( EQ_16(st_ivas->ivas_format , MC_FORMAT) && EQ_16(st_ivas->mc_mode , MC_MODE_PARAMUPMIX) ) + { + hMCT->nchan_out_woLFE = sub(st_ivas->nchan_transport , st_ivas->hTransSetup.num_lfe); + } + ELSE + { + assert( !"IVAS format currently not supported for MCT" ); } - IF ( EQ_16(st_ivas->ivas_format, MC_FORMAT) && EQ_16(st_ivas->mc_mode, MC_MODE_MCT) && EQ_16(st_ivas->bfi, 0) ) + cp_bitrate = L_shl( Mult_32_16( st_ivas->hDecoderConfig->ivas_total_brate, div_s( 1, hMCT->nchan_out_woLFE ) ), 1 ); + + IF( EQ_16(st_ivas->ism_mode , ISM_SBA_MODE_DISC) ) { - /* get the number of channels from the signalled MC LS setup */ - n = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); + cp_bitrate = L_shl( Mult_32_16( st_ivas->hDecoderConfig->ivas_total_brate, div_s( 1, st_ivas->nchan_transport ) ), 1 ); + } - IF ( NE_16(n, st_ivas->nchan_transport) ) + /* indicate LFE for appropriate core-coder channel */ + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) { - /* IVAS_fmToDo: more work needed for switching the number of transport channels */ - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: wrong number of transport channels signalled in MC format!" ); + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } } - FOR ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ + IF( hMCT->nchan_out_woLFE % 2 ) { - /*initialize param_lpc buffer*/ - FOR ( n = 0; n < CPE_CHANNELS; n++ ) - { - set_s( param_lpc[cpe_id][n], 0, NPRM_LPC_NEW ); - } + st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } - set32_fx( &output_fx[0][0], 0, L_FRAME48k ); - set32_fx( &output_fx[1][0], 0, L_FRAME48k ); + /*Initialize MCT block data */ + max_blocks = shr(hMCT->nchan_out_woLFE , 1); - IF( ( error = ivas_cpe_dec_fx( st_ivas, cpe_id, &output_fx[0], output_frame, 0, &q_output ) ) != IVAS_ERR_OK ) + FOR( n = 0; n < max_blocks; n++ ) + { + IF( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_DEC_BLOCK_DATA ) ) ) == NULL ) { - return error; + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); } - IF ( EQ_16(cpe_id, 0) ) - { - st_ivas->hCPE[0]->hCoreCoder[0]->total_brate = ivas_total_brate; /* set high enough to read the whole side-info; total_brate is rewritten later in ivas_mdct_core_invQ() */ - move32(); - } + /*Initialize all parameters to zero*/ + hMCT->hBlockData[n]->ch1 = 0; + hMCT->hBlockData[n]->ch2 = 0; - IF ( EQ_16(st_ivas->bfi, 0) ) - { - ivas_mdct_dec_side_bits_frame_channel_fx( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], nTnsBitsTCX10[cpe_id], param[cpe_id], 1, - (Word16) GT_16( i_mult(add( cpe_id, 1 ), CPE_CHANNELS ), hMCT->nchan_out_woLFE ) ); + /*-----------------------------------------------------------------* + * MDCT stereo initialization + *-----------------------------------------------------------------*/ - st_ivas->BER_detect = s_or(st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect); - test(); - st_ivas->BER_detect = s_or(st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect); - test(); + IF( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); } + + initMdctStereoDecData_fx( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, SWB ); + hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; + hMCT->hBlockData[n]->hStereoMdct->reverse_dmx = 0; + hMCT->hBlockData[n]->hStereoMdct->smooth_ratio_fx = ONE_IN_Q26; + } + FOR( ; n < MCT_MAX_BLOCKS; n++ ) + { + hMCT->hBlockData[n] = NULL; } - /* MCT side bits decoder */ - ivas_mct_side_bits_fx( hMCT, st_ivas->hCPE, nCPE, st_ivas->hCPE[0]->hCoreCoder[0], st_ivas->bfi, st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream, ivas_total_brate, nb_bits_metadata ); + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ - FOR ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect = s_or(st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect, st_ivas->BER_detect); - test(); - st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect = s_or(st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect, st_ivas->BER_detect); - test(); + hMCT->currBlockDataCnt = 0; - FOR ( n = 0; n < CPE_CHANNELS; n++ ) - { - x_fx[n][0] = output_fx[n + cpe_id * CPE_CHANNELS]; - x_e[n][0] = 20; - x_fx[n][1] = output_fx[n + cpe_id * CPE_CHANNELS] + shr( L_FRAME48k, 1 ); - x_e[n][1] = 20; - move16(); - move16(); - - set32_fx( x_fx[n][0], 0, shr(L_FRAME48k, 1) ); - set32_fx( x_fx[n][1], 0, shr(L_FRAME48k, 1) ); - } + /*Initialize bits required to signal channel-pair index*/ + // hMCT->bitsChannelPairIndex = max( 1, (Word16) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); + hMCT->bitsChannelPairIndex = s_max( 1, floor_log_2( (Word32) hMCT->nchan_out_woLFE * ( (Word32) hMCT->nchan_out_woLFE - 1 ) / 2 - 1 )+ 1 ); - ivas_mdct_core_invQ_fx( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], - fUseTns[cpe_id], tnsData[cpe_id], x_fx, x_e, x_fx, x_e, x_len, Aq_fx[cpe_id], NULL, 1 ); + set16_fx( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); + set16_fx( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); - FOR(ch = 0; ch < CPE_CHANNELS; ch++) - { - Word16 subFrames = (st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->core == TCX_10_CORE) ? NB_DIV : 1; - FOR(k = 0; k < subFrames; ++k) - { - Scale_sig32(x_fx[ch][k], shr(L_FRAME48k, subFrames - 1), sub(x_e[ch][k], 20)); - } - } - - st_ivas->BER_detect = s_or(st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect); - test(); - st_ivas->BER_detect = s_or(st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect); - test(); + st_ivas->hMCT = hMCT; + + return IVAS_ERR_OK; +} +#endif // IVAS_FLOAT_FIXED + +ivas_error create_mct_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + MCT_DEC_HANDLE hMCT; + int16_t n; + int32_t cp_bitrate; + int16_t max_blocks; + int16_t cpe_id; + + /*--------------------------------------------------------- --------* + * Allocate MCT handle + *-----------------------------------------------------------------*/ + + if ( ( hMCT = (MCT_DEC_HANDLE) malloc( sizeof( MCT_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CPE\n" ) ); } + /*-----------------------------------------------------------------* + * Allocate MCT BlockData handles + *-----------------------------------------------------------------*/ - /* MCT core decoder */ - Word16 q_x[MAX_TRANSPORT_CHANNELS]; - set16_fx(q_x, Q12, MAX_TRANSPORT_CHANNELS); - // Scaling output buffer to q_x - FOR ( i = 0; i < hMCT->nchan_out_woLFE; ++i) + /* Determine active channels */ + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) { - Scale_sig32(output_fx[i], L_FRAME48k, sub(q_x[i], Q11) ); + hMCT->nchan_out_woLFE = st_ivas->nchan_transport; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + hMCT->nchan_out_woLFE += st_ivas->nchan_ism; + } } - ivas_mct_core_dec(hMCT, st_ivas->hCPE, nCPE, output_fx, q_x); - // Scaling output buffer back to Q11 - FOR ( i = 0; i < hMCT->nchan_out_woLFE; ++i) + else if ( st_ivas->mc_mode == MC_MODE_MCT ) { - Scale_sig32(output_fx[i], L_FRAME48k, sub(Q11, q_x[i]) ); + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } + else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } + else + { + assert( !"IVAS format currently not supported for MCT" ); } - - /* for sba to stereo output disable any further processing for TCs > 2 as it is not needed*/ - IF ( NE_16(st_ivas->sba_dirac_stereo_flag, 0) && NE_16(st_ivas->ivas_format, SBA_ISM_FORMAT) ) + cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { - FOR ( cpe_id = 1; cpe_id < nCPE; cpe_id++ ) + cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + } + + /* indicate LFE for appropriate core-coder channel */ + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) { - FOR ( n = 0; n < CPE_CHANNELS; n++ ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; - } + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } } - Word32 Aq_fx_32[6][2][102]; - /* MCT reconstruction and CoreCoder updates */ - FOR(cpe_id = 0; cpe_id < nCPE; cpe_id++) + /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ + if ( hMCT->nchan_out_woLFE % 2 ) { - hCPE = st_ivas->hCPE[cpe_id]; + st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } - FOR(n = 0; n < CPE_CHANNELS; n++) + /*Initialize MCT block data */ + max_blocks = hMCT->nchan_out_woLFE / 2; + + for ( n = 0; n < max_blocks; n++ ) + { + if ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_DEC_BLOCK_DATA ) ) ) == NULL ) { - Copy_Scale_sig_16_32(Aq_fx[cpe_id][n], Aq_fx_32[cpe_id][n], 102, sub(Q16, Q12)); - x_fx[n][0] = output_fx[n + cpe_id * CPE_CHANNELS]; - x_fx[n][1] = output_fx[n + cpe_id * CPE_CHANNELS] + (L_FRAME48k / 2); - x_e[n][0] = 20; - move16(); - x_e[n][1] = 20; - move16(); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); } - ivas_mdct_core_tns_ns_fx(hCPE, fUseTns[cpe_id], tnsData[cpe_id], x_fx, Aq_fx_32[cpe_id], 1, x_e); + /*Initialize all parameters to zero*/ + hMCT->hBlockData[n]->ch1 = 0; + hMCT->hBlockData[n]->ch2 = 0; - FOR(Word16 ind = 0; ind < 2; ind++) + /*-----------------------------------------------------------------* + * MDCT stereo initialization + *-----------------------------------------------------------------*/ + + if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL ) { - Word16 nSubFrames = EQ_16(hCPE->hCoreCoder[ind]->core, TCX_20_CORE) ? 1 : NB_DIV; - Scale_sig32(x_fx[ind][0], shr(L_FRAME48k, sub(nSubFrames, 1)), sub(x_e[ind][0], 20)); - IF(nSubFrames == 2) { - Scale_sig32(x_fx[ind][1], shr(L_FRAME48k, 1), sub(x_e[ind][1], 20)); - } + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); } - } - - IF ( EQ_16(st_ivas->renderer_type, RENDERER_MC) ) +#ifndef IVAS_FLOAT_FIXED + initMdctStereoDecData( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, SWB ); +#else + initMdctStereoDecData_fx( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, SWB ); +#endif + hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; + hMCT->hBlockData[n]->hStereoMdct->reverse_dmx = 0; +#ifndef IVAS_FLOAT_FIXED + hMCT->hBlockData[n]->hStereoMdct->smooth_ratio = 1.f; +#else + hMCT->hBlockData[n]->hStereoMdct->smooth_ratio_fx = ONE_IN_Q26; +#endif + } + for ( ; n < MCT_MAX_BLOCKS; n++ ) { - /* Equalization in MDCT Domain */ - ivas_ls_setup_conversion_process_mdct_fx( st_ivas, output_fx); + hMCT->hBlockData[n] = NULL; } - 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))) + + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + hMCT->currBlockDataCnt = 0; + + /*Initialize bits required to signal channel-pair index*/ + hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); + + set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); + set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); + + st_ivas->hMCT = hMCT; + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * mct_dec_reconfigure() + * + * Reconfigure IVAS decoder MCT handle + *-------------------------------------------------------------------------*/ + +#ifdef IVAS_FLOAT_FIXED +ivas_error mct_dec_reconfigure_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const UWord16 b_nchan_change /* i : flag indicating different channel count */ +) +{ + MCT_DEC_HANDLE hMCT; + Decoder_State *st; + Word16 n, cpe_id, max_blocks; + Word32 cp_bitrate, L_tmp; + Word16 tmp_exp, tmp; + + hMCT = st_ivas->hMCT; + + /*-----------------------------------------------------------------* + * Allocate and initialize MCT BlockData handles + *-----------------------------------------------------------------*/ + IF ( b_nchan_change ) { - Word16 x_all_e[MAX_CICP_CHANNELS][NB_DIV] = { 0 }; - Word32 *x_all_fx[MAX_CICP_CHANNELS][NB_DIV]; - FOR(cpe_id = 0; cpe_id < nCPE; cpe_id++) + /* Determine active channels */ + test(); test(); test(); test(); + IF ( ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - FOR(n = 0; n < CPE_CHANNELS; n++) + hMCT->nchan_out_woLFE = st_ivas->nchan_transport; + move16(); + IF ( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - x_all_fx[n + cpe_id * CPE_CHANNELS][0] = output_fx[n + cpe_id * CPE_CHANNELS]; - x_all_fx[n + cpe_id * CPE_CHANNELS][1] = output_fx[n + cpe_id * CPE_CHANNELS] + (L_FRAME48k / 2); - x_all_e[n + cpe_id * CPE_CHANNELS][1] = 20; - move16(); - x_all_e[n + cpe_id * CPE_CHANNELS][0] = 20; - move16(); + hMCT->nchan_out_woLFE = add( hMCT->nchan_out_woLFE, st_ivas->nchan_ism ); } } - - ivas_ls_setup_conversion_process_mdct_param_mc_fx(st_ivas, x_all_fx, x_all_e); - - FOR(cpe_id = 0; cpe_id < nCPE; cpe_id++) + ELSE IF ( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) { - FOR(n = 0; n < CPE_CHANNELS; n++) - { - Scale_sig32(x_all_fx[n + cpe_id * CPE_CHANNELS][0], shr(L_FRAME48k, 1), sub(x_all_e[n + cpe_id * CPE_CHANNELS][0], 20)); - Scale_sig32(x_all_fx[n + cpe_id * CPE_CHANNELS][1], shr(L_FRAME48k, 1), sub(x_all_e[n + cpe_id * CPE_CHANNELS][1], 20)); - } + hMCT->nchan_out_woLFE = sub( st_ivas->nchan_transport, st_ivas->hTransSetup.num_lfe ); + } + ELSE IF ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) + { + hMCT->nchan_out_woLFE = sub( st_ivas->nchan_transport, st_ivas->hTransSetup.num_lfe ); + } + ELSE + { + assert( !"IVAS format currently not supported for MCT" ); } - } - FOR ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + /* indicate LFE for appropriate core-coder channel */ + FOR ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - hCPE = st_ivas->hCPE[cpe_id]; - sts = hCPE->hCoreCoder; - FOR ( n = 0; n < CPE_CHANNELS; n++ ) { - x_fx[n][0] = output_fx[n + cpe_id * CPE_CHANNELS]; - x_fx[n][1] = output_fx[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 ); - } - FOR(n = 0; n < CPE_CHANNELS; n++) - { - IF(NE_16(hCPE->hCoreCoder[n]->Q_syn, 0)) - { - Scale_sig(hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, L_FRAME48k, hCPE->hCoreCoder[n]->Q_syn); - } - if ( sts[n]->hTcxDec && sts[n]->hTcxDec->conCngLevelBackgroundTrace_e < 0 ) - { - sts[n]->hTcxDec->conCngLevelBackgroundTrace_e = 0; - } + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } - - Copy_Scale_sig_16_32(hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, M + 1, (28 - norm_s(hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0] - 1))); - Copy_Scale_sig_16_32(hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, M + 1, (28 - norm_s(hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0] - 1))); - ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, 15 ); + } - FOR(n = 0; n < CPE_CHANNELS; n++) - { - IF(NE_16(hCPE->hCoreCoder[n]->Q_syn, 0)) - { - Scale_sig(hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, L_FRAME48k, negate(hCPE->hCoreCoder[n]->Q_syn)); - } - IF(hCPE->hCoreCoder[n]->hBPF) - { - hCPE->hCoreCoder[n]->hBPF->pst_mem_deemp_err_fx = extract_l( L_shr( hCPE->hCoreCoder[n]->mem_error, sub(Q16, hCPE->hCoreCoder[n]->Q_syn2 - 1) ) ); - Scale_sig(hCPE->hCoreCoder[n]->hBPF->pst_old_syn_fx, NBPSF_PIT_MAX, hCPE->hCoreCoder[n]->Q_syn2 - 1); - } - IF(hCPE->hCoreCoder[n]->hTcxDec) - { - Scale_sig(hCPE->hCoreCoder[n]->hTcxDec->synth_history_fx, NS2SA(hCPE->hCoreCoder[n]->output_Fs, PH_ECU_MEM_NS), negate(hCPE->hCoreCoder[n]->Q_syn)); - } - IF(hCPE->hCoreCoder[n]->hHQ_core) - { - Scale_sig(hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, L_FRAME48k, negate(hCPE->hCoreCoder[n]->Q_syn)); - } + /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ + IF ( hMCT->nchan_out_woLFE % 2 ) + { + st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } - } - + tmp = BASOP_Util_Divide3216_Scale(st_ivas->hDecoderConfig->ivas_total_brate, hMCT->nchan_out_woLFE, &tmp_exp ); + cp_bitrate = L_shl( tmp, tmp_exp + 2 ); - /*----------------------------------------------------------------* - * CoreCoder Post-processing and updates - *----------------------------------------------------------------*/ - Word32 synth_fx_32[CPE_CHANNELS][L_FRAME48k]; + IF ( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + tmp = BASOP_Util_Divide3216_Scale(st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, &tmp_exp); + cp_bitrate = L_shl(tmp, tmp_exp + 2); + } + /* set correct nominal bitrates and igf config already here, otherwise we + * run into a number of problems */ + FOR ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate; + move32(); FOR ( n = 0; n < CPE_CHANNELS; n++ ) { - IF ( NE_16(st_ivas->sba_dirac_stereo_flag, 0) && ( NE_16(st_ivas->ivas_format, SBA_ISM_FORMAT) || GE_16(cpe_id, sub(nCPE, 2)) ) ) - { - - Copy_Scale_sig_16_32(synth_fx[n], synth_fx_32[n], L_FRAME48k, sub(Q11, 0)); - Copy_Scale_sig_16_32(hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->oldOut_fx, output_frame, Q11); - ivas_post_proc_fx( NULL, hCPE, n, synth_fx_32[n], NULL, output_frame, 1 ); - Copy_Scale_sig_32_16(synth_fx_32[n], synth_fx[n], L_FRAME48k, sub(0, Q11)); + st = st_ivas->hCPE[cpe_id]->hCoreCoder[n]; - } + st->total_brate = st_ivas->hCPE[cpe_id]->element_brate; + move32(); - /* Postprocessing for ACELP/MDCT core switching and synchronization */ - Word16 output_mem_fx[L_FRAME48k]; - IF( hCPE->output_mem[1] != NULL ) - { - Copy_Scale_sig_32_16( hCPE->output_mem_fx[1], output_mem_fx, NS2SA( sts[n]->output_Fs, 3125000 ), sub(0, Q11) ); - } - ELSE + IF ( NE_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - set16_fx( output_mem_fx, 0, NS2SA( sts[n]->output_Fs, 3125000 ) ); + tmp = BASOP_Util_Divide3232_Scale( st_ivas->hCPE[cpe_id]->element_brate, FRAMES_PER_SEC, &tmp_exp ); + st->bits_frame_nominal = shr( tmp, 15 - tmp_exp ); + 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 + + IF(st->igf) + { + IGFDecSetMode_ivas_fx(st->hIGFDec, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, -1, -1, st->rf_flag); + } } - - Word16 Q_synth = 0; + } + } - IF ( ( error = core_switching_post_dec_ivas_fx( sts[n], synth_fx[n], output_fx[cpe_id * CPE_CHANNELS + n], output_mem_fx, st_ivas->ivas_format, 0, output_frame, 0 /*core_switching_flag*/, ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) ? st_ivas->sba_dirac_stereo_flag : 0, -1, hCPE->last_element_mode, &Q_synth ) ) != IVAS_ERR_OK ) + /*Initialize MCT block data */ + tmp = BASOP_Util_Divide1616_Scale(hMCT->nchan_out_woLFE, CPE_CHANNELS, &tmp_exp); + max_blocks = shr( tmp, 15 - tmp_exp ); + + FOR ( n = 0; n < max_blocks; n++ ) + { + IF ( b_nchan_change ) + { + IF ( hMCT->hBlockData[n] == NULL ) { - return error; - } + IF ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_BLOCK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); + } - Copy_Scale_sig_16_32(synth_fx[n], output_fx[cpe_id * CPE_CHANNELS + n], output_frame, sub(Q11, Q_synth)); + /*Initialize all parameters to zero*/ + hMCT->hBlockData[n]->ch1 = 0; + move16(); + hMCT->hBlockData[n]->ch2 = 0; + move16(); - /* Save synthesis for HQ FEC */ - Word32 output_fx_[L_FRAME48k]; - mvl2l(output_fx[cpe_id * CPE_CHANNELS + n], output_fx_, L_FRAME48k); - Scale_sig32(output_fx_, L_FRAME48k, sub(Q16, Q11)); - Copy_Scale_sig32_16(sts[n]->prev_synth_buffer32_fx, sts[n]->prev_synth_buffer_fx, NS2SA(48000, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS), -11); - sts[n]->q_prev_synth_buffer_fx = 0; + /* MDCT stereo initialization */ + IF ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + } + } - save_synthesis_hq_fec_fx( sts[n], output_fx_, output_frame, hCPE ); - - /* CoreCoder common updates */ - ivas_updt_dec_common_fx( hCPE->hCoreCoder[n], NORMAL_HQ_CORE, -1, output_fx[cpe_id * CPE_CHANNELS + n], 11 ); + initMdctStereoDecData_fx( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth ); - } /* n_channels loop */ + hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; + move16(); + } - FOR(n = 0; n < 2; n++) { - IF(hCPE->hCoreCoder[n]) + FOR ( ; n < MCT_MAX_BLOCKS; n++ ) + { + /* deallocate no longer needed blocks */ + IF ( hMCT->hBlockData[n] != NULL ) + { + IF ( hMCT->hBlockData[n]->hStereoMdct != NULL ) { - Copy_Scale_sig_16_32(hCPE->hCoreCoder[n]->delay_buf_out_fx, hCPE->hCoreCoder[n]->delay_buf_out32_fx, HQ_DELTA_MAX * HQ_DELAY_COMP, Q11); + free( hMCT->hBlockData[n]->hStereoMdct ); + hMCT->hBlockData[n]->hStereoMdct = NULL; } - } - /* synthesis synchronization between stereo modes */ - IF ( EQ_16(st_ivas->sba_dirac_stereo_flag, 0) || ( EQ_16(st_ivas->ivas_format, SBA_ISM_FORMAT) && LE_16(cpe_id, sub(nCPE, 2)) ) ) - { - synchro_synthesis_fx( ivas_total_brate, hCPE, output_fx + cpe_id * CPE_CHANNELS, output_frame, 0 ); + free( hMCT->hBlockData[n] ); + hMCT->hBlockData[n] = NULL; } } - /* move channels after LFE to correct output for multi-channel MCT */ - IF ( EQ_16(st_ivas->ivas_format, MC_FORMAT) && ( EQ_16(st_ivas->mc_mode, MC_MODE_MCT) || EQ_16(st_ivas->mc_mode, MC_MODE_PARAMUPMIX) ) ) + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ + + IF ( b_nchan_change ) { - Word32 tmp[L_FRAME48k]; + hMCT->currBlockDataCnt = 0; + move16(); - /*save center channel output*/ - mvl2l( output_fx[hMCT->nchan_out_woLFE - 1], tmp, output_frame ); + /*Initialize bits required to signal channel-pair index*/ - FOR ( n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n-- ) - { - mvl2l( output_fx[n - 1], output_fx[n + 1], output_frame ); - } - mvl2l( tmp, output_fx[LFE_CHANNEL - 1], output_frame ); + Word32 log_tmp; + L_tmp = L_sub( L_shr( L_mult0( hMCT->nchan_out_woLFE, sub(hMCT->nchan_out_woLFE, 1) ), 1 ), 1 ); + tmp_exp = norm_l(L_tmp); + L_tmp = L_shl(L_tmp, tmp_exp); + log_tmp = BASOP_Util_Log2(L_tmp); // ( 31 - tmp_exp ) + log_tmp = L_add(log_tmp, L_shl((Q31 - tmp_exp), Q25)); // Q25 + // scale down from Q25 to Q0 - /* save LFE channel */ - mvl2l( output_lfe_ch_fx, output_fx[LFE_CHANNEL], output_frame ); - } + tmp = extract_l(L_shr(log_tmp, Q25)); + tmp = add(tmp, 1); + hMCT->bitsChannelPairIndex = s_max(1, tmp); - pop_wmops(); - return error; + set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); + set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); + } + return IVAS_ERR_OK; } -#endif - - -/*------------------------------------------------------------------------- - * create_mct_dec() - * - * Create, allocate and initialize IVAS decoder MCT handle - *-------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -ivas_error create_mct_dec_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#else +ivas_error mct_dec_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t b_nchan_change /* i : flag indicating different channel count */ ) { MCT_DEC_HANDLE hMCT; - Word16 n; - Word32 cp_bitrate; - Word16 max_blocks; - Word16 cpe_id; - - /*--------------------------------------------------------- --------* - * Allocate MCT handle - *-----------------------------------------------------------------*/ + Decoder_State *st; + int16_t n, cpe_id, max_blocks; + int32_t cp_bitrate; - IF( ( hMCT = (MCT_DEC_HANDLE) malloc( sizeof( MCT_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CPE\n" ) ); - } + hMCT = st_ivas->hMCT; /*-----------------------------------------------------------------* - * Allocate MCT BlockData handles - *-----------------------------------------------------------------*/ + * Allocate and initialize MCT BlockData handles + *-----------------------------------------------------------------*/ - /* Determine active channels */ - IF( ( EQ_16(st_ivas->ivas_format , MC_FORMAT) && EQ_16(st_ivas->mc_mode , MC_MODE_PARAMMC) ) || EQ_16(st_ivas->ivas_format , SBA_FORMAT) || EQ_16(st_ivas->ivas_format , SBA_ISM_FORMAT) ) + if ( b_nchan_change ) { - hMCT->nchan_out_woLFE = st_ivas->nchan_transport; - IF( EQ_16(st_ivas->ism_mode , ISM_SBA_MODE_DISC) ) + /* Determine active channels */ + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) { - hMCT->nchan_out_woLFE = add(hMCT->nchan_out_woLFE,st_ivas->nchan_ism); + hMCT->nchan_out_woLFE = st_ivas->nchan_transport; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + hMCT->nchan_out_woLFE += st_ivas->nchan_ism; + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } + else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } + else + { + assert( !"IVAS format currently not supported for MCT" ); } - } - ELSE IF( EQ_16(st_ivas->mc_mode , MC_MODE_MCT) ) - { - hMCT->nchan_out_woLFE = sub(st_ivas->nchan_transport , st_ivas->hTransSetup.num_lfe); - } - ELSE IF( EQ_16(st_ivas->ivas_format , MC_FORMAT) && EQ_16(st_ivas->mc_mode , MC_MODE_PARAMUPMIX) ) - { - hMCT->nchan_out_woLFE = sub(st_ivas->nchan_transport , st_ivas->hTransSetup.num_lfe); - } - ELSE - { - assert( !"IVAS format currently not supported for MCT" ); - } - - cp_bitrate = L_shl( Mult_32_16( st_ivas->hDecoderConfig->ivas_total_brate, div_s( 1, hMCT->nchan_out_woLFE ) ), 1 ); - - IF( EQ_16(st_ivas->ism_mode , ISM_SBA_MODE_DISC) ) - { - cp_bitrate = L_shl( Mult_32_16( st_ivas->hDecoderConfig->ivas_total_brate, div_s( 1, st_ivas->nchan_transport ) ), 1 ); } /* indicate LFE for appropriate core-coder channel */ - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - FOR( n = 0; n < CPE_CHANNELS; n++ ) + for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } } /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ - IF( hMCT->nchan_out_woLFE % 2 ) + if ( hMCT->nchan_out_woLFE % 2 ) { st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; } - /*Initialize MCT block data */ - max_blocks = shr(hMCT->nchan_out_woLFE , 1); + cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + } - FOR( n = 0; n < max_blocks; n++ ) + /* set correct nominal bitrates and igf config already here, otherwise we + * run into a number of problems */ + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - IF( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_DEC_BLOCK_DATA ) ) ) == NULL ) + st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate; + for ( n = 0; n < CPE_CHANNELS; n++ ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); - } + st = st_ivas->hCPE[cpe_id]->hCoreCoder[n]; - /*Initialize all parameters to zero*/ - hMCT->hBlockData[n]->ch1 = 0; - hMCT->hBlockData[n]->ch2 = 0; + st->total_brate = st_ivas->hCPE[cpe_id]->element_brate; - /*-----------------------------------------------------------------* - * MDCT stereo initialization - *-----------------------------------------------------------------*/ + if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag ); + if ( st->igf ) + { + IGFDecSetMode_flt( st->hIGFDec, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, -1, -1, st->rf_flag ); + } + } + } + } - IF( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL ) + /*Initialize MCT block data */ + max_blocks = hMCT->nchan_out_woLFE / CPE_CHANNELS; + + for ( n = 0; n < max_blocks; n++ ) + { + if ( b_nchan_change ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + if ( hMCT->hBlockData[n] == NULL ) + { + if ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_BLOCK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); + } + + /*Initialize all parameters to zero*/ + hMCT->hBlockData[n]->ch1 = 0; + hMCT->hBlockData[n]->ch2 = 0; + + /* MDCT stereo initialization */ + if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + } + } } - initMdctStereoDecData_fx( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, SWB ); + initMdctStereoDecData( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth ); hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; - hMCT->hBlockData[n]->hStereoMdct->reverse_dmx = 0; - hMCT->hBlockData[n]->hStereoMdct->smooth_ratio_fx = ONE_IN_Q26; } - FOR( ; n < MCT_MAX_BLOCKS; n++ ) + + for ( ; n < MCT_MAX_BLOCKS; n++ ) { - hMCT->hBlockData[n] = NULL; - } + /* deallocate no longer needed blocks */ + if ( hMCT->hBlockData[n] != NULL ) + { + if ( hMCT->hBlockData[n]->hStereoMdct != NULL ) + { + free( hMCT->hBlockData[n]->hStereoMdct ); + hMCT->hBlockData[n]->hStereoMdct = NULL; + } - /*-----------------------------------------------------------------* - * Initializations - *-----------------------------------------------------------------*/ + free( hMCT->hBlockData[n] ); + hMCT->hBlockData[n] = NULL; + } + } - hMCT->currBlockDataCnt = 0; + /*-----------------------------------------------------------------* + * Initializations + *-----------------------------------------------------------------*/ - /*Initialize bits required to signal channel-pair index*/ - // hMCT->bitsChannelPairIndex = max( 1, (Word16) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); - hMCT->bitsChannelPairIndex = s_max( 1, floor_log_2( (Word32) hMCT->nchan_out_woLFE * ( (Word32) hMCT->nchan_out_woLFE - 1 ) / 2 - 1 )+ 1 ); + if ( b_nchan_change ) + { + hMCT->currBlockDataCnt = 0; - set16_fx( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); - set16_fx( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); + /*Initialize bits required to signal channel-pair index*/ + hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); - st_ivas->hMCT = hMCT; + set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); + set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); + } return IVAS_ERR_OK; } -#endif // IVAS_FLOAT_FIXED +#endif -ivas_error create_mct_dec( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + +/*------------------------------------------------------------------------- + * create_mct_dec_close() + * + * Close IVAS decoder MCT handle + *-------------------------------------------------------------------------*/ + +void ivas_mct_dec_close( + MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */ ) +#ifdef IVAS_FLOAT_FIXED { - MCT_DEC_HANDLE hMCT; - int16_t n; - int32_t cp_bitrate; - int16_t max_blocks; - int16_t cpe_id; - - /*--------------------------------------------------------- --------* - * Allocate MCT handle - *-----------------------------------------------------------------*/ + Word16 n, maxBlocks; - if ( ( hMCT = (MCT_DEC_HANDLE) malloc( sizeof( MCT_DEC_DATA ) ) ) == NULL ) + IF ( hMCT == NULL || *hMCT == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CPE\n" ) ); + return; } - /*-----------------------------------------------------------------* - * Allocate MCT BlockData handles - *-----------------------------------------------------------------*/ + maxBlocks = shr( ( *hMCT )->nchan_out_woLFE, 1 ); - /* Determine active channels */ - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + FOR ( n = 0; n < maxBlocks; n++ ) { - hMCT->nchan_out_woLFE = st_ivas->nchan_transport; - if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + IF ( ( *hMCT )->hBlockData[n] != NULL ) { - hMCT->nchan_out_woLFE += st_ivas->nchan_ism; + IF ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL ) + { + free( ( *hMCT )->hBlockData[n]->hStereoMdct ); + ( *hMCT )->hBlockData[n]->hStereoMdct = NULL; + } + + free( ( *hMCT )->hBlockData[n] ); + ( *hMCT )->hBlockData[n] = NULL; } } - else if ( st_ivas->mc_mode == MC_MODE_MCT ) - { - hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; - } - else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) - { - hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; - } - else - { - assert( !"IVAS format currently not supported for MCT" ); - } - cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + free( *hMCT ); + *hMCT = NULL; - if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + return; +} +#else +{ + Word16 n, maxBlocks; + + IF ( hMCT == NULL || *hMCT == NULL ) { - cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + return; } - /* indicate LFE for appropriate core-coder channel */ - for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + maxBlocks = ( *hMCT )->nchan_out_woLFE / 2; + + FOR ( n = 0; n < maxBlocks; n++ ) { - for ( n = 0; n < CPE_CHANNELS; n++ ) + IF ( ( *hMCT )->hBlockData[n] != NULL ) { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + IF ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL ) + { + free( ( *hMCT )->hBlockData[n]->hStereoMdct ); + ( *hMCT )->hBlockData[n]->hStereoMdct = NULL; + } + + free( ( *hMCT )->hBlockData[n] ); + ( *hMCT )->hBlockData[n] = NULL; } } - /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ - if ( hMCT->nchan_out_woLFE % 2 ) - { - st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; - } + free( *hMCT ); + *hMCT = NULL; - /*Initialize MCT block data */ - max_blocks = hMCT->nchan_out_woLFE / 2; + return; +} +#endif - for ( n = 0; n < max_blocks; n++ ) - { - if ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_DEC_BLOCK_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); - } - /*Initialize all parameters to zero*/ - hMCT->hBlockData[n]->ch1 = 0; - hMCT->hBlockData[n]->ch2 = 0; +/*------------------------------------------------------------------------- + * ivas_mc_dec_config() + * + * - read transported MC LS setup + * - select MC format mode + * - reconfigure the MC format decoder + *-------------------------------------------------------------------------*/ - /*-----------------------------------------------------------------* - * MDCT stereo initialization - *-----------------------------------------------------------------*/ +/*! r : MC format mode */ +ivas_error ivas_mc_dec_config( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t idx, /* i : LS config. index */ + uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ + int16_t *data /* o : output synthesis signal */ +) +{ + AUDIO_CONFIG signaled_config; + MC_MODE last_mc_mode; + ivas_error error; - if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); - } + /* store last frame MC mode */ + last_mc_mode = st_ivas->mc_mode; -#ifndef IVAS_FLOAT_FIXED - initMdctStereoDecData( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, SWB ); -#else - initMdctStereoDecData_fx( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, SWB ); -#endif - hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; - hMCT->hBlockData[n]->hStereoMdct->reverse_dmx = 0; -#ifndef IVAS_FLOAT_FIXED - hMCT->hBlockData[n]->hStereoMdct->smooth_ratio = 1.f; -#else - hMCT->hBlockData[n]->hStereoMdct->smooth_ratio_fx = ONE_IN_Q26; -#endif - } - for ( ; n < MCT_MAX_BLOCKS; n++ ) + if ( !st_ivas->bfi ) { - hMCT->hBlockData[n] = NULL; - } + /* set transported MC LS setup */ + signaled_config = ivas_mc_map_ls_setup_to_output_config( idx ); - /*-----------------------------------------------------------------* - * Initializations - *-----------------------------------------------------------------*/ + if ( st_ivas->ini_frame == 0 ) + { + st_ivas->transport_config = signaled_config; + } - hMCT->currBlockDataCnt = 0; + /* select MC format mode */ + st_ivas->mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( signaled_config ), st_ivas->hDecoderConfig->ivas_total_brate ); - /*Initialize bits required to signal channel-pair index*/ - hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); + /* MC format switching */ + if ( st_ivas->ini_frame != 0 ) + { + if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || st_ivas->transport_config != signaled_config || last_mc_mode != st_ivas->mc_mode ) + { +#ifdef IVAS_FLOAT_FIXED +#if 1 /*TODO: To be removed(Float to fixed conversion)*/ + DECODER_TC_BUFFER_HANDLE hTcBuffer; + hTcBuffer = st_ivas->hTcBuffer; + RENDERER_TYPE renderer_type_old; + renderer_type_old = st_ivas->renderer_type; + IF( st_ivas->hCombinedOrientationData ) + FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < 3; ind2++ ) + { + st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32) ( st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * ( 1 << 15 ) ); + } + } + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + Word16 nchan_transport_old = st_ivas->nchan_transport; + uint16_t nchan_internal; + Word32 ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + DECODER_CONFIG_HANDLE hDecoderConfig; + hDecoderConfig = st_ivas->hDecoderConfig; - set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); - set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); + Word16 n_tc; + n_tc = st_ivas->hTcBuffer->nchan_transport_internal; + for ( int ch = 0; ch < n_tc; ch++ ) + { + floatToFixed_arrL( st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k ); + } + Word16 cx_e = 0, cy_e = 0, mmo_e = 0, mmro_e = 0; + PARAM_MC_DEC_HANDLE hParamMC; + hParamMC = st_ivas->hParamMC; + Word16 nchan_out_transport, nchan_out_cov; + MC_LS_SETUP mc_ls_setup; + Word16 nchan_transport; + if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_ls_setup ); + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + if ( st_ivas->hParamMC ) + { + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else + { + nchan_out_cov = nchan_out_transport; + } + floatToFixed_arr( hParamMC->icc_q, hParamMC->icc_q_fx, Q15, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + floatToFixed_arr( hParamMC->icld_q, hParamMC->icld_q_fx, Q8, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + Word32 max_cx_old_fx, max_cy_old_fx, max_mix_matrix_old_fx, max_mix_matrix_res_old_fx; + float max_cx_old = hParamMC->h_output_synthesis_cov_state.cx_old[0][0], max_cy_old = hParamMC->h_output_synthesis_cov_state.cy_old[0][0], max_mix_matrix_old = hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[0][0], max_mix_matrix_res_old = hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[0][0]; + for ( int i = 0; i < hParamMC->hMetadataPMC->num_parameter_bands; i++ ) + { + if ( hParamMC->h_output_synthesis_cov_state.cx_old[i] ) + { + for ( int j = 0; j < nchan_transport_old * nchan_transport_old; j++ ) + max_cx_old = max( max_cx_old, hParamMC->h_output_synthesis_cov_state.cx_old[i][j] ); + for ( int j = 0; j < nchan_out_cov * nchan_out_cov; j++ ) + max_cy_old = max( max_cy_old, hParamMC->h_output_synthesis_cov_state.cy_old[i][j] ); + for ( int j = 0; j < nchan_transport_old * nchan_out_cov; j++ ) + max_mix_matrix_old = max( max_mix_matrix_old, hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[i][j] ); + } + } + /*IF(st_ivas->hParamMC->ls_conv_dmx_matrix_fx ) + floatToFixed_arr32( st_ivas->hParamMC->ls_conv_dmx_matrix, st_ivas->hParamMC->ls_conv_dmx_matrix_fx, Q30, st_ivas->hDecoderConfig->nchan_out * ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) );*/ + for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + if ( hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[i] ) + { + for ( int j = 0; j < nchan_out_cov * nchan_out_cov; j++ ) + max_mix_matrix_res_old = max( max_mix_matrix_res_old, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[i][j] ); + } + } + f2me( max_cx_old, &max_cx_old_fx, &cx_e ); + f2me( max_cy_old, &max_cy_old_fx, &cy_e ); + f2me( max_mix_matrix_old, &max_mix_matrix_old_fx, &mmo_e ); + f2me( max_mix_matrix_res_old, &max_mix_matrix_res_old_fx, &mmro_e ); + if ( mmo_e < 0 ) + mmo_e = 0; + if ( mmro_e < 0 ) + mmro_e = 0; + for ( int i = 0; i < hParamMC->hMetadataPMC->num_parameter_bands; i++ ) + { + if ( hParamMC->h_output_synthesis_cov_state.cx_old[i] ) + { + + floatToFixed_arrL( hParamMC->h_output_synthesis_cov_state.cx_old[i], hParamMC->h_output_synthesis_cov_state.cx_old_fx[i], 31 - cx_e, nchan_transport_old * nchan_transport_old ); + floatToFixed_arrL( hParamMC->h_output_synthesis_cov_state.cy_old[i], hParamMC->h_output_synthesis_cov_state.cy_old_fx[i], 31 - cy_e, nchan_out_cov * nchan_out_cov ); + floatToFixed_arrL( hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[i], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[i], 31 - mmo_e, nchan_transport_old * nchan_out_cov ); + } + } + for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + if ( hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[i] ) + { + floatToFixed_arrL( hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[i], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[i], 31 - mmro_e, nchan_out_cov * nchan_out_cov ); + } + } + floatToFixed_arrL( hParamMC->proto_matrix_int, hParamMC->proto_matrix_int_fx, Q31, nchan_out_transport * nchan_transport ); + FOR( Word16 i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) + { + if ( hParamMC->diff_proto_info ) + floatToFixed_arrL( hParamMC->diff_proto_info->proto_fac[i], hParamMC->diff_proto_info->proto_fac_fx[i], Q26, hParamMC->diff_proto_info->num_source_chan_diff[i] ); + } + } + } + if ( st_ivas->hRenderConfig ) + FOR( Word16 i = 0; i < 4; i++ ) + { + st_ivas->hRenderConfig->directivity_fx[i * 3] = (Word16) floatToFixed( st_ivas->hRenderConfig->directivity[i * 3], 6 ); + st_ivas->hRenderConfig->directivity_fx[i * 3 + 1] = (Word16) floatToFixed( st_ivas->hRenderConfig->directivity[i * 3 + 1], 6 ); + st_ivas->hRenderConfig->directivity_fx[i * 3 + 2] = (Word16) floatToFixed( st_ivas->hRenderConfig->directivity[i * 3 + 2], 15 ); + } +#endif + if ( ( error = ivas_mc_dec_reconfig( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1 + if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + hParamMC = st_ivas->hParamMC; + mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); + st_ivas->nchan_transport = ivas_param_mc_getNumTransportChannels( ivas_total_brate, mc_ls_setup ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else + { + nchan_out_cov = nchan_out_transport; + } + if ( hParamMC ) + { + //if ( st_ivas->hLsSetUpConversion ) + //{ + // for ( Word16 k = 0; k < nchan_transport; k++ ) + // { + // for ( int16_t i = 0; i < nchan_out_cov; i++ ) + // { + // st_ivas->hLsSetUpConversion->dmxMtx[k][i] = fixedToFloat( st_ivas->hLsSetUpConversion->dmxMtx_fx[k][i], Q30 ); + // } + // } + //} + fixedToFloat_arr( hParamMC->icc_q_fx, hParamMC->icc_q, Q15, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); + fixedToFloat_arr( hParamMC->icld_q_fx, hParamMC->icld_q, Q8, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); + fixedToFloat_arrL( hParamMC->h_output_synthesis_params.proto_matrix_fx, hParamMC->h_output_synthesis_params.proto_matrix, 26, nchan_transport * nchan_out_cov ); + IF( hParamMC->diff_proto_info ) + FOR( Word16 i = 0; i < hParamMC->diff_proto_info->num_protos_diff; i++ ) + { + fixedToFloat_arrL( hParamMC->diff_proto_info->proto_fac_fx[i], hParamMC->diff_proto_info->proto_fac[i], 26, hParamMC->diff_proto_info->num_source_chan_diff[i] ); + } + fixedToFloat_arrL( hParamMC->proto_matrix_int_fx, hParamMC->proto_matrix_int, Q31, nchan_out_transport * nchan_transport ); + /*IF(st_ivas->hParamMC->ls_conv_dmx_matrix_fx ) + fixedToFloat_arrL( st_ivas->hParamMC->ls_conv_dmx_matrix_fx, st_ivas->hParamMC->ls_conv_dmx_matrix, Q30, st_ivas->hDecoderConfig->nchan_out * ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) );*/ + if ( last_mc_mode == MC_MODE_PARAMMC ) + { + for ( int i = 0; i < hParamMC->hMetadataPMC->num_parameter_bands; i++ ) + { + if ( hParamMC->h_output_synthesis_cov_state.cx_old[i] ) + { + fixedToFloat_arrL( hParamMC->h_output_synthesis_cov_state.cx_old_fx[i], hParamMC->h_output_synthesis_cov_state.cx_old[i], 31 - cx_e, nchan_transport_old * nchan_transport_old ); + fixedToFloat_arrL( hParamMC->h_output_synthesis_cov_state.cy_old_fx[i], hParamMC->h_output_synthesis_cov_state.cy_old[i], 31 - cy_e, nchan_out_cov * nchan_out_cov ); + fixedToFloat_arrL( hParamMC->h_output_synthesis_cov_state.mixing_matrix_old_fx[i], hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[i], 31 - mmo_e, nchan_transport_old * nchan_out_cov ); + } + } + for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + if ( hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[i] ) + { + fixedToFloat_arrL( hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old_fx[i], hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[i], 31 - mmro_e, nchan_out_cov * nchan_out_cov ); + } + } + } + if ( hParamMC->hoa_encoder_fx ) + fixedToFloat_arrL( hParamMC->hoa_encoder_fx, hParamMC->hoa_encoder, Q29, st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS ); + } + } +#endif +#else + if ( ( error = ivas_mc_dec_reconfig( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif // IVAS_FLOAT_FIXED + } + } - st_ivas->hMCT = hMCT; + st_ivas->transport_config = signaled_config; + } return IVAS_ERR_OK; } /*------------------------------------------------------------------------- - * mct_dec_reconfigure() + * ivas_mc_dec_reconfig() * - * Reconfigure IVAS decoder MCT handle + * reconfigure the MC format decoder *-------------------------------------------------------------------------*/ - #ifdef IVAS_FLOAT_FIXED -ivas_error mct_dec_reconfigure_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const UWord16 b_nchan_change /* i : flag indicating different channel count */ +static ivas_error ivas_mc_dec_reconfig( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + UWord16 *nSamplesRendered, /* o : number of samples flushed from the last frame (JBM) */ + Word16 *data /* o : output synthesis signal */ ) { - MCT_DEC_HANDLE hMCT; + Word16 nchan_transport_old, nSCE_old, nCPE_old, sba_dirac_stereo_flag_old, nchan_hp20_old; + Word16 numCldfbAnalyses_old, numCldfbSyntheses_old; + Word32 new_brate_SCE, new_brate_CPE, ivas_total_brate; + RENDERER_TYPE renderer_type_old; Decoder_State *st; - Word16 n, cpe_id, max_blocks; - Word32 cp_bitrate, L_tmp; - Word16 tmp_exp, tmp; + ivas_error error; + MC_MODE mc_mode, last_mc_mode; + TC_BUFFER_MODE tc_buffer_mode_new; + Word16 tc_nchan_tc_new; + Word16 tc_nchan_allocate_new; + Word16 tc_granularity_new; + AUDIO_CONFIG intern_config_old; + IVAS_OUTPUT_SETUP hIntSetupOld; + Word16 nchan_out_buff_old, nchan_out_buff; - hMCT = st_ivas->hMCT; + error = IVAS_ERR_OK; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + nchan_transport_old = st_ivas->nchan_transport; + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); + last_mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ), st_ivas->hDecoderConfig->last_ivas_total_brate ); /* NB: this assumes that LS config remains the same between frames */ - /*-----------------------------------------------------------------* - * Allocate and initialize MCT BlockData handles - *-----------------------------------------------------------------*/ - IF ( b_nchan_change ) - { - /* Determine active channels */ - test(); test(); test(); test(); - IF ( ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - hMCT->nchan_out_woLFE = st_ivas->nchan_transport; - move16(); - IF ( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - hMCT->nchan_out_woLFE = add( hMCT->nchan_out_woLFE, st_ivas->nchan_ism ); - } - } - ELSE IF ( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) - { - hMCT->nchan_out_woLFE = sub( st_ivas->nchan_transport, st_ivas->hTransSetup.num_lfe ); - } - ELSE IF ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) - { - hMCT->nchan_out_woLFE = sub( st_ivas->nchan_transport, st_ivas->hTransSetup.num_lfe ); - } - ELSE - { - assert( !"IVAS format currently not supported for MCT" ); - } - } + /* temporally set the current mc_mode back to the previous one to make sure the following call to + ivas_init_dec_get_num_cldfb_instances() returns the correct counts */ + mc_mode = st_ivas->mc_mode; + st_ivas->mc_mode = last_mc_mode; + ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); - /* indicate LFE for appropriate core-coder channel */ - FOR ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + st_ivas->mc_mode = mc_mode; + + nSCE_old = st_ivas->nSCE; + nCPE_old = st_ivas->nCPE; + sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag; + + /* special handling needed for the hp20 buffers for McMASA */ + IF ( EQ_16(last_mc_mode , MC_MODE_MCMASA) ) { - FOR ( n = 0; n < CPE_CHANNELS; n++ ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; - } + nchan_hp20_old = getNumChanSynthesis( st_ivas ); } - - /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ - IF ( hMCT->nchan_out_woLFE % 2 ) + ELSE { - st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + nchan_hp20_old = nchan_transport_old; } + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - tmp = BASOP_Util_Divide3216_Scale(st_ivas->hDecoderConfig->ivas_total_brate, hMCT->nchan_out_woLFE, &tmp_exp ); - cp_bitrate = L_shl( tmp, tmp_exp + 2 ); + /* save old IntSetup, might be needed for JBM flushing...*/ + intern_config_old = st_ivas->intern_config; + hIntSetupOld = st_ivas->hIntSetup; + tc_granularity_new = 1; - IF ( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + /* renderer might have changed, reselect */ + renderer_type_old = st_ivas->renderer_type; + ivas_renderer_select( st_ivas ); + + /* side effect of the renderer selection can be a changed internal config */ + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + IF ( EQ_16(last_mc_mode , MC_MODE_PARAMMC) ) { - tmp = BASOP_Util_Divide3216_Scale(st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, &tmp_exp); - cp_bitrate = L_shl(tmp, tmp_exp + 2); + st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; + Copy( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + ELSE IF ( EQ_16(last_mc_mode , MC_MODE_MCMASA) && st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } - /* set correct nominal bitrates and igf config already here, otherwise we - * run into a number of problems */ - FOR ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs ); + IF ( LT_16(tc_granularity_new , st_ivas->hTcBuffer->n_samples_granularity) ) { - st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate; - move32(); - FOR ( n = 0; n < CPE_CHANNELS; n++ ) + IF ( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, last_mc_mode, ISM_MODE_NONE, nSamplesRendered, data ) ) != IVAS_ERR_OK ) { - st = st_ivas->hCPE[cpe_id]->hCoreCoder[n]; + return error; + } + } + /* 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 ) + { + return error; + } + } + IF ( EQ_16(st_ivas->mc_mode , MC_MODE_MCT) ) + { + st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); + st_ivas->nSCE = 0; + st_ivas->nCPE = st_ivas->nchan_transport / 2; - st->total_brate = st_ivas->hCPE[cpe_id]->element_brate; - move32(); + IF ( NE_16(last_mc_mode , MC_MODE_MCT) ) + { + /*De-allocate handles for other MC modes*/ + IF ( st_ivas->hParamMC != NULL ) + { + ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); - IF ( NE_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + /* remove ls conversion if it was allocated by ParamMC */ + ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); + } + + IF ( EQ_16(last_mc_mode , MC_MODE_PARAMUPMIX) ) { - tmp = BASOP_Util_Divide3232_Scale( st_ivas->hCPE[cpe_id]->element_brate, FRAMES_PER_SEC, &tmp_exp ); - st->bits_frame_nominal = shr( tmp, 15 - tmp_exp ); - 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 + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + ivas_ls_setup_conversion_close_fx( &( st_ivas->hLsSetUpConversion ) ); + } - IF(st->igf) + /* De-allocate McMasa-related handles */ + ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); + + ivas_qmetadata_close( &st_ivas->hQMetaData ); + IF ( st_ivas->hDirAC != NULL ) + { + 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 ) ); + } + + /* init LS conversion if the renderer type asks for it */ + IF ( EQ_16(st_ivas->renderer_type , RENDERER_MC) && st_ivas->hLsSetUpConversion == NULL ) + { + if ( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { - IGFDecSetMode_ivas_fx(st->hIGFDec, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, -1, -1, st->rf_flag); + return error; } } } } - - /*Initialize MCT block data */ - tmp = BASOP_Util_Divide1616_Scale(hMCT->nchan_out_woLFE, CPE_CHANNELS, &tmp_exp); - max_blocks = shr( tmp, 15 - tmp_exp ); - - FOR ( n = 0; n < max_blocks; n++ ) + ELSE IF ( EQ_16(st_ivas->mc_mode , MC_MODE_PARAMUPMIX) ) { - IF ( b_nchan_change ) + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + IF ( NE_16(last_mc_mode , MC_MODE_PARAMUPMIX) ) { - IF ( hMCT->hBlockData[n] == NULL ) + /*De-allocate handles for other MC modes*/ + IF ( st_ivas->hParamMC != NULL ) { - IF ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_BLOCK_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); - } + ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); - /*Initialize all parameters to zero*/ - hMCT->hBlockData[n]->ch1 = 0; - move16(); - hMCT->hBlockData[n]->ch2 = 0; - move16(); + /* remove ls conversion if it was allocated by ParamMC */ + ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); + } - /* MDCT stereo initialization */ - IF ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) + ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); + ivas_qmetadata_close( &st_ivas->hQMetaData ); + + /* init LS conversion if the renderer type asks for it */ + IF ( ( EQ_16(st_ivas->renderer_type , RENDERER_MC) ) && st_ivas->hLsSetUpConversion == NULL ) + { + IF ( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); + return error; } } - } - - initMdctStereoDecData_fx( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth ); - - hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; - move16(); - } - FOR ( ; n < MCT_MAX_BLOCKS; n++ ) - { - /* deallocate no longer needed blocks */ - IF ( hMCT->hBlockData[n] != NULL ) - { - IF ( hMCT->hBlockData[n]->hStereoMdct != NULL ) + IF ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK ) { - free( hMCT->hBlockData[n]->hStereoMdct ); - hMCT->hBlockData[n]->hStereoMdct = NULL; + return error; } - - free( hMCT->hBlockData[n] ); - hMCT->hBlockData[n] = NULL; } } - - /*-----------------------------------------------------------------* - * Initializations - *-----------------------------------------------------------------*/ - - IF ( b_nchan_change ) + ELSE IF ( EQ_16(st_ivas->mc_mode , MC_MODE_PARAMMC) ) { - hMCT->currBlockDataCnt = 0; - move16(); - - /*Initialize bits required to signal channel-pair index*/ - - Word32 log_tmp; - L_tmp = L_sub( L_shr( L_mult0( hMCT->nchan_out_woLFE, sub(hMCT->nchan_out_woLFE, 1) ), 1 ), 1 ); - tmp_exp = norm_l(L_tmp); - L_tmp = L_shl(L_tmp, tmp_exp); - log_tmp = BASOP_Util_Log2(L_tmp); // ( 31 - tmp_exp ) - log_tmp = L_add(log_tmp, L_shl((Q31 - tmp_exp), Q25)); // Q25 - // scale down from Q25 to Q0 + IF ( NE_16(last_mc_mode , MC_MODE_PARAMMC) ) + { + /* remove old ls conversion for MCT if open, gets reopened correctly within ivas_param_mc_dec_open when needed */ + IF ( EQ_16(renderer_type_old , RENDERER_MC) && st_ivas->hLsSetUpConversion != NULL ) + { + ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); + } - tmp = extract_l(L_shr(log_tmp, Q25)); - tmp = add(tmp, 1); - hMCT->bitsChannelPairIndex = s_max(1, tmp); + IF ( ( error = ivas_param_mc_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } - set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); - set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); - } + } + ELSE + { + IF ( ( error = ivas_param_mc_dec_reconfig_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } - return IVAS_ERR_OK; -} -#else -ivas_error mct_dec_reconfigure( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const uint16_t b_nchan_change /* i : flag indicating different channel count */ -) -{ - MCT_DEC_HANDLE hMCT; - Decoder_State *st; - int16_t n, cpe_id, max_blocks; - int32_t cp_bitrate; + /* De-allocate McMasa-related handles */ + ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); + ivas_qmetadata_close( &st_ivas->hQMetaData ); - hMCT = st_ivas->hMCT; + IF ( st_ivas->hDirAC != NULL ) + { + 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 ) ); + } - /*-----------------------------------------------------------------* - * Allocate and initialize MCT BlockData handles - *-----------------------------------------------------------------*/ + IF ( EQ_16(last_mc_mode , MC_MODE_MCT) ) + { + IF ( st_ivas->hMCT != NULL && LE_16(st_ivas->nchan_transport , CPE_CHANNELS) ) + { + ivas_mct_dec_close( &st_ivas->hMCT ); + } + } + ELSE IF ( EQ_16(last_mc_mode , MC_MODE_PARAMUPMIX) ) + { + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + } - if ( b_nchan_change ) + /* LFE handle */ + ivas_lfe_dec_close_fx( &( st_ivas->hLFE ) ); + } + ELSE IF ( EQ_16(st_ivas->mc_mode , MC_MODE_MCMASA) ) { - /* Determine active channels */ - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + IF ( NE_16(last_mc_mode , MC_MODE_MCMASA) ) { - hMCT->nchan_out_woLFE = st_ivas->nchan_transport; - if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + IF ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) { - hMCT->nchan_out_woLFE += st_ivas->nchan_ism; + return error; } } - else if ( st_ivas->mc_mode == MC_MODE_MCT ) + + IF ( ( error = ivas_mcmasa_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK ) { - hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + return error; } - else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + + /* LS conversion */ + IF ( st_ivas->hLsSetUpConversion != NULL ) { - hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); } - else + + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + + IF ( st_ivas->hParamMC != NULL ) { - assert( !"IVAS format currently not supported for MCT" ); + ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); + st_ivas->hParamMC = NULL; } - } - /* indicate LFE for appropriate core-coder channel */ - for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - for ( n = 0; n < CPE_CHANNELS; n++ ) + IF ( EQ_16(last_mc_mode , MC_MODE_MCT) ) { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + ivas_mct_dec_close( &st_ivas->hMCT ); } - } - /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ - if ( hMCT->nchan_out_woLFE % 2 ) - { - st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + /* LFE handle */ + ivas_lfe_dec_close_fx( &( st_ivas->hLFE ) ); } - cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; - if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + IF ( NE_16(st_ivas->mc_mode , MC_MODE_MCMASA) ) { - cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + IF ( EQ_16(st_ivas->nchan_transport , 1) ) + { + st_ivas->element_mode_init = IVAS_SCE; + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } } - /* set correct nominal bitrates and igf config already here, otherwise we - * run into a number of problems */ - for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + /*-----------------------------------------------------------------* + * Reconfigure core coder + *-----------------------------------------------------------------*/ + + /* special case: MCT->ParamMC with more than 2 TC, CPE 1 stays, but has the wrong mct_chan_mode in channel 1 + and might have IGF static memory not allocated and the bit stream index list not set, + set correct mct_chan_mode and init missing static mem (IGF, HQ) and some config (TNS) do it here since it is _very_ MC specific */ + IF ( EQ_16(last_mc_mode , MC_MODE_MCT) && EQ_16(st_ivas->mc_mode , MC_MODE_PARAMMC) && GT_16(st_ivas->nchan_transport , CPE_CHANNELS) ) { - st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate; - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - st = st_ivas->hCPE[cpe_id]->hCoreCoder[n]; + st = st_ivas->hCPE[1]->hCoreCoder[1]; - st->total_brate = st_ivas->hCPE[cpe_id]->element_brate; + IF ( st_ivas->nchan_transport == 3 ) + { + st->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + } + ELSE + { + st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + } - if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + IF ( st->hIGFDec == NULL ) + { + IF ( ( st->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL ) { - st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); - st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag ); - if ( st->igf ) - { - IGFDecSetMode_flt( st->hIGFDec, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, -1, -1, st->rf_flag ); - } + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for IGF\n" ) ); } - } - } - /*Initialize MCT block data */ - max_blocks = hMCT->nchan_out_woLFE / CPE_CHANNELS; + st->igf = 0; + init_igf_dec( st->hIGFDec ); +#if 1 /*TODO: To be removed later(floating point initialization)*/ +#if ( defined EVS_FLOAT ) || !( defined IVAS_FLOAT_FIXED ) + st->hIGFDec->virtualSpec_float = &st->hIGFDec->virtualSpecBuf[0]; + st->hIGFDec->igfData.pSpecFlat_float = &st->hIGFDec->igfData.pSpecFlatBuf[0]; + set_f( st->hIGFDec->igfData.pSpecFlatBuf, 0, IGF_START_MX ); +#endif + FOR( Word16 l = 0; l < IGF_START_MX; l++ ) + st->hIGFDec->infoTCXNoiseBuf[l] = (uint8_t) st->hIGFDec->infoTCXNoise_evs[l]; +#endif + } - for ( n = 0; n < max_blocks; n++ ) - { - if ( b_nchan_change ) + IF ( st->hHQ_core == NULL ) { - if ( hMCT->hBlockData[n] == NULL ) + IF ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) { - if ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_BLOCK_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) ); - } + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); + } - /*Initialize all parameters to zero*/ - hMCT->hBlockData[n]->ch1 = 0; - hMCT->hBlockData[n]->ch2 = 0; + /* HQ core initialization */ +#if 1/*TODO: To be removed later*/ + HQ_core_dec_init_flt( st->hHQ_core ); +#endif + HQ_core_dec_init_fx( st->hHQ_core ); + } - /* MDCT stereo initialization */ - if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) ); - } + /* check if we have a doubly used hTxcCfg, if so, allocate a distint one for the old MCT LFE channel */ + IF ( st->hTcxCfg == st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg ) + { + IF ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); } } - initMdctStereoDecData( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth ); - hMCT->hBlockData[n]->hStereoMdct->use_itd = 0; + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode ); + } + IF ( EQ_16(st_ivas->mc_mode , MC_MODE_MCMASA) ) + { + uint8_t separateChannelEnabled; + int16_t separateChannelIndex; + ivas_mcmasa_set_separate_channel_mode_fx( &separateChannelEnabled, &separateChannelIndex, ivas_total_brate ); + ivas_mcmasa_split_brate_fx( separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &new_brate_SCE, &new_brate_CPE ); + } + ELSE IF ( EQ_16(st_ivas->mc_mode , MC_MODE_MCT) ) + { + new_brate_SCE = 0; + new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; + } + ELSE IF ( EQ_16(st_ivas->mc_mode , MC_MODE_PARAMUPMIX) ) + { + new_brate_SCE = 0; + new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; + } + ELSE + { + new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/ + new_brate_CPE = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS; } - for ( ; n < MCT_MAX_BLOCKS; n++ ) + IF( ( error = ivas_corecoder_dec_reconfig_fx( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, sba_dirac_stereo_flag_old, new_brate_SCE, new_brate_CPE ) ) != IVAS_ERR_OK ) { - /* deallocate no longer needed blocks */ - if ( hMCT->hBlockData[n] != NULL ) + return error; + } + IF ( EQ_16(last_mc_mode , MC_MODE_MCT) && EQ_16(st_ivas->mc_mode , MC_MODE_PARAMMC) && GT_16(st_ivas->nchan_transport , CPE_CHANNELS) ) + { + st = st_ivas->hCPE[1]->hCoreCoder[1]; + + /* TCX-LTP */ + IF ( st->hTcxLtpDec == NULL ) { - if ( hMCT->hBlockData[n]->hStereoMdct != NULL ) + IF ( ( st->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) { - free( hMCT->hBlockData[n]->hStereoMdct ); - hMCT->hBlockData[n]->hStereoMdct = NULL; + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); } - - free( hMCT->hBlockData[n] ); - hMCT->hBlockData[n] = NULL; + tcxltp_dec_init_fx( st->hTcxLtpDec, 0, st->last_codec_mode, st->element_mode, st->pit_max, st->sr_core ); } } /*-----------------------------------------------------------------* - * Initializations + * re-configure HP20 memories *-----------------------------------------------------------------*/ - - if ( b_nchan_change ) - { - hMCT->currBlockDataCnt = 0; - - /*Initialize bits required to signal channel-pair index*/ - hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) ); - - set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS ); - set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS ); - } - - return IVAS_ERR_OK; -} -#endif - - -/*------------------------------------------------------------------------- - * create_mct_dec_close() - * - * Close IVAS decoder MCT handle - *-------------------------------------------------------------------------*/ - -void ivas_mct_dec_close( - MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */ -) -#ifdef IVAS_FLOAT_FIXED -{ - Word16 n, maxBlocks; - - IF ( hMCT == NULL || *hMCT == NULL ) + IF ( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) { - return; + return error; } + /*-----------------------------------------------------------------* + * Allocate the LFE handle that is coded separately after the allocation of the core coders + *-----------------------------------------------------------------*/ - maxBlocks = shr( ( *hMCT )->nchan_out_woLFE, 1 ); - - FOR ( n = 0; n < maxBlocks; n++ ) + IF ( ( EQ_16(st_ivas->mc_mode , MC_MODE_MCT) || EQ_16(st_ivas->mc_mode , MC_MODE_PARAMUPMIX) ) && st_ivas->hLFE == NULL ) { - IF ( ( *hMCT )->hBlockData[n] != NULL ) + Word32 binauralization_delay_ns = st_ivas->binaural_latency_ns; + IF ( st_ivas->hBinRenderer != NULL ) { - IF ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL ) + IF ( st_ivas->hBinRenderer->render_lfe ) { - free( ( *hMCT )->hBlockData[n]->hStereoMdct ); - ( *hMCT )->hBlockData[n]->hStereoMdct = NULL; + /* Account for filterbank delay */ + binauralization_delay_ns += IVAS_FB_DEC_DELAY_NS; + } + else + { + binauralization_delay_ns = 0; } + } - free( ( *hMCT )->hBlockData[n] ); - ( *hMCT )->hBlockData[n] = NULL; + IF( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) + { + return error; } + + set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); + set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); } - free( *hMCT ); - *hMCT = NULL; + /*-----------------------------------------------------------------* + * Reconfigure renderers + *-----------------------------------------------------------------*/ - return; -} -#else -{ - Word16 n, maxBlocks; + IF ( EQ_16(st_ivas->mc_mode , MC_MODE_MCMASA) ) + { + IF ( ( NE_16(st_ivas->renderer_type , RENDERER_DISABLE) ) && ( NE_16(st_ivas->renderer_type , RENDERER_MCMASA_MONO_STEREO) ) ) + { + IF ( st_ivas->hDirAC != NULL ) + { + /* reconfigure existing DirAC dec */ + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE + { + /* init a new DirAC dec */ + IF ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + ELSE IF ( EQ_16(st_ivas->renderer_type , RENDERER_DISABLE) && st_ivas->hDirAC != NULL ) + { + 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 ) ); + } + } - IF ( hMCT == NULL || *hMCT == NULL ) + IF ( NE_16(renderer_type_old , st_ivas->renderer_type) ) { - return; - } + AUDIO_CONFIG output_config; - maxBlocks = ( *hMCT )->nchan_out_woLFE / 2; + output_config = st_ivas->hDecoderConfig->output_config; - FOR ( n = 0; n < maxBlocks; n++ ) - { - IF ( ( *hMCT )->hBlockData[n] != NULL ) + /* binaural renderers*/ + 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) ) { - IF ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL ) + /* remove unneeded binaural renderers */ + IF ( st_ivas->hBinRenderer != NULL && ( NE_16(st_ivas->renderer_type , RENDERER_BINAURAL_FASTCONV) && NE_16(st_ivas->renderer_type , RENDERER_BINAURAL_FASTCONV_ROOM) ) ) { - free( ( *hMCT )->hBlockData[n]->hStereoMdct ); - ( *hMCT )->hBlockData[n]->hStereoMdct = NULL; + ivas_binRenderer_close( &st_ivas->hBinRenderer ); } - free( ( *hMCT )->hBlockData[n] ); - ( *hMCT )->hBlockData[n] = NULL; - } - } + IF ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( NE_16(st_ivas->renderer_type , RENDERER_BINAURAL_MIXER_CONV) && NE_16(st_ivas->renderer_type , RENDERER_BINAURAL_MIXER_CONV_ROOM) && ( NE_16(st_ivas->renderer_type , RENDERER_BINAURAL_OBJECTS_TD) || NE_16(st_ivas->hIntSetup.output_config , IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB) ) ) ) + { - free( *hMCT ); - *hMCT = NULL; + ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); + } - return; -} -#endif + IF ( st_ivas->hBinRendererTd != NULL && ( NE_16(st_ivas->renderer_type , RENDERER_BINAURAL_OBJECTS_TD) ) ) + { + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; + } + IF ( st_ivas->hDiracDecBin != NULL ) + { + IF ( NE_16(st_ivas->renderer_type , RENDERER_BINAURAL_PARAMETRIC) && NE_16(st_ivas->renderer_type , RENDERER_BINAURAL_PARAMETRIC_ROOM) && NE_16(st_ivas->renderer_type , RENDERER_STEREO_PARAMETRIC) ) + { + ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + } + } -/*------------------------------------------------------------------------- - * ivas_mc_dec_config() - * - * - read transported MC LS setup - * - select MC format mode - * - reconfigure the MC format decoder - *-------------------------------------------------------------------------*/ + /* init necessary new renderers */ + IF ( st_ivas->hBinRenderer == NULL && ( EQ_16(st_ivas->renderer_type , RENDERER_BINAURAL_FASTCONV) || EQ_16(st_ivas->renderer_type , RENDERER_BINAURAL_FASTCONV_ROOM) ) ) + { + IF ( ( error = ivas_binRenderer_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF ( st_ivas->hBinRendererTd == NULL && EQ_16(st_ivas->renderer_type , RENDERER_BINAURAL_OBJECTS_TD) ) + { + IF( ( error = ivas_td_binaural_open_fx( st_ivas, &st_ivas->SrcInd[0], &st_ivas->num_src ) ) != IVAS_ERR_OK ) + { + return error; + } + IF ( EQ_16(st_ivas->hIntSetup.output_config , IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB) ) + { + IF ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); + } -/*! r : MC format mode */ -ivas_error ivas_mc_dec_config( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t idx, /* i : LS config. index */ - uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ - int16_t *data /* o : output synthesis signal */ -) -{ - AUDIO_CONFIG signaled_config; - MC_MODE last_mc_mode; - ivas_error error; + st_ivas->hCrendWrapper->hCrend = NULL; + st_ivas->hCrendWrapper->hHrtfCrend = NULL; + IF ( ( st_ivas->hCrendWrapper->hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" ); + } + } + } + ELSE IF ( st_ivas->hCrendWrapper == NULL && ( EQ_16(st_ivas->renderer_type , RENDERER_BINAURAL_MIXER_CONV) || EQ_16(st_ivas->renderer_type , RENDERER_BINAURAL_MIXER_CONV_ROOM) ) ) + { + 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 ) + { + return error; + } + st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + } + } + /* mono/stereo */ + ELSE IF ( EQ_16(output_config , IVAS_AUDIO_CONFIG_MONO) || EQ_16(output_config , IVAS_AUDIO_CONFIG_STEREO) ) + { + /* nothing should happen here... */ + } + /* LS */ + ELSE IF ( EQ_16(output_config , IVAS_AUDIO_CONFIG_5_1) || EQ_16(output_config , IVAS_AUDIO_CONFIG_5_1_2) || EQ_16(output_config , IVAS_AUDIO_CONFIG_5_1_4) || EQ_16(output_config , IVAS_AUDIO_CONFIG_7_1) || EQ_16(output_config , IVAS_AUDIO_CONFIG_7_1_4) || EQ_16(output_config , IVAS_AUDIO_CONFIG_LS_CUSTOM) ) + { + } + } + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ - /* store last frame MC mode */ - last_mc_mode = st_ivas->mc_mode; + IF ( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * JBM TC buffers + *-----------------------------------------------------------------*/ - if ( !st_ivas->bfi ) { - /* set transported MC LS setup */ - signaled_config = ivas_mc_map_ls_setup_to_output_config( idx ); + Word16 tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; - if ( st_ivas->ini_frame == 0 ) + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); + tc_nchan_allocate_new = tc_nchan_tc_new; + tc_nchan_full_new = tc_nchan_tc_new; + + IF ( EQ_16(st_ivas->renderer_type , RENDERER_BINAURAL_PARAMETRIC) || EQ_16(st_ivas->renderer_type , RENDERER_BINAURAL_PARAMETRIC_ROOM) || EQ_16(st_ivas->renderer_type , RENDERER_STEREO_PARAMETRIC) ) { - st_ivas->transport_config = signaled_config; + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + tc_nchan_full_new = tc_nchan_allocate_new; } - /* select MC format mode */ - st_ivas->mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( signaled_config ), st_ivas->hDecoderConfig->ivas_total_brate ); - - /* MC format switching */ - if ( st_ivas->ini_frame != 0 ) + IF ( EQ_16(st_ivas->mc_mode , MC_MODE_PARAMMC) && NE_16(st_ivas->hDecoderConfig->output_config , IVAS_AUDIO_CONFIG_MONO) && NE_16(st_ivas->hDecoderConfig->output_config , IVAS_AUDIO_CONFIG_STEREO) ) { - if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || st_ivas->transport_config != signaled_config || last_mc_mode != st_ivas->mc_mode ) + tc_nchan_full_new = 0; + } + ELSE IF ( EQ_16(st_ivas->mc_mode , MC_MODE_PARAMUPMIX) ) + { + tc_nchan_allocate_new = MC_PARAMUPMIX_MAX_INPUT_CHANS; + tc_buffer_mode_new = TC_BUFFER_MODE_RENDERER; + IF ( EQ_16(st_ivas->hDecoderConfig->output_config , IVAS_AUDIO_CONFIG_STEREO) || EQ_16(st_ivas->hDecoderConfig->output_config , IVAS_AUDIO_CONFIG_MONO) ) { - if ( ( error = ivas_mc_dec_reconfig( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) - - { - return error; - } + tc_buffer_mode_new = TC_BUFFER_MODE_BUFFER; + tc_nchan_tc_new = st_ivas->hDecoderConfig->nchan_out; + tc_nchan_allocate_new = tc_nchan_tc_new; } + tc_nchan_full_new = tc_nchan_allocate_new; } - st_ivas->transport_config = signaled_config; + /* reconfigure buffer */ + IF ( NE_16(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) || + NE_16(tc_granularity_new , hTcBuffer->n_samples_granularity) ) + { + 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 ) + { + return error; + } + } + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + IF ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + Copy( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + ELSE IF ( st_ivas->hParamMC != NULL ) + { + st_ivas->hParamMC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hParamMC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hParamMC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hParamMC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + Copy( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } } - return IVAS_ERR_OK; -} + /*-----------------------------------------------------------------* + * floating-point output audio buffers + *-----------------------------------------------------------------*/ -/*------------------------------------------------------------------------- - * ivas_mc_dec_reconfig() - * - * reconfigure the MC format decoder - *-------------------------------------------------------------------------*/ + nchan_out_buff = ivas_get_nchan_buffers_dec_ivas_fx( 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 ) + { + return error; + } +#if 1/*TODO: To be removed later*/ + if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + return error; +} +#else static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -1985,21 +2300,6 @@ static ivas_error ivas_mc_dec_reconfig( #if 1 /*Float to fixed conversion*/ DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; - if ( st_ivas->hIsmRendererData ) - { - FOR( Word16 ind1 = 0; ind1 < st_ivas->hIsmRendererData->interpolator_len; ind1++ ) - { - st_ivas->hIsmRendererData->interpolator_fx[ind1] = (Word16) L_min( 32767, floatToFixed( st_ivas->hIsmRendererData->interpolator_fx[ind1], 15 ) ); - } - } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) - { - if ( st_ivas->hIsmMetaData[ind1] ) - { - st_ivas->hIsmMetaData[ind1]->azimuth_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->azimuth * ( 1 << 22 ) ); - st_ivas->hIsmMetaData[ind1]->elevation_fx = (Word32) ( st_ivas->hIsmMetaData[ind1]->elevation * ( 1 << 22 ) ); - } - } IF( st_ivas->hCombinedOrientationData ) FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) { @@ -2021,7 +2321,7 @@ static ivas_error ivas_mc_dec_reconfig( nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); DECODER_CONFIG_HANDLE hDecoderConfig; hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_in, numch_out, num_md_sub_frames, q1 = 30, q2 = 30; + Word16 numch_in = 0, numch_out, num_md_sub_frames; ; Word16 numch_out_dirac = hDecoderConfig->nchan_out; IF( hSpar ) @@ -2029,30 +2329,8 @@ static ivas_error ivas_mc_dec_reconfig( numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; 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 ); + hSpar->hMdDec->Q_mixer_mat = 30; - for ( int l = 0; l < numch_out; l++ ) - { - for ( int j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - for ( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } - } - } - } for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) { for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) @@ -2105,19 +2383,7 @@ static ivas_error ivas_mc_dec_reconfig( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); } } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } - } + // fix2float (to be cleaned) 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 ) ) ) ) { @@ -2139,14 +2405,6 @@ static ivas_error ivas_mc_dec_reconfig( } } } - FOR( Word16 ind1 = 0; ind1 < MAX_NUM_OBJECTS; ind1++ ) - { - if ( st_ivas->hIsmMetaData[ind1] ) - { - st_ivas->hIsmMetaData[ind1]->azimuth = (float) ( st_ivas->hIsmMetaData[ind1]->azimuth_fx ) / (float) ( 1 << 22 ); - st_ivas->hIsmMetaData[ind1]->elevation = (float) ( st_ivas->hIsmMetaData[ind1]->elevation_fx ) / (float) ( 1 << 22 ); - } - } #endif #else if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, last_mc_mode, ISM_MODE_NONE, nSamplesRendered, data ) ) != IVAS_ERR_OK ) @@ -2330,15 +2588,15 @@ static ivas_error ivas_mc_dec_reconfig( { for ( Word16 k = 0; k < nchan_out_transport; k++ ) { - floatToFixed_arr32( st_ivas->hLsSetUpConversion->dmxMtx[k], st_ivas->hLsSetUpConversion->dmxMtx_fx[k], Q30, nchan_out_cov ); + //floatToFixed_arr32( st_ivas->hLsSetUpConversion->dmxMtx[k], st_ivas->hLsSetUpConversion->dmxMtx_fx[k], Q30, nchan_out_cov ); } } if ( st_ivas->hParamMC ) { floatToFixed_arr( hParamMC->icc_q, hParamMC->icc_q_fx, Q15, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe ); floatToFixed_arr( hParamMC->icld_q, hParamMC->icld_q_fx, Q8, hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); - if ( hParamMC->ls_conv_dmx_matrix ) - floatToFixed_arr32( hParamMC->ls_conv_dmx_matrix, hParamMC->ls_conv_dmx_matrix_fx, Q31, nchan_out_cov * nchan_out_transport ); + //if ( hParamMC->ls_conv_dmx_matrix ) + // floatToFixed_arr32( hParamMC->ls_conv_dmx_matrix, hParamMC->ls_conv_dmx_matrix_fx, Q31, nchan_out_cov * nchan_out_transport ); Word32 max_cx_old_fx, max_cy_old_fx, max_mix_matrix_old_fx, max_mix_matrix_res_old_fx; float max_cx_old = hParamMC->h_output_synthesis_cov_state.cx_old[0][0], max_cy_old = hParamMC->h_output_synthesis_cov_state.cy_old[0][0], max_mix_matrix_old = hParamMC->h_output_synthesis_cov_state.mixing_matrix_old[0][0], max_mix_matrix_res_old = hParamMC->h_output_synthesis_cov_state.mixing_matrix_res_old[0][0]; for ( int i = 0; i < hParamMC->hMetadataPMC->num_parameter_bands; i++ ) @@ -2432,13 +2690,13 @@ static ivas_error ivas_mc_dec_reconfig( { for ( int16_t i = 0; i < nchan_out_cov; i++ ) { - st_ivas->hLsSetUpConversion->dmxMtx[k][i] = fixedToFloat( st_ivas->hLsSetUpConversion->dmxMtx_fx[k][i], Q30 ); + //st_ivas->hLsSetUpConversion->dmxMtx[k][i] = fixedToFloat( st_ivas->hLsSetUpConversion->dmxMtx_fx[k][i], Q30 ); } } } fixedToFloat_arrL( hParamMC->proto_matrix_int_fx, hParamMC->proto_matrix_int, Q31, nchan_out_transport * nchan_transport ); - if ( hParamMC->ls_conv_dmx_matrix ) - fixedToFloat_arrL( hParamMC->ls_conv_dmx_matrix_fx, hParamMC->ls_conv_dmx_matrix, Q31, nchan_out_transport * nchan_out_cov ); + //if ( hParamMC->ls_conv_dmx_matrix ) + // fixedToFloat_arrL( hParamMC->ls_conv_dmx_matrix_fx, hParamMC->ls_conv_dmx_matrix, Q31, nchan_out_transport * nchan_out_cov ); } #endif #else @@ -2586,7 +2844,7 @@ static ivas_error ivas_mc_dec_reconfig( #ifdef IVAS_FLOAT_FIXED init_igf_dec( st->hIGFDec ); #if 1/*TODO: To be removed later(floating point initialization)*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->hIGFDec->virtualSpec_float = &st->hIGFDec->virtualSpecBuf[0]; st->hIGFDec->igfData.pSpecFlat_float = &st->hIGFDec->igfData.pSpecFlatBuf[0]; set_f( st->hIGFDec->igfData.pSpecFlatBuf, 0, IGF_START_MX ); @@ -2610,7 +2868,11 @@ static ivas_error ivas_mc_dec_reconfig( #if 1 HQ_core_dec_init_flt( st->hHQ_core ); #endif - HQ_core_dec_init(st->hHQ_core); +#ifdef IVAS_FLOAT_FIXED + HQ_core_dec_init_fx(st->hHQ_core); +#endif // IVAS_FLOAT_FIXED + + } /* check if we have a doubly used hTxcCfg, if so, allocate a distint one for the old MCT LFE channel */ @@ -2682,8 +2944,8 @@ static ivas_error ivas_mc_dec_reconfig( { IF( st->ini_frame == 0 ) { - fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_in, st->hTcxLtpDec->tcxltp_mem_in_float, 0, TCXLTP_MAX_DELAY ); - fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_out, st->hTcxLtpDec->tcxltp_mem_out_float, 0, L_FRAME48k ); + //fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_in, st->hTcxLtpDec->tcxltp_mem_in_float, 0, TCXLTP_MAX_DELAY ); + //fixedToFloat_arr( st->hTcxLtpDec->tcxltp_mem_out, st->hTcxLtpDec->tcxltp_mem_out_float, 0, L_FRAME48k ); } } #else @@ -2700,13 +2962,13 @@ static ivas_error ivas_mc_dec_reconfig( { return error; } -#endif // IVAS_FLOAT_FIXED +#else // IVAS_FLOAT_FIXED /*To be removed later: Contains memory allocations for floating point buffers*/ if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) { return error; } - +#endif /*-----------------------------------------------------------------* * Allocate the LFE handle that is coded separately after the allocation of the core coders *-----------------------------------------------------------------*/ @@ -2736,9 +2998,10 @@ static ivas_error ivas_mc_dec_reconfig( return error; } +#ifndef IVAS_FLOAT_FIXED set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); -#ifdef IVAS_FLOAT_FIXED +#else set32_fx(st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN); set32_fx(st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k); #endif // IVAS_FLOAT_FIXED @@ -2755,7 +3018,11 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hDirAC != NULL ) { /* reconfigure existing DirAC dec */ +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -2763,7 +3030,11 @@ static ivas_error ivas_mc_dec_reconfig( else { /* init a new DirAC dec */ +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -2934,10 +3205,55 @@ static ivas_error ivas_mc_dec_reconfig( } else if ( st_ivas->hCrendWrapper == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { +#ifdef IVAS_FLOAT_FIXED /*Cleanup changes: float to fixed*/ + RENDER_CONFIG_DATA *hRendCfg = st_ivas->hRenderConfig; + HRTFS_CREND_HANDLE hSetOfHRTF = st_ivas->hSetOfHRTF; + IF( hSetOfHRTF ) + { + hSetOfHRTF->hHRTF_brir_combined->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_brir_combined->latency_s, 31 ); + hSetOfHRTF->hHRTF_hrir_foa->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_foa->latency_s, 31 ); + hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_combined->latency_s, 31 ); + hSetOfHRTF->hHRTF_hrir_hoa3->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_hoa3->latency_s, 31 ); + hSetOfHRTF->hHRTF_hrir_hoa2->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_hoa2->latency_s, 31 ); + } + IF( hRendCfg ) + { + hRendCfg->roomAcoustics.acousticPreDelay_fx = floatToFixed( hRendCfg->roomAcoustics.acousticPreDelay, 27 ); + FOR( int i = 0; i < 60; i++ ) + { + hRendCfg->roomAcoustics.pFc_input_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pFc_input[i] * ONE_IN_Q16 ); + hRendCfg->roomAcoustics.pAcoustic_rt60_fx[i] = (Word32) ( ( hRendCfg->roomAcoustics.pAcoustic_rt60[i] ) * ONE_IN_Q26 ); + hRendCfg->roomAcoustics.pAcoustic_dsr_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pAcoustic_dsr[i] * ONE_IN_Q30 ); + } + + hRendCfg->roomAcoustics.inputPreDelay_fx = (Word32) ( hRendCfg->roomAcoustics.inputPreDelay * ONE_IN_Q27 ); + hRendCfg->roomAcoustics.dimensions.x_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.x * 4194304 ); // Q10.22, min value:1, max :999.0 + hRendCfg->roomAcoustics.dimensions.y_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.y * 4194304 ); // Q10.22 + hRendCfg->roomAcoustics.dimensions.z_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.z * 4194304 ); // Q10.22 + + + FOR( int ii = 0; ii < 6; ii++ ) + { + hRendCfg->roomAcoustics.AbsCoeff_fx[ii] = (Word32) ( hRendCfg->roomAcoustics.AbsCoeff[ii] * 1073741824 ); // Q2.30 min :0 max 1 + } + + hRendCfg->roomAcoustics.ListenerOrigin.x_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.x * 4194304 ); //( 2147483648 >> 2 ); + hRendCfg->roomAcoustics.ListenerOrigin.y_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.y * ( 4194304 ) ); + hRendCfg->roomAcoustics.ListenerOrigin.z_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.z * ( 4194304 ) ); + } +#endif // 1 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 ) { return error; } +#ifdef IVAS_FLOAT_FIXED/*Cleanup changes: fixed to float*/ + IF(st_ivas->hCrendWrapper && st_ivas->hCrendWrapper->hHrtfCrend != NULL ) + { + st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe = fixedToFloat( st_ivas->hCrendWrapper->hHrtfCrend->gain_lfe_fx, 14 ); + st_ivas->hCrendWrapper->hHrtfCrend->latency_s = fixedToFloat( st_ivas->hCrendWrapper->hHrtfCrend->latency_s_fx, 31 ); + fixedToFloat_arr( st_ivas->hCrendWrapper->hHrtfCrend->inv_diffuse_weight_fx, st_ivas->hCrendWrapper->hHrtfCrend->inv_diffuse_weight, 15, 16 ); + } +#endif st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; } } @@ -3107,3 +3423,4 @@ static ivas_error ivas_mc_dec_reconfig( return error; } +#endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 9af44380fc77f90e7ae830d7432b6f277fea00c6..9cc2cd5b0f1c9dd823ada2e895452e2a9ace4c2e 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -228,14 +228,14 @@ static void dec_prm_tcx_sidebits_fx( * TCX20/TCX10 parameters *--------------------------------------------------------------------------------*/ - getTCXparam( st, st0, hm_cfg, param, 0, 0, ( ( ch > 0 ) && ( tnsSize ) && ( tnsSize[0] + tnsSize[1] > 0 ) ? tnsSize : NULL ), p_param, nTnsBitsTCX10, 0 ); + getTCXparam_fx( st, st0, hm_cfg, param, 0, 0, ( ( ch > 0 ) && ( tnsSize ) && ( tnsSize[0] + tnsSize[1] > 0 ) ? tnsSize : NULL ), p_param, nTnsBitsTCX10, 0 ); st->side_bits_frame_channel = st0->next_bit_pos - start_bit_pos; return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED static void dec_prm_tcx_sidebits( int16_t param[], /* o : decoded parameters */ Decoder_State *st, /* i/o: decoder memory state */ @@ -395,7 +395,7 @@ static void dec_prm_tcx_spec_fx( * TCX20/TCX10 parameters *--------------------------------------------------------------------------------*/ - getTCXparam( st, st, hm_cfg, param, 0, 0, NULL, p_param, target_bitsTCX10, 1 ); + 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 ) ) ) ); @@ -412,7 +412,7 @@ static void dec_prm_tcx_spec_fx( return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED static void dec_prm_tcx_spec( Decoder_State *st, /* i/o: decoder memory state */ int16_t param[], /* o : decoded parameters */ @@ -662,7 +662,7 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( tmp = 3; } - getLPCparam( 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 && !( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ); st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; } @@ -672,7 +672,7 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED 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 */ @@ -923,7 +923,7 @@ void ivas_mdct_core_invQ_fx( 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 }, concealment_noise_len[CPE_CHANNELS]; + Word16 concealment_noise_e[CPE_CHANNELS] = { 0 }; TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode_bfi; Word16 q_l = 0, q_r = 0; @@ -1197,36 +1197,6 @@ void ivas_mdct_core_invQ_fx( * TCX20/10/5 *--------------------------------------------------------------------------------*/ -#ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - // PLC - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - IF( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) - { - IF( bfi && sts[ch]->tonal_mdct_plc_active && NE_16( sts[ch]->element_mode, IVAS_CPE_MDCT ) ) - { - FOR( Word16 i = 0; i < sts[ch]->hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - float pd = sts[ch]->hTonalMDCTConc->pTCI->phaseDiff_float[i]; - IF( pd >= PI2 ) - pd = fmodf( pd, PI2 ) - PI2; - sts[ch]->hTonalMDCTConc->pTCI->phaseDiff[i] = float_to_fix16( pd, Q12 ); - } - FOR( Word16 i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - float pd = sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i]; - pd = fmodf( pd, PI2 ); - sts[ch]->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i] = (Word16) ( pd * ( 1u << Q13 ) ); - } - FOR( Word16 i = 0; i < FDNS_NPTS; i++ ) - { - f2me_16( sts[ch]->hTonalMDCTConc->secondLastBlockData.scaleFactors_float[i], &sts[ch]->hTonalMDCTConc->secondLastBlockData.scaleFactors[i], &sts[ch]->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); - sts[ch]->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e = s_max( sts[ch]->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, sts[ch]->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); - } - } - } - } -#endif FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; @@ -1475,7 +1445,7 @@ void ivas_mdct_core_invQ( /* PLC: [Common: mode decision] * PLC: Decide which Concealment to use. Update pitch lags if needed */ - st->core = GetPLCModeDecision_flt( st ); + st->core = GetPLCModeDecision( st ); } if ( ( !st->bfi || st->hTcxCfg->psychParamsCurrent == NULL ) && st->core > ACELP_CORE ) @@ -1729,7 +1699,7 @@ void ivas_mdct_core_reconstruct( TonalMDCTConceal_SaveTimeSignal_ivas( st->hTonalMDCTConc, synthFB, L_frameTCX[ch] ); } - decoder_tcx_post_flt( st, synth, synthFB, NULL, bfi, MCT_flag ); + decoder_tcx_post( st, synth, synthFB, NULL, bfi, MCT_flag ); } else /*ACELP core for ACELP-PLC */ { @@ -1737,11 +1707,11 @@ void ivas_mdct_core_reconstruct( /* PLC: [TCX: TD PLC] */ if ( MCT_flag ) { - con_tcx_flt( st, &synthFB[0], -1.f, NULL, 0, NULL ); + con_tcx( st, &synthFB[0], -1.f, NULL, 0, NULL ); } else { - con_tcx_flt( st, &synthFB[0], hCPE->hStereoMdct->lastCoh, &sts[0]->seed_acelp, ( sts[1]->core != ACELP_CORE ) ? 1 : 0, &st->hFdCngDec->hFdCngCom->A_cng_flt[0] ); + con_tcx( st, &synthFB[0], hCPE->hStereoMdct->lastCoh, &sts[0]->seed_acelp, ( sts[1]->core != ACELP_CORE ) ? 1 : 0, &st->hFdCngDec->hFdCngCom->A_cng_flt[0] ); } lerp_flt( synthFB, synth, st->L_frame, st->hTcxDec->L_frameTCX ); @@ -1879,7 +1849,7 @@ void ivas_mdct_core_reconstruct_fx( synth_fx = synth_buf_fx + st->hTcxDec->old_synth_len; synthFB_fx = synth_bufFB_fx + st->hTcxDec->old_synth_lenFB; - Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub(q_syn, st->Q_syn) ); + Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, 0 ); 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 ); @@ -1943,10 +1913,11 @@ void ivas_mdct_core_reconstruct_fx( /* PLC: [TCX: TD PLC] */ IF ( NE_16(MCT_flag , 0) ) { - con_tcx( st, &synthFB_fx[0] /*, -1.f, NULL, 0, NULL */ ); + 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] ); } @@ -1995,8 +1966,8 @@ void ivas_mdct_core_reconstruct_fx( } /* Update */ - mvs2s( synth_buf_fx + st->L_frame, st->hTcxDec->old_synth, st->hTcxDec->old_synth_len ); - mvs2s( 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 ) ); + 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 ); Scale_sig(st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synth_lenFB, sub(st->Q_syn, q_syn)); IF ( st->hHQ_core != NULL ) @@ -2011,9 +1982,17 @@ void ivas_mdct_core_reconstruct_fx( /* 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 ) ); + } post_decoder_ivas_fx( st, synth_buf_fx, pit_gain_fx[ch], pitch[ch], x_fx_16, st->p_bpf_noise_buf ); - + + IF( st->p_bpf_noise_buf_32 ) + { + Copy_Scale_sig_16_32_no_sat( st->p_bpf_noise_buf, st->p_bpf_noise_buf_32, st->L_frame, Q11 ); + } IF ( signal_outFB_fx[ch] != NULL ) { Copy_Scale_sig( synthFB_fx, signal_outFB_fx[ch], st->hTcxDec->L_frameTCX, sub(sub(15, e_sig), q_syn) ); @@ -2074,7 +2053,7 @@ void ivas_mdct_core_reconstruct_fx( #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------* * ivas_mdct_core_tns_ns() * @@ -2282,42 +2261,7 @@ void ivas_mdct_core_tns_ns( if ( bfi && st->tonal_mdct_plc_active ) { -#ifdef IVAS_FLOAT_FIXED - // Float to fixed - Word32 x_fx[N_MAX]; - Word16 x_e; - f2me_buf(x[ch][0], x_fx, &x_e, st->hTonalMDCTConc->pTCI->upperIndex[st->hTonalMDCTConc->pTCI->numIndexes - 1]); - FOR(Word16 i = 0; i < st->hTonalMDCTConc->pTCI->numIndexes; i++) - { - float pd = st->hTonalMDCTConc->pTCI->phaseDiff_float[i]; - if (pd >= PI2) - pd = fmodf(pd, PI2) - PI2; - st->hTonalMDCTConc->pTCI->phaseDiff[i] = float_to_fix16(pd, Q12); - } - FOR(Word16 i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++) - { - float pd = st->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i]; - pd = fmodf(pd, PI2); - st->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i] = (Word16)(pd * (1u << Q13)); - } - FOR(Word16 i = 0; i < FDNS_NPTS; i++) - { - f2me_16(st->hTonalMDCTConc->secondLastBlockData.scaleFactors_float[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors[i], &st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i]); - st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e = s_max(st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i]); - } - TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx, &x_e, st->hTcxCfg->psychParamsCurrent ); - // Fix to float - 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[ch][0][l] = me2f(x_fx[l], x_e); - } - } - //st->hTonalMDCTConc->nFramesLost_float = fix16_to_float(st->hTonalMDCTConc->nFramesLost, Q1); -#else TonalMDCTConceal_Apply_ivas( st->hTonalMDCTConc, x[ch][0], st->hTcxCfg->psychParamsCurrent ); -#endif } if ( ( bfi || MCT_flag ) && st->hTonalMDCTConc != NULL ) @@ -2348,7 +2292,6 @@ void ivas_mdct_core_tns_ns_fx( Word16 L_frame_global[CPE_CHANNELS], L_frameTCX_glob[CPE_CHANNELS]; /* TCX */ -#ifdef IVAS_FLOAT_FIXED Word32 xn_buf_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; Word16 tcx_offset[CPE_CHANNELS]; Word16 tcx_offsetFB[CPE_CHANNELS]; @@ -2356,7 +2299,6 @@ void ivas_mdct_core_tns_ns_fx( Word16 L_spec[CPE_CHANNELS]; Word32 sns_int_scf_fx[FDNS_NPTS]; Word16 exp; -#endif // IVAS_FLOAT_FIXED /* Initializations */ sts = hCPE->hCoreCoder; @@ -2402,16 +2344,10 @@ void ivas_mdct_core_tns_ns_fx( q_x = sub(31 , x_e[ch][k]); IF ( EQ_16(bfi, 0) ) { - -#ifdef IVAS_FLOAT_FIXED sns_interpolate_scalefactors_fx( sns_int_scf_fx, &Aq_fx[ch][k * M], DEC ); -#else - sns_interpolate_scalefactors( &sns_int_scf[0], &Aq[ch][k * M], DEC ); -#endif // IVAS_FLOAT_FIXED IF ( NE_16(MCT_flag, 0) && st->hTonalMDCTConc != NULL && EQ_16( add( k, 1 ), nSubframes[ch] ) ) { -#ifdef IVAS_FLOAT_FIXED Word16 scf_fx[FDNS_NPTS], scf_e[FDNS_NPTS]; Word16 q_shift; FOR(Word16 ind = 0; ind < st->hTonalMDCTConc->nScaleFactors; ind++) { @@ -2420,18 +2356,13 @@ void ivas_mdct_core_tns_ns_fx( scf_e[ind] = sub(15 , q_shift); } 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] ) ); -#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 { - // st->hTonalMDCTConc->scf_fadeout; IF ( st->hTonalMDCTConc != NULL ) { IF ( EQ_16(MCT_flag, 0) && LT_16(st->hTcxDec->cummulative_damping_tcx, 32440) ) - //if ( !MCT_flag && st->hTcxDec->cummulative_damping_tcx_float != 1.f ) { Word16 *scf_last_m, *scf_last_e; Word32 *scf_bg; @@ -2461,7 +2392,6 @@ void ivas_mdct_core_tns_ns_fx( } } } -#ifdef IVAS_FLOAT_FIXED Word16 norm_x; q_x = sub(q_x,5); Scale_sig32( &x_fx[ch][k][0], L_spec[ch], -5 ); @@ -2470,10 +2400,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); -#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 + Word16 q_sns_int_scf; Word16 q_2; q_sns_int_scf = add(16 - 1 , getScaleFactor32( sns_int_scf_fx, FDNS_NPTS )); @@ -2495,20 +2422,14 @@ void ivas_mdct_core_tns_ns_fx( q_x = add(q_x , 1); } x_e[ch][k] = sub(31 , q_x); -#else - sns_shape_spectrum( x[ch][k], st->hTcxCfg->psychParamsCurrent, &sns_int_scf[0], st->hTcxCfg->psychParamsCurrent->nBins ); -#endif // IVAS_FLOAT_FIXEDs -#ifdef IVAS_FLOAT_FIXED + 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 ); 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 ); q_x = q_2; x_e[ch][k] = sub(31 , q_x); -#else - 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 ); -#endif // IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED + 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 ); @@ -2516,14 +2437,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); -#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, 0 ); -#endif // IVAS_FLOAT_FIXED } IF ( NE_16(bfi, 0) && NE_16(st->tonal_mdct_plc_active, 0) ) { -#ifdef IVAS_FLOAT_FIXED Word16 q_x, q_x_old; FOR( Word16 i = 0; i < FDNS_NPTS; i++ ) { @@ -2559,9 +2476,6 @@ void ivas_mdct_core_tns_ns_fx( } } } -#else - TonalMDCTConceal_Apply_ivas( st->hTonalMDCTConc, x[ch][0], st->hTcxCfg->psychParamsCurrent ); -#endif } IF ( ( bfi || MCT_flag ) && st->hTonalMDCTConc != NULL ) diff --git a/lib_dec/ivas_mono_dmx_renderer.c b/lib_dec/ivas_mono_dmx_renderer.c index 91e65b52cbac41a21e77515dab232fa6cb2d15c9..75d42d5ec179ba90db4990ee4cbc00292e36e293 100644 --- a/lib_dec/ivas_mono_dmx_renderer.c +++ b/lib_dec/ivas_mono_dmx_renderer.c @@ -72,8 +72,6 @@ ivas_error ivas_mono_dmx_renderer_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for downmixing\n" ) ); } - hDownmix->inputEnergy = 0; // float - hDownmix->protoEnergy = 0; // float hDownmix->inputEnergy_fx = 0; hDownmix->protoEnergy_fx = 0; hDownmix->Q_inputEner = 0; @@ -146,7 +144,7 @@ void ivas_mono_dmx_renderer_close( * * Downmix process *------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_mono_downmix_render_passive( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output_f[], /* i/o: synthesized core-coder transport channels/mono output */ @@ -205,10 +203,7 @@ void ivas_mono_downmix_render_passive( return; } - -#ifdef IVAS_FLOAT_FIXED - - +#else void ivas_mono_downmix_render_passive_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word32 *output_f_fx[], /* i/o: synthesized core-coder transport channels/mono output */ diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 235e1cfadb397fae430fd7bdcef1fa53313dbde4..1c9ec030815acd490c8dcf2731385c8bdcdd9060 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -130,213 +130,6 @@ ivas_error ivas_td_binaural_renderer( * and renders the current frame. *---------------------------------------------------------------------*/ -ivas_error ivas_td_binaural_renderer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ -) -{ - int16_t first_sf, last_sf, subframe_idx; - float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - float *p_reverb_signal[BINAURAL_CHANNELS]; - float *output_f_local[BINAURAL_CHANNELS]; - float *tc_local[MAX_TRANSPORT_CHANNELS]; - int16_t ch, slot_size, slots_to_render, output_frame; - ivas_error error; - - int16_t ism_md_subframe_update_jbm; - int16_t c_indx, nS; - int16_t nchan_ism_internal, nchan_ism, ch_offset; - - /* Set the number of ISMs */ - if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) - { - nchan_ism_internal = st_ivas->nchan_ism; - nchan_ism = st_ivas->nchan_ism; - ch_offset = 2; - } - else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) - { - nchan_ism_internal = st_ivas->nchan_ism; - nchan_ism = st_ivas->nchan_ism; - ch_offset = 0; - } - else - { - nchan_ism_internal = st_ivas->hTcBuffer->nchan_transport_internal; - nchan_ism = st_ivas->nchan_transport; - ch_offset = 0; - } - - /* Number of subframes to delay metadata to sync with audio */ - if ( st_ivas->hDecoderConfig->Opt_delay_comp ) - { - ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 ); - } - else - { - ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; - } - - if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) - { - ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 2 ); - } - - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - p_reverb_signal[ch] = reverb_signal[ch]; - } - - for ( ch = 0; ch < nchan_ism_internal; ch++ ) - { - tc_local[ch] = st_ivas->hTcBuffer->tc[ch + ch_offset] + st_ivas->hTcBuffer->n_samples_rendered; - } - - for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) - { - output_f_local[ch] = output[ch]; - } - - slot_size = st_ivas->hTcBuffer->n_samples_granularity; - - /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_granularity / slot_size ); - first_sf = st_ivas->hTcBuffer->subframes_rendered; - last_sf = first_sf; - st_ivas->hTcBuffer->slots_rendered += slots_to_render; - - while ( slots_to_render > 0 ) - { - slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; - last_sf++; - } - - for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) - { - output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity; - - /* Update object position(s) */ - c_indx = 0; - - for ( nS = 0; nS < nchan_ism; nS++ ) - { - if ( !( st_ivas->ivas_format == MC_FORMAT && nS == LFE_CHANNEL ) ) /* Skip LFE for MC */ - { - st_ivas->hBinRendererTd->Sources[c_indx]->InputFrame_p = tc_local[nS]; - st_ivas->hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; - c_indx++; - } - } - if ( subframe_idx == ism_md_subframe_update_jbm ) - { - if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - /* Update the listener's location/orientation */ - if ( ( error = TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, - ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] : 0, - ( st_ivas->hCombinedOrientationData != NULL ) ? &st_ivas->hCombinedOrientationData->Quaternions[st_ivas->hCombinedOrientationData->subframe_idx] : NULL, - ( st_ivas->hCombinedOrientationData != NULL ) ? &st_ivas->hCombinedOrientationData->listenerPos[st_ivas->hCombinedOrientationData->subframe_idx] : NULL ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { -#ifdef IVAS_FLOAT_FIXED - Word16 i,j,exp; - Word32 pcm_in_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - Word32 pcm_out_buff[BINAURAL_CHANNELS][L_FRAME48k]; - Word32 *pcm_in_fx[MAX_OUTPUT_CHANNELS]; - Word32 *pcm_out_fx[BINAURAL_CHANNELS]; - Word16 nchan_transport = audioCfg2channels( st_ivas->transport_config ); - REVERB_HANDLE hReverb = st_ivas->hReverb; - exp = Q7; - for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - pcm_in_fx[i] = pcm_in_buff[i]; - } - for ( i = 0; i < nchan_transport; i++ ) - { - - for ( j = 0; j < ( ( 0 + 1 ) * hReverb->full_block_size ); j++ ) - { - - pcm_in_fx[i][j] = (Word32) float_to_fixed( tc_local[i][j], exp ); - } - } - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - pcm_out_fx[i] = pcm_out_buff[i]; - } - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - - for ( j = 0; j < ( hReverb->full_block_size ); j++ ) - { - pcm_out_fx[i][0 * hReverb->full_block_size + j] = (Word32) float_to_fixed( p_reverb_signal[i][0 * hReverb->full_block_size + j], ( exp ) ); - } - } - - if ( ( error = ivas_reverb_process_fx( st_ivas->hReverb, st_ivas->transport_config, 0, pcm_in_fx, pcm_out_fx, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) -#endif - { - return error; - } -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - - for ( j = 0; j < ( hReverb->full_block_size ); j++ ) - { - - p_reverb_signal[i][0 * hReverb->full_block_size + j] = fixed_to_float( pcm_out_fx[i][0 * hReverb->full_block_size + j], ( exp - 2 ) ); - } - } -#endif - } - - /* 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( st_ivas->hBinRendererTd, output_f_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 ) - { - /* add reverb to rendered signals */ - v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame ); - v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); - } - - - for ( ch = 0; ch < nchan_ism_internal; ch++ ) - { - tc_local[ch] += output_frame; - } - - for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) - { - output_f_local[ch] += output_frame; - } - - /* update combined orientation access index */ - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, output_frame ); - } - - st_ivas->hTcBuffer->subframes_rendered = last_sf; - - return IVAS_ERR_OK; -} - #ifdef IVAS_FLOAT_FIXED ivas_error ivas_td_binaural_renderer_sf_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -362,16 +155,16 @@ 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_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { nchan_ism_internal = st_ivas->nchan_ism; move16(); nchan_ism = st_ivas->nchan_ism; move16(); ch_offset = 2; - move16(); + move16(); } - ELSE IF ( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + ELSE IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { nchan_ism_internal = st_ivas->nchan_ism; move16(); @@ -383,7 +176,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( ELSE { nchan_ism_internal = st_ivas->hTcBuffer->nchan_transport_internal; - move16(); + move16(); nchan_ism = st_ivas->nchan_transport; move16(); ch_offset = 0; @@ -424,24 +217,24 @@ 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; - IF(n_samples_granularity != 0) + IF( n_samples_granularity != 0 ) { - tmp = idiv1616(n_samples_granularity, slot_size); + tmp = idiv1616( n_samples_granularity, slot_size ); } slots_to_render = s_min( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered ), tmp ); first_sf = st_ivas->hTcBuffer->subframes_rendered; move16(); last_sf = first_sf; move16(); - st_ivas->hTcBuffer->slots_rendered = add(st_ivas->hTcBuffer->slots_rendered, slots_to_render); + st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, slots_to_render ); WHILE( slots_to_render > 0 ) { - slots_to_render = sub(slots_to_render, st_ivas->hTcBuffer->subframe_nbslots[last_sf]); - last_sf = add(last_sf, 1); + slots_to_render = sub( slots_to_render, st_ivas->hTcBuffer->subframe_nbslots[last_sf] ); + last_sf = add( last_sf, 1 ); } - FOR ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { output_frame = i_mult( st_ivas->hTcBuffer->subframe_nbslots[subframe_idx], st_ivas->hTcBuffer->n_samples_granularity ); @@ -457,13 +250,13 @@ ivas_error ivas_td_binaural_renderer_sf_fx( st_ivas->hBinRendererTd->Sources[c_indx]->InputFrame_p_q = q_factor; st_ivas->hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; move16(); - c_indx = add(c_indx, 1); + c_indx = add( c_indx, 1 ); } } - IF ( EQ_16( subframe_idx, ism_md_subframe_update_jbm ) ) + IF( EQ_16( subframe_idx, ism_md_subframe_update_jbm ) ) { - IF ( ( error = TDREND_Update_object_positions_fx( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) + IF( ( error = TDREND_Update_object_positions_fx( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) { return error; } @@ -478,9 +271,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( /* Shifting w_fx, x_fx, y_fx, z_fx to a common Q-factor if they are not having the same Q-factor */ Word16 min_q; - IF ( !( EQ_16( tmp_Quaternion_fx->w_qfact, tmp_Quaternion_fx->x_qfact ) - && EQ_16( tmp_Quaternion_fx->x_qfact, tmp_Quaternion_fx->y_qfact ) - && EQ_16( tmp_Quaternion_fx->y_qfact, tmp_Quaternion_fx->z_qfact ) ) ) + IF( !( EQ_16( tmp_Quaternion_fx->w_qfact, tmp_Quaternion_fx->x_qfact ) && EQ_16( tmp_Quaternion_fx->x_qfact, tmp_Quaternion_fx->y_qfact ) && EQ_16( tmp_Quaternion_fx->y_qfact, tmp_Quaternion_fx->z_qfact ) ) ) { min_q = MAX16B; move16(); @@ -526,17 +317,17 @@ 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( ( 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 ) + IF( st_ivas->hRenderConfig != NULL && 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( ( 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; } @@ -545,24 +336,24 @@ 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( ( 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 ) + IF( st_ivas->hRenderConfig != NULL && 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 ); v_add_32( reverb_signal_fx[1], output_fx_local[1], output_fx_local[1], output_frame ); } - FOR ( ch = 0; ch < nchan_ism_internal; ch++ ) + FOR( ch = 0; ch < nchan_ism_internal; ch++ ) { tc_local_fx[ch] += output_frame; } - FOR ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + FOR( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { output_fx_local[ch] += output_frame; } @@ -576,4 +367,162 @@ ivas_error ivas_td_binaural_renderer_sf_fx( return IVAS_ERR_OK; } +#else +ivas_error ivas_td_binaural_renderer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +) +{ + int16_t first_sf, last_sf, subframe_idx; + float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float *p_reverb_signal[BINAURAL_CHANNELS]; + float *output_f_local[BINAURAL_CHANNELS]; + float *tc_local[MAX_TRANSPORT_CHANNELS]; + int16_t ch, slot_size, slots_to_render, output_frame; + ivas_error error; + + int16_t ism_md_subframe_update_jbm; + int16_t c_indx, nS; + int16_t nchan_ism_internal, nchan_ism, ch_offset; + + /* Set the number of ISMs */ + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + nchan_ism_internal = st_ivas->nchan_ism; + nchan_ism = st_ivas->nchan_ism; + ch_offset = 2; + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + nchan_ism_internal = st_ivas->nchan_ism; + nchan_ism = st_ivas->nchan_ism; + ch_offset = 0; + } + else + { + nchan_ism_internal = st_ivas->hTcBuffer->nchan_transport_internal; + nchan_ism = st_ivas->nchan_transport; + ch_offset = 0; + } + + /* Number of subframes to delay metadata to sync with audio */ + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) + { + ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 ); + } + else + { + ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; + } + + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 2 ); + } + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } + + for ( ch = 0; ch < nchan_ism_internal; ch++ ) + { + tc_local[ch] = st_ivas->hTcBuffer->tc[ch + ch_offset] + st_ivas->hTcBuffer->n_samples_rendered; + } + + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + output_f_local[ch] = output[ch]; + } + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_granularity / slot_size ); + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity; + + /* Update object position(s) */ + c_indx = 0; + + for ( nS = 0; nS < nchan_ism; nS++ ) + { + if ( !( st_ivas->ivas_format == MC_FORMAT && nS == LFE_CHANNEL ) ) /* Skip LFE for MC */ + { + st_ivas->hBinRendererTd->Sources[c_indx]->InputFrame_p = tc_local[nS]; + st_ivas->hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } + if ( subframe_idx == ism_md_subframe_update_jbm ) + { + if ( ( error = TDREND_Update_object_positions( st_ivas->hBinRendererTd, nchan_ism, st_ivas->ivas_format, st_ivas->hIsmMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Update the listener's location/orientation */ + if ( ( error = TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] : 0, + ( st_ivas->hCombinedOrientationData != NULL ) ? &st_ivas->hCombinedOrientationData->Quaternions[st_ivas->hCombinedOrientationData->subframe_idx] : NULL, + ( st_ivas->hCombinedOrientationData != NULL ) ? &st_ivas->hCombinedOrientationData->listenerPos[st_ivas->hCombinedOrientationData->subframe_idx] : NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* 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( st_ivas->hBinRendererTd, output_f_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 ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame ); + v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); + } + + + for ( ch = 0; ch < nchan_ism_internal; ch++ ) + { + tc_local[ch] += output_frame; + } + + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + output_f_local[ch] += output_frame; + } + + /* update combined orientation access index */ + ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, output_frame ); + } + + st_ivas->hTcBuffer->subframes_rendered = last_sf; + + return IVAS_ERR_OK; +} #endif diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 98019a12e950ae3a3f097562dcb0818c5b37943f..8635457e69d50e517d555270717b1a6843ddce9e 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -277,7 +277,6 @@ void ivas_omasa_data_close( ivas_error ivas_omasa_dec_config_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - Word16 Q_cldfbSynDec, /* i : Q factor for cldfb state */ Word16 *num_src, Word16 SrcInd[MAX_NUM_TDREND_CHANNELS], Word16 *data /* o : output synthesis signal */ @@ -339,9 +338,128 @@ ivas_error ivas_omasa_dec_config_fx( st_ivas->hCPE[0]->nchan_out = 1; move16(); } - ELSE IF( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) - { - return error; + ELSE{ + ///////////////////////////////local flt2fix: to be removed + Word16 n_samples_granularity; + + n_samples_granularity = NS2SA(st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS); + DECODER_TC_BUFFER_HANDLE hTcBuffer; + hTcBuffer = st_ivas->hTcBuffer; + DECODER_CONFIG_HANDLE hDecoderConfig = NULL; + Word16 numch_out_dirac = 0; + SPAR_DEC_HANDLE hSpar = NULL; + Word16 numch_in, numch_out, num_md_sub_frames; + IF(EQ_16(st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC) || EQ_16(st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM) || EQ_16(st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC)) + { + IF(EQ_16(st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC) && NE_16(st_ivas->ism_mode, ISM_MASA_MODE_DISC)) + { + IF(LT_16(n_samples_granularity, st_ivas->hTcBuffer->n_samples_granularity)) + { + + IF(st_ivas->hCombinedOrientationData) + FOR(Word16 ind1 = 0; ind1 < 3; ind1++) + { + FOR(Word16 ind2 = 0; ind2 < 3; ind2++) + { + st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32)(st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * (1 << 15)); + } + } + if (st_ivas->hSbaIsmData) + { + for (Word16 ch_idx = 0; ch_idx < st_ivas->hSbaIsmData->delayBuffer_nchan; ch_idx++) + { + floatToFixed_arr32(st_ivas->hSbaIsmData->delayBuffer[ch_idx], st_ivas->hSbaIsmData->delayBuffer_fx[ch_idx], Q11, st_ivas->hSbaIsmData->delayBuffer_size); + } + } + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata(st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate); + hDecoderConfig = st_ivas->hDecoderConfig; + numch_out_dirac = hDecoderConfig->nchan_out; + IF(hSpar) + { + numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; + numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + 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); + + for (Word16 in_ch = 0; in_ch < numch_in; in_ch++) + { + for (Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32)(st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * (1LL << (Q11))); + } + } + if ((hDecoderConfig->ivas_total_brate < IVAS_24k4) && ((hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2) || (hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3))) + { + for (Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++) + { + floatToFixed_arrL(hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1); + } + floatToFixed_arr(hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS); + } + FOR(Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++) + { + IF(st_ivas->cldfbSynDec[out_ch]) + { + FOR(Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix(st_ivas->cldfbSynDec[out_ch]->cldfb_state[i], Q11); + } + } + } + } + Word16 n_tc; + if (st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) + n_tc = st_ivas->nchan_ism; + else + n_tc = st_ivas->hTcBuffer->nchan_transport_internal; + for (int ch = 0; ch < n_tc; ch++) + { + floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k); + } + } + } + } + //////////////////////////// local flt2fix end + IF((error = ivas_masa_dec_reconfigure_fx(st_ivas, nSamplesRendered, data)) != IVAS_ERR_OK) + { + return error; + } + //////////////////////////// local fix2flt: to be removed + if (hTcBuffer->tc_buffer) + fixedToFloat_arrL(hTcBuffer->tc_buffer_fx, hTcBuffer->tc_buffer, Q11, hTcBuffer->tc_buff_len); + IF(hSpar) + { + numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + FOR(Word16 in_ch = 0; in_ch < numch_in; in_ch++) + { + FOR(Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ((float)(st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i]) / (1LL << (Q11))); /*Rounding off*/ + } + } + // fix2float (to be cleaned) + 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)))) + { + fixedToFloat_arr(hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS); + FOR(Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++) + { + fixedToFloat_arrL(hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1); + } + } + // fix2float end + FOR(Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++) + { + IF(st_ivas->cldfbSynDec[out_ch]) + { + FOR(Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ((float)(st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i]) / (float)(1LL << (Q11))); + } + } + } + } + //////////////////////////////////////////////local fix2flt end } IF( LT_32( cpe_brate, MASA_STEREO_MIN_BITRATE ) ) @@ -374,10 +492,10 @@ ivas_error ivas_omasa_dec_config_fx( } #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED /* Float code to be removed. */ - IF( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) - { - return error; - } + //IF( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) + //{ + // return error; + //} #endif /* reconfigure core-coders for ISMs */ @@ -427,7 +545,7 @@ ivas_error ivas_omasa_dec_config_fx( IF( st_ivas->hIsmMetaData[0] == NULL ) { - IF( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) { return error; } @@ -440,7 +558,7 @@ ivas_error ivas_omasa_dec_config_fx( ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); - IF( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) { return error; } @@ -511,7 +629,7 @@ ivas_error ivas_omasa_dec_config_fx( IF( st_ivas->renderer_type == RENDERER_DIRAC ) { - IF( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) { return error; } @@ -548,7 +666,7 @@ ivas_error ivas_omasa_dec_config_fx( * CLDFB instances *-----------------------------------------------------------------*/ - IF ( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, 2, numCldfbAnalyses_old, numCldfbSyntheses_old, Q_cldfbSynDec ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, 2, numCldfbAnalyses_old, numCldfbSyntheses_old) ) != IVAS_ERR_OK ) { return error; } @@ -572,7 +690,7 @@ ivas_error ivas_omasa_dec_config_fx( return IVAS_ERR_OK; } -#endif +#else ivas_error ivas_omasa_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -647,11 +765,17 @@ ivas_error ivas_omasa_dec_config( ivas_set_omasa_TC( st_ivas->ism_mode, st_ivas->nchan_ism, &st_ivas->nSCE, &st_ivas->nCPE ); /* re-configure 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 /* reconfigure core-coders for ISMs */ k = 0; while ( k < SIZE_IVAS_BRATE_TBL && ivas_total_brate != ivas_brate_tbl[k] ) @@ -687,7 +811,11 @@ ivas_error ivas_omasa_dec_config( if ( st_ivas->hIsmMetaData[0] == NULL ) { +#ifdef IVAS_FLOAT_FIXED + IF ( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -699,7 +827,11 @@ ivas_error ivas_omasa_dec_config( ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); +#ifdef IVAS_FLOAT_FIXED + IF ( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -770,7 +902,11 @@ ivas_error ivas_omasa_dec_config( if ( st_ivas->renderer_type == RENDERER_DIRAC ) { +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -826,7 +962,7 @@ ivas_error ivas_omasa_dec_config( return IVAS_ERR_OK; } - +#endif /*--------------------------------------------------------------------------* * ivas_set_surplus_brate_dec() @@ -1015,7 +1151,7 @@ void ivas_set_surplus_brate_dec( * * decode ISM metadata in OMASA format *--------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_omasa_ism_metadata_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int32_t ism_total_brate, /* i : ISM total bitrate */ @@ -1092,7 +1228,7 @@ ivas_error ivas_omasa_ism_metadata_dec( * * decode ISM metadata in OMASA format *--------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED +#else ivas_error ivas_omasa_ism_metadata_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word32 ism_total_brate, /* i : ISM total bitrate */ @@ -1215,10 +1351,14 @@ void ivas_omasa_dirac_rend_jbm( subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; +#ifdef IVAS_FLOAT_FIXED + ivas_dirac_dec_render_fx( st_ivas, nchan_transport, nSamplesAsked, nSamplesRendered, nSamplesAvailable, output_f ); +#else ivas_dirac_dec_render( st_ivas, nchan_transport, nSamplesAsked, nSamplesRendered, nSamplesAvailable, output_f ); +#endif #ifdef IVAS_FLOAT_FIXED - Word16 q_output = 31, q_inverse_matrix = 31; + Word16 q_output = 31; Word32 **output_fx, data_separated_objects_fx[4][960]; q_output = Q11; FOR(Word16 ind = 0; ind < MAX_NUM_OBJECTS; ind++) diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index a223534ef550dfbc9bf5a676775b27f3ec90f663..09bef1197db89429d17beee9184b41daaada94b4 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -40,8 +40,10 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #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 @@ -66,38 +68,73 @@ ivas_error ivas_osba_data_open( hSbaIsmData->delayBuffer_nchan = st_ivas->nchan_ism; hSbaIsmData->delayBuffer_size = (int16_t) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + if ( ( hSbaIsmData->delayBuffer = (float **) malloc( hSbaIsmData->delayBuffer_nchan * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for OSBA delay buffer \n" ) ); + } + + for ( i = 0; i < hSbaIsmData->delayBuffer_nchan; i++ ) + { + if ( ( hSbaIsmData->delayBuffer[i] = (float *) malloc( hSbaIsmData->delayBuffer_size * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for OSBA delay buffer \n" ) ); + } + set_zero( hSbaIsmData->delayBuffer[i], hSbaIsmData->delayBuffer_size ); + } + + st_ivas->hSbaIsmData = hSbaIsmData; + + return IVAS_ERR_OK; +} + #ifdef IVAS_FLOAT_FIXED +ivas_error ivas_osba_data_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + SBA_ISM_DATA_HANDLE hSbaIsmData; + int16_t i; + + 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 ); + 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" ) ); } -#endif +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED if ( ( hSbaIsmData->delayBuffer = (float **) malloc( hSbaIsmData->delayBuffer_nchan * sizeof( float * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for OSBA delay buffer \n" ) ); } +#endif for ( i = 0; i < hSbaIsmData->delayBuffer_nchan; i++ ) { -#ifdef IVAS_FLOAT_FIXED 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" ) ); } set_zero_fx( hSbaIsmData->delayBuffer_fx[i], hSbaIsmData->delayBuffer_size ); -#endif // IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED if ( ( hSbaIsmData->delayBuffer[i] = (float *) malloc( hSbaIsmData->delayBuffer_size * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for OSBA delay buffer \n" ) ); } set_zero( hSbaIsmData->delayBuffer[i], hSbaIsmData->delayBuffer_size ); +#endif // IVAS_FLOAT_FIXED } st_ivas->hSbaIsmData = hSbaIsmData; return IVAS_ERR_OK; } - +#endif /*-------------------------------------------------------------------* * ivas_osba_data_close() @@ -132,21 +169,62 @@ void ivas_osba_data_close( return; } +#ifdef IVAS_FLOAT_FIXED +void ivas_osba_data_close_fx( + SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ +) +{ + int16_t i; + + if ( hSbaIsmData == NULL || *hSbaIsmData == NULL ) + { + return; + } + + if ( ( *hSbaIsmData )->delayBuffer_fx != NULL ) + { + for ( i = 0; i < ( *hSbaIsmData )->delayBuffer_nchan; i++ ) + { + free( ( *hSbaIsmData )->delayBuffer_fx[i] ); + } + free( ( *hSbaIsmData )->delayBuffer_fx ); + ( *hSbaIsmData )->delayBuffer_fx = NULL; + } + +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED + if ( ( *hSbaIsmData )->delayBuffer != NULL ) + { + for ( i = 0; i < ( *hSbaIsmData )->delayBuffer_nchan; i++ ) + { + free( ( *hSbaIsmData )->delayBuffer[i] ); + } + free( ( *hSbaIsmData )->delayBuffer ); + ( *hSbaIsmData )->delayBuffer = NULL; + } +#endif + + free( *hSbaIsmData ); + *hSbaIsmData = NULL; + + return; +} +#endif /*--------------------------------------------------------------------------* * ivas_osba_dirac_td_binaural_jbm() * * Binaural rendering in JBM OSBA format *--------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED ivas_error ivas_osba_dirac_td_binaural_jbm_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ 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_fx[], /* o : rendered time signal */ - const Word16 q_factor, /* i : q_factor of rendered time signal */ - Word16 out_len/*Store the length of values in each channel*/ + Word32 *output_fx[], /* o : rendered time signal */ + const Word16 q_factor, /* i : q_factor of rendered time signal */ + Word16 out_len /*Store the length of values in each channel*/ ) { Word16 n; @@ -155,7 +233,7 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( Word32 *p_sepobj_fx[BINAURAL_CHANNELS]; int16_t channel_offset; - FOR ( n = 0; n < BINAURAL_CHANNELS; n++ ) + FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) { p_sepobj_fx[n] = &output_separated_objects_fx[n][0]; } @@ -163,29 +241,27 @@ 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( ( 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( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, q_factor, *nSamplesRendered ) ) != IVAS_ERR_OK ) { return error; } - FOR ( n = 0; n < BINAURAL_CHANNELS; n++ ) + FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) { Word16 i; - FOR ( i = 0; i < nSamplesAsked; 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[channel_offset + n][i], 1 ), L_shr( p_sepobj_fx[n][i], 1 ) ); } } return IVAS_ERR_OK; } - -#endif // IVAS_FLOAT_FIXED - +#else ivas_error ivas_osba_dirac_td_binaural_jbm( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ @@ -225,9 +301,9 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( output_f[n][i] = 0.5f * output_f[channel_offset + n][i] + 0.5f * p_sepobj[n][i]; } } - return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------------* @@ -235,6 +311,31 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( * * ISM metadata decoding in OSBA format. *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_osba_ism_metadata_dec_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word32 ism_total_brate, /* i : ISM total bitrate */ + Word16 *nchan_ism, /* o : number of ISM separated channels */ + Word16 nb_bits_metadata[] /* o : number of ISM metadata bits */ +) +{ + ivas_error error; + Word16 nchan_transport_ism; + + /* set ISM parameters */ + nchan_transport_ism = st_ivas->nchan_ism; + *nchan_ism = st_ivas->nchan_ism; + + /* 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) + { + return error; + } + + return IVAS_ERR_OK; +} +#else ivas_error ivas_osba_ism_metadata_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -259,13 +360,132 @@ ivas_error ivas_osba_ism_metadata_dec( return IVAS_ERR_OK; } - +#endif /*-------------------------------------------------------------------------* * ivas_osba_render_sf() * * Object + SBA rendering process. *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_osba_render_sf_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */ + Word32 *p_output[] /* o : rendered time signal */ +) +{ + Word16 n; + Word32 output_ism[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 *p_output_ism[MAX_OUTPUT_CHANNELS]; + ivas_error error; + + FOR(n = 0; n < MAX_OUTPUT_CHANNELS; n++) + { + p_output_ism[n] = &output_ism[n][0]; + } + + FOR(n = 0; n < st_ivas->nchan_ism; n++) + { + v_shr(p_output[n], sub(Q15, Q11), output_ism[n], nSamplesAsked); + } + +#if 1 /*Float to fixed conversion*/ + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + DECODER_CONFIG_HANDLE hDecoderConfig; + hDecoderConfig = st_ivas->hDecoderConfig; + Word16 numch_out_dirac = hDecoderConfig->nchan_out; + + for ( int i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) + { + floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); + } + hSpar->hMdDec->Q_mixer_mat = Q30; + for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( int i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + } + } + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + for ( int i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + } + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( int i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i], Q11 ); + } + } + } +#endif // + + IF((error = ivas_sba_dec_render_fx(st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output, 960)) != IVAS_ERR_OK) + { + return error; + } +#if 1 /*Fixed to float */ + FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + FOR( int i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ + } + } + // fix2float (to be cleaned) + 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 ) ) ) ) + { + fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); + FOR( int i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + } + // fix2float end + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( int i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); + } + } + } +#endif + + IF(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) + { + v_add_fixed(p_output[n], p_output_ism[n], p_output[n], *nSamplesRendered, 1); //takes care of downscaling by 0.5f + } + ELSE{ + scale_sig32(p_output[n], *nSamplesRendered, -1); + } + //v_multc_fixed(p_output[n], 1073741824 /* 0.5f in Q31 */, p_output[n], *nSamplesRendered); + } + return IVAS_ERR_OK; +} +#else ivas_error ivas_osba_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ @@ -311,3 +531,4 @@ ivas_error ivas_osba_render_sf( return IVAS_ERR_OK; } +#endif diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index cee1062b149ff4804d6899a72ea45876ad9a4a41..f2960375f7c1c1fc5d7a6436d3714ef42767f01e 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -271,7 +271,7 @@ static void get_custom_ls_conversion_matrix_fx( Word32 dmxCoeff_LFE; /* TODO: remove the floating point dependency */ - float tmp_gains[MAX_OUTPUT_CHANNELS]; + Word32 tmp_gains[MAX_OUTPUT_CHANNELS]; lfe_in_idx = -1; move16(); @@ -324,7 +324,8 @@ static void get_custom_ls_conversion_matrix_fx( ELSE IF( NE_16( lfe_out_idx, ch_in ) ) { /* Set the values of hLsSetUpConversion->dmxMtx to EFAP gains, skipping LFE */ - efap_determine_gains( hEFAPdata, tmp_gains, hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], EFAP_MODE_EFAP ); + /*angles float2fix conversion: to be removed*/ + efap_determine_gains_fx( hEFAPdata, tmp_gains, L_shl((Word32)hTransSetup.ls_azimuth[ch_in_woLFE], Q22), L_shl((Word32)hTransSetup.ls_elevation[ch_in_woLFE], Q22), EFAP_MODE_EFAP ); FOR( ( ch_out = 0, ch_out_woLFE = 0 ); ch_out < nchan_out; ( ch_out++, ch_out_woLFE++ ) ) { @@ -334,8 +335,7 @@ static void get_custom_ls_conversion_matrix_fx( } ELSE { - // Currently efap_determine_gains returns float tmp_gains. - hLsSetUpConversion->dmxMtx_fx[ch_in][ch_out] = float_to_fix( tmp_gains[ch_out_woLFE], Q30 ); + hLsSetUpConversion->dmxMtx_fx[ch_in][ch_out] = tmp_gains[ch_out_woLFE]; move32(); } } @@ -344,8 +344,7 @@ static void get_custom_ls_conversion_matrix_fx( return; } -#endif - +#else static void get_custom_ls_conversion_matrix( const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : Transport channel configuration handle */ @@ -417,7 +416,7 @@ static void get_custom_ls_conversion_matrix( return; } - +#endif #ifdef IVAS_FLOAT_FIXED static ivas_error get_ls_conversion_matrix_fx( @@ -444,7 +443,7 @@ static ivas_error get_ls_conversion_matrix_fx( FOR( i = 0; i < LS_SETUP_CONVERSION_NUM_MAPPINGS; i++ ) { test(); - IF( ( EQ_32( input_config, ls_conversion_mapping[i].input_config ) ) && ( EQ_32( output_config, ls_conversion_mapping[i].output_config ) ) ) + IF( ( EQ_32( input_config, ls_conversion_mapping_fx[i].input_config ) ) && ( EQ_32( output_config, ls_conversion_mapping_fx[i].output_config ) ) ) { /* Special handling for MONO and STEREO downmix */ test(); @@ -513,7 +512,7 @@ static ivas_error get_ls_conversion_matrix_fx( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "The conversion matrix between these formats is not defined!\n" ); } -#endif +#else static ivas_error get_ls_conversion_matrix( LSSETUP_CONVERSION_HANDLE hLsSetUpConversion, const AUDIO_CONFIG input_config, @@ -598,7 +597,7 @@ static ivas_error get_ls_conversion_matrix( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "The conversion matrix between these formats is not defined!\n" ); } - +#endif /*------------------------------------------------------------------------- * ivas_ls_setup_conversion_open() * @@ -661,26 +660,28 @@ ivas_error ivas_ls_setup_conversion_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); } set32_fx( hLsSetUpConversion->targetEnergyPrev_fx[chIdx], 0, hLsSetUpConversion->sfbCnt ); + hLsSetUpConversion->te_prev_exp = 0; set32_fx( hLsSetUpConversion->dmxEnergyPrev_fx[chIdx], 0, hLsSetUpConversion->sfbCnt ); + hLsSetUpConversion->dmx_prev_exp = 0; /* TODO: remove the floating point dependency */ - IF( ( hLsSetUpConversion->targetEnergyPrev[chIdx] = (float *) malloc( ( hLsSetUpConversion->sfbCnt ) * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); - } - IF( ( hLsSetUpConversion->dmxEnergyPrev[chIdx] = (float *) malloc( ( hLsSetUpConversion->sfbCnt ) * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); - } - set_f( hLsSetUpConversion->targetEnergyPrev[chIdx], 0.0f, hLsSetUpConversion->sfbCnt ); - set_f( hLsSetUpConversion->dmxEnergyPrev[chIdx], 0.0f, hLsSetUpConversion->sfbCnt ); + //IF( ( hLsSetUpConversion->targetEnergyPrev[chIdx] = (float *) malloc( ( hLsSetUpConversion->sfbCnt ) * sizeof( float ) ) ) == NULL ) + //{ + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + //} + //IF( ( hLsSetUpConversion->dmxEnergyPrev[chIdx] = (float *) malloc( ( hLsSetUpConversion->sfbCnt ) * sizeof( float ) ) ) == NULL ) + //{ + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + //} + //set_f( hLsSetUpConversion->targetEnergyPrev[chIdx], 0.0f, hLsSetUpConversion->sfbCnt ); + //set_f( hLsSetUpConversion->dmxEnergyPrev[chIdx], 0.0f, hLsSetUpConversion->sfbCnt ); } FOR( ; chIdx < MAX_CICP_CHANNELS; chIdx++ ) { hLsSetUpConversion->targetEnergyPrev_fx[chIdx] = NULL; hLsSetUpConversion->dmxEnergyPrev_fx[chIdx] = NULL; /* TODO: remove the floating point dependency */ - hLsSetUpConversion->targetEnergyPrev[chIdx] = NULL; - hLsSetUpConversion->dmxEnergyPrev[chIdx] = NULL; + //hLsSetUpConversion->targetEnergyPrev[chIdx] = NULL; + //hLsSetUpConversion->dmxEnergyPrev[chIdx] = NULL; } } ELSE @@ -714,28 +715,28 @@ ivas_error ivas_ls_setup_conversion_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); } /* TODO: remove the floating point dependency */ - IF( ( hLsSetUpConversion->targetEnergyPrev[0] = (float *) malloc( ( MAX_SFB + 2 ) * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); - } - IF( ( hLsSetUpConversion->dmxEnergyPrev[0] = (float *) malloc( ( MAX_SFB + 2 ) * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); - } + //IF( ( hLsSetUpConversion->targetEnergyPrev[0] = (float *) malloc( ( MAX_SFB + 2 ) * sizeof( float ) ) ) == NULL ) + //{ + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + //} + //IF( ( hLsSetUpConversion->dmxEnergyPrev[0] = (float *) malloc( ( MAX_SFB + 2 ) * sizeof( float ) ) ) == NULL ) + //{ + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LS configuration Conversion Handle \n" ) ); + //} FOR( chIdx = 1; chIdx < MAX_CICP_CHANNELS; chIdx++ ) { hLsSetUpConversion->targetEnergyPrev_fx[chIdx] = NULL; hLsSetUpConversion->dmxEnergyPrev_fx[chIdx] = NULL; /* TODO: remove the floating point dependency */ - hLsSetUpConversion->targetEnergyPrev[chIdx] = NULL; - hLsSetUpConversion->dmxEnergyPrev[chIdx] = NULL; + //hLsSetUpConversion->targetEnergyPrev[chIdx] = NULL; + //hLsSetUpConversion->dmxEnergyPrev[chIdx] = NULL; } set32_fx( hLsSetUpConversion->targetEnergyPrev_fx[0], 0, MAX_SFB + 2 ); set32_fx( hLsSetUpConversion->dmxEnergyPrev_fx[0], 0, MAX_SFB + 2 ); /* TODO: remove the floating point dependency */ - set_f( hLsSetUpConversion->targetEnergyPrev[0], 0.0f, MAX_SFB + 2 ); - set_f( hLsSetUpConversion->dmxEnergyPrev[0], 0.0f, MAX_SFB + 2 ); + //set_f( hLsSetUpConversion->targetEnergyPrev[0], 0.0f, MAX_SFB + 2 ); + //set_f( hLsSetUpConversion->dmxEnergyPrev[0], 0.0f, MAX_SFB + 2 ); } /* Initialize the DMX conversion matrix */ @@ -750,18 +751,18 @@ ivas_error ivas_ls_setup_conversion_open_fx( /* TODO: remove the floating point dependency */ /* Allocate memory depending on the number of output channels */ - IF( ( hLsSetUpConversion->dmxMtx[chIdx] = (float *) malloc( outChannels * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory FOR temp dmx matrix \n" ) ); - } - set_zero( hLsSetUpConversion->dmxMtx[chIdx], outChannels ); + //IF( ( hLsSetUpConversion->dmxMtx[chIdx] = (float *) malloc( outChannels * sizeof( float ) ) ) == NULL ) + //{ + // return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory FOR temp dmx matrix \n" ) ); + //} + //set_zero( hLsSetUpConversion->dmxMtx[chIdx], outChannels ); } FOR( ; chIdx < MAX_CICP_CHANNELS; chIdx++ ) { hLsSetUpConversion->dmxMtx_fx[chIdx] = NULL; /* TODO: remove the floating point dependency */ - hLsSetUpConversion->dmxMtx[chIdx] = NULL; + //hLsSetUpConversion->dmxMtx[chIdx] = NULL; } IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) @@ -792,7 +793,7 @@ ivas_error ivas_ls_setup_conversion_open_fx( { FOR( Word16 j = 0; j < outChannels; ++j ) { - hLsSetUpConversion->dmxMtx[i][j] = fix_to_float( hLsSetUpConversion->dmxMtx_fx[i][j], Q30 ); + //hLsSetUpConversion->dmxMtx[i][j] = fix_to_float( hLsSetUpConversion->dmxMtx_fx[i][j], Q30 ); } } @@ -800,7 +801,7 @@ ivas_error ivas_ls_setup_conversion_open_fx( return IVAS_ERR_OK; } -#endif +#else ivas_error ivas_ls_setup_conversion_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ @@ -939,7 +940,7 @@ ivas_error ivas_ls_setup_conversion_open( return IVAS_ERR_OK; } - +#endif /*------------------------------------------------------------------------- * ivas_ls_setup_conversion_close() @@ -980,23 +981,23 @@ void ivas_ls_setup_conversion_close_fx( } /* TODO: remove the floating point dependency */ - IF( ( *hLsSetUpConversion )->dmxMtx[idx] != NULL ) - { - free( ( *hLsSetUpConversion )->dmxMtx[idx] ); - ( *hLsSetUpConversion )->dmxMtx[idx] = NULL; - } + //IF( ( *hLsSetUpConversion )->dmxMtx[idx] != NULL ) + //{ + // free( ( *hLsSetUpConversion )->dmxMtx[idx] ); + // ( *hLsSetUpConversion )->dmxMtx[idx] = NULL; + //} - IF( ( *hLsSetUpConversion )->targetEnergyPrev[idx] != NULL ) - { - free( ( *hLsSetUpConversion )->targetEnergyPrev[idx] ); - ( *hLsSetUpConversion )->targetEnergyPrev[idx] = NULL; - } + //IF( ( *hLsSetUpConversion )->targetEnergyPrev[idx] != NULL ) + //{ + // free( ( *hLsSetUpConversion )->targetEnergyPrev[idx] ); + // ( *hLsSetUpConversion )->targetEnergyPrev[idx] = NULL; + //} - IF( ( *hLsSetUpConversion )->dmxEnergyPrev[idx] != NULL ) - { - free( ( *hLsSetUpConversion )->dmxEnergyPrev[idx] ); - ( *hLsSetUpConversion )->dmxEnergyPrev[idx] = NULL; - } + //IF( ( *hLsSetUpConversion )->dmxEnergyPrev[idx] != NULL ) + //{ + // free( ( *hLsSetUpConversion )->dmxEnergyPrev[idx] ); + // ( *hLsSetUpConversion )->dmxEnergyPrev[idx] = NULL; + //} } free( *hLsSetUpConversion ); @@ -1004,7 +1005,7 @@ void ivas_ls_setup_conversion_close_fx( return; } -#endif +#else void ivas_ls_setup_conversion_close( LSSETUP_CONVERSION_HANDLE *hLsSetUpConversion /* i/o: LS converter handle */ @@ -1043,7 +1044,7 @@ void ivas_ls_setup_conversion_close( return; } - +#endif /*------------------------------------------------------------------------- * ivas_ls_setup_conversion() @@ -1112,7 +1113,7 @@ void ivas_ls_setup_conversion_fx( return; } -#endif +#else void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ @@ -1170,7 +1171,7 @@ void ivas_ls_setup_conversion( return; } - +#endif /*------------------------------------------------------------------------- * ivas_ls_setup_conversion_process_mdct() @@ -1392,6 +1393,8 @@ void ivas_ls_setup_conversion_process_mdct_fx( move32(); hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx] = dmxEnergy[bandIdx]; move32(); + hLsSetUpConversion->te_prev_exp = 31; + hLsSetUpConversion->dmx_prev_exp = 31; } FOR( i = 0; i < inChannels; ++i ) @@ -1478,7 +1481,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( pop_wmops(); return; } -#endif +#else void ivas_ls_setup_conversion_process_mdct( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output[] /* i/o: output synthesis signal */ @@ -1711,7 +1714,7 @@ void ivas_ls_setup_conversion_process_mdct( pop_wmops(); return; } - +#endif /*------------------------------------------------------------------------- * ivas_ls_setup_conversion_process_mdct_param_mc() @@ -2057,7 +2060,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( } return; } -#endif // IVAS_FLOAT_FIXED +#else void ivas_ls_setup_conversion_process_mdct_param_mc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -2426,7 +2429,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( return; } - +#endif /*------------------------------------------------------------------------- * ivas_ls_setup_conversion_process_param_mc() @@ -2570,6 +2573,8 @@ void ivas_lssetupconversion_process_param_mc_fx( move32(); hLsSetUpConversion->dmxEnergyPrev_fx[chOutIdx][bandIdx] = dmxEnergy[chOutIdx][bandIdx]; move32(); + hLsSetUpConversion->te_prev_exp = 31; + hLsSetUpConversion->dmx_prev_exp = 31; } } } @@ -2605,7 +2610,7 @@ void ivas_lssetupconversion_process_param_mc_fx( pop_wmops(); return; } -#endif +#else void ivas_lssetupconversion_process_param_mc( Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ @@ -2729,3 +2734,4 @@ void ivas_lssetupconversion_process_param_mc( pop_wmops(); return; } +#endif \ No newline at end of file diff --git a/lib_dec/ivas_pca_dec.c b/lib_dec/ivas_pca_dec.c index 492cff90db917ef4fd32e52b103ba9abb77b1696..ffb10f8eb33411ea4bb1e1a965a53ebff6eb9929 100644 --- a/lib_dec/ivas_pca_dec.c +++ b/lib_dec/ivas_pca_dec.c @@ -42,7 +42,7 @@ /*-----------------------------------------------------------------------* * Local function definitions *-----------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static int32_t ivas_bitstream_read_int32( Decoder_State *st0, const int16_t bits ) @@ -309,3 +309,4 @@ void ivas_pca_dec( return; } +#endif \ No newline at end of file diff --git a/lib_dec/ivas_pca_dec_fx.c b/lib_dec/ivas_pca_dec_fx.c index e19b1bda94eaf668675bfde9311220b3a60a8580..ef53d89b3f453b059ef06904f1694efe19a34865 100644 --- a/lib_dec/ivas_pca_dec_fx.c +++ b/lib_dec/ivas_pca_dec_fx.c @@ -246,10 +246,10 @@ void ivas_pca_dec_fx( } ELSE { - pca_dec_inv_transform_fx( hPCA, ql_fx, ql_fx, output_frame, n_channels, pcm_out_fx ); + pca_dec_inv_transform_fx( hPCA, ql_fx, qr_fx, output_frame, n_channels, pcm_out_fx ); } - pca_dec_update_dquat_fx( hPCA, ql_fx, ql_fx ); + pca_dec_update_dquat_fx( hPCA, ql_fx, qr_fx ); hPCA->prev_pca_bypass = add(hPCA->prev_pca_bypass, 1); move16(); @@ -276,7 +276,7 @@ void ivas_pca_dec_fx( IF( EQ_16(pca_bypass, PCA_MODE_INACTIVE )) { - pca_dec_reset_dquat_fx( ql_fx, ql_fx ); + pca_dec_reset_dquat_fx( ql_fx, qr_fx ); IF( GT_16(hPCA->prev_pca_bypass, 1 )) //&& (hPCA->pca_off_hangover == 0)) { @@ -285,10 +285,10 @@ void ivas_pca_dec_fx( } ELSE { - pca_dec_inv_transform_fx( hPCA, ql_fx, ql_fx, output_frame, n_channels, pcm_out_fx ); + pca_dec_inv_transform_fx( hPCA, ql_fx, qr_fx, output_frame, n_channels, pcm_out_fx ); } - pca_dec_update_dquat_fx( hPCA, ql_fx, ql_fx ); + pca_dec_update_dquat_fx( hPCA, ql_fx, qr_fx ); hPCA->prev_pca_bypass = add(hPCA->prev_pca_bypass , 1); hPCA->prev_pca_bypass = min( hPCA->prev_pca_bypass, 2 ); @@ -299,19 +299,19 @@ void ivas_pca_dec_fx( IF( !bfi ) { pca_dec_s3_fx( hPCA->index[0], ql_fx ); - pca_dec_s3_fx( hPCA->index[1], ql_fx ); + pca_dec_s3_fx( hPCA->index[1], qr_fx ); } ELSE { /* freeze */ // todo : check if update of prev_ql_fx is required Copy( hPCA->prev_ql_fx, ql_fx, IVAS_PCA_INTERP ); - Copy( hPCA->prev_qr_fx, ql_fx, IVAS_PCA_INTERP ); + Copy( hPCA->prev_qr_fx, qr_fx, IVAS_PCA_INTERP ); } - pca_dec_inv_transform_fx( hPCA, ql_fx, ql_fx, output_frame, n_channels, pcm_out_fx ); + pca_dec_inv_transform_fx( hPCA, ql_fx, qr_fx, output_frame, n_channels, pcm_out_fx ); /* update for next frame */ - pca_dec_update_dquat_fx( hPCA, ql_fx, ql_fx ); + pca_dec_update_dquat_fx( hPCA, ql_fx, qr_fx ); hPCA->prev_pca_bypass = 0; move16(); diff --git a/lib_dec/ivas_post_proc.c b/lib_dec/ivas_post_proc.c index 0226e232b6e5f8d7a9e8a614eb1890bc1ce7b5e7..8a50efab32f9a698c835d546e66bac3dafcca7c0 100644 --- a/lib_dec/ivas_post_proc.c +++ b/lib_dec/ivas_post_proc.c @@ -36,6 +36,7 @@ #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" @@ -50,7 +51,8 @@ * - in CPE_DFT, post-processing on output channels * - in CPE_TD, post-processing on decoded channels before upmixing *-------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) + +#ifndef IVAS_FLOAT_FIXED void ivas_post_proc( SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ @@ -148,8 +150,7 @@ void ivas_post_proc( return; } -#endif -#ifdef IVAS_FLOAT_FIXED +#else void ivas_post_proc_fx( SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ @@ -250,12 +251,13 @@ void ivas_post_proc_fx( #endif // IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * stereo_dft_dec_core_switching_fx() * * core switching in DFT stereo *-------------------------------------------------------------------------*/ + +#ifdef IVAS_FLOAT_FIXED void stereo_dft_dec_core_switching_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 output_fx[], /* i/o: synthesis @internal Fs */ @@ -269,7 +271,6 @@ void stereo_dft_dec_core_switching_fx( Word16 *q_DFT ) { - Word32 output_Fs; Decoder_State *st; Word16 i, tmps; @@ -319,6 +320,11 @@ void stereo_dft_dec_core_switching_fx( st->last_core = st->last_core_bfi; } + IF( st->p_bpf_noise_buf_32 ) + { + Scale_sig32( st->p_bpf_noise_buf_32, L_FRAME16k, sub( *q, Q11 ) ); + } + IF( st->core == TCX_20_CORE || st->core == TCX_10_CORE || st->core == HQ_CORE || ( st->bfi == 1 && st->core == ACELP_CORE && st->con_tcx == 1 ) ) { IF( ( ( st->last_core != ACELP_CORE || ( st->prev_bfi == 1 && st->last_core == ACELP_CORE && st->last_con_tcx == 1 ) ) && st->last_core != AMR_WB_CORE ) || ( sba_dirac_stereo_dtx_flag && st->cng_type == FD_CNG ) ) /* TCX / HQ-CORE -> TCX / HQ-CORE */ @@ -692,10 +698,14 @@ void stereo_dft_dec_core_switching_fx( } } + IF( st->p_bpf_noise_buf_32 ) + { + Scale_sig32( st->p_bpf_noise_buf_32, L_FRAME16k, negate( sub( *q, Q11 ) ) ); + } + return; } -#endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#else void stereo_dft_dec_core_switching( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ float output[], /* i/o: synthesis @internal Fs */ diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 369ca37b067432f88dac662bf686a35d16f0ba62..9242d0672747e08a387d203893032a54c41723c9 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -7940,6 +7940,9 @@ static int16_t read_surround_coherence_hr( IVAS_QDIRECTION *q_direction; int16_t min_index; int16_t d, idx; +#ifdef NON_BE_FIX_1048_THRESHOLD_COH_BASOP + int32_t int_error_ratio_surr; +#endif coding_subbands = hQMetaData->q_direction[0].cfg.nbands; q_direction = hQMetaData->q_direction; @@ -7963,6 +7966,11 @@ static int16_t read_surround_coherence_hr( error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf]; } +#ifdef NON_BE_FIX_1048_THRESHOLD_COH_BASOP + int_error_ratio_surr = (int32_t)(MASA_SUR_COH_PRECISION * error_ratio_surr); + error_ratio_surr = (float)(int_error_ratio_surr * MASA_SUR_COH_THRESHOLD); +#endif + if ( error_ratio_surr <= 0 ) { error_ratio_surr = 0; @@ -8087,7 +8095,7 @@ static Word16 read_surround_coherence_hr_fx( Word16 coding_subbands; Word16 no_cv_vec[MASA_MAXIMUM_CODING_SUBBANDS]; Word16 bit_pos; - Word32 error_ratio_surr_fx; + Word64 error_ratio_surr_fx; Word16 idx_ER[MASA_MAXIMUM_CODING_SUBBANDS]; Word16 bits_sur_coherence, bits_GR; Word16 j, k, sf; @@ -8096,6 +8104,7 @@ static Word16 read_surround_coherence_hr_fx( IVAS_QDIRECTION *q_direction; Word16 min_index; Word16 d, idx; + Word32 int_error_ratio_surr; coding_subbands = hQMetaData->q_direction[0].cfg.nbands; q_direction = hQMetaData->q_direction; @@ -8105,63 +8114,24 @@ static Word16 read_surround_coherence_hr_fx( FOR( sf = 0; sf < hQMetaData->q_direction[0].cfg.nblocks; sf++ ) { d = 0; -#ifdef IVAS_FLOAT_FIXED_TBD - FOR( j = 0; j < coding_subbands; j++ ) - { - error_ratio_surr_fx = 1 << *q; - if ( hQMetaData->no_directions == 2 ) - { - d += hQMetaData->twoDirBands[j]; - idx = max( d - 1, 0 ); - error_ratio_surr_fx = L_sub( - L_sub( 1 << *q, q_direction[0].band_data[j].energy_ratio_fx[sf] ), - q_direction[1].band_data[idx].energy_ratio_fx[sf] * hQMetaData->twoDirBands[j] ); - } - ELSE - { - error_ratio_surr_fx = L_sub( 1 << *q, q_direction[0].band_data[j].energy_ratio_fx[sf] ); - } - if ( error_ratio_surr_fx <= 53667 ) // Assuming max error of 10^(-4) in q = 29 => 10^(-4) * 2^(29) - { - error_ratio_surr_fx = 0; - no_cv_vec[j] = 1; - idx_ER[j] = 0; - } - ELSE - { - idx_ER[j] = 7; // masa_sq( error_ratio_surr, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); - no_cv_vec[j] = idx_cb_sur_coh_masa[idx_ER[j]] + 2; - } - } -#else - /* NOTE: This block gives incorrect output with fixed point resulting in failures in pytest */ - /* TODO: Remove the intermediate conversion from fixed to float below */ - float tmp; - float energy_ratio_j_sf; - float energy_ratio_idx_sf; FOR( j = 0; j < coding_subbands; j++ ) { - energy_ratio_j_sf = (float) energy_ratio[0][j][sf] / ( ONE_IN_Q62 ); - - tmp = 1.0f; - IF( hQMetaData->no_directions == 2 ) + error_ratio_surr_fx = ONE_IN_Q62; + IF( EQ_32( hQMetaData->no_directions, 2 ) ) { - d += hQMetaData->twoDirBands[j]; - idx = max( d - 1, 0 ); - - energy_ratio_idx_sf = (float) energy_ratio[1][idx][sf] / ( ONE_IN_Q62 ); - - tmp = 1.0f - energy_ratio_j_sf - energy_ratio_idx_sf * hQMetaData->twoDirBands[j]; + d = add( d, hQMetaData->twoDirBands[j] ); + idx = s_max( sub( d, 1 ), 0 ); + error_ratio_surr_fx = W_sub( + W_sub( ONE_IN_Q62, energy_ratio[0][j][sf] ), + energy_ratio[1][idx][sf] * hQMetaData->twoDirBands[j] ); } ELSE { - tmp = 1.0f - energy_ratio_j_sf; + error_ratio_surr_fx = W_sub( ONE_IN_Q62, energy_ratio[0][j][sf] ); } - error_ratio_surr_fx = (Word32) ( tmp * ONE_IN_Q30 ); - - IF( error_ratio_surr_fx <= 0 ) + IF( LE_64( error_ratio_surr_fx, ( 461168601842 ) ) ) // 1e-7 in Q62 { error_ratio_surr_fx = 0; no_cv_vec[j] = 1; @@ -8173,9 +8143,8 @@ static Word16 read_surround_coherence_hr_fx( no_cv_vec[j] = idx_cb_sur_coh_masa[idx_ER[j]] + 2; } } -#endif // !IVAS_FLOAT_FIXED_TBD - IF( sum_s( no_cv_vec, coding_subbands ) == coding_subbands ) + IF( EQ_16( sum_s( no_cv_vec, coding_subbands ), coding_subbands ) ) { /* surround coherence is zero */ FOR( j = 0; j < coding_subbands; j++ ) @@ -8193,29 +8162,29 @@ static Word16 read_surround_coherence_hr_fx( { /* read how the surround coherence is encoded */ byteBuffer = bitstream[bit_pos--]; - bits_sur_coherence += 1; + bits_sur_coherence = add( bits_sur_coherence, 1 ); IF( byteBuffer & 1 ) { /* GR decoding */ /* read GR order */ byteBuffer = bitstream[bit_pos--]; - bits_sur_coherence += 1; + bits_sur_coherence = add( bits_sur_coherence, 1 ); /* read min index */ bits_GR = bit_pos; min_index = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, MASA_MAX_NO_CV_SUR_COH, 0 ); - bits_sur_coherence += bits_GR - bit_pos; + bits_sur_coherence = add( bits_sur_coherence, sub( bits_GR, bit_pos ) ); /* read GR data */ FOR( j = 0; j < coding_subbands; j++ ) { bits_GR = bit_pos; /* decoding for min removed */ - IF( no_cv_vec[j] > 1 ) + IF( GT_16( no_cv_vec[j], 1 ) ) { idx_sur_coh[j] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, no_cv_vec[j] - min_index, ( byteBuffer & 1 ) ); - bits_sur_coherence += bits_GR - bit_pos; + bits_sur_coherence = add( bits_sur_coherence, sub( bits_GR, bit_pos ) ); } ELSE { @@ -8225,9 +8194,9 @@ static Word16 read_surround_coherence_hr_fx( FOR( j = 0; j < coding_subbands; j++ ) { - IF( no_cv_vec[j] > 1 ) + IF( GT_16( no_cv_vec[j], 1 ) ) { - hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j] + min_index; + hQMetaData->surcoh_band_data[j].sur_coherence_index = L_add( (Word32) idx_sur_coh[j], L_deposit_l( min_index ) ); hQMetaData->surcoh_band_data[j].surround_coherence[sf] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index]; } ELSE @@ -8253,7 +8222,7 @@ static Word16 read_surround_coherence_hr_fx( /* deindex surround coherence */ FOR( j = 0; j < coding_subbands; j++ ) { - IF( no_cv_vec[j] > 1 ) + IF( GT_16( no_cv_vec[j], 1 ) ) { hQMetaData->surcoh_band_data[j].surround_coherence[sf] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index]; } @@ -8267,7 +8236,7 @@ static Word16 read_surround_coherence_hr_fx( } /* Replace return value with the actual read bits. bits_sur_coherence might show wrong count at this point. */ - bits_sur_coherence = *p_bit_pos - bit_pos; + bits_sur_coherence = sub( *p_bit_pos, bit_pos ); *p_bit_pos = bit_pos; return bits_sur_coherence; diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index a284b74c45e187707f4af691dc5d2a49c710800a..2d2779d814cc91de914df694dcd701e34c226da1 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -131,6 +131,7 @@ void ivas_sba_set_cna_cng_flag( } #endif +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * ivas_sba_dec_reconfigure() * @@ -249,6 +250,762 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->sba_analysis_order = sba_analysis_order_old_flush; st_ivas->hDecoderConfig->ivas_total_brate = last_ivas_total_brate; +#ifdef IVAS_FLOAT_FIXED +#if 1 /*Float to fixed conversion*/ + DECODER_TC_BUFFER_HANDLE hTcBuffer; + hTcBuffer = st_ivas->hTcBuffer; + IF( st_ivas->hCombinedOrientationData ) + FOR( Word16 ind1 = 0; ind1 < 3; ind1++ ) + { + FOR( Word16 ind2 = 0; ind2 < 3; ind2++ ) + { + st_ivas->hCombinedOrientationData->Rmat_fx[0][ind1][ind2] = (Word32) ( st_ivas->hCombinedOrientationData->Rmat[0][ind1][ind2] * ( 1 << 15 ) ); + } + } + if ( st_ivas->hSbaIsmData ) + { + for ( Word16 ch_idx = 0; ch_idx < st_ivas->hSbaIsmData->delayBuffer_nchan; ch_idx++ ) + { + floatToFixed_arr32( st_ivas->hSbaIsmData->delayBuffer[ch_idx], st_ivas->hSbaIsmData->delayBuffer_fx[ch_idx], Q11, st_ivas->hSbaIsmData->delayBuffer_size ); + } + } + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + uint16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + hDecoderConfig = st_ivas->hDecoderConfig; + Word16 numch_in = 0, numch_out, q1 = 30, q2 = 30; + ; + Word16 numch_out_dirac = hDecoderConfig->nchan_out; + IF( hSpar ) + { + numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; + numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + 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 ); + hSpar->hMdDec->Q_mixer_mat = 30; + //for ( int l = 0; l < numch_out; l++ ) + //{ + // for ( int j = 0; j < numch_in; j++ ) + // { + // for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) + // { + // hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); + // } + // } + //} + //for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + //{ + // for ( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) + // { + // for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) + // { + // for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) + // { + // hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); + // } + // } + // } + //} + for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); + } + } + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) + { + for ( Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); + } + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] , Q11 ); + } + } + } + } + Word16 n_tc; + if (st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT) + n_tc = st_ivas->nchan_ism; + else + n_tc = st_ivas->hTcBuffer->nchan_transport_internal; + for (int ch = 0; ch < n_tc; ch++) + { + floatToFixed_arrL(st_ivas->hTcBuffer->tc[ch], st_ivas->hTcBuffer->tc_fx[ch], Q11, L_FRAME48k); + } +#endif + if ( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, granularity_new, st_ivas->renderer_type, st_ivas->intern_config, &st_ivas->hIntSetup, st_ivas->mc_mode, ism_mode_old, nSamplesFlushed, data ) ) != IVAS_ERR_OK ) + { + return error; + } +#if 1 /*Fixed to float */ + if ( hTcBuffer->tc_buffer ) + fixedToFloat_arrL( hTcBuffer->tc_buffer_fx, hTcBuffer->tc_buffer, Q11, hTcBuffer->tc_buff_len ); + IF( hSpar ) + { + FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + { + FOR( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + { + st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); + } + } + /*FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + { + FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) + { + FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) + { + FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) + { + hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); + } + } + } + }*/ + // fix2float (to be cleaned) + 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 ) ) ) ) + { + fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); + FOR( Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + } + // fix2float end + FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + { + IF( st_ivas->cldfbSynDec[out_ch] ) + { + FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + { + st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); + } + } + } + } +#endif +#else + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, granularity_new, st_ivas->renderer_type, st_ivas->intern_config, &st_ivas->hIntSetup, st_ivas->mc_mode, ism_mode_old, nSamplesFlushed, data ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif // IVAS_FLOAT_FIXED + + /* restore correct values for the current frame*/ + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); + st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; + } + else if ( granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* make sure the changed number of slots in the last subframe is not lost in the following steps */ + if ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hSpatParamRendCom->subframe_nbslots[st_ivas->hSpatParamRendCom->nb_subframes - 1] = st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; + } + st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->nb_subframes - 1] = st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; + } + } + + /* save old */ + if ( ism_mode_old != ISM_SBA_MODE_DISC ) + { + if ( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) + { + st_ivas->hTcBuffer->num_slots = st_ivas->hSpar->num_slots; + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpar->nb_subframes; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpar->slots_rendered; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpar->subframes_rendered; + mvs2s( st_ivas->hSpar->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + } + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SBA handles + *-----------------------------------------------------------------*/ + + int16_t sba_order_internal; + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; + + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + + if ( hSpar != NULL ) + { + if ( ( hSpar->hPCA != NULL ) && ( ( hDecoderConfig->ivas_total_brate != PCA_BRATE ) || ( st_ivas->sba_order != 1 ) ) ) + { + free( st_ivas->hSpar->hPCA ); + hSpar->hPCA = NULL; + } + + if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) ) + { + 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; + } + } + else if ( last_ivas_total_brate < IVAS_24k4 && ivas_total_brate >= IVAS_24k4 ) + { + num_channels = st_ivas->hSpar->hMdDec->spar_md_cfg.num_umx_chs; + ivas_spar_md_dec_matrix_close( st_ivas->hSpar->hMdDec, num_channels ); + + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order_internal, ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + if ( ( error = ivas_spar_md_dec_matrix_open( st_ivas->hSpar->hMdDec, num_channels, num_md_sub_frames ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( hSpar->hPCA == NULL && st_ivas->hDecoderConfig->ivas_total_brate == PCA_BRATE && st_ivas->sba_order == 1 && st_ivas->ivas_format == SBA_FORMAT ) + { + 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 + + } + + 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; + } + } + + hSpar = st_ivas->hSpar; + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + if ( st_ivas->nchan_transport == 1 ) + { + st_ivas->element_mode_init = IVAS_SCE; + } + else + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + } + + /*-----------------------------------------------------------------* + * Renderer selection + *-----------------------------------------------------------------*/ + + /* renderer might have changed */ + intern_config_old = st_ivas->intern_config; + ivas_renderer_select( st_ivas ); + + /* side effect of the renderer selection can be a changed internal config */ + if ( st_ivas->intern_config != intern_config_old ) + { + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + } + + /*-------------------------------------------------------------------* + * Reallocate and initialize binaural rendering handles + *--------------------------------------------------------------------*/ + + if ( st_ivas->hBinRenderer == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + /* open fastconv binaural renderer */ + if ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hBinRenderer != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + ivas_binRenderer_close( &st_ivas->hBinRenderer ); + } + + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX && st_ivas->hMonoDmxRenderer == NULL ) + { + if ( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) + { + ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); + } + + 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; + } + + 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 ) ) ) + { + DIRAC_CONFIG_FLAG flag_config; + + flag_config = DIRAC_OPEN; + if ( st_ivas->hDirAC != NULL ) + { + 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; + } + } + else + { + 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 ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + + set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + 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 ); + + if ( st_ivas->hDirAC ) + { + st_ivas->hDirAC->hConfig->enc_param_start_band = st_ivas->hSpar->enc_param_start_band; + } + } + + 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 ) + { + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + } + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( ism_mode_old == ISM_MODE_NONE && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + 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; + } + + if ( ( 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 ) ) + { +#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 ) + { + if ( st_ivas->hMonoDmxRenderer == NULL ) + { + if ( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /* Allocate TD renderer for the objects in DISC mode */ + if ( st_ivas->hBinRendererTd == NULL ) + { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* Allocate memory for OSBA delay buffer */ + if ( ( error = ivas_osba_data_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->nCPE += ( st_ivas->nchan_ism + 1 ) >> 1; + } + else if ( ism_mode_old == ISM_SBA_MODE_DISC && st_ivas->ism_mode == ISM_MODE_NONE ) + { + /* ISM renderer handle */ + ivas_ism_renderer_close( &st_ivas->hIsmRendererData ); + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + ivas_osba_data_close( &st_ivas->hSbaIsmData ); + + /* Time Domain binaural renderer handle */ + if ( st_ivas->hBinRendererTd != NULL ) + { + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + st_ivas->hHrtfTD = NULL; + } + } + nchan_transport_old += st_ivas->nchan_ism; + st_ivas->ism_mode = ISM_MODE_NONE; + } + else if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->nchan_ism + 1 ) >> 1; + nCPE_old = st_ivas->nCPE; + nchan_transport_old = st_ivas->nchan_transport; + nchan_transport_old += st_ivas->nchan_ism; + } + } + +#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 + *-----------------------------------------------------------------*/ + + 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 ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * JBM TC buffers + *-----------------------------------------------------------------*/ + + { + int16_t tc_nchan_to_allocate; + int16_t tc_nchan_tc; + TC_BUFFER_MODE tc_buffer_mode; + + tc_buffer_mode = TC_BUFFER_MODE_RENDERER; + tc_nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_to_allocate = tc_nchan_tc; + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || 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 ) ) + { + tc_nchan_tc = st_ivas->hDecoderConfig->nchan_out + st_ivas->nchan_ism; + tc_nchan_to_allocate = tc_nchan_tc; + } + else + { + tc_buffer_mode = TC_BUFFER_MODE_BUFFER; + tc_nchan_tc = st_ivas->hDecoderConfig->nchan_out; + tc_nchan_to_allocate = tc_nchan_tc; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + tc_nchan_to_allocate += st_ivas->nchan_ism; + } + } + else + { + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + tc_nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + } + } + + if ( tc_nchan_tc != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || tc_buffer_mode != st_ivas->hTcBuffer->tc_buffer_mode || granularity_new != st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode, tc_nchan_tc, tc_nchan_to_allocate, tc_nchan_to_allocate, granularity_new ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + /* resync SPAR and DirAC JBM info from TC Buffer */ + if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity ) + { + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + } + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpar->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + st_ivas->hSpar->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpar->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + int16_t granularityMultiplier = st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size; + int16_t n; + for ( n = 0; n < MAX_JBM_SUBFRAMES_5MS; n++ ) + { + st_ivas->hSpatParamRendCom->subframe_nbslots[n] = st_ivas->hTcBuffer->subframe_nbslots[n] * granularityMultiplier; + st_ivas->hSpar->subframe_nbslots[n] = st_ivas->hSpatParamRendCom->subframe_nbslots[n]; + } + } + + /*-----------------------------------------------------------------* + * floating-point output audio buffers + *-----------------------------------------------------------------*/ + + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + { + 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; +} +#else +/*-------------------------------------------------------------------* + * ivas_sba_dec_reconfigure_fx() + * + * Reconfigure IVAS SBA decoder + *-------------------------------------------------------------------*/ + +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 */ +) +{ + int16_t nchan_transport_old, nSCE_old, nCPE_old, nchan_hp20_old; + AUDIO_CONFIG intern_config_old; + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; + int16_t sba_dirac_stereo_flag_old; + int32_t ivas_total_brate; + int32_t last_ivas_total_brate; + int16_t num_channels, num_md_sub_frames; + int16_t nchan_out_buff, nchan_out_buff_old; + int16_t sba_analysis_order_old_flush; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + ISM_MODE ism_mode_old; + int16_t granularity_new; + + ism_mode_old = st_ivas->ism_mode; + hDecoderConfig = st_ivas->hDecoderConfig; + ivas_total_brate = hDecoderConfig->ivas_total_brate; + last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; + sba_analysis_order_old_flush = st_ivas->sba_analysis_order; + + /*-----------------------------------------------------------------* + * Set SBA high-level parameters + * Save old SBA high-level parameters + *-----------------------------------------------------------------*/ + + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, sba_analysis_order_old_flush, last_ivas_total_brate ); + + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + nchan_hp20_old = getNumChanSynthesis( st_ivas ); + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + if ( ivas_total_brate >= IVAS_256k ) + { + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + } + else + { + st_ivas->ism_mode = ISM_MODE_NONE; + } + } + else + { + st_ivas->ism_mode = ISM_MODE_NONE; + } + + nSCE_old = st_ivas->nSCE; + nCPE_old = st_ivas->nCPE; + nchan_transport_old = st_ivas->nchan_transport; + sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag; + + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); + + *nSamplesFlushed = 0; + granularity_new = st_ivas->hTcBuffer->n_samples_granularity; + + /* we may need to flush only for binaural and OSBA and TSM */ + 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_IR || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + RENDERER_TYPE renderer_type_new; + int16_t sba_order_internal; + + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + + /* get new renderer type */ + /* copy the logic from ivas_renderer_select(), because calling this function has too many side effects that would affect the flushing */ + if ( ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) <= 2 ) + { + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL ) + { + renderer_type_new = RENDERER_BINAURAL_PARAMETRIC; + } + else + { + renderer_type_new = RENDERER_BINAURAL_PARAMETRIC_ROOM; + } + } + else + { + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + ) + { + renderer_type_new = RENDERER_BINAURAL_FASTCONV; + } + else + { + renderer_type_new = RENDERER_BINAURAL_FASTCONV_ROOM; + } + } + + /* determine new granularity */ + granularity_new = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* this will change anyway only with binaural */ + if ( renderer_type_new == RENDERER_BINAURAL_FASTCONV && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + granularity_new *= JBM_CLDFB_SLOTS_IN_SUBFRAME; + } + + /* flush renderer on granularity change form 5ms to 1.25ms, again only possible for binaural rendering */ + if ( granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) + { + /* write back info for correct rendering of the flushable samples */ + st_ivas->sba_analysis_order = sba_analysis_order_old_flush; + st_ivas->hDecoderConfig->ivas_total_brate = last_ivas_total_brate; + #ifdef IVAS_FLOAT_FIXED #if 1 /*Float to fixed conversion*/ DECODER_TC_BUFFER_HANDLE hTcBuffer; @@ -287,40 +1044,38 @@ ivas_error ivas_sba_dec_reconfigure( hSpar = st_ivas->hSpar; uint16_t nchan_internal; nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - DECODER_CONFIG_HANDLE hDecoderConfig; hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_in, numch_out, num_md_sub_frames, q1 = 30, q2 = 30; - ; + Word16 numch_in = 0, numch_out; Word16 numch_out_dirac = hDecoderConfig->nchan_out; IF( hSpar ) { numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; 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 ); - - for ( int l = 0; l < numch_out; l++ ) - { - for ( int j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - for ( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); - } - } - } - } + hSpar->hMdDec->Q_mixer_mat = 30; + //for ( int l = 0; l < numch_out; l++ ) + //{ + // for ( int j = 0; j < numch_in; j++ ) + // { + // for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) + // { + // hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k], q1 ); + // } + // } + //} + //for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + //{ + // for ( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) + // { + // for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) + // { + // for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) + // { + // hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l], q2 ); + // } + // } + // } + //} for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) { for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) @@ -373,7 +1128,7 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); } } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) + /*FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) { FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) { @@ -385,7 +1140,7 @@ ivas_error ivas_sba_dec_reconfigure( } } } - } + }*/ // fix2float (to be cleaned) 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 ) ) ) ) { @@ -486,7 +1241,7 @@ ivas_error ivas_sba_dec_reconfigure( { ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); - if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_spar_dec_open_fx( st_ivas, 1 ) ) != IVAS_ERR_OK ) { return error; } @@ -494,10 +1249,10 @@ ivas_error ivas_sba_dec_reconfigure( else if ( last_ivas_total_brate < IVAS_24k4 && ivas_total_brate >= IVAS_24k4 ) { num_channels = st_ivas->hSpar->hMdDec->spar_md_cfg.num_umx_chs; - ivas_spar_md_dec_matrix_close( st_ivas->hSpar->hMdDec, num_channels ); + ivas_spar_md_dec_matrix_close_fx( st_ivas->hSpar->hMdDec, num_channels ); num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order_internal, ivas_total_brate, st_ivas->last_active_ivas_total_brate ); - if ( ( error = ivas_spar_md_dec_matrix_open( st_ivas->hSpar->hMdDec, num_channels, num_md_sub_frames ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_spar_md_dec_matrix_open_fx( st_ivas->hSpar->hMdDec, num_channels, num_md_sub_frames ) ) != IVAS_ERR_OK ) { return error; } @@ -510,7 +1265,7 @@ ivas_error ivas_sba_dec_reconfigure( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PCA decoder" ); } - ivas_pca_dec_init( hSpar->hPCA ); + //ivas_pca_dec_init( hSpar->hPCA ); #ifdef IVAS_FLOAT_FIXED ivas_pca_dec_init_fx(hSpar->hPCA); #endif @@ -521,7 +1276,7 @@ ivas_error ivas_sba_dec_reconfigure( } else { - if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -559,8 +1314,16 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hBinRenderer == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) { + /*float2fix block: to be removed*/ + if (st_ivas->hIntSetup.ls_azimuth && st_ivas->hIntSetup.ls_azimuth_fx) { + floatToFixed_arrL((float *)st_ivas->hIntSetup.ls_azimuth, (Word32 *)st_ivas->hIntSetup.ls_azimuth_fx, Q22, st_ivas->hIntSetup.nchan_out_woLFE); + } + if (st_ivas->hIntSetup.ls_elevation && st_ivas->hIntSetup.ls_elevation_fx) { + floatToFixed_arrL((float *)st_ivas->hIntSetup.ls_elevation, (Word32 *)st_ivas->hIntSetup.ls_elevation_fx, Q22, st_ivas->hIntSetup.nchan_out_woLFE); + } + /*float2fix block end*/ /* open fastconv binaural renderer */ - if ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_binRenderer_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } @@ -601,7 +1364,11 @@ 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; } @@ -659,7 +1426,11 @@ 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; } @@ -715,7 +1486,7 @@ ivas_error ivas_sba_dec_reconfigure( } /* Allocate memory for OSBA delay buffer */ - if ( ( error = ivas_osba_data_open( st_ivas ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_osba_data_open_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } @@ -727,14 +1498,14 @@ ivas_error ivas_sba_dec_reconfigure( /* ISM renderer handle */ ivas_ism_renderer_close( &st_ivas->hIsmRendererData ); ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); - ivas_osba_data_close( &st_ivas->hSbaIsmData ); + ivas_osba_data_close_fx( &st_ivas->hSbaIsmData ); /* Time Domain binaural renderer handle */ if ( st_ivas->hBinRendererTd != NULL ) { if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { - ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); st_ivas->hHrtfTD = NULL; } } @@ -770,12 +1541,12 @@ ivas_error ivas_sba_dec_reconfigure( { return error; } -#endif // IVAS_FLOAT_FIXED +#else if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) { return error; } - +#endif /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ @@ -895,7 +1666,10 @@ ivas_error ivas_sba_dec_reconfigure( return error; } +#endif + +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * ivas_sba_dec_digest_tc() * @@ -1162,23 +1936,23 @@ void ivas_sba_dec_digest_tc( } st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = norm_l(max_cngNoiseLevel); - floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1); + //floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q13, M + 1); floatToFixed_arrL(st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, FFTCLDFBLEN); for (int i = 0; i < FFTLEN; i++) { - st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15); + //st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx[i] = float_to_fix(st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt[i], 15); } #endif generate_masking_noise_lb_dirac_fx(st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc_fx[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna); #if 1 - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, 15, st->hFdCngDec->hFdCngCom->fftlen); fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->fftBuffer, st->hFdCngDec->hFdCngCom->fftBuffer_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp, st->hFdCngDec->hFdCngCom->fftlen); - fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); + //fixedToFloat_arrL(st->hFdCngDec->hFdCngCom->exc_cng_32fx, st->hFdCngDec->hFdCngCom->exc_cng_flt, 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); fixedToFloat_arrL(st_ivas->hTcBuffer->tc_fx[1], st_ivas->hTcBuffer->tc[1], 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp - 9, st->hFdCngDec->hFdCngCom->frameSize); #endif @@ -1189,7 +1963,7 @@ void ivas_sba_dec_digest_tc( return; } - +#endif #ifdef IVAS_FLOAT_FIXED void ivas_sba_dec_digest_tc_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -1257,6 +2031,8 @@ void ivas_sba_dec_digest_tc_fx( ( (EQ_16(st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC) || EQ_16(st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM) || EQ_16(st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC) ) && (EQ_16(nchan_transport, 1) && NE_16(st_ivas->nchan_transport, 2) && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) ) ) { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + Scale_sig(st->hFdCngDec->hFdCngCom->A_cng, M + 1, norm_s(st->hFdCngDec->hFdCngCom->A_cng[0] - 1) - 2); + generate_masking_noise_lb_dirac_fx( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc_fx[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); } @@ -1355,7 +2131,8 @@ ivas_error ivas_sba_dec_render_fx( return IVAS_ERR_OK; } -#endif // IVAS_FLOAT_FIXED + +#else ivas_error ivas_sba_dec_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -1401,107 +2178,7 @@ ivas_error ivas_sba_dec_render( { int16_t n_samples_sf = slot_size * hSpar->subframe_nbslots[subframe_idx]; -#ifdef IVAS_FLOAT_FIXED1 -#if 1 /*Float to fixed conversion*/ - Word16 numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - Word16 num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; - DECODER_CONFIG_HANDLE hDecoderConfig; - hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_out_dirac = hDecoderConfig->nchan_out; - - Word16 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 ); - - for ( int i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) - { - floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); - } - Word16 q1 = 30, q2 = 30; - for ( int l = 0; l < numch_out; l++ ) - { - for ( int j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed(hSpar->hMdDec->mixer_mat[l][j][k] , q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - for ( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed( hSpar->hMdDec->mixer_mat_prev[m][j][k][l] , q2 ); - } - } - } - } - for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); - } - } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) - { - for ( Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); - } -#endif // - ivas_spar_dec_upmixer_sf_fx( st_ivas, output_f_local, nchan_internal ); -#ifdef IVAS_FLOAT_FIXED /*Fixed to float */ - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - FOR( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ - } - } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } - } - // fix2float (to be cleaned) - 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 ) ) ) ) - { - fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); - FOR( Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - } - // fix2float end - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) - { - IF( st_ivas->cldfbSynDec[out_ch] ) - { - FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q7 ) ) ); /*Rounding off*/ - } - } - } -#endif -#else ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); -#endif // IVAS_FLOAT_FIXED for ( ch = 0; ch < nchan_out; ch++ ) { output_f_local[ch] += n_samples_sf; @@ -1535,3 +2212,5 @@ ivas_error ivas_sba_dec_render( return IVAS_ERR_OK; } +#endif // IVAS_FLOAT_FIXED + diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 1ddff43a4469822ad1d03b1937458e309d42d2bd..af1f06f2be15098f34c56887f4f01b72b527e0ba 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -849,9 +849,6 @@ void ivas_sba_dirac_stereo_dec( ivas_sba_dirac_stereo_config( hStereoDft->hConfig ); hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !mcmasa ) ); stereo_dft_dec_update( hStereoDft, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); -#ifdef IVAS_FLOAT_FIXED - stereo_dft_dec_update_fx( hCPE->hStereoDft, output_frame, 0 ); -#endif if ( st_ivas->nchan_transport > 1 ) { stereo_dft_dec_analyze( hCPE, output[0], DFT, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0 ); @@ -865,122 +862,7 @@ void ivas_sba_dirac_stereo_dec( /* do DFT Stereo core switching (including DFT analysis) here as CPE element was not available in SCE decoder */ mvr2r( hSCE->save_synth, tmp_synth, hSCE->hCoreCoder[0]->L_frame ); -#ifdef IVAS_FLOAT_FIXED - Word16 q = 11, q_DFT[2] = { 3, 3 }; - Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; - Word32 synth_fx[L_FRAME48k]; - Word32 hb_synth_fx[L_FRAME48k]; - Word32 output_fx[960]; - FOR( int i = 0; i < 960; i++ ) - { - output_fx[i] = (Word32)(output[0][i] * ( 1 << q )); - } - IF( hCPE->hCoreCoder[0] != NULL ) - FOR( int i = 0; i < L_FRAME32k; i++ ) - { - hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[i] = (Word32)(hCPE->hCoreCoder[0]->hHQ_core->old_outLB[i] * ( 1 << q )); - } - IF( (hCPE->hCoreCoder[0] != NULL) && (hCPE->hCoreCoder[0]->p_bpf_noise_buf_32 != NULL) ) - FOR( int i = 0; i < L_FRAME16k; i++ ) - { - hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[i] = (Word32)(hCPE->hCoreCoder[0]->p_bpf_noise_buf_float[i] * ( 1 << q )); - } - IF( DFT != NULL ) - FOR( int i = 0; i < CPE_CHANNELS; i++ ) - { - FOR( int j = 0; j < STEREO_DFT_BUF_MAX; j++ ) - { - DFT_fx[i][j] = (Word32)(DFT[i][j] * ( 1 << q_DFT[i] )); - } - } - - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_BPF_fx[0][i] = (Word32)(hCPE->input_mem_BPF[0][i] * ( 1 << q )); - FOR( int i = 0; i < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); i++ ) - hCPE->input_mem_fx[0][i] = (Word32)(hCPE->input_mem[0][i] * ( 1 << q )); - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_LB_fx[0][i] = (Word32)(hCPE->input_mem_LB[0][i] * ( 1 << q )); - FOR( int i = 0; i < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); i++ ) - hCPE->input_mem_fx[1][i] = (Word32)(hCPE->input_mem[1][i] * ( 1 << q )); - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_LB_fx[1][i] = (Word32)(hCPE->input_mem_LB[1][i] * ( 1 << q )); - IF( hCPE->hStereoDft != NULL ) - FOR( int i = 0; i < NS2SA( 16000, DELAY_BWE_TOTAL_NS ); i++ ) - { - hCPE->hStereoDft->ap_delay_mem_fx[i] = (Word32)(hCPE->hStereoDft->ap_delay_mem[i] * ( 1 << q )); - } - FOR( int i = 0; i < hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC; i++ ) - { - synth_fx[i] = (Word32)(hSCE->save_synth[i] * ( 1 << q )); - hb_synth_fx[i] = (Word32)(hSCE->save_hb_synth[i] * ( 1 << q )); - } - IF( hCPE->hCoreCoder[0] != NULL ) - FOR( int i = 0; i < L_FRAME48k; i++ ) - { - hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[i] = (Word32)(hCPE->hCoreCoder[0]->hHQ_core->old_out[i] * ( 1 << q )); - } - IF( hCPE->hStereoDft != NULL ) - FOR( int i = 0; i < NS2SA( 16000, STEREO_DFT32MS_OVL_NS ); i++ ) - { - hCPE->hStereoDft->buff_LBTCX_mem_fx[i] = (Word32)(hCPE->hStereoDft->buff_LBTCX_mem[i] * ( 1 << q )); - } - stereo_dft_dec_core_switching_fx( hCPE, output_fx /*hSCE->save_output*/, synth_fx, hb_synth_fx, DFT_fx, output_frame, 0, dtx_flag, &q, q_DFT ); - IF( DFT != NULL ) - FOR( int i = 0; i < CPE_CHANNELS; i++ ) - { - FOR( Word16 j = 0; j < STEREO_DFT_BUF_MAX; j++ ) - { - DFT[i][j] = (float) DFT_fx[i][j] / (float) ( 1 << q_DFT[i] ); - } - } - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_BPF[0][i] = (float) hCPE->input_mem_BPF_fx[0][i] / (float) ( 1 << q ); - FOR( int i = 0; i < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); i++ ) - hCPE->input_mem[0][i] = (float) hCPE->input_mem_fx[0][i] / (float) ( 1 << q ); - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_LB[0][i] = (float) hCPE->input_mem_LB_fx[0][i] / (float) ( 1 << q ); - FOR( int i = 0; i < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); i++ ) - hCPE->input_mem[1][i] = (float) hCPE->input_mem_fx[1][i] / (float) ( 1 << q ); - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_LB[1][i] = (float) hCPE->input_mem_LB_fx[1][i] / (float) ( 1 << q ); - IF( hCPE->hStereoDft != NULL ) - FOR( int i = 0; i < NS2SA( 16000, DELAY_BWE_TOTAL_NS ); i++ ) - { - hCPE->hStereoDft->ap_delay_mem[i] = (float) hCPE->hStereoDft->ap_delay_mem_fx[i] / (float) ( 1 << q ); - } - IF( (hCPE->hCoreCoder[0] != NULL) && (hCPE->hCoreCoder[0]->p_bpf_noise_buf_32 != NULL) ) - FOR( int i = 0; i < L_FRAME16k; i++ ) - { - hCPE->hCoreCoder[0]->p_bpf_noise_buf_float[i] = (float) hCPE->hCoreCoder[0]->p_bpf_noise_buf_32[i] / (float) ( 1 << q ); - } - FOR( int i = 0; i < 960; i++ ) - { - output[0][i] = (float) output_fx[i] / (float) ( 1 << q ); - } - FOR( int i = 0; i < hCPE->hCoreCoder[0]->output_Fs / FRAMES_PER_SEC; i++ ) - { - hSCE->save_synth[i] = (float) synth_fx[i] / (float) ( 1 << q ); - hSCE->save_hb_synth[i] = (float) hb_synth_fx[i] / (float) ( 1 << q ); - } - IF( hCPE->hCoreCoder[0] != NULL ) - FOR( int i = 0; i < L_FRAME48k; i++ ) - { - hCPE->hCoreCoder[0]->hHQ_core->old_out[i] = (float) hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx[i] / (float) ( 1 << q ); - } - IF( hCPE->hStereoDft != NULL ) - FOR( int i = 0; i < NS2SA( 16000, STEREO_DFT32MS_OVL_NS ); i++ ) - { - hCPE->hStereoDft->buff_LBTCX_mem[i] = (float) hCPE->hStereoDft->buff_LBTCX_mem_fx[i] / (float) ( 1 << q ); - } - IF( hCPE->hCoreCoder[0] != NULL ) - FOR( int i = 0; i < L_FRAME32k; i++ ) - { - hCPE->hCoreCoder[0]->hHQ_core->old_outLB[i] = (float) hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx[i] / (float) ( 1 << q ); - } - -#else stereo_dft_dec_core_switching( hCPE, output[0] /*hSCE->save_output*/, hSCE->save_synth, hSCE->save_hb_synth, DFT, output_frame, 0, dtx_flag ); -#endif /* do updates here after skipping this in SCE decoder (needs to be done after core switching) */ updt_dec_common( hSCE->hCoreCoder[0], NORMAL_HQ_CORE, -1, hSCE->save_synth ); @@ -1006,11 +888,8 @@ void ivas_sba_dirac_stereo_dec( { stereo_dft_dec_synthesize( hCPE, DFT, 1, output[1], output_frame ); } -#ifdef IVAS_FLOAT_FIXED - synchro_synthesis_fixed( st_ivas->hDecoderConfig->ivas_total_brate, hCPE, output, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); -#else + synchro_synthesis( st_ivas->hDecoderConfig->ivas_total_brate, hCPE, output, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); -#endif //Todo use below once input is fixed not done due to complication in pointer //synchro_synthesis_fixed_clean( st_ivas->hDecoderConfig->ivas_total_brate, hCPE, output, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); diff --git a/lib_dec/ivas_sba_dirac_stereo_dec_fx.c b/lib_dec/ivas_sba_dirac_stereo_dec_fx.c index 4bf0e880729d5ba1a9603b0ed29d363f8417958e..1aadd28814ebe31f6ba97ba3eb17c2427e9dea9d 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec_fx.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec_fx.c @@ -731,6 +731,7 @@ static void ivas_sba_dirac_stereo_compute_td_stefi_nrgs( } hStereoDft->hb_nrg_subr_fx[0] = hb_nrg2; + hStereoDft->q_hb_nrg_subr = sub(shl(q_hb_synth, 1), 31); move32(); hb_nrg = L_add(hb_nrg, hb_nrg2); hb_nrg2 = EPSILON_FIX; @@ -1170,7 +1171,8 @@ void ivas_sba_dirac_stereo_smooth_parameters_fx( { FOR ( b = 0; b < hStereoDft->nbands; b++ ) { - hStereoDft->mixer_mat_smooth_fx[i][j][b + k * IVAS_MAX_NUM_BANDS] = hMdDec->mixer_mat_fx[i][j][b]; + // The Q format of mixer_mat_fx is Q30 so applying the left shift. + hStereoDft->mixer_mat_smooth_fx[i][j][b + k * IVAS_MAX_NUM_BANDS] = L_shl_sat(hMdDec->mixer_mat_fx[i][j][b], 1); move32(); } FOR ( ; b < IVAS_MAX_NUM_BANDS; b++ ) @@ -1191,9 +1193,10 @@ void ivas_sba_dirac_stereo_smooth_parameters_fx( { Word16 beta = hStereoDft->smooth_fac_fx[k][b]; move16(); + // The Q format of mixer_mat_prev_fx is Q30 so applying the left shift. hStereoDft->mixer_mat_smooth_fx[i][j][b + k * IVAS_MAX_NUM_BANDS] = - Madd_32_16(Mpy_32_16_1(hStereoDft->mixer_mat_smooth_fx[i][j][b + k * IVAS_MAX_NUM_BANDS], beta), - hMdDec->mixer_mat_prev_fx[i_hist][i][j][b], sub((Word16)0x7FFF, beta)); + L_add(Mpy_32_16_1(hStereoDft->mixer_mat_smooth_fx[i][j][b + k * IVAS_MAX_NUM_BANDS], beta), + L_shl(Mpy_32_16_1(hMdDec->mixer_mat_prev_fx[i_hist][i][j][b], sub((Word16)0x7FFF, beta)), Q1)); move32(); } } diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 5a872443a85678fd20b476025679adf78f497520..5b479f344deb81c9b2b5aee4de8a16eaa2b89ecb 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -234,7 +234,7 @@ void ivas_mc2sba_fx( /* Add LFE to omni W with gain*/ FOR( k = 0; k < output_frame; k++ ) { - buffer_tmp_fx[0][k] = L_add( buffer_tmp_fx[0][k], L_shr( Mult_32_16( in_buffer_td_fx[i][k], gain_lfe_fx ), 2 ) ); /*Q+14-15-2==Q-3*/ + buffer_tmp_fx[0][k] = L_add( buffer_tmp_fx[0][k], L_shl( Mult_32_16( in_buffer_td_fx[i][k], gain_lfe_fx ), 1 ) ); /*Q+14-15+1==Q*/ } } @@ -259,7 +259,7 @@ void ivas_mc2sba_fx( { FOR( k = 0; k < output_frame; k++ ) { - buffer_tmp_fx[j][k] = L_add( buffer_tmp_fx[j][k], L_shr( Mult_32_32( in_buffer_td_fx[i][k], gains_fx[j] ), 1 ) ); /*Q+29-31-1==Q-3*/ + buffer_tmp_fx[j][k] = L_add( buffer_tmp_fx[j][k], L_shl( Mult_32_32( in_buffer_td_fx[i][k], gains_fx[j] ), 2 ) ); /*Q+29-31+2==Q*/ } } } @@ -652,8 +652,8 @@ void ivas_ism2sba_sf_fx( } return; } -#endif // IVAS_FLOAT_FIXED - +#else // IVAS_FLOAT_FIXED + void ivas_ism2sba_sf( float *buffer_in[], /* i : TC buffer */ float *buffer_out[], /* o : TD signal buffers */ @@ -686,13 +686,8 @@ void ivas_ism2sba_sf( g2 = hIsmRendererData->interpolator + offset; tc = buffer_in[i] + offset; out = buffer_tmp[j]; -#ifdef IVAS_FLOAT_FIXED - gain = fix_to_float(hIsmRendererData->gains_fx[i][j], Q30); - prev_gain = fix_to_float(hIsmRendererData->prev_gains_fx[i][j], Q30); -#else gain = hIsmRendererData->gains[i][j]; prev_gain = hIsmRendererData->prev_gains[i][j]; -#endif for ( k = 0; k < n_samples_to_render; k++ ) { g1 = 1.0f - *g2; @@ -708,7 +703,7 @@ void ivas_ism2sba_sf( return; } - +#endif /*-------------------------------------------------------------------* * ivas_sba_linear_renderer() @@ -903,6 +898,8 @@ void ivas_sba_mix_matrix_determiner_fx( } #endif // IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED + void ivas_sba_mix_matrix_determiner( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ float *output[], /* i/o: transport/output audio channels */ @@ -989,102 +986,13 @@ void ivas_sba_mix_matrix_determiner( num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; #ifdef IVAS_FLOAT_FIXED #if 1 /*Float to fixed changes */ - Word16 j, b, i_ts, num_out_ch; + Word16 num_out_ch; num_out_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - Word16 Q_C_re_fx = 31, Q_P_re_fx = 31; hSpar->hMdDec->Q_mixer_mat = 31; Word16 num_in_ch; num_in_ch = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < num_in_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, Q_factor_L( hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] ) ); - } - } - } - } - FOR ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR ( i = 0; i < num_out_ch; i++ ) - { - FOR ( j = 0; j < nchan_transport; j++ ) - { - FOR ( b = 0; b < num_bands_out; b++ ) - { - Q_C_re_fx = s_min( Q_C_re_fx, Q_factor_L( hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] ) ); - } - } - } - } - FOR ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR ( i = 0; i < num_out_ch; i++ ) - { - FOR ( j = nchan_transport; j < num_out_ch; j++ ) - { - FOR ( b = 0; b < num_bands_out; b++ ) - { - Q_P_re_fx = s_min( Q_P_re_fx, Q_factor_L( hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] ) ); - } - } - } - } - hSpar->hMdDec->Q_mixer_mat = s_min(hSpar->hMdDec->Q_mixer_mat, s_min( Q_C_re_fx, Q_P_re_fx ) ); - FOR ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < num_in_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed( hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat ); - } - } - } - FOR ( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < nchan_transport; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed( hSpar->hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat ); - } - } - } - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = nchan_transport; j < num_out_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = floatToFixed( hSpar->hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat ); - } - } - } - } #endif ivas_spar_dec_gen_umx_mat_fx( hSpar->hMdDec, nchan_transport, num_bands_out, bfi, num_md_sub_frames); -#if 1 /*Fixed to float changes */ - FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR( i = 0; i < num_out_ch; i++ ) - { - FOR( j = 0; j < num_in_ch; j++ ) - { - FOR( b = 0; b < num_bands_out; b++ ) - { - hSpar->hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = fixedToFloat( hSpar->hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], hSpar->hMdDec->Q_mixer_mat ); - } - } - } - } -#endif #else ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi, num_md_sub_frames ); #endif // IVAS_FLOAT_FIXED @@ -1092,4 +1000,60 @@ void ivas_sba_mix_matrix_determiner( return; } +#else +void ivas_sba_mix_matrix_determiner( + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + float *output[], /* i/o: transport/output audio channels */ + const int16_t bfi, /* i : BFI flag */ + const int16_t nchan_remapped, /* i : num channels after remapping of TCs */ + const int16_t output_frame, /* i : output frame length */ + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix*/ +) +{ + int16_t i, ch; + float temp; + int16_t num_bands_out, nchan_transport, nchan_out; + + /* Convert numeric range */ + for (ch = 0; ch < nchan_remapped; ch++) + { + for (i = 0; i < output_frame; i++) + { + temp = output[ch][i]; + temp = floorf(temp + 0.5f); + + if (temp > MAX16B_FLT) + { + temp = MAX16B_FLT; + } + else if (temp < (-1.0f * PCM16_TO_FLT_FAC)) + { + temp = (-1.0f * PCM16_TO_FLT_FAC); + } + temp *= (1.0f / PCM16_TO_FLT_FAC); + output[ch][i] = temp; + } + } + + /* AGC */ + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + nchan_out = nchan_transport; + ivas_agc_dec_process(hSpar->hAgcDec, output, output, nchan_transport, output_frame); + + /* Convert numeric range back */ + for (ch = 0; ch < nchan_out; ch++) + { + for (i = 0; i < output_frame; i++) + { + output[ch][i] = output[ch][i] * PCM16_TO_FLT_FAC; + } + } + + /* Mixing matrix determiner */ + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + ivas_spar_dec_gen_umx_mat(hSpar->hMdDec, nchan_transport, num_bands_out, bfi, num_md_sub_frames); + + return; +} +#endif diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index d49c292a8d98d4c18ba519d8a883179ace7e31f5..781a2504a8cdbe9f645c71f0be4c368ffd95ea7b 100644 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -346,7 +346,7 @@ ivas_error create_sce_dec( { st->is_ism_format = 1; } -#ifdef EVS_FLOAT +#ifndef IVAS_FLOAT_FIXED IF ( ( error = init_decoder( st, 0, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) #else if ( ( error = init_decoder_fx(st, EVS_MONO) ) != IVAS_ERR_OK ) @@ -375,7 +375,7 @@ ivas_error create_sce_dec( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); } - td_cng_dec_init_flt( st ); + td_cng_dec_init( st ); } /*-----------------------------------------------------------------* diff --git a/lib_dec/ivas_sce_dec_fx.c b/lib_dec/ivas_sce_dec_fx.c index f6a805aaf338a71d973895aeffa88ecb49d01bd3..8d3ff85181c55aecd9b6ec64af5c7767037d8ff7 100644 --- a/lib_dec/ivas_sce_dec_fx.c +++ b/lib_dec/ivas_sce_dec_fx.c @@ -45,9 +45,6 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" -/* 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 - /*--------------------------------------------------------------------------* * ivas_sce_dec() * @@ -239,68 +236,31 @@ ivas_error ivas_sce_dec_fx( /*----------------------------------------------------------------* * Decoder *----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - float *output_flt[1]; - float outputHB_flt[1][960]; - output_flt[0] = malloc( sizeof( Word32 ) * L_FRAME48k ); - set_f( output_flt[0], 0, L_FRAME48k ); - FOR( int k = 0; k < L_FRAME48k; k++ ) - { - output_flt[0][k] = (float) output[0][k] / ONE_IN_Q11; - } #ifndef TO_BE_REMOVED_CONVERSION - //Word16 k; - - //{ - // sts = hCPE->hCoreCoder; - //} - - //core_coding_part will go in this loop, once the things are done - /* for (k = 0; k < n_channels; k++) - {*/ if (st->hTcxDec != NULL) { floatToFixed_arr(st->hHQ_core->old_out, st->hHQ_core->old_out_fx, 0, L_FRAME48k); floatToFixed_arr(st->hHQ_core->old_outLB, st->hHQ_core->old_out_LB_fx, 0, L_FRAME32k); floatToFixed_arrL(st->hHQ_core->old_outLB, st->hHQ_core->old_outLB_fx, 11, L_FRAME32k); - //sts[k]->hTcxDec->conceal_eof_gain32 = floatToFixed( sts[k]->hTcxDec->conceal_eof_gain_float, 15 ); } - /*}*/ IF(st->hFdCngDec != NULL && (st->element_mode == IVAS_CPE_MDCT && st->total_brate == SID_2k40)) { - //FOR(Word16 ch = 0; ch < CPE_CHANNELS; ++ch) - { f2me_buf(st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt, st->hFdCngDec->hFdCngCom->cngNoiseLevel, &st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, st->hFdCngDec->hFdCngCom->stopBand - st->hFdCngDec->hFdCngCom->startBand); - floatToFixed_arr(st->hFdCngDec->hFdCngCom->A_cng_flt, st->hFdCngDec->hFdCngCom->A_cng, Q14, M + 1); - } } - #endif set32_fx(output[0], 0, L_FRAME48k); -#endif // !IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( ( error = ivas_core_dec( st_ivas, hSCE, NULL, NULL, 1, output, outputHB_flt, NULL, st_ivas->sba_dirac_stereo_flag ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_core_dec( st_ivas, hSCE, NULL, NULL, 1, output, outputHB, NULL, st_ivas->sba_dirac_stereo_flag ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - FOR( int k = 0; k < L_FRAME48k; k++ ) - { - //output[0][k] = (Word32) ( output_flt[0][k] * ONE_IN_Q11 ); - outputHB[0][k] = (Word32) ( outputHB_flt[0][k] * ONE_IN_Q11 ); - } - free( output_flt[0] ); -#endif // !IVAS_FLOAT_FIXED_TO_BE_REMOVED IF( st_ivas->sba_dirac_stereo_flag && ( GT_32( st->core_brate, SID_2k40 ) || EQ_16( st->cng_type, LP_CNG ) ) ) { /* skip addition of ACELP BWE for now, will be done after upmix */ -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - mvr2r( outputHB_flt[0], hSCE->save_hb_synth, output_frame ); -#else Copy32( outputHB[0], hSCE->save_hb_synth_fx, output_frame ); -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED + hSCE->q_save_hb_synth_fx = Q11; } ELSE IF( !st_ivas->sba_dirac_stereo_flag ) { @@ -377,9 +337,6 @@ ivas_error create_sce_dec( hSCE->sce_id = sce_id; hSCE->element_brate = element_brate; -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - //set_f( hSCE->prev_hb_synth, 0.0f, NS2SA( st_ivas->hDecoderConfig->output_Fs, L_sub( IVAS_DEC_DELAY_NS, DELAY_BWE_TOTAL_NS ) ) ); -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED set32_fx( hSCE->prev_hb_synth_fx, 0, NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, L_sub( IVAS_DEC_DELAY_NS, DELAY_BWE_TOTAL_NS ) ) ); /*-----------------------------------------------------------------* @@ -402,13 +359,28 @@ ivas_error create_sce_dec( { st->is_ism_format = 1; } -#ifdef EVS_FLOAT - IF( ( error = init_decoder_ivas_fx( st, 0, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) -#else - IF( ( error = init_decoder_fx( st, EVS_MONO ) ) != IVAS_ERR_OK ) -#endif + + //if (st_ivas->mode == IVAS_DEC_MODE_EVS) + if (st->element_mode == EVS_MONO) { - return error; + error = init_decoder_fx(st, EVS_MONO); + if (error) + { + { + return error; + } + } + } + else + { + error = init_decoder_ivas_fx(st, 0, st_ivas->mc_mode); + if (error) + { + { + return error; + } + } + } IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_FORMAT ) && ( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) || ( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && EQ_16( st_ivas->nchan_transport, 1 ) ) ) ) @@ -431,76 +403,34 @@ ivas_error create_sce_dec( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); } -#ifdef IVAS_FLOAT_FIXED td_cng_dec_init_ivas_fx( st ); -#else - td_cng_dec_init_flt( st ); -#endif // IVAS_FLOAT_FIXED } /*-----------------------------------------------------------------* * Synthesis buffers: allocate and initialize *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED IF( st_ivas->sba_dirac_stereo_flag ) { - - IF( ( hSCE->save_synth = (float *) malloc( sizeof( float ) * output_frame ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for stereo output\n" ) ); - } - set_zero( hSCE->save_synth, output_frame ); - - IF( ( hSCE->save_hb_synth = (float *) malloc( sizeof( float ) * output_frame ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate HB memory for stereo output\n" ) ); - } - set_zero( hSCE->save_hb_synth, output_frame ); -#ifdef IVAS_FLOAT_FIXED IF( ( hSCE->save_synth_fx = (Word32 *) malloc( sizeof( *(hSCE->save_synth_fx) ) * output_frame ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for stereo output\n" ) ); } set_zero_fx( hSCE->save_synth_fx, output_frame ); + hSCE->q_save_synth_fx = 0; IF( ( hSCE->save_hb_synth_fx = (Word32 *) malloc( sizeof( *(hSCE->save_hb_synth_fx) ) * output_frame ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate HB memory for stereo output\n" ) ); } set_zero_fx( hSCE->save_hb_synth_fx, output_frame ); -#endif - } - ELSE - { - hSCE->save_synth = NULL; - hSCE->save_hb_synth = NULL; -#ifdef IVAS_FLOAT_FIXED - hSCE->save_synth_fx = NULL; - hSCE->save_hb_synth_fx = NULL; -#endif - } -#else - IF( st_ivas->sba_dirac_stereo_flag ) - { - IF( ( hSCE->save_synth_fx = (Word32 *) malloc( sizeof( Word32 ) * output_frame ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for stereo output\n" ) ); - } - set32_fx( hSCE->save_synth_fx, 0, output_frame ); - - IF( ( hSCE->save_hb_synth_fx = (Word32 *) malloc( sizeof( Word32 ) * output_frame ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate HB memory for stereo output\n" ) ); - } - set32_fx( hSCE->save_hb_synth_fx, 0, output_frame ); + hSCE->q_save_hb_synth_fx = 0; } ELSE { hSCE->save_synth_fx = NULL; hSCE->save_hb_synth_fx = NULL; } -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED hSCE->hCoreCoder[0] = st; st_ivas->hSCE[sce_id] = hSCE; @@ -531,18 +461,6 @@ void destroy_sce_dec( st = NULL; } -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( hSCE->save_synth != NULL ) - { - free( hSCE->save_synth ); - hSCE->save_synth = NULL; - } - IF( hSCE->save_hb_synth != NULL ) - { - free( hSCE->save_hb_synth ); - hSCE->save_hb_synth = NULL; - } -#else IF( hSCE->save_synth_fx != NULL ) { free( hSCE->save_synth_fx ); @@ -553,7 +471,6 @@ void destroy_sce_dec( free( hSCE->save_hb_synth_fx ); hSCE->save_hb_synth_fx = NULL; } -#endif // IVAS_FLOAT_FIXED_TO_BE_REMOVED free( hSCE ); diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 94dd189973d0e66ff774e2791874f41307bfe4ba..ef3222b475d74dacc6c16530f9c7629abe177bde 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -61,10 +61,12 @@ #ifdef IVAS_FLOAT_FIXED static ivas_error ivas_spar_dec_MD_fx( Decoder_Struct *st_ivas, Decoder_State *st0 ); -#endif +#else static ivas_error ivas_spar_dec_MD( Decoder_Struct *st_ivas, Decoder_State *st0 ); +#endif +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * ivas_spar_dec_open() * @@ -111,6 +113,212 @@ ivas_error ivas_spar_dec_open( num_decor_chs = 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 ) ) ) + { + hSpar->hTdDecorr = NULL; + } + else + { + if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, 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 ) + { + return error; + } + hSpar->hMdDec->td_decorr_flag = 1; + if ( hSpar->hTdDecorr ) + { + hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; + } + + /* 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 ) + { + return error; + } + fb_cfg->pcm_offset = NS2SA( output_Fs, DELAY_FB_1_NS + IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ); + fb_cfg->remix_order = remix_order_set[hSpar->hMdDec->spar_md_cfg.remix_unmix_order]; + + /* FB mixer handle */ + if ( ( error = ivas_FB_mixer_open( &hSpar->hFbMixer, output_Fs, fb_cfg, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* AGC handle */ + if ( ( error = ivas_spar_agc_dec_open( &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 ) + { + 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 ); + } + + /* mixer_mat intitialization */ + for ( i = 0; i < num_channels_internal; i++ ) + { + for ( j = 0; j < num_channels_internal; j++ ) + { + for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) + { + hSpar->hMdDec->mixer_mat[i][j][b] = 0.0f; + for ( int16_t i_ts = 0; i_ts < ( MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); i_ts++ ) + { + hSpar->hMdDec->mixer_mat_prev[i_ts][i][j][b] = 0.0f; + } + } + } + } + hSpar->i_subframe = 0; + hSpar->AGC_flag = 0; + + /*-----------------------------------------------------------------* + * Configuration - set SPAR high-level parameters + *-----------------------------------------------------------------*/ + + 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 ) + { + case 1: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_FOA; + break; + case 2: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_HOA2; + break; + case 3: + st_ivas->transport_config = IVAS_AUDIO_CONFIG_HOA3; + 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 ); + hSpar->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hSpar->subframes_rendered = 0; + hSpar->slots_rendered = 0; + hSpar->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + + /* 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++ ) + { + hSpar->render_to_md_map[map_idx] = map_idx; + } + + /* allocate transport channels*/ + if ( st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate; + int16_t nchan_tc; + TC_BUFFER_MODE buffer_mode; + int16_t granularity; + + buffer_mode = TC_BUFFER_MODE_RENDERER; + nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + nchan_to_allocate = num_channels_internal; + + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + nchan_to_allocate += st_ivas->nchan_ism; + } + + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + if ( ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || 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 ) ) + { + nchan_tc = st_ivas->hDecoderConfig->nchan_out + st_ivas->nchan_ism; + nchan_to_allocate = nchan_tc; + } + else + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + nchan_tc = st_ivas->hDecoderConfig->nchan_out; + nchan_to_allocate = nchan_tc; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + + 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 ) + { + /* 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 ) ); + } + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->hSpar = hSpar; + + return error; +} + +#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 */ +) +{ + SPAR_DEC_HANDLE hSpar; + ivas_error error; + int16_t 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; + + error = IVAS_ERR_OK; + + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + + num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); + + hSpar = st_ivas->hSpar; + + if ( !spar_reconfig_flag ) + { + /* SPAR decoder handle */ + 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 ) ) + { + num_decor_chs = IVAS_HBR_MAX_DECOR_CHS; + } + else + { + num_decor_chs = 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 ) ) ) { @@ -173,7 +381,7 @@ ivas_error ivas_spar_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PCA decoder" ); } - ivas_pca_dec_init( hSpar->hPCA ); + //ivas_pca_dec_init( hSpar->hPCA ); #ifdef IVAS_FLOAT_FIXED ivas_pca_dec_init_fx(hSpar->hPCA); #endif @@ -187,10 +395,10 @@ ivas_error ivas_spar_dec_open( { for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) { - hSpar->hMdDec->mixer_mat[i][j][b] = 0.0f; + hSpar->hMdDec->mixer_mat_fx[i][j][b] = 0; for ( int16_t i_ts = 0; i_ts < ( MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); i_ts++ ) { - hSpar->hMdDec->mixer_mat_prev[i_ts][i][j][b] = 0.0f; + hSpar->hMdDec->mixer_mat_prev_fx[i_ts][i][j][b] = 0; } } } @@ -291,7 +499,7 @@ ivas_error ivas_spar_dec_open( return error; } - +#endif /*------------------------------------------------------------------------- * ivas_spar_dec_close() @@ -381,6 +589,12 @@ ivas_error ivas_spar_dec_fx( { FOR( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) { + Word32 tmp = 0; + tmp = (Word32) ( q_direction->band_data[j].elevation[k] * ( 1 << 22 ) ); + if ( GT_32( L_abs( L_sub( tmp, q_direction->band_data[j].elevation_fx[k] ) ), 1 << Q5 ) ) + { + assert( 0 ); + } q_direction->band_data[j].elevation_fx[k] = (Word32) ( q_direction->band_data[j].elevation[k] * ( 1 << 22 ) ); q_direction->band_data[j].azimuth_fx[k] = (Word32) ( q_direction->band_data[j].azimuth[k] * ( 1 << 22 ) ); q_direction->band_data[j].energy_ratio_fx[k] = (Word32) ( q_direction->band_data[j].energy_ratio[k] * ( 1 << 30 ) ); @@ -428,7 +642,7 @@ ivas_error ivas_spar_dec_fx( /* read DirAC bitstream */ IF( st_ivas->hQMetaData != NULL ) { - ivas_dirac_dec_read_BS( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hSpatParamRendCom, st_ivas->hQMetaData, nb_bits_read, last_bit_pos, ivas_get_hodirac_flag_fx( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->hSpar->dirac_to_spar_md_bands ); + ivas_dirac_dec_read_BS_fx( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hSpatParamRendCom, st_ivas->hQMetaData, nb_bits_read, last_bit_pos, ivas_get_hodirac_flag_fx( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->hSpar->dirac_to_spar_md_bands ); } IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) @@ -536,7 +750,7 @@ ivas_error ivas_spar_dec_fx( return error; } -#endif +#else ivas_error ivas_spar_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ int16_t *nb_bits_read /* o : number of MD bits read */ @@ -569,46 +783,8 @@ ivas_error ivas_spar_dec( /* read DirAC bitstream */ if ( st_ivas->hQMetaData != NULL ) - { -#ifdef IVAS_FLOAT_FIXED - // To do remove this code once ivas_spar_dec_MD is done - for ( int d = 0; d < st_ivas->hQMetaData->no_directions; d++ ) - { - IVAS_QDIRECTION *q_direction; - q_direction = &st_ivas->hQMetaData->q_direction[d]; - int nbands = q_direction->cfg.nbands; - FOR( Word16 j = 0; j < nbands; j++ ) - { - FOR( Word16 k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) - { - q_direction->band_data[j].elevation_fx[k] = (Word32) ( q_direction->band_data[j].elevation[k] * ( 1 << 22 ) ); - q_direction->band_data[j].azimuth_fx[k] = (Word32) ( q_direction->band_data[j].azimuth[k] * ( 1 << 22 ) ); - q_direction->band_data[j].energy_ratio_fx[k] = (Word32) ( q_direction->band_data[j].energy_ratio[k] * ( 1 << 30 ) ); - } - } - } -#endif + { ivas_dirac_dec_read_BS( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hSpatParamRendCom, st_ivas->hQMetaData, nb_bits_read, last_bit_pos, ivas_get_hodirac_flag( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->hSpar->dirac_to_spar_md_bands ); - -#ifdef IVAS_FLOAT_FIXED - // To do remove this code once ivas_spar_dec_MD is done - for ( int d = 0; d < st_ivas->hQMetaData->no_directions; d++ ) - { - IVAS_QDIRECTION *q_direction; - q_direction = &st_ivas->hQMetaData->q_direction[d]; - int nbands = q_direction->cfg.nbands; - FOR( Word16 j = 0; j < nbands; j++ ) - { - FOR( Word16 k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) - { - - q_direction->band_data[j].elevation[k] = ( (float) q_direction->band_data[j].elevation_fx[k] / ( 1 << 22 ) ); - q_direction->band_data[j].azimuth[k] = ( (float) q_direction->band_data[j].azimuth_fx[k] / ( 1 << 22 ) ); - q_direction->band_data[j].energy_ratio[k] = ( (float) q_direction->band_data[j].energy_ratio_fx[k] / ( 1 << 30 ) ); - } - } - } -#endif } if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) @@ -667,6 +843,7 @@ ivas_error ivas_spar_dec( return error; } +#endif /*---------------------------------------------------------------------* @@ -787,6 +964,7 @@ static Word16 get_random_number_fx( Word16 *seed ) { Word16 x = own_random2_fx( *seed ); + *seed = x; return x; } #endif // IVAS_FLOAT_FIXED @@ -1018,7 +1196,7 @@ void ivas_spar_get_cldfb_gains_fx( /* compute time-domain cross-fade for considered time slots*/ tmp_idx = sub( cf_start, imult1616( cf_cldfb_start, stride ) ); Word32 pFilterbank_cross_fade_fx[192];// Temporarily added to stored fixed value of hSpar->hFbMixer->pFilterbank_cross_fade_fx - floatToFixed_arrL( (Float32 *) hSpar->hFbMixer->pFilterbank_cross_fade, pFilterbank_cross_fade_fx, 31, cf_len ); + 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++] = pFilterbank_cross_fade_fx[sample]; @@ -1068,7 +1246,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] = Mult_32_32( tgt_fx[sample], L_add( T_fx[sample][0], L_add( T_fx[sample][1], T_fx[sample][2] ) ) ); + 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*/ } /* compute matrices */ FOR ( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) @@ -1078,7 +1256,7 @@ void ivas_spar_get_cldfb_gains_fx( Tt_T_fx[slot_row][slot_col] = 0; 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(T_fx[sample][slot_row],T_fx[sample][slot_col] ) ); + 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*/ } } } @@ -1094,7 +1272,7 @@ void ivas_spar_get_cldfb_gains_fx( Tt_tgt_fx[slot_row] = L_add(Tt_tgt_fx[slot_row],Mult_32_32(T_fx[sample][slot_row] , tgt_fx[sample])); } } - Word16 output_q = 0; + Word16 output_q = 27; 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++ ) @@ -1104,8 +1282,9 @@ void ivas_spar_get_cldfb_gains_fx( { 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)] = s_max( s_min( (Word16)tmp, (1<< (output_q-20)) ), 0 ); + 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*/ } + hSpar->hFbMixer->cldfb_cross_fade_q = Q_weights; cldfb_reset_memory_fx( cldfbSynDec0 ); cldfb_reset_memory_fx( cldfbAnaDec0 ); @@ -1370,10 +1549,6 @@ static ivas_error ivas_spar_dec_MD_fx( * Initialization *---------------------------------------------------------------------*/ -#ifndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - Word16 i, j, k; -#endif - sba_order = s_min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); bfi = st_ivas->bfi; move16(); @@ -1412,7 +1587,6 @@ static ivas_error ivas_spar_dec_MD_fx( move16(); } -// From here TBD IF( ( error = ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK ) { return error; @@ -1424,28 +1598,7 @@ static ivas_error ivas_spar_dec_MD_fx( * Decode MD *---------------------------------------------------------------------*/ - ivas_spar_md_dec_process( st_ivas, st0, num_bands_out, sba_order ); - -// Till here TBD -#ifndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - // float to fix - Word16 num_channels_tmp = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR( i = 0; i < num_channels_tmp; i++ ) - { - FOR( j = 0; j < num_channels_tmp; j++ ) - { - FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->spar_coeffs_prev.C_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs_prev.C_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_prev.P_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs_prev.P_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_tar.C_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs_tar.C_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_tar.P_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs_tar.P_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs.C_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs.P_re[i][j][k], Q22 ); - } - } - } -#endif + ivas_spar_md_dec_process_fx( st_ivas, st0, num_bands_out, sba_order ); /*---------------------------------------------------------------------* * read PCA bits @@ -1487,78 +1640,21 @@ static ivas_error ivas_spar_dec_MD_fx( { ivas_spar_update_md_hist_fx( hSpar->hMdDec ); } - -#ifndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - // fix to float - FOR( i = 0; i < num_channels_tmp; i++ ) - { - FOR( j = 0; j < num_channels_tmp; j++ ) - { - FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->spar_coeffs_prev.C_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs_prev.C_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_prev.P_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs_prev.P_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_tar.C_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs_tar.C_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_tar.P_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs_tar.P_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs.C_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs.P_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][k], Q22 ); - } - } - } -#endif } ELSE { -#ifndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - // float to fix - Word16 num_channels_tmp = hSpar->hMdDec->spar_md_cfg.num_umx_chs; - FOR( i = 0; i < num_channels_tmp; i++ ) - { - FOR( j = 0; j < num_channels_tmp; j++ ) - { - FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->spar_coeffs_prev.C_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs_prev.C_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_prev.P_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs_prev.P_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_tar.C_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs_tar.C_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_tar.P_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs_tar.P_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs.C_re[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][k] = floatToFixed( hSpar->hMdDec->spar_coeffs.P_re[i][j][k], Q22 ); - } - } - } -#endif - IF( !bfi ) { 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 ); -#ifndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - FOR( i = 0; i < num_channels_tmp; i++ ) - { - FOR( j = 0; j < num_channels_tmp; j++ ) - { - FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->spar_coeffs_prev.C_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs_prev.C_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_prev.P_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs_prev.P_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_tar.C_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs_tar.C_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs_tar.P_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs_tar.P_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs.C_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs.C_re_fx[i][j][k], Q22 ); - hSpar->hMdDec->spar_coeffs.P_re[i][j][k] = fixedToFloat( hSpar->hMdDec->spar_coeffs.P_re_fx[i][j][k], Q22 ); - } - } - } -#endif } - pop_wmops(); return IVAS_ERR_OK; } -#endif +#else static ivas_error ivas_spar_dec_MD( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ Decoder_State *st0 /* i/o: decoder state structure - for bitstream handling*/ @@ -1627,12 +1723,7 @@ static ivas_error ivas_spar_dec_MD( if ( hSpar->hPCA != NULL ) { -#ifdef IVAS_FLOAT_FIXED - ivas_pca_read_bits_fx(st0, hSpar->hPCA); -#else - ivas_pca_read_bits(st0, hSpar->hPCA); -#endif - + ivas_pca_read_bits( st0, hSpar->hPCA ); } /*---------------------------------------------------------------------* @@ -1646,12 +1737,7 @@ static ivas_error ivas_spar_dec_MD( hSpar->AGC_flag = get_next_indice( st0, 1 ); } -#ifndef IVAS_FLOAT_FIXED ivas_agc_read_bits( hSpar->hAgcDec, st0, hSpar->hMdDec->spar_md_cfg.nchan_transport, hSpar->AGC_flag ); -#else - ivas_agc_read_bits_fx( hSpar->hAgcDec, st0, hSpar->hMdDec->spar_md_cfg.nchan_transport, hSpar->AGC_flag ); -#endif // IVAS_FLOAT_FIXED - } /*---------------------------------------------------------------------* @@ -1680,6 +1766,7 @@ static ivas_error ivas_spar_dec_MD( pop_wmops(); return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -1687,6 +1774,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 */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ @@ -1774,6 +1862,7 @@ static Word16 ivas_spar_get_cldfb_slot_gain_fx( return weight_fx; } +#else static float ivas_spar_get_cldfb_slot_gain( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ @@ -1782,48 +1871,48 @@ static float ivas_spar_get_cldfb_slot_gain( int16_t *time_slot_idx1, float *weight_lowfreq) { - float weight; - float output_Fs, encfb_delay, decfb_delay; - float xfade_start_ns; - int16_t xfade_delay_subframes; - int16_t i_hist; - int16_t split_band; + float weight; + float output_Fs, encfb_delay, decfb_delay; + float xfade_start_ns; + int16_t xfade_delay_subframes; + int16_t i_hist; + int16_t split_band; - *weight_lowfreq = hSpar->hFbMixer->cldfb_cross_fade[time_slot_idx]; + *weight_lowfreq = hSpar->hFbMixer->cldfb_cross_fade[time_slot_idx]; - output_Fs = (float)hDecoderConfig->output_Fs; - encfb_delay = IVAS_FB_ENC_DELAY_NS; - decfb_delay = IVAS_FB_DEC_DELAY_NS; - xfade_start_ns = hSpar->hFbMixer->cross_fade_start_offset / output_Fs * 1000000000.f - encfb_delay + decfb_delay * 0.5f; - xfade_delay_subframes = (int16_t)(xfade_start_ns / (FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES)); + output_Fs = (float) hDecoderConfig->output_Fs; + encfb_delay = IVAS_FB_ENC_DELAY_NS; + decfb_delay = IVAS_FB_DEC_DELAY_NS; + xfade_start_ns = hSpar->hFbMixer->cross_fade_start_offset / output_Fs * 1000000000.f - encfb_delay + decfb_delay * 0.5f; + xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); - i_hist = 4 - xfade_delay_subframes; - split_band = SPAR_DIRAC_SPLIT_START_BAND; + i_hist = 4 - xfade_delay_subframes; + split_band = SPAR_DIRAC_SPLIT_START_BAND; - if (split_band < IVAS_MAX_NUM_BANDS) - { - if (hSpar->i_subframe > 3) + if ( split_band < IVAS_MAX_NUM_BANDS ) { - weight = (float)(time_slot_idx % MAX_PARAM_SPATIAL_SUBFRAMES) / (float)MAX_PARAM_SPATIAL_SUBFRAMES; + if ( hSpar->i_subframe > 3 ) + { + weight = (float) ( time_slot_idx % MAX_PARAM_SPATIAL_SUBFRAMES ) / (float) MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + weight = 0.0f; + } + *time_slot_idx0 = i_hist; + *time_slot_idx1 = i_hist + 1; } else { - weight = 0.0f; + /* determine cross-fade gain for current frame Parameters*/ + *time_slot_idx0 = hSpar->hFbMixer->cldfb_cross_fade_start; + *time_slot_idx1 = hSpar->hFbMixer->cldfb_cross_fade_end; + weight = *weight_lowfreq; } - *time_slot_idx0 = i_hist; - *time_slot_idx1 = i_hist + 1; - } - else - { - /* determine cross-fade gain for current frame Parameters*/ - *time_slot_idx0 = hSpar->hFbMixer->cldfb_cross_fade_start; - *time_slot_idx1 = hSpar->hFbMixer->cldfb_cross_fade_end; - weight = *weight_lowfreq; - } - return weight; + return weight; } - +#endif /*-------------------------------------------------------------------* @@ -1831,7 +1920,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 */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ @@ -1843,11 +1932,69 @@ void ivas_spar_get_parameters_fx( ) { int16_t spar_band, out_ch, in_ch; - Word16 weight_fx, weight_20ms_fx; + Word16 weight_fx, weight_20ms_fx; + int16_t 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++ ) + { + 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*/ + ) + { + for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + if ( 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)); + } + else + { + par_mat_fx[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band]; + } + + } + } + else + { + 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 */ + 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)); + + } + } + } + } + + return; +} +#else + +void ivas_spar_get_parameters( + 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, + float par_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]) +{ + int16_t spar_band, out_ch, in_ch; + float weight, weight_20ms; int16_t 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); + weight = ivas_spar_get_cldfb_slot_gain( hSpar, hDecoderConfig, ts, &ts0, &ts1, &weight_20ms ); split_band = SPAR_DIRAC_SPLIT_START_BAND; for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) @@ -1863,15 +2010,13 @@ void ivas_spar_get_parameters_fx( { if ( 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)); + par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight ) * hSpar->hMdDec->mixer_mat_prev[ts0][out_ch][in_ch][spar_band] + + weight * hSpar->hMdDec->mixer_mat_prev[ts1][out_ch][in_ch][spar_band]; } else { - par_mat_fx[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band]; + par_mat[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; } - } } else @@ -1880,9 +2025,7 @@ void ivas_spar_get_parameters_fx( { /* 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 */ - 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)); - + par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight_20ms ) * hSpar->hMdDec->mixer_mat_prev[prev_idx][out_ch][in_ch][spar_band] + weight_20ms * hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; } } } @@ -1890,60 +2033,7 @@ void ivas_spar_get_parameters_fx( return; } - -void ivas_spar_get_parameters( - 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, - float par_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]) -{ - int16_t spar_band, out_ch, in_ch; - float weight, weight_20ms; - int16_t ts0, ts1, split_band; - - weight = ivas_spar_get_cldfb_slot_gain(hSpar, hDecoderConfig, ts, &ts0, &ts1, &weight_20ms); - - split_band = SPAR_DIRAC_SPLIT_START_BAND; - for (spar_band = 0; spar_band < num_spar_bands; spar_band++) - { - 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*/ - ) - { - for (in_ch = 0; in_ch < num_ch_in; in_ch++) - { - if (hSpar->i_subframe > 3) - { - par_mat[out_ch][in_ch][spar_band] = (1.0f - weight) * hSpar->hMdDec->mixer_mat_prev[ts0][out_ch][in_ch][spar_band] + - weight * hSpar->hMdDec->mixer_mat_prev[ts1][out_ch][in_ch][spar_band]; - } - else - { - par_mat[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; - } - } - } - else - { - 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 */ - par_mat[out_ch][in_ch][spar_band] = (1.0f - weight_20ms) * hSpar->hMdDec->mixer_mat_prev[prev_idx][out_ch][in_ch][spar_band] + weight_20ms * hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band]; - } - } - } - } - - return; -} - +#endif /*-------------------------------------------------------------------* * ivas_spar_get_skip_mat() @@ -1951,6 +2041,7 @@ void ivas_spar_get_parameters( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void ivas_spar_get_skip_mat( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ const int16_t num_ch_out, @@ -2012,7 +2103,7 @@ static void ivas_spar_get_skip_mat( return; } -#ifdef IVAS_FLOAT_FIXED +#else static void ivas_spar_get_skip_mat_fx( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ const Word16 num_ch_out, @@ -2290,6 +2381,7 @@ static void ivas_spar_calc_smooth_facs( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_spar_dec_agc_pca( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float *output[], /* i/o: input/output audio channels */ @@ -2333,42 +2425,7 @@ void ivas_spar_dec_agc_pca( * AGC *---------------------------------------------------------------------*/ -#ifndef IVAS_FLOAT_FIXED ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame ); -#ifdef DUMPS_ENABLED - dbgwrite_txt( &output[0][0], output_frame, "flt_ivas_agc_dec_process_output.txt", NULL ); -#endif // DUMPS_ENABLED -#else - Word32 *output_fx[20]; - FOR( Word16 i = 0; i < nchan_transport; i++ ) - { - output_fx[i] = malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ); - FOR( Word16 j = 0; j < output_frame; j++ ) - { - output_fx[i][j] = (Word32) ( output[i][j] * ONE_IN_Q14 ); - } - } - - ivas_agc_dec_process_fx( hSpar->hAgcDec, ( output_fx ), ( output_fx ), nchan_transport, output_frame ); - - FOR( Word16 i = 0; i < nchan_transport; i++ ) - { - FOR( Word16 j = 0; j < output_frame; j++ ) - { - output[i][j] = (float) output_fx[i][j] / ONE_IN_Q11; - } - } - -#ifdef DUMPS_ENABLED - dbgwrite_txt( &output[0][0], output_frame, "fix_ivas_agc_dec_process_output.txt", NULL ); -#endif // DUMPS_ENABLED - - FOR( Word16 i = 0; i < nchan_transport; i++ ) - { - free( output_fx[i] ); - } - -#endif // !IVAS_FLOAT_FIXED if ( hSpar->hPCA != NULL ) { @@ -2379,7 +2436,7 @@ void ivas_spar_dec_agc_pca( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_spar_dec_agc_pca_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ Word32 *output[], /* i/o: input/output audio channels */ @@ -2442,7 +2499,7 @@ void ivas_spar_dec_agc_pca_fx( * * *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_spar_dec_set_render_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nCldfbTs /* i : number of CLDFB time slots */ @@ -2472,7 +2529,7 @@ void ivas_spar_dec_set_render_map( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_spar_dec_set_render_map_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 nCldfbTs /* i : number of CLDFB time slots */ @@ -2504,6 +2561,7 @@ void ivas_spar_dec_set_render_map_fx( } #endif +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer() * @@ -2528,7 +2586,7 @@ void ivas_spar_dec_set_render_params( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_spar_dec_set_render_params_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const Word16 n_cldfb_slots /* i : number of cldfb slots in this frame */ @@ -2554,7 +2612,7 @@ void ivas_spar_dec_set_render_params_fx( * * *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_spar_dec_digest_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t nchan_transport, /* i : number of transport channels */ @@ -2600,40 +2658,7 @@ void ivas_spar_dec_digest_tc( if ( hSpar->hTdDecorr ) { -#ifndef IVAS_FLOAT_FIXED ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); -#else - { - Word32 *pPcm_tmp_fx[MAX_SPAR_INTERNAL_CHANNELS]; - Word32 *p_tc_fx[MAX_SPAR_INTERNAL_CHANNELS]; - Word32 pcm_tmp_fx[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k]; - Word32 tc_fx[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k]; - Word32 i, j; - Word16 q_format = Q14; - - FOR( i = 0; i < nchan_internal; i++ ) - { - pPcm_tmp_fx[i] = pcm_tmp_fx[i]; - p_tc_fx[i] = tc_fx[i]; - } - FOR( j = 0; j < nSamplesToDecorr; j++ ) - { - p_tc_fx[0][j] = (Word32) ( p_tc[0][j] * ( 1 << q_format ) ); - } - ivas_td_decorr_process_fx( hSpar->hTdDecorr, p_tc_fx, pPcm_tmp_fx, nSamplesToDecorr, &q_format ); - - FOR( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) - { - FOR( j = 0; j < nSamplesToDecorr; j++ ) - { - pPcm_tmp[i][j] = ( pPcm_tmp_fx[i][j] ) / (float) ( 1 << q_format ); - } -#ifdef DUMPS_ENABLED - dbgwrite_txt( decorr_signal[i], nSamplesToDecorr, "fixed.txt", NULL ); -#endif - } - } -#endif if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) @@ -2666,7 +2691,7 @@ void ivas_spar_dec_digest_tc( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_spar_dec_digest_tc_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const Word16 nchan_transport, /* i : number of transport channels */ @@ -2686,7 +2711,6 @@ void ivas_spar_dec_digest_tc_fx( Word32 *pPcm_tmp[MAX_SPAR_INTERNAL_CHANNELS]; Word32 *p_tc[MAX_SPAR_INTERNAL_CHANNELS]; Word32 Pcm_tmp[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k]; - Word32 i, j; Word16 q_format = Q14; ch_sba_idx = 0; move16(); @@ -2752,6 +2776,7 @@ void ivas_spar_dec_digest_tc_fx( } #endif +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer() * @@ -2812,41 +2837,8 @@ void ivas_spar_dec_upmixer( { if ( hSpar->hTdDecorr ) { -#ifndef IVAS_FLOAT_FIXED ivas_td_decorr_process( hSpar->hTdDecorr, output_f_local, pPcm_tmp, output_frame ); -#else - { - Word32 *output_f_local_fx[MAX_OUTPUT_CHANNELS]; - Word32 *pPcm_tmp_fx[MAX_OUTPUT_CHANNELS]; - Word32 arr_output_f_local_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - Word32 pcm_tmp_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - Word32 j; - Word16 q_format = Q14; - - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - pPcm_tmp_fx[i] = pcm_tmp_fx[i]; - output_f_local_fx[i] = arr_output_f_local_fx[i]; - } - - FOR( j = 0; j < output_frame; j++ ) - { - output_f_local_fx[0][j] = (Word32) ( output_f_local[0][j] * ( 1 << q_format ) ); - } - ivas_td_decorr_process_fx( hSpar->hTdDecorr, output_f_local_fx, pPcm_tmp_fx, output_frame, &q_format ); - FOR( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) - { - FOR( j = 0; j < output_frame; j++ ) - { - pPcm_tmp[i][j] = ( pPcm_tmp_fx[i][j] ) / (float) ( 1 << q_format ); - } -#ifdef DUMPS_ENABLED - dbgwrite_txt( decorr_signal[i], nSamplesToDecorr, "fixed.txt", NULL ); -#endif - } - } -#endif if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( i = 0; i < nchan_internal - nchan_transport; i++ ) @@ -2873,116 +2865,12 @@ void ivas_spar_dec_upmixer( if ( st_ivas->hDirAC != 0 ) { -#ifdef IVAS_FLOAT_FIXED - ivas_dirac_dec_set_md_map_fx( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); -#else ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); -#endif } for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { -#ifdef IVAS_FLOAT_FIXED1 -#if 1 /*Float to fixed conversion*/ - Word16 numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; - Word16 numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; - Word16 num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; - DECODER_CONFIG_HANDLE hDecoderConfig; - hDecoderConfig = st_ivas->hDecoderConfig; - Word16 numch_out_dirac = hDecoderConfig->nchan_out; - - Word16 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 ); - - for ( int i = 0; i < s_max( st_ivas->nchan_ism, 0 ) + nchan_internal; i++ ) - { - floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); - } - Word16 q1 = 30, q2 = 30; - for ( int l = 0; l < numch_out; l++ ) - { - for ( int j = 0; j < numch_in; j++ ) - { - for ( int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++ ) - { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat[l][j][k] , q1 ); - } - } - } - for ( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - for ( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - for ( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - for ( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = floatToFixed(hSpar->hMdDec->mixer_mat_prev[m][j][k][l] , q2 ); - } - } - } - } - for ( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); - } - } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) - { - for ( Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - floatToFixed_arrL( hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - floatToFixed_arr( hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS ); - } -#endif // - ivas_spar_dec_upmixer_sf_fx( st_ivas, output_f_local, nchan_internal ); -#ifdef IVAS_FLOAT_FIXED /*Fixed to float */ - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) - { - FOR( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) - { - st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ - } - } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } - } - // fix2float (to be cleaned) - 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 ) ) ) ) - { - fixedToFloat_arr( hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS ); - FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - fixedToFloat_arrL( hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - } - // fix2float end - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) - { - IF( st_ivas->cldfbSynDec[out_ch] ) - { - FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) - { - st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); /*Rounding off*/ - } - } - } -#endif -#else ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); -#endif // IVAS_FLOAT_FIXED for ( n = 0; n < nchan_out; n++ ) { @@ -3013,13 +2901,7 @@ void ivas_spar_dec_upmixer( return; } - - -/*-------------------------------------------------------------------* - * ivas_spar_dec_upmixer_sf() - * - * IVAS SPAR upmixer - *-------------------------------------------------------------------*/ +#endif #ifdef IVAS_FLOAT_FIXED void ivas_spar_dec_upmixer_sf_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -3032,7 +2914,6 @@ void ivas_spar_dec_upmixer_sf_fx( float *cldfb_in_ts_re[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; float *cldfb_in_ts_im[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; float Pcm_tmp[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; - float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; float *p_output[MAX_OUTPUT_CHANNELS]; /*---------------------------------------------------------------------------*/ @@ -3053,7 +2934,7 @@ void ivas_spar_dec_upmixer_sf_fx( DECODER_CONFIG_HANDLE hDecoderConfig; SPAR_DEC_HANDLE hSpar; Word16 num_md_sub_frames; - Word16 q1 = 30,q2=30; + Word16 q1 = 30; push_wmops( "ivas_spar_dec_upmixer_sf" ); hSpar = st_ivas->hSpar; hDecoderConfig = st_ivas->hDecoderConfig; @@ -3172,7 +3053,7 @@ void ivas_spar_dec_upmixer_sf_fx( #ifdef IVAS_FLOAT_FIXED /*Float to fixed*/ FOR ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - FOR ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + FOR ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) { st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * ( 1LL << ( Q11 ) ) ); } @@ -3209,49 +3090,29 @@ void ivas_spar_dec_upmixer_sf_fx( { md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; #if 1 /*TODO: To be removed later when ivas_spar_get_parameters is integerated*/ - FOR( Word16 in_ch = 0; in_ch < numch_in; in_ch++ ) + FOR( in_ch = 0; in_ch < numch_in; in_ch++ ) { - FOR( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + FOR( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) { st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ } } - FOR( int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++ ) - { - FOR( int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++ ) - { - FOR( int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++ ) - { - FOR( int l = 0; l < IVAS_MAX_NUM_BANDS; l++ ) - { - hSpar->hMdDec->mixer_mat_prev[m][j][k][l] = ( (float) hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] / ( 1 << q2 ) ); - } - } - } - } - FOR( Word16 out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) +#endif +#if 1 + FOR( out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) { IF( st_ivas->cldfbSynDec[out_ch] ) { - FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) { st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] = ( (float) ( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] ) / (float) ( 1LL << ( Q11 ) ) ); } } } #endif - ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); - FOR ( int i = 0; i < numch_out; i++ ) - { - FOR ( int j = 0; j < numch_in; j++ ) - { - FOR ( int k = 0; k < num_spar_bands; k++ ) - { - mixer_mat_fx[i][j][k] = floatToFixed( mixer_mat[i][j][k], q1 ); - hSpar->hMdDec->mixer_mat_prev2_fx[i][j][k] = floatToFixed( hSpar->hMdDec->mixer_mat_prev2[i][j][k], q1 ); - } - } - } + 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) ) ) ) { FOR ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) @@ -3337,19 +3198,6 @@ void ivas_spar_dec_upmixer_sf_fx( hSpar->i_subframe = s_min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); } } -#if 1 /*TODO: To be removed when ivas_spar_get_parameters is integerated*/ - FOR( int i = 0; i < numch_out; i++ ) - { - FOR( int j = 0; j < numch_in; j++ ) - { - FOR( int k = 0; k < num_spar_bands; k++ ) - { - mixer_mat[i][j][k] = fixedToFloat( mixer_mat_fx[i][j][k], q1 ); - hSpar->hMdDec->mixer_mat_prev2[i][j][k] = fixedToFloat( hSpar->hMdDec->mixer_mat_prev2_fx[i][j][k], q1 ); - } - } - } -#endif } #ifdef IVAS_FLOAT_FIXED /*Fixed to float */ @@ -3357,7 +3205,7 @@ void ivas_spar_dec_upmixer_sf_fx( { FOR ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - FOR ( Word16 i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + FOR ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { cldfb_in_ts_re[in_ch][ts][i] = (float) ( cldfb_in_ts_re_fx[in_ch][ts][i] ) / (float) ( 1LL << 6 ); /*Resultant q is 6*/ cldfb_in_ts_im[in_ch][ts][i] = (float) ( cldfb_in_ts_im_fx[in_ch][ts][i] ) / (float) ( 1LL << 6 ); /*Resultant q is 6*/ @@ -3372,7 +3220,7 @@ void ivas_spar_dec_upmixer_sf_fx( fixedToFloat_arrL( output_fx[ch], output[ch], Q11, out_len ); p_output[ch] = output[ch]; } - ivas_dirac_dec_render_sf( st_ivas, p_output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); + ivas_dirac_dec_render_sf_fx( st_ivas, p_output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); FOR( Word16 ch = 0; ch < add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ); ch++ ) { floatToFixed_arrL( output[ch], output_fx[ch], Q11, out_len ); @@ -3382,7 +3230,7 @@ void ivas_spar_dec_upmixer_sf_fx( { IF( st_ivas->cldfbSynDec[out_ch] ) { - FOR( Word16 i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) + FOR( i = 0; i < st_ivas->cldfbSynDec[out_ch]->p_filter_length; i++ ) { st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx[i] = float_to_fix( st_ivas->cldfbSynDec[out_ch]->cldfb_state[i] ,Q11); } @@ -3458,7 +3306,7 @@ void ivas_spar_dec_upmixer_sf_fx( return; } -#endif // IVAS_FLOAT_FIXED +#else void ivas_spar_dec_upmixer_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -3469,10 +3317,6 @@ void ivas_spar_dec_upmixer_sf( int16_t cldfb_band, num_cldfb_bands, numch_in, numch_out; float *cldfb_in_ts_re[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; float *cldfb_in_ts_im[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; -#ifdef IVAS_FLOAT_FIXED - Word32 *cldfb_in_ts_re_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; - Word32 *cldfb_in_ts_im_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX]; -#endif int16_t i, b, ts, out_ch, in_ch; int16_t num_spar_bands, spar_band, nchan_transport; int16_t num_in_ingest, split_band; @@ -3480,10 +3324,6 @@ void ivas_spar_dec_upmixer_sf( float *p_tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; int16_t md_idx; float Pcm_tmp[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; -#ifdef IVAS_FLOAT_FIXED - Word32 *p_tc_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; - Word32 Pcm_tmp_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; -#endif int16_t numch_out_dirac; float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -3504,11 +3344,12 @@ void ivas_spar_dec_upmixer_sf( slot_idx_start = hSpar->slots_rendered; #ifdef IVAS_FLOAT_FIXED - for ( int i = 0; i < s_max(st_ivas->nchan_ism,0)+ nchan_internal; i++ ) + for ( i = 0; i < s_max(st_ivas->nchan_ism,0)+ nchan_internal; i++ ) { floatToFixed_arr32( st_ivas->hTcBuffer->tc[i], st_ivas->hTcBuffer->tc_fx[i], Q11, st_ivas->hTcBuffer->n_samples_available ); } #endif // IVAS_FLOAT_FIXED + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { int16_t nchan_ism; @@ -3517,9 +3358,6 @@ void ivas_spar_dec_upmixer_sf( for ( i = 0; i < nchan_internal; i++ ) { -#ifdef IVAS_FLOAT_FIXED - p_tc_fx[i] = st_ivas->hTcBuffer->tc_fx[i + nchan_ism] + slot_idx_start * slot_size; -#endif // IVAS_FLOAT_FIXED p_tc[i] = st_ivas->hTcBuffer->tc[i + nchan_ism] + slot_idx_start * slot_size; } @@ -3527,9 +3365,6 @@ void ivas_spar_dec_upmixer_sf( { for ( i = 0; i < nchan_ism; i++ ) { -#ifdef IVAS_FLOAT_FIXED - p_tc_fx[i + nchan_internal] = st_ivas->hTcBuffer->tc_fx[i] + slot_idx_start * slot_size; -#endif // IVAS_FLOAT_FIXED p_tc[i + nchan_internal] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size; } } @@ -3538,9 +3373,6 @@ void ivas_spar_dec_upmixer_sf( { for ( i = 0; i < nchan_internal; i++ ) { -#ifdef IVAS_FLOAT_FIXED - p_tc_fx[i] = st_ivas->hTcBuffer->tc_fx[i] + slot_idx_start * slot_size; -#endif // IVAS_FLOAT_FIXED p_tc[i] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size; } } @@ -3580,10 +3412,6 @@ void ivas_spar_dec_upmixer_sf( { cldfb_in_ts_re[in_ch][ts] = &Pcm_tmp[in_ch][ts * num_cldfb_bands]; cldfb_in_ts_im[in_ch][ts] = &Pcm_tmp[in_ch][ts * num_cldfb_bands + 4 * num_cldfb_bands]; -#ifdef IVAS_FLOAT_FIXED - 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]; -#endif } } } @@ -3595,10 +3423,6 @@ void ivas_spar_dec_upmixer_sf( { cldfb_in_ts_re[in_ch][ts] = &Pcm_tmp[in_ch][ts * num_cldfb_bands]; cldfb_in_ts_im[in_ch][ts] = &Pcm_tmp[in_ch][ts * num_cldfb_bands + 4 * num_cldfb_bands]; -#ifdef IVAS_FLOAT_FIXED - 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]; -#endif } } } @@ -3611,49 +3435,7 @@ void ivas_spar_dec_upmixer_sf( /* apply parameters */ /* determine if we can skip certain data */ -#ifdef IVAS_FLOAT_FIXED - Word16 q1 = 31; - for (int l = 0; l < numch_out; l++) { - for (int j = 0; j < numch_in; j++) { - for (int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++) { - if (abs((Word32)hSpar->hMdDec->mixer_mat[l][j][k]) != 0) { - q1 = min(norm_l((Word32)(hSpar->hMdDec->mixer_mat[l][j][k])), q1); - } - } - } - } - for (int l = 0; l < numch_out; l++) { - for (int j = 0; j < numch_in; j++) { - for (int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++) { - hSpar->hMdDec->mixer_mat_fx[l][j][k] = (Word32)(hSpar->hMdDec->mixer_mat[l][j][k] * (1 << q1)); - } - } - } - Word16 q2 = 31; - for (int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++) { - for (int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++) { - for (int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++) { - for (int l = 0; l < IVAS_MAX_NUM_BANDS; l++) { - if (abs((Word32)hSpar->hMdDec->mixer_mat_prev[m][j][k][l]) != 0) { - q2 = min(norm_l((Word32)hSpar->hMdDec->mixer_mat_prev[m][j][k][l]), q2); - } - } - } - } - } - for (int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++) { - for (int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++) { - for (int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++) { - for (int l = 0; l < IVAS_MAX_NUM_BANDS; l++) { - hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = (Word32) (hSpar->hMdDec->mixer_mat_prev[m][j][k][l] * (1 << q2)); - } - } - } - } - 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*/ -#else ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat, num_md_sub_frames ); /* this can be precomputed based on bitrate and format*/ -#endif numch_out_dirac = hDecoderConfig->nchan_out; @@ -3662,7 +3444,7 @@ void ivas_spar_dec_upmixer_sf( #ifdef IVAS_FLOAT_FIXED/*Float to fixed*/ for (in_ch = 0; in_ch < numch_in; in_ch++) { - for (Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++) + for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++) { st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] = (Word32)(st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] * (1LL << (Q11))); } @@ -3672,12 +3454,7 @@ void ivas_spar_dec_upmixer_sf( { for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { -#ifdef IVAS_FLOAT_FIXED - 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 ); -#else cldfbAnalysis_ts_ivas( &p_tc[in_ch][ts * num_cldfb_bands], cldfb_in_ts_re[in_ch][ts], cldfb_in_ts_im[in_ch][ts], num_cldfb_bands, st_ivas->cldfbAnaDec[in_ch] ); -#endif // IVAS_FLOAT_FIXED } } @@ -3687,12 +3464,7 @@ void ivas_spar_dec_upmixer_sf( { for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { -#ifdef IVAS_FLOAT_FIXED - 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); -#else cldfbAnalysis_ts_ivas( &p_tc[in_ch][ts * num_cldfb_bands], cldfb_in_ts_re[in_ch][ts], cldfb_in_ts_im[in_ch][ts], num_cldfb_bands, st_ivas->cldfbAnaDec[in_ch] ); -#endif } } } @@ -3702,13 +3474,13 @@ void ivas_spar_dec_upmixer_sf( { for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - for ( Word16 i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + for ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { cldfb_in_ts_re[in_ch][ts][i] = (float) ( cldfb_in_ts_re_fx[in_ch][ts][i] ) / (float) ( 1LL << 6 ); /*q_cldfb-5*/ cldfb_in_ts_im[in_ch][ts][i] = (float) ( cldfb_in_ts_im_fx[in_ch][ts][i] ) / (float) ( 1LL << 6 ); /*q_cldfb-5*/ } } - for ( Word16 i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) + for ( i = 0; i < st_ivas->cldfbAnaDec[in_ch]->p_filter_length - st_ivas->cldfbAnaDec[in_ch]->no_channels; i++ ) { st_ivas->cldfbAnaDec[in_ch]->cldfb_state[i] = (float) ( ( st_ivas->cldfbAnaDec[in_ch]->cldfb_state_fx[i] + ( 1 << 10 ) ) / ( 1LL << ( Q11 ) ) ); /*Rounding off*/ } @@ -3716,38 +3488,7 @@ void ivas_spar_dec_upmixer_sf( #endif if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) ) { -#ifdef IVAS_FLOAT_FIXED - //float2fix (to be cleaned) - Word16 q_cldfb = 31; - for (ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++) - { - Word16 q_ts_re = Q_factor_arrL(cldfb_in_ts_re[0][ts], CLDFB_NO_CHANNELS_MAX); - Word16 q_ts_im = Q_factor_arrL(cldfb_in_ts_im[0][ts], CLDFB_NO_CHANNELS_MAX); - q_cldfb = min(q_cldfb, min(q_ts_re, q_ts_im)); - } - for (ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++) - { - floatToFixed_arrL(cldfb_in_ts_re[0][ts], cldfb_in_ts_re_fx[0][ts], q_cldfb, CLDFB_NO_CHANNELS_MAX); - floatToFixed_arrL(cldfb_in_ts_im[0][ts], cldfb_in_ts_im_fx[0][ts], q_cldfb, CLDFB_NO_CHANNELS_MAX); - } - for (i = 0; i < IVAS_MAX_NUM_BANDS; i++) { - floatToFixed_arrL(hSpar->hMdDec->smooth_buf[i], hSpar->hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1); - } - floatToFixed_arr(hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_fac_fx, Q15, IVAS_MAX_NUM_BANDS); - //float2fix end - - 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 ); - - //fix2float (to be cleaned) - fixedToFloat_arr(hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_fac, Q15, IVAS_MAX_NUM_BANDS); - for (i = 0; i < IVAS_MAX_NUM_BANDS; i++) { - fixedToFloat_arrL(hSpar->hMdDec->smooth_buf_fx[i], hSpar->hMdDec->smooth_buf[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1); - } - //fix2float end -#else ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, hSpar->subframe_nbslots[hSpar->subframes_rendered], hSpar->subframes_rendered == 0, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf ); -#endif } for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) @@ -3845,7 +3586,11 @@ void ivas_spar_dec_upmixer_sf( if ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA && hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO && hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) { +#ifndef IVAS_FLOAT_FIXED ivas_dirac_dec_render_sf( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); +#else + ivas_dirac_dec_render_sf_fx( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); +#endif } if ( st_ivas->hDirAC != NULL ) @@ -3900,3 +3645,4 @@ void ivas_spar_dec_upmixer_sf( return; } +#endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 123a083d817d7c83ef372d695eb1b088cd12da9d..858b542ceb9ca234407f93c85905fab323f0cae7 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -45,7 +45,7 @@ #include "prot_fx2.h" #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED - +#ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------------------------* * Local constants @@ -65,7 +65,11 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 * Static functions declaration *------------------------------------------------------------------------------------------*/ +#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 ); +#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 static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t strat, const int32_t ivas_total_brate ); @@ -73,7 +77,11 @@ static void ivas_decode_huffman_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_St static void ivas_fill_band_coeffs_idx( ivas_band_coeffs_ind_t *pBands_idx, const int16_t nB, int16_t *pSymbol_re, ivas_cell_dim_t *pCell_dims, ivas_coeffs_type_t coeff_type ); +#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 ); +#endif static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi, const int16_t num_md_sub_frames ); @@ -81,6 +89,9 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_ static void ivas_spar_dec_compute_ramp_down_post_matrix_fx(ivas_spar_md_dec_state_t *hMdDec, const Word16 num_bands, const Word16 bfi, const Word16 num_md_sub_frames); #endif // IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED +static void ivas_spar_md_fill_invalid_bands_fx(ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const Word16 *valid_bands, Word16 *base_band_age, const Word16 num_bands, const Word16 num_channels, const Word16 num_md_sub_frames); +#endif 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 ); 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 ); @@ -93,12 +104,20 @@ static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, co 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 ); 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 ); +#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 ); +#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 +); +#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 +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * ivas_spar_md_dec_matrix_open() * @@ -140,286 +159,269 @@ ivas_error ivas_spar_md_dec_matrix_open( } } -#ifdef IVAS_FLOAT_FIXED - if ( ( hMdDec->mixer_mat_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } for ( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->mixer_mat_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } 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->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } - hMdDec->mix_mat_dim_0_1 = num_channels; - hMdDec->mix_mat_dim_2 = num_md_sub_frames * IVAS_MAX_NUM_BANDS; -#endif -#ifdef IVAS_FLOAT_FIXED - if ( ( hMdDec->spar_coeffs.C_re_fx = (Word32 ***) malloc( num_channels * sizeof(Word32 ** ) ) ) == NULL ) + + if ( ( hMdDec->spar_coeffs.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } 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.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } 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.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == 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_prev.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } 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_prev.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } 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_prev.C_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } -#endif // IVAS_FLOAT_FIXED - if ( ( hMdDec->spar_coeffs.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + + if ( ( hMdDec->spar_coeffs_prev.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } for ( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->spar_coeffs.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs_prev.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } for ( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs_prev.P_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } - //Fix_memory - /*if ((hMdDec->spar_coeffs.C_re_fx = (Word32 ***)malloc(num_channels * sizeof(Word32 **))) == NULL) + + if ( ( hMdDec->spar_coeffs_tar.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix"); } 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_tar.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) { return IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix"); } 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_tar.C_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix"); } } - }*/ - + } - if ( ( hMdDec->spar_coeffs.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs_tar.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } for ( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->spar_coeffs.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs_tar.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } for ( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs_tar.P_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } - //Fix memory - /*if ((hMdDec->spar_coeffs.P_re_fx = (Word32 ***)malloc(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++) { - if ((hMdDec->spar_coeffs.P_re_fx[i] = (Word32 **)malloc(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++) { - if ((hMdDec->spar_coeffs.P_re_fx[i][j] = (Word32 *)malloc(num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof(Word32))) == NULL) + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) { - return IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix"); + hMdDec->spar_coeffs_prev.C_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_prev.P_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_tar.C_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_tar.P_re[i][j][k] = 0.0f; + } } } - }*/ - if ( ( hMdDec->spar_coeffs_prev.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + return IVAS_ERR_OK; } - for ( i = 0; i < num_channels; i++ ) + +#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 */ +) { - if ( ( hMdDec->spar_coeffs_prev.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + 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 ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } - for ( j = 0; j < num_channels; j++ ) - { - if ( ( hMdDec->spar_coeffs_prev.C_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == 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 SPAR MD matrix" ); - } - } + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } - - //Fix Memory -#ifdef IVAS_FLOAT_FIXED - if ((hMdDec->spar_coeffs_prev.C_re_fx = (Word32 ***)malloc(num_channels * sizeof(Word32 **))) == NULL) + if ( ( hMdDec->mixer_mat_fx = (Word32 ***) malloc( 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++) { - if ((hMdDec->spar_coeffs_prev.C_re_fx[i] = (Word32 **)malloc(num_channels * sizeof(Word32 *))) == NULL) + if ( ( hMdDec->mixer_mat_fx[i] = (Word32 **) malloc( 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++) { - if ((hMdDec->spar_coeffs_prev.C_re_fx[i][j] = (Word32 *)malloc(IVAS_MAX_NUM_BANDS * sizeof(Word32))) == NULL) + if ( ( hMdDec->mixer_mat_fx[i][j] = (Word32 *) malloc( 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"); } } } -#endif - if ( ( hMdDec->spar_coeffs_prev.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + hMdDec->mix_mat_dim_0_1 = num_channels; + hMdDec->mix_mat_dim_2 = num_md_sub_frames * IVAS_MAX_NUM_BANDS; + + if ( ( hMdDec->spar_coeffs.C_re_fx = (Word32 ***) malloc( 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++ ) { - if ( ( hMdDec->spar_coeffs_prev.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs.C_re_fx[i] = (Word32 **) malloc( 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++ ) { - if ( ( hMdDec->spar_coeffs_prev.P_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs.C_re_fx[i][j] = (Word32 *) malloc( 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" ); } } } -#ifdef IVAS_FLOAT_FIXED - //Fix Memory - if ((hMdDec->spar_coeffs_prev.P_re_fx = (Word32 ***)malloc(num_channels * sizeof(Word32 **))) == NULL) + if ( ( hMdDec->spar_coeffs.P_re_fx = (Word32 ***) malloc( 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++) { - if ((hMdDec->spar_coeffs_prev.P_re_fx[i] = (Word32 **)malloc(num_channels * sizeof(Word32 *))) == NULL) + if ( ( hMdDec->spar_coeffs.P_re_fx[i] = (Word32 **) malloc( 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++) { - if ((hMdDec->spar_coeffs_prev.P_re_fx[i][j] = (Word32 *)malloc(IVAS_MAX_NUM_BANDS * sizeof(Word32))) == NULL) + if ( ( hMdDec->spar_coeffs.P_re_fx[i][j] = (Word32 *) malloc( 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"); } } } -#endif - if ( ( hMdDec->spar_coeffs_tar.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + if ((hMdDec->spar_coeffs_prev.C_re_fx = (Word32 ***)malloc(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++ ) { - if ( ( hMdDec->spar_coeffs_tar.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + if ((hMdDec->spar_coeffs_prev.C_re_fx[i] = (Word32 **)malloc(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++ ) { - if ( ( hMdDec->spar_coeffs_tar.C_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == 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" ); } } } -#ifdef IVAS_FLOAT_FIXED //Fix Memory - if ((hMdDec->spar_coeffs_tar.C_re_fx = (Word32 ***)malloc(num_channels * sizeof(Word32 **))) == NULL) + if ((hMdDec->spar_coeffs_prev.P_re_fx = (Word32 ***)malloc(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++) { - if ((hMdDec->spar_coeffs_tar.C_re_fx[i] = (Word32 **)malloc(num_channels * sizeof(Word32 *))) == NULL) + if ((hMdDec->spar_coeffs_prev.P_re_fx[i] = (Word32 **)malloc(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++) { - if ((hMdDec->spar_coeffs_tar.C_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"); } } } -#endif - - if ( ( hMdDec->spar_coeffs_tar.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + //Fix Memory + if ((hMdDec->spar_coeffs_tar.C_re_fx = (Word32 ***)malloc(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++ ) { - if ( ( hMdDec->spar_coeffs_tar.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + if ((hMdDec->spar_coeffs_tar.C_re_fx[i] = (Word32 **)malloc(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++ ) { - if ( ( hMdDec->spar_coeffs_tar.P_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == 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" ); } } } - -#ifdef IVAS_FLOAT_FIXED //Fix Memory if ((hMdDec->spar_coeffs_tar.P_re_fx = (Word32 ***)malloc(num_channels * sizeof(Word32 **))) == NULL) { @@ -439,7 +441,6 @@ ivas_error ivas_spar_md_dec_matrix_open( } } } -#endif for ( i = 0; i < num_channels; i++ ) { @@ -447,23 +448,17 @@ ivas_error ivas_spar_md_dec_matrix_open( { for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) { - hMdDec->spar_coeffs_prev.C_re[i][j][k] = 0.0f; - hMdDec->spar_coeffs_prev.P_re[i][j][k] = 0.0f; - hMdDec->spar_coeffs_tar.C_re[i][j][k] = 0.0f; - hMdDec->spar_coeffs_tar.P_re[i][j][k] = 0.0f; -#ifdef IVAS_FLOAT_FIXED hMdDec->spar_coeffs_prev.C_re_fx[i][j][k] = 0; hMdDec->spar_coeffs_prev.P_re_fx[i][j][k] = 0; hMdDec->spar_coeffs_tar.C_re_fx[i][j][k] = 0; hMdDec->spar_coeffs_tar.P_re_fx[i][j][k] = 0; -#endif } } } return IVAS_ERR_OK; } - +#endif /*------------------------------------------------------------------------- * ivas_get_spar_dec_md_num_subframes() @@ -560,7 +555,11 @@ ivas_error ivas_spar_md_dec_open( 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 { return error; } @@ -598,6 +597,7 @@ ivas_error ivas_spar_md_dec_open( * Deallocate SPAR MD decoder matrices *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_spar_md_dec_matrix_close( ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ const int16_t num_channels /* i : number of internal channels */ @@ -629,167 +629,169 @@ void ivas_spar_md_dec_matrix_close( free( hMdDecoder->mixer_mat ); } -#ifdef IVAS_FLOAT_FIXED - if ( hMdDecoder->mixer_mat_fx != NULL ) + if ( hMdDecoder->spar_coeffs.C_re != NULL ) { for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { - free( hMdDecoder->mixer_mat_fx[i][j] ); + free( hMdDecoder->spar_coeffs.C_re[i][j] ); } - free( hMdDecoder->mixer_mat_fx[i] ); + free( hMdDecoder->spar_coeffs.C_re[i] ); } - free( hMdDecoder->mixer_mat_fx ); + free( hMdDecoder->spar_coeffs.C_re ); } -#endif -#ifdef IVAS_FLOAT_FIXED - if ( hMdDecoder->spar_coeffs.C_re_fx != NULL ) + + if ( hMdDecoder->spar_coeffs.P_re != NULL ) { for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { - free( hMdDecoder->spar_coeffs.C_re_fx[i][j] ); + free( hMdDecoder->spar_coeffs.P_re[i][j] ); } - free( hMdDecoder->spar_coeffs.C_re_fx[i] ); + free( hMdDecoder->spar_coeffs.P_re[i] ); } - free( hMdDecoder->spar_coeffs.C_re_fx ); + free( hMdDecoder->spar_coeffs.P_re ); } - if ( hMdDecoder->spar_coeffs.P_re_fx != NULL ) + + if ( hMdDecoder->spar_coeffs_prev.C_re != NULL ) { for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { - free( hMdDecoder->spar_coeffs.P_re_fx[i][j] ); + free( hMdDecoder->spar_coeffs_prev.C_re[i][j] ); } - free( hMdDecoder->spar_coeffs.P_re_fx[i] ); + free( hMdDecoder->spar_coeffs_prev.C_re[i] ); } - free( hMdDecoder->spar_coeffs.P_re_fx ); + free( hMdDecoder->spar_coeffs_prev.C_re ); } -#endif // IVAS_FLOAT_FIXED - if ( hMdDecoder->spar_coeffs.C_re != NULL ) + if ( hMdDecoder->spar_coeffs_prev.P_re != NULL ) { for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { - free( hMdDecoder->spar_coeffs.C_re[i][j] ); + free( hMdDecoder->spar_coeffs_prev.P_re[i][j] ); } - free( hMdDecoder->spar_coeffs.C_re[i] ); + free( hMdDecoder->spar_coeffs_prev.P_re[i] ); } - free( hMdDecoder->spar_coeffs.C_re ); + free( hMdDecoder->spar_coeffs_prev.P_re ); } - /*if (hMdDecoder->spar_coeffs.C_re_fx != NULL) + + if ( hMdDecoder->spar_coeffs_tar.C_re != NULL ) { for (i = 0; i < num_channels; i++) { for (j = 0; j < num_channels; j++) { - free(hMdDecoder->spar_coeffs.C_re_fx[i][j]); + free( hMdDecoder->spar_coeffs_tar.C_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_tar.C_re[i] ); } - free(hMdDecoder->spar_coeffs.C_re_fx[i]); + free( hMdDecoder->spar_coeffs_tar.C_re ); } - free(hMdDecoder->spar_coeffs.C_re_fx); - }*/ - if ( hMdDecoder->spar_coeffs.P_re != NULL ) + if ( hMdDecoder->spar_coeffs_tar.P_re != NULL ) { for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { - free( hMdDecoder->spar_coeffs.P_re[i][j] ); + free( hMdDecoder->spar_coeffs_tar.P_re[i][j] ); } - free( hMdDecoder->spar_coeffs.P_re[i] ); + free( hMdDecoder->spar_coeffs_tar.P_re[i] ); } - free( hMdDecoder->spar_coeffs.P_re ); + free( hMdDecoder->spar_coeffs_tar.P_re ); } - /*if (hMdDecoder->spar_coeffs.P_re_fx != NULL) - { - for (i = 0; i < num_channels; i++) + return; +} + +#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 */ +) { - for (j = 0; j < num_channels; j++) + int16_t i, j; + + if ( hMdDecoder->spar_md.band_coeffs != NULL ) { - free(hMdDecoder->spar_coeffs.P_re_fx[i][j]); + free( hMdDecoder->spar_md.band_coeffs ); + hMdDecoder->spar_md.band_coeffs = NULL; } - free(hMdDecoder->spar_coeffs.P_re_fx[i]); + if ( hMdDecoder->band_coeffs_prev != NULL ) + { + free( hMdDecoder->band_coeffs_prev ); + hMdDecoder->band_coeffs_prev = NULL; } - free(hMdDecoder->spar_coeffs.P_re_fx); - }*/ - if ( hMdDecoder->spar_coeffs_prev.C_re != NULL ) + if ( hMdDecoder->mixer_mat_fx != NULL ) { for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { - free( hMdDecoder->spar_coeffs_prev.C_re[i][j] ); + free( hMdDecoder->mixer_mat_fx[i][j] ); } - free( hMdDecoder->spar_coeffs_prev.C_re[i] ); + free( hMdDecoder->mixer_mat_fx[i] ); } - free( hMdDecoder->spar_coeffs_prev.C_re ); + free( hMdDecoder->mixer_mat_fx ); } -#ifdef IVAS_FLOAT_FIXED - if (hMdDecoder->spar_coeffs_prev.C_re_fx != NULL) + if ( hMdDecoder->spar_coeffs.C_re_fx != NULL ) { for (i = 0; i < num_channels; i++) { for (j = 0; j < num_channels; j++) { - free(hMdDecoder->spar_coeffs_prev.C_re_fx[i][j]); + free( hMdDecoder->spar_coeffs.C_re_fx[i][j] ); } - free(hMdDecoder->spar_coeffs_prev.C_re_fx[i]); + free( hMdDecoder->spar_coeffs.C_re_fx[i] ); } - free(hMdDecoder->spar_coeffs_prev.C_re_fx); + free( hMdDecoder->spar_coeffs.C_re_fx ); } -#endif - - if ( hMdDecoder->spar_coeffs_prev.P_re != NULL ) + if ( hMdDecoder->spar_coeffs.P_re_fx != NULL ) { for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { - free( hMdDecoder->spar_coeffs_prev.P_re[i][j] ); + free( hMdDecoder->spar_coeffs.P_re_fx[i][j] ); } - free( hMdDecoder->spar_coeffs_prev.P_re[i] ); + free( hMdDecoder->spar_coeffs.P_re_fx[i] ); } - free( hMdDecoder->spar_coeffs_prev.P_re ); + free( hMdDecoder->spar_coeffs.P_re_fx ); } -#ifdef IVAS_FLOAT_FIXED - if (hMdDecoder->spar_coeffs_prev.P_re_fx != NULL) + if (hMdDecoder->spar_coeffs_prev.C_re_fx != NULL) { for (i = 0; i < num_channels; i++) { for (j = 0; j < num_channels; j++) { - free(hMdDecoder->spar_coeffs_prev.P_re_fx[i][j]); + free(hMdDecoder->spar_coeffs_prev.C_re_fx[i][j]); } - free(hMdDecoder->spar_coeffs_prev.P_re_fx[i]); + free(hMdDecoder->spar_coeffs_prev.C_re_fx[i]); } - free(hMdDecoder->spar_coeffs_prev.P_re_fx); + free(hMdDecoder->spar_coeffs_prev.C_re_fx); } -#endif - if ( hMdDecoder->spar_coeffs_tar.C_re != NULL ) + if (hMdDecoder->spar_coeffs_prev.P_re_fx != NULL) { for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { - free( hMdDecoder->spar_coeffs_tar.C_re[i][j] ); + free(hMdDecoder->spar_coeffs_prev.P_re_fx[i][j]); } - free( hMdDecoder->spar_coeffs_tar.C_re[i] ); + free(hMdDecoder->spar_coeffs_prev.P_re_fx[i]); } - free( hMdDecoder->spar_coeffs_tar.C_re ); + free(hMdDecoder->spar_coeffs_prev.P_re_fx); } -#ifdef IVAS_FLOAT_FIXED if (hMdDecoder->spar_coeffs_tar.C_re_fx != NULL) { for (i = 0; i < num_channels; i++) @@ -802,21 +804,6 @@ void ivas_spar_md_dec_matrix_close( } free(hMdDecoder->spar_coeffs_tar.C_re_fx); } -#endif - - if ( hMdDecoder->spar_coeffs_tar.P_re != NULL ) - { - for ( i = 0; i < num_channels; i++ ) - { - for ( j = 0; j < num_channels; j++ ) - { - free( hMdDecoder->spar_coeffs_tar.P_re[i][j] ); - } - free( hMdDecoder->spar_coeffs_tar.P_re[i] ); - } - free( hMdDecoder->spar_coeffs_tar.P_re ); - } -#ifdef IVAS_FLOAT_FIXED if (hMdDecoder->spar_coeffs_tar.P_re_fx != NULL) { for (i = 0; i < num_channels; i++) @@ -829,11 +816,10 @@ void ivas_spar_md_dec_matrix_close( } free(hMdDecoder->spar_coeffs_tar.P_re_fx); } -#endif return; } - +#endif /*------------------------------------------------------------------------- * ivas_spar_md_dec_close() @@ -851,7 +837,11 @@ void ivas_spar_md_dec_close( hMdDecoder = *hMdDec; num_channels = hMdDecoder->spar_md_cfg.num_umx_chs; +#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; @@ -865,6 +855,7 @@ Word32 pFC_16k[IVAS_MAX_NUM_BANDS] = { 66, 200, 333, 466, 600, 733, 866, 1133, 1 Word32 pFC_32k[IVAS_MAX_NUM_BANDS] = { 133, 400, 666, 933, 1200, 1466, 1733, 2266, 3466, 5333, 8133, 12933 }; Word32 pFC_48k[IVAS_MAX_NUM_BANDS] = { 199, 600, 1000, 1400, 1800, 2200, 2600, 3400, 5200, 8000, 12200, 19400 }; +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* * Function ivas_spar_md_dec_init() * @@ -881,7 +872,6 @@ ivas_error ivas_spar_md_dec_init( int16_t i, j; int16_t nchan_transport; float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; - Word32 *pFC_fx=NULL, PR_minmax_fx[2]; ivas_error error; ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); @@ -900,23 +890,117 @@ ivas_error ivas_spar_md_dec_init( pFC[i] = ivas_fb_fcs_12band_1ms[i] * hDecoderConfig->output_Fs * 0.5f; } - if (hDecoderConfig->output_Fs == 8000) + if ( ( error = ivas_spar_set_dec_config( hMdDec, nchan_transport, pFC ) ) != 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 ) ) ) + { + return IVAS_ERR_INTERNAL; + } + + /* DTX quant init */ + PR_minmax[0] = hMdDec->spar_md_cfg.quant_strat[0].PR.min; + PR_minmax[1] = hMdDec->spar_md_cfg.quant_strat[0].PR.max; + ivas_spar_quant_dtx_init( &hMdDec->spar_md, PR_minmax ); + + ivas_spar_arith_coeffs_com_init( &hMdDec->arith_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); + ivas_spar_huff_coeffs_com_init( &hMdDec->huff_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); + + hMdDec->spar_md_cfg.prev_quant_idx = -1; + + /* 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 ); + hMdDec->spar_plc_num_lost_frames = 0; + hMdDec->spar_plc_enable_fadeout_flag = 1; + hMdDec->dtx_md_smoothing_cntr = 1; + + 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 ); + 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; + hMdDec->td_decorr_flag = 1; + + 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 ); + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + set_zero( hMdDec->smooth_buf[i], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + + for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH; j++ ) + { + set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); + } + } + hMdDec->first_valid_frame = 1; + + return IVAS_ERR_OK; +} +#else +/*-----------------------------------------------------------------------------------------* +* Function ivas_spar_md_dec_init() +* +* SPAR MD decoder initialization +*-----------------------------------------------------------------------------------------*/ +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 */ +) +{ + int16_t i, j; + int16_t nchan_transport; + Word32 pFC[IVAS_MAX_NUM_BANDS]; + Word32 *pFC_fx=NULL, PR_minmax_fx[2]; + ivas_error error; + + ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); + + ivas_sba_get_spar_hoa_ch_ind( 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 ); + + 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; + + + + /* 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 + } + + IF (EQ_32 (hDecoderConfig->output_Fs, 8000)) { pFC_fx = pFC_8k; } - else if (hDecoderConfig->output_Fs == 12800) + ELSE IF(EQ_32(hDecoderConfig->output_Fs, 12800)) { pFC_fx = pFC_12k; } - else if (hDecoderConfig->output_Fs == 16000) + ELSE IF (EQ_32(hDecoderConfig->output_Fs, 16000)) { pFC_fx = pFC_16k; } - else if (hDecoderConfig->output_Fs == 32000) + ELSE IF (EQ_32(hDecoderConfig->output_Fs, 32000)) { pFC_fx = pFC_32k; } - else if (hDecoderConfig->output_Fs == 48000) + ELSE IF (EQ_32(hDecoderConfig->output_Fs, 48000)) { pFC_fx = pFC_48k; } @@ -940,11 +1024,8 @@ ivas_error ivas_spar_md_dec_init( } /* DTX quant init */ - PR_minmax[0] = hMdDec->spar_md_cfg.quant_strat[0].PR.min; PR_minmax_fx[0] = hMdDec->spar_md_cfg.quant_strat[0].PR.min_fx; - PR_minmax[1] = hMdDec->spar_md_cfg.quant_strat[0].PR.max; PR_minmax_fx[1] = hMdDec->spar_md_cfg.quant_strat[0].PR.max_fx; - ivas_spar_quant_dtx_init( &hMdDec->spar_md, PR_minmax ); ivas_spar_quant_dtx_init_fx( &hMdDec->spar_md, PR_minmax_fx ); ivas_spar_arith_coeffs_com_init( &hMdDec->arith_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); @@ -960,8 +1041,13 @@ ivas_error ivas_spar_md_dec_init( hMdDec->spar_plc_enable_fadeout_flag = 1; hMdDec->dtx_md_smoothing_cntr = 1; +#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 ); @@ -969,20 +1055,21 @@ ivas_error ivas_spar_md_dec_init( hMdDec->spar_md.dtx_vad = 0; hMdDec->td_decorr_flag = 1; - set_f( hMdDec->spar_md.en_ratio_slow, 0.0f, IVAS_MAX_NUM_BANDS ); + set32_fx( hMdDec->spar_md.en_ratio_slow_fx, 0, IVAS_MAX_NUM_BANDS ); - set_f( hMdDec->spar_md.ref_pow_slow, 0.0f, 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 ); -#ifdef IVAS_FLOAT_FIXED - set16_fx( hMdDec->smooth_fac_fx,0, IVAS_MAX_NUM_BANDS ); #endif for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) { - set_zero( hMdDec->smooth_buf[i], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); -#ifdef IVAS_FLOAT_FIXED 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 } @@ -990,9 +1077,9 @@ ivas_error ivas_spar_md_dec_init( { for ( j = 0; j < IVAS_SPAR_MAX_CH; j++ ) { - set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); -#ifdef IVAS_FLOAT_FIXED 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 } } @@ -1001,6 +1088,8 @@ ivas_error ivas_spar_md_dec_init( return IVAS_ERR_OK; } +#endif + /*-----------------------------------------------------------------------------------------* * Function ivas_spar_set_dec_config() @@ -1120,12 +1209,12 @@ static ivas_error ivas_spar_set_dec_config( * * *-----------------------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void ivas_dec_mono_sba_handling( Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ) { - Word16 mono_flag, b, block; + int16_t mono_flag, b, block; mono_flag = 1; @@ -1136,11 +1225,6 @@ static void ivas_dec_mono_sba_handling( float azimuth = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth[block]; float elevation = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth[block]; float energy_ratio = st_ivas->hQMetaData->q_direction[0].band_data[0].energy_ratio[block]; -#ifdef IVAS_FLOAT_FIXED - Word32 azimuth_fx = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth_fx[block]; - Word32 elevation_fx = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth_fx[block]; - Word32 energy_ratio_fx = st_ivas->hQMetaData->q_direction[0].band_data[0].energy_ratio_fx[block]; -#endif if ( ( azimuth != 0.0f ) || ( elevation != 0.0f ) || @@ -1148,7 +1232,55 @@ static void ivas_dec_mono_sba_handling( { mono_flag = 0; } -#ifdef IVAS_FLOAT_FIXED + } + } + + /* Combine the SPAR prediction coefs flag with the azimuth, elevation and energy ratio flag.*/ + mono_flag = mono_flag && ivas_spar_chk_zero_coefs( st_ivas ); + + if ( mono_flag ) + { + /* Set Energy Ratio values to be zero */ + for ( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + set_zero( st_ivas->hQMetaData->q_direction[0].band_data[b].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + if ( st_ivas->hDirAC != NULL ) + { + for ( block = 0; block < st_ivas->hSpatParamRendCom->dirac_md_buffer_length; ++block ) + { + /* Set directional Energy Ratio values to be zero */ + set_zero( st_ivas->hSpatParamRendCom->energy_ratio1[block], st_ivas->hSpatParamRendCom->num_freq_bands ); + if ( st_ivas->hQMetaData->no_directions == 2 ) + { + set_zero( st_ivas->hSpatParamRendCom->energy_ratio2[block], st_ivas->hSpatParamRendCom->num_freq_bands ); + } + /* Set Diffuseness values to be 1.0 */ + set_f( st_ivas->hSpatParamRendCom->diffuseness_vector[block], 1.0f, st_ivas->hSpatParamRendCom->num_freq_bands ); + } + } + } + + return; +} +#else +static void ivas_dec_mono_sba_handling_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + Word16 mono_flag, b, block; + + mono_flag = 1; + + FOR ( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) + { + + Word32 azimuth_fx = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth_fx[block]; + Word32 elevation_fx = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth_fx[block]; + Word32 energy_ratio_fx = st_ivas->hQMetaData->q_direction[0].band_data[0].energy_ratio_fx[block]; + IF ( ( NE_32(azimuth_fx, 0) ) || (NE_32(elevation_fx, 0) ) || @@ -1156,7 +1288,6 @@ static void ivas_dec_mono_sba_handling( { mono_flag = 0; } -#endif } } @@ -1170,9 +1301,9 @@ static void ivas_dec_mono_sba_handling( for ( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ ) { set_zero( st_ivas->hQMetaData->q_direction[0].band_data[b].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES ); -#ifdef IVAS_FLOAT_FIXED + set32_fx( st_ivas->hQMetaData->q_direction[0].band_data[b].energy_ratio_fx,0, MAX_PARAM_SPATIAL_SUBFRAMES ); -#endif + } if ( st_ivas->hDirAC != NULL ) { @@ -1180,48 +1311,48 @@ static void ivas_dec_mono_sba_handling( { /* Set directional Energy Ratio values to be zero */ set_zero( st_ivas->hSpatParamRendCom->energy_ratio1[block], st_ivas->hSpatParamRendCom->num_freq_bands ); -#ifdef IVAS_FLOAT_FIXED + set32_fx( st_ivas->hSpatParamRendCom->energy_ratio1_fx[block],0, st_ivas->hSpatParamRendCom->num_freq_bands ); -#endif + if ( st_ivas->hQMetaData->no_directions == 2 ) { set_zero( st_ivas->hSpatParamRendCom->energy_ratio2[block], st_ivas->hSpatParamRendCom->num_freq_bands ); -#ifdef IVAS_FLOAT_FIXED + set32_fx( st_ivas->hSpatParamRendCom->energy_ratio2_fx[block],0, st_ivas->hSpatParamRendCom->num_freq_bands ); -#endif + } /* Set Diffuseness values to be 1.0 */ set_f( st_ivas->hSpatParamRendCom->diffuseness_vector[block], 1.0f, st_ivas->hSpatParamRendCom->num_freq_bands ); -#ifdef IVAS_FLOAT_FIXED + set32_fx( st_ivas->hSpatParamRendCom->diffuseness_vector_fx[block], ONE_IN_Q30, st_ivas->hSpatParamRendCom->num_freq_bands ); -#endif + } } } return; } - - +#endif +#ifdef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* - * Function ivas_spar_md_dec_process() + * Function ivas_spar_md_dec_process_fx() * * SPAR Meta Data decoder process *-----------------------------------------------------------------------------------------*/ -void ivas_spar_md_dec_process( +void ivas_spar_md_dec_process_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ - const int16_t num_bands_out, /* i : number of output bands */ - const int16_t sba_order /* i : Ambisonic (SBA) order */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ) { - int16_t j, k, b, bw, dtx_vad, nB, i_ts; + Word16 j, k, b, bw, dtx_vad, nB, i_ts; ivas_spar_md_dec_state_t *hMdDec; - int16_t num_md_chs; - int16_t num_md_sub_frames; - int16_t dyn_active_w_flag; - int16_t active_w_vlbr; + Word16 num_md_chs; + Word16 num_md_sub_frames; + Word16 dyn_active_w_flag; + Word16 active_w_vlbr; hMdDec = st_ivas->hSpar->hMdDec; @@ -1231,48 +1362,55 @@ void ivas_spar_md_dec_process( num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); - if ( hMdDec->spar_md_cfg.nchan_transport > 1 && hMdDec->spar_md_cfg.nchan_transport <= 3 ) + test(); + IF ( GT_16(hMdDec->spar_md_cfg.nchan_transport , 1) && LE_16(hMdDec->spar_md_cfg.nchan_transport , 3) ) { - hMdDec->spar_md.res_ind = 0; - dyn_active_w_flag = get_next_indice( st0, 1 ); - if ( dyn_active_w_flag == 1 ) + hMdDec->spar_md.res_ind = 0; move16(); + dyn_active_w_flag = get_next_indice_fx( st0, 1 ); + IF ( EQ_16(dyn_active_w_flag , 1) ) { - if ( hMdDec->spar_md_cfg.nchan_transport == 2 ) + IF ( EQ_16(hMdDec->spar_md_cfg.nchan_transport , 2) ) { - hMdDec->spar_md.res_ind = get_next_indice( st0, 1 ); - hMdDec->spar_md.res_ind += hMdDec->spar_md_cfg.nchan_transport; + hMdDec->spar_md.res_ind = get_next_indice_fx( st0, 1 ); + move16(); + hMdDec->spar_md.res_ind = add(hMdDec->spar_md_cfg.nchan_transport, hMdDec->spar_md.res_ind); + move16(); } - else if ( hMdDec->spar_md_cfg.nchan_transport == 3 ) + ELSE IF ( EQ_16(hMdDec->spar_md_cfg.nchan_transport , 3) ) { hMdDec->spar_md.res_ind = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order][hMdDec->spar_md_cfg.nchan_transport]; + move16(); } } } else { dyn_active_w_flag = 0; - if ( hMdDec->spar_md_cfg.nchan_transport == FOA_CHANNELS ) + move16(); + IF ( EQ_16(hMdDec->spar_md_cfg.nchan_transport , FOA_CHANNELS) ) { - get_next_indice( st0, 1 ); + get_next_indice_fx( st0, 1 ); } } - for (int i = 0; i < IVAS_MAX_NUM_BANDS; i++) +#if 0 //ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED + FOR (Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++) { - for (int ii = 0; ii < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; ii++) + FOR (Word16 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++) + 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 (int jj = 0; jj < IVAS_SPAR_MAX_DMX_CHS - 1; jj++) + 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)); } } - ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, +#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 ); @@ -1285,6 +1423,7 @@ void ivas_spar_md_dec_process( &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++) @@ -1300,16 +1439,18 @@ void ivas_spar_md_dec_process( hMdDec->spar_md.band_coeffs[i].P_re[jj] = (float)hMdDec->spar_md.band_coeffs[i].P_re_fx[jj] / (1 << 22); } } - ivas_dec_mono_sba_handling( st_ivas ); +#endif + ivas_dec_mono_sba_handling_fx( st_ivas ); /* SPAR to DirAC conversion */ - if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) + IF ( EQ_16(hMdDec->spar_hoa_dirac2spar_md_flag , 1) ) { - ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out, bw, dyn_active_w_flag ); + ivas_spar_to_dirac_fx( st_ivas, hMdDec, dtx_vad, num_bands_out, bw, dyn_active_w_flag ); } /* set correct number of bands*/ nB = IVAS_MAX_NUM_BANDS; + move16(); /* expand DirAC MD to all time slots */ for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) @@ -1318,28 +1459,37 @@ void ivas_spar_md_dec_process( { 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]; + move32(); } 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++ ) { +#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]; + move32(); } } 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]; + move32(); } } } - ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, num_md_chs, active_w_vlbr, dyn_active_w_flag ); + ivas_get_spar_matrices_fx( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, num_md_chs, active_w_vlbr, dyn_active_w_flag ); #ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS { @@ -1352,53 +1502,180 @@ void ivas_spar_md_dec_process( fprintf( fid, "%.6f\n", hMdDec->mixer_mat[1][0][band] ); } #endif - ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, num_md_chs, num_md_sub_frames ); + ivas_spar_md_fill_invalid_bands_fx( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, num_md_chs, num_md_sub_frames ); hMdDec->dtx_md_smoothing_cntr = 1; return; } - - +#else /*-----------------------------------------------------------------------------------------* - * Function ivas_spar_chk_zero_coefs() + * Function ivas_spar_md_dec_process() * - * Check for zeroed SPAR coefficients + * SPAR Meta Data decoder process *-----------------------------------------------------------------------------------------*/ -int16_t ivas_spar_chk_zero_coefs( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +void ivas_spar_md_dec_process( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ ) { - int16_t j, k, b; - ivas_spar_md_dec_state_t *hMdDec; - int16_t mono = 1; - int16_t ndec, ndm; + int16_t j, k, b, bw, dtx_vad, nB, i_ts; + ivas_spar_md_dec_state_t *hMdDec; + int16_t num_md_chs; + int16_t num_md_sub_frames; + int16_t dyn_active_w_flag; + int16_t active_w_vlbr; - hMdDec = st_ivas->hSpar->hMdDec; - ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; - ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + hMdDec = st_ivas->hSpar->hMdDec; - for ( b = 0; b < min( hMdDec->spar_md.num_bands, SPAR_DIRAC_SPLIT_START_BAND ); b++ ) + active_w_vlbr = (st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4) ? 1 : 0; + + num_md_chs = ivas_sba_get_nchan_metadata(sba_order, st_ivas->hDecoderConfig->ivas_total_brate); + + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes(sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate); + + if (hMdDec->spar_md_cfg.nchan_transport > 1 && hMdDec->spar_md_cfg.nchan_transport <= 3) + { + hMdDec->spar_md.res_ind = 0; + dyn_active_w_flag = get_next_indice(st0, 1); + if (dyn_active_w_flag == 1) { - for ( j = 0; j < ndm + ndec - 1; j++ ) - { - if ( hMdDec->spar_md.band_coeffs[b].pred_re[j] != 0.0f ) - { - mono = 0; - } - } - for ( j = 0; j < ndec; j++ ) - { - for ( k = 0; k < ndm - 1; k++ ) - { - if ( hMdDec->spar_md.band_coeffs[b].C_re[j][k] != 0.0f ) - { - mono = 0; - } - } - } + if (hMdDec->spar_md_cfg.nchan_transport == 2) + { + hMdDec->spar_md.res_ind = get_next_indice(st0, 1); + hMdDec->spar_md.res_ind += hMdDec->spar_md_cfg.nchan_transport; + } + else if (hMdDec->spar_md_cfg.nchan_transport == 3) + { + hMdDec->spar_md.res_ind = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order][hMdDec->spar_md_cfg.nchan_transport]; + } + } + } + else + { + dyn_active_w_flag = 0; + if (hMdDec->spar_md_cfg.nchan_transport == FOA_CHANNELS) + { + get_next_indice(st0, 1); + } + } + + ivas_spar_dec_parse_md_bs(hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, + st_ivas->hQMetaData->sba_inactive_mode + ); + + assert(nB == hMdDec->spar_md.num_bands); + assert(bw == 1); + ivas_spar_md_fill_invalid_bandcoeffs( + hMdDec->spar_md.band_coeffs, + hMdDec->band_coeffs_prev, + &hMdDec->valid_bands[0], + &hMdDec->base_band_coeffs_age[0], + &hMdDec->first_valid_frame, + nB); + + ivas_dec_mono_sba_handling(st_ivas); + + /* SPAR to DirAC conversion */ + if (hMdDec->spar_hoa_dirac2spar_md_flag == 1) + { + ivas_spar_to_dirac(st_ivas, hMdDec, dtx_vad, num_bands_out, bw, dyn_active_w_flag); + } + + /* set correct number of bands*/ + nB = IVAS_MAX_NUM_BANDS; + + /* expand DirAC MD to all time slots */ + for (i_ts = 1; i_ts < num_md_sub_frames; i_ts++) + { + for (b = 0; b < hMdDec->spar_md.num_bands; b++) + { + for (j = 0; j < IVAS_SPAR_MAX_CH - 1; j++) + { + hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j] = hMdDec->spar_md.band_coeffs[b].pred_re[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++) + { + 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]; + } + } + + for (j = 0; j < IVAS_SPAR_MAX_CH - 1; j++) + { + hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[j] = hMdDec->spar_md.band_coeffs[b].P_re[j]; + } + } + } + + ivas_get_spar_matrices(hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, num_md_chs, active_w_vlbr, dyn_active_w_flag); + +#ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS + { + static FILE *fid = 0; + int16_t band = 9; + if (!fid) + { + fid = fopen("pred_coeffs_dec.txt", "wt"); + } + fprintf(fid, "%.6f\n", hMdDec->mixer_mat[1][0][band]); + } +#endif + ivas_spar_md_fill_invalid_bands(&hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, num_md_chs, num_md_sub_frames); + + + hMdDec->dtx_md_smoothing_cntr = 1; + + return; +} + +#endif + +#ifndef IVAS_FLOAT_FIXED +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_chk_zero_coefs() + * + * Check for zeroed SPAR coefficients + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_spar_chk_zero_coefs( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + int16_t j, k, b; + ivas_spar_md_dec_state_t *hMdDec; + int16_t mono = 1; + int16_t ndec, ndm; + + hMdDec = st_ivas->hSpar->hMdDec; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + + for ( b = 0; b < min( hMdDec->spar_md.num_bands, SPAR_DIRAC_SPLIT_START_BAND ); b++ ) + { + for ( j = 0; j < ndm + ndec - 1; j++ ) + { + if ( hMdDec->spar_md.band_coeffs[b].pred_re[j] != 0.0f ) + { + mono = 0; + } + } + for ( j = 0; j < ndec; j++ ) + { + for ( k = 0; k < ndm - 1; k++ ) + { + if ( hMdDec->spar_md.band_coeffs[b].C_re[j][k] != 0.0f ) + { + mono = 0; + } + } + } for ( j = 0; j < ndec; j++ ) { if ( hMdDec->spar_md.band_coeffs[b].P_re[j] != 0.0f ) @@ -1410,6 +1687,7 @@ int16_t ivas_spar_chk_zero_coefs( return mono; } +#else Word16 ivas_spar_chk_zero_coefs_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ @@ -1454,6 +1732,7 @@ Word16 ivas_spar_chk_zero_coefs_fx( return mono; } +#endif /*-----------------------------------------------------------------------------------------* @@ -1543,7 +1822,7 @@ void ivas_spar_smooth_md_dtx_fx( return; } -#endif +#else void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out, /* i : number of output bands */ @@ -1612,6 +1891,7 @@ void ivas_spar_smooth_md_dtx( return; } +#endif /*-----------------------------------------------------------------------------------------* @@ -1685,7 +1965,7 @@ void ivas_spar_setup_md_smoothing_fx( return; } -#endif +#else void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out, /* i : number of output bands */ @@ -1745,6 +2025,7 @@ void ivas_spar_setup_md_smoothing( return; } +#endif /*-----------------------------------------------------------------------------------------* @@ -1813,7 +2094,7 @@ void ivas_spar_update_md_hist_fx( return; } -#endif +#else void ivas_spar_update_md_hist( ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ ) @@ -1868,14 +2149,14 @@ void ivas_spar_update_md_hist( return; } - +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_get_spar_matrices() * * Get SPAR matrices *-----------------------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, @@ -1928,10 +2209,6 @@ static void ivas_get_spar_matrices( { set_zero( &hMdDec->spar_coeffs.C_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS ); set_zero( &hMdDec->spar_coeffs.P_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS ); -#ifdef IVAS_FLOAT_FIXED - 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); -#endif } } num_bands = min( num_bands, nB ); @@ -2106,8 +2383,265 @@ static void ivas_get_spar_matrices( return; } +#else +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 ) +{ + Word16 num_bands, dmx_ch, split_band; + Word16 i, j, k, m, b, i_ts, active_w; + const Word16 *order; + Word32 active_w_dm_fac_fx, re_fx,re_fx1; + + num_bands = num_bands_out; + order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order]; + + split_band = SPAR_DIRAC_SPLIT_START_BAND; + + //Dead code as SPAR_DIRAC_SPLIT_START_BAND = 8 and IVAS_MAX_NUM_BANDS = 12 + IF( GE_16( split_band, IVAS_MAX_NUM_BANDS ) ) + { + /*store previous 4x4 parameters for linear interpolation to current*/ + + FOR( i = 0; i < numch_out; i++ ) + { + FOR( j = 0; j < numch_out; j++ ) + { + FOR( b = 0; b < num_bands; b++ ) + { + hMdDec->mixer_mat_prev_fx[0][i][j][b] = hMdDec->mixer_mat_fx[i][j][b]; + move32(); + } + } + } + } + + IF( bw == IVAS_RED_BAND_FACT ) + { + num_bands = shl( num_bands, 1 ); + } + + 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(); + FOR( i_ts = 0; i_ts < n_ts; i_ts++ ) + { + FOR( i = 0; i < numch_out; i++ ) + { + 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 ); + } + } + num_bands = min( num_bands, nB ); + + 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]; + + FOR( j = 0; j < numch_out; j++ ) + { + set_zero_fx( tmp_C1_re_fx[j], numch_out ); + set_zero_fx( tmp_C2_re_fx[j], numch_out ); + set_zero_fx( tmp_dm_re_fx[j], numch_out ); + + tmp_C1_re_fx[j][j] = ONE_IN_Q22; + tmp_C2_re_fx[j][j] = ONE_IN_Q22; + tmp_dm_re_fx[j][j] = ONE_IN_Q22; + move32(); + move32(); + move32(); + } + + 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 + move32(); + } + + IF( EQ_16( active_w, 1 ) ) + { + 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 + move32(); + } + re_fx = Mpy_32_32( tmp_C2_re_fx[0][1], tmp_C1_re_fx[1][0] ); // Q22 *Q22 =Q13 + re_fx1 = L_add( ONE_IN_Q13, re_fx ); // Q13+Q13 + + re_fx = Mpy_32_32( tmp_C2_re_fx[0][2], tmp_C1_re_fx[2][0] ); // Q22 *Q22 =Q13 + re_fx1 = L_add( re_fx1, re_fx ); // Q13+Q13 + + re_fx = Mpy_32_32( tmp_C2_re_fx[0][3], tmp_C1_re_fx[3][0] ); // Q22 *Q22 =Q13 + 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 ) ) + { + 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]; + + tmp_dm_re_fx[0][2] = tmp_C2_re_fx[0][2]; + + tmp_dm_re_fx[0][3] = tmp_C2_re_fx[0][3]; + + tmp_dm_re_fx[1][0] = tmp_C1_re_fx[1][0]; + + tmp_dm_re_fx[2][0] = tmp_C1_re_fx[2][0]; + + tmp_dm_re_fx[3][0] = tmp_C1_re_fx[3][0]; + + IF( NE_16( hMdDec->spar_md_cfg.remix_unmix_order, 3 ) ) + { + ivas_mat_col_rearrange_fx( tmp_dm_re_fx, order, i_ts, hMdDec->mixer_mat_fx, b, numch_out ); + } + } + ELSE + { + 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 ) ) + { + Word32 tmpC_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word32 tmpP_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + FOR( j = 0; j < numch_out; j++ ) + { + set32_fx( tmpC_re_fx[j], 0, numch_out ); + set32_fx( tmpP_re_fx[j], 0, numch_out ); + } + + FOR( j = 0; j < numch_out; j++ ) + { + set32_fx( tmpC_re_fx[j], 0, numch_out ); + } + + FOR( k = 0; k < dmx_ch; k++ ) + { + tmpC_re_fx[k][k] = ONE_IN_Q22; + move32(); + } + + FOR( j = dmx_ch; j < numch_out; j++ ) + { + 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 + move32(); + } + } + + FOR( j = dmx_ch; j < numch_out; j++ ) + { + FOR( k = dmx_ch; k < numch_out; k++ ) + { + 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 + move32(); + } + ELSE + { + tmpP_re_fx[j][k] = 0; + move32(); + } + } + } + + + FOR( j = 1; j < numch_out; j++ ) + { + FOR( k = dmx_ch; k < numch_out; k++ ) + { + 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 = 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 ); + move32(); + } + } + } + + + FOR( j = 0; j < numch_out; j++ ) + { + FOR( k = 0; k < dmx_ch; k++ ) + { + 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 = 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 ); + 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] ); + } + } + + /* band mixing */ + IF( EQ_16( bw, IVAS_RED_BAND_FACT ) ) + { + FOR( b = 0; b < num_bands_out; b = b + bw ) + { + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; + move16(); + FOR( j = 0; j < numch_out; j++ ) + { + 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]; + move32(); + } + } + + FOR( j = 0; j < numch_out; j++ ) + { + 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]; + + move32(); + } + } + } + } + } + + return; +} +#endif +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* * Function ivas_mat_col_rearrange() * @@ -2136,7 +2670,39 @@ static void ivas_mat_col_rearrange( return; } +#else +/*-----------------------------------------------------------------------------------------* +* Function ivas_mat_col_rearrange() +* +* reorders the input matrix based on order +*-----------------------------------------------------------------------------------------*/ + +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 +) +{ + Word16 i, j, idx; + + FOR( i = 0; i < num_ch; i++ ) + { + idx = order[i]; + move16(); + + 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); + move32(); + } + } + return; +} +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_spar_dec_gen_umx_mat() @@ -2164,7 +2730,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] = hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + 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); move32(); } } @@ -2175,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] = hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + 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); move32(); } } @@ -2189,7 +2755,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] = hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + 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); move32(); } } @@ -2199,7 +2765,7 @@ void ivas_spar_dec_gen_umx_mat_fx( ivas_spar_dec_compute_ramp_down_post_matrix_fx( hMdDec, num_bands_out, bfi, num_md_sub_frames); return; } -#endif // IVAS_FLOAT_FIXED +#else // IVAS_FLOAT_FIXED void ivas_spar_dec_gen_umx_mat( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ @@ -2258,6 +2824,7 @@ void ivas_spar_dec_gen_umx_mat( return; } +#endif static void ivas_spar_md_band_upmix( ivas_band_coeffs_t *band_coeffs, @@ -2279,20 +2846,26 @@ static void ivas_spar_md_band_upmix( idx = i * bw_fact + b; for ( ii = 0; ii < 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]; } for ( ii = 0; ii < ndec; ii++ ) { for ( jj = 0; jj < 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]; } } 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]; } valid_bands[idx] = valid_bands[i]; @@ -2310,6 +2883,7 @@ static void ivas_spar_md_band_upmix( * Parse SPAR MD bitstream *-----------------------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st0, @@ -2327,7 +2901,6 @@ static void ivas_spar_dec_parse_md_bs( int16_t strat, no_ec; int16_t do_diff[IVAS_MAX_NUM_BANDS]; float quant[IVAS_SPAR_MAX_C_COEFF]; - Word32 quant_fx[IVAS_SPAR_MAX_C_COEFF]; int16_t do_repeat[IVAS_MAX_NUM_BANDS]; *dtx_vad = 1; *bands_bw = 1; @@ -2382,9 +2955,7 @@ static void ivas_spar_dec_parse_md_bs( 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; - hMdDec->spar_md.band_coeffs[i].P_re_fx[j] = 0; } hMdDec->valid_bands[i] = 1; } @@ -2396,7 +2967,6 @@ static void ivas_spar_dec_parse_md_bs( 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; } } } @@ -2490,7 +3060,6 @@ static void ivas_spar_dec_parse_md_bs( ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[( *bands_bw ) * i]; 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 ); j = 0; for ( ii = 0; ii < ndec; ii++ ) @@ -2498,13 +3067,11 @@ static void ivas_spar_dec_parse_md_bs( for ( jj = 0; jj < 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++; } } 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 ) ); j = 0; for ( ii = 0; ii < ndec; ii++ ) @@ -2512,13 +3079,11 @@ static void ivas_spar_dec_parse_md_bs( for ( jj = 0; jj < 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++; } } 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 ); /* Store prior coefficient indices */ for ( j = 0; j < ndm + ndec - 1; j++ ) @@ -2553,98 +3118,3952 @@ static void ivas_spar_dec_parse_md_bs( return; } - - -/*-----------------------------------------------------------------------------------------* - * Function ivas_decode_arith_bs() - * - * Decode bitstream with arith decoder - *-----------------------------------------------------------------------------------------*/ - -static void ivas_decode_arith_bs( +#else +static void ivas_spar_dec_parse_md_bs_fx( ivas_spar_md_dec_state_t *hMdDec, - Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ - const uint16_t qsi, - const int16_t nB, - const int16_t bands_bw, - int16_t *pDo_diff, - const int16_t strat, - const int32_t ivas_total_brate ) + 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) { - int16_t i, ndm, ndec; - int16_t j; - ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; - ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; - ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; - ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; - int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; - int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; - int16_t any_diff; + int16_t i, j, k, num_bands; + int16_t ii, jj, ndec, ndm; + uint16_t 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]; + Word32 quant_fx[IVAS_SPAR_MAX_C_COEFF]; + int16_t do_repeat[IVAS_MAX_NUM_BANDS]; + *dtx_vad = 1; + *bands_bw = 1; + qsi = 0; + num_bands = hMdDec->spar_md.num_bands; - for ( i = 0; i < nB; i++ ) + if ( ivas_total_brate > IVAS_SID_5k2 ) { - ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; - ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; - if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) - { - pred_cell_dims[i].dim1 = 0; - pred_cell_dims[i].dim2 = 0; - drct_cell_dims[i].dim1 = 0; - drct_cell_dims[i].dim2 = 0; - decd_cell_dims[i].dim1 = 0; - decd_cell_dims[i].dim2 = 0; - decx_cell_dims[i].dim1 = 0; - decx_cell_dims[i].dim2 = 0; - } - else + if ( hMdDec->spar_md_cfg.quant_strat_bits > 0 ) { - pred_cell_dims[i].dim1 = ndm + ndec - 1; - if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT ) { - if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + /*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 ) { - pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + *dtx_vad = 0; } } - pred_cell_dims[i].dim2 = 1; - drct_cell_dims[i].dim1 = ndec; - drct_cell_dims[i].dim2 = ndm - 1; - decd_cell_dims[i].dim1 = ndec; - decd_cell_dims[i].dim2 = 1; - decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; - decx_cell_dims[i].dim2 = 1; + else + { + if ( sba_inactive_mode == 1 ) + { + *dtx_vad = 0; + qsi = hMdDec->spar_md_cfg.quant_strat_bits + 1; + } + else + { + qsi = get_next_indice( st0, hMdDec->spar_md_cfg.quant_strat_bits ); + } + } + } + else + { + qsi = 0; } } + else + { + *dtx_vad = 0; + } - any_diff = 0; - for ( i = 0; i < nB; i++ ) + hMdDec->dtx_vad = *dtx_vad; + + if ( *dtx_vad == 0 ) { - if ( pDo_diff[i] != 0 ) + *nB = SPAR_DTX_BANDS; + *bands_bw = num_bands / *nB; + + for ( i = 0; i < *nB; i++ ) { - any_diff = 1; - break; + 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; + hMdDec->spar_md.band_coeffs[i].P_re_fx[j] = 0; + } + hMdDec->valid_bands[i] = 1; } - } - if ( any_diff == 1 ) - { - if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + for ( i = 0; i < num_bands; i++ ) { - for ( i = 0; i < nB; i++ ) + for ( j = 0; j < ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ); j++ ) { - if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + for ( k = 0; k < ( IVAS_SPAR_MAX_DMX_CHS - 1 ); k++ ) { - for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) - { - hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j] = - hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; - } + //hMdDec->spar_md.band_coeffs[i].C_re[j][k] = 0; + hMdDec->spar_md.band_coeffs[i].C_re_fx[j][k] = 0; } } } - ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF ); - } + 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 ) + { + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + ivas_spar_md_band_upmix( + hMdDec->spar_md.band_coeffs, + nB, + bands_bw, + hMdDec->valid_bands, + 1, + ndec, + ndm ); + } + + return; + } + + qs = hMdDec->spar_md_cfg.quant_strat[qsi]; + + strat = get_next_indice( st0, 3 ); + + no_ec = 0; + + if ( strat < 2 ) + { + *bands_bw = strat + 1; + *nB = num_bands / *bands_bw; + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = 0; + } + } + else if ( strat < 4 ) + { + *bands_bw = strat - 1; + *nB = num_bands / *bands_bw; + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = 0; + } + no_ec = 1; + } + else if ( ivas_total_brate < IVAS_24k4 ) + { + *bands_bw = 2; + *nB = num_bands / *bands_bw; + + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = ( ( strat % 2 ) == ( ( i + 1 ) % 2 ) ); + } + } + else + { + *bands_bw = 1; + *nB = num_bands; + + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); + do_repeat[i] = 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; + + if ( no_ec == 0 ) + { + ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, strat, ivas_total_brate ); + } + else + { + ivas_decode_huffman_bs( hMdDec, st0, qsi, *nB, *bands_bw ); + } + + 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]; + + //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 ); + + j = 0; + for ( ii = 0; ii < ndec; ii++ ) + { + for ( jj = 0; jj < 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++; + } + } + + //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 ) ); + + j = 0; + for ( ii = 0; ii < ndec; ii++ ) + { + for ( jj = 0; jj < 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++; + } + } + + //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 ); + + /* Store prior coefficient indices */ + for ( j = 0; j < 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]; + } + for ( j = 0; j < ndec * ( 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]; + } + 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]; + } + hMdDec->valid_bands[i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0; + } + + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + if ( *bands_bw != 1 ) + { + ivas_spar_md_band_upmix( + hMdDec->spar_md.band_coeffs, + nB, + bands_bw, + hMdDec->valid_bands, + 1, + ndec, + ndm ); + } + + + return; +} +#endif + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_decode_arith_bs() + * + * Decode bitstream with arith decoder + *-----------------------------------------------------------------------------------------*/ + +static void ivas_decode_arith_bs( + ivas_spar_md_dec_state_t *hMdDec, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const uint16_t qsi, + const int16_t nB, + const int16_t bands_bw, + int16_t *pDo_diff, + const int16_t strat, + const int32_t ivas_total_brate ) +{ + int16_t i, ndm, ndec; + int16_t j; + ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; + int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; + int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; + int16_t any_diff; + + for ( i = 0; i < nB; i++ ) + { + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) + { + pred_cell_dims[i].dim1 = 0; + pred_cell_dims[i].dim2 = 0; + drct_cell_dims[i].dim1 = 0; + drct_cell_dims[i].dim2 = 0; + decd_cell_dims[i].dim1 = 0; + decd_cell_dims[i].dim2 = 0; + decx_cell_dims[i].dim1 = 0; + decx_cell_dims[i].dim2 = 0; + } + else + { + pred_cell_dims[i].dim1 = ndm + ndec - 1; + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + } + } + pred_cell_dims[i].dim2 = 1; + drct_cell_dims[i].dim1 = ndec; + drct_cell_dims[i].dim2 = ndm - 1; + decd_cell_dims[i].dim1 = ndec; + decd_cell_dims[i].dim2 = 1; + decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; + decx_cell_dims[i].dim2 = 1; + } + } + + any_diff = 0; + for ( i = 0; i < nB; i++ ) + { + if ( pDo_diff[i] != 0 ) + { + any_diff = 1; + break; + } + } + + if ( any_diff == 1 ) + { + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + for ( i = 0; i < nB; i++ ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) + { + hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j] = + hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + } + } + } + } + + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF ); + } + + ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.pred_arith_re[qsi], &hMdDec->arith_coeffs.pred_arith_re_diff[qsi], + st0, pred_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re ); + + ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF ); + + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + for ( i = 0; i < nB; i++ ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- ) + { + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )] = + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j]; + } + for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + { + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; + } + } + } + } + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, drct_cell_dims, DRCT_COEFF ); + } + + ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.drct_arith_re[qsi], &hMdDec->arith_coeffs.drct_arith_re_diff[qsi], + st0, drct_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re ); + + ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, drct_cell_dims, DRCT_COEFF ); + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decd_cell_dims, DECD_COEFF ); + } + + ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.decd_arith_re[qsi], &hMdDec->arith_coeffs.decd_arith_re_diff[qsi], + st0, decd_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re ); + + ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF ); + + if ( any_diff == 1 ) + { + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF ); + } + + ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF ); + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function ivas_fill_band_coeffs_idx() + * + * Copy pred band coeffs to arr + *-----------------------------------------------------------------------------------------*/ + +static void ivas_fill_band_coeffs_idx( + ivas_band_coeffs_ind_t *pBands_idx, + const int16_t nB, + int16_t *pSymbol_re, + ivas_cell_dim_t *pCell_dims, + const ivas_coeffs_type_t coeff_type ) +{ + int16_t i, len; + int16_t *pPtr_idx = NULL; + + for ( i = 0; i < nB; i++ ) + { + switch ( coeff_type ) + { + case PRED_COEFF: + { + pPtr_idx = pBands_idx[i].pred_index_re; + break; + } + case DRCT_COEFF: + { + pPtr_idx = pBands_idx[i].drct_index_re; + break; + } + case DECD_COEFF: + { + pPtr_idx = pBands_idx[i].decd_index_re; + break; + } + case DECX_COEFF: + { + break; + } + + default: + assert( !"unsupported config!" ); + } + + if ( coeff_type != DECX_COEFF ) + { + len = pCell_dims[i].dim1 * pCell_dims[i].dim2; + mvs2s( pSymbol_re, pPtr_idx, len ); + pSymbol_re += len; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_decode_huffman_bs() + * + * Decode bitstream with huffman decoder + *-----------------------------------------------------------------------------------------*/ + +static void ivas_decode_huffman_bs( + ivas_spar_md_dec_state_t *hMdDec, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const uint16_t qsi, + const int16_t nB, + const int16_t bands_bw ) +{ + int16_t i, j; + int16_t ndm, ndec; + int16_t pred_dim, drct_dim, decd_dim, pred_offset; + + for ( i = 0; i < nB; i++ ) + { + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; + + pred_dim = ndec + ndm - 1; + drct_dim = ndec * ( ndm - 1 ); + decd_dim = ndec; + pred_offset = 0; + + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_offset = FOA_CHANNELS - 1; + } + } + + for ( j = pred_offset; j < pred_dim; j++ ) + { + ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] ); + } + + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = 0; j < pred_offset; j++ ) + { + hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; + } + } + } + + for ( j = 0; j < drct_dim; j++ ) + { + ivas_huffman_decode( &hMdDec->huff_coeffs.drct_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].drct_index_re[j] ); + } + + for ( j = 0; j < decd_dim; j++ ) + { + ivas_huffman_decode( &hMdDec->huff_coeffs.decd_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j] ); + } + } + + return; +} + +static void ivas_spar_plc_get_band_age( + const int16_t *valid_bands, + int16_t *base_band_age, + const int16_t num_bands, + int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS], + int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], + int16_t *all_valid, + int16_t *b_idx ) +{ + int16_t b, idx; + + set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); + set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); + idx = -1; + *all_valid = 1; + for ( b = 0; b < num_bands; b++ ) + { + if ( valid_bands[b] != 0 ) + { + base_band_age[b] = 0; /* reset band age */ + idx++; + valid_band_idx[idx] = b; + } + else + { + base_band_age[b] += 1; /* increment the age of invalid bands */ + + if ( base_band_age[b] > 3 ) + { + last_valid_band_idx[b] = idx; + } + *all_valid = 0; + } + } + *b_idx = idx; + + return; +} + +static void ivas_spar_get_plc_interp_weights( + int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], + int16_t last_valid_band_idx, + int16_t idx, + int16_t b, + float *w, + int16_t *id0, + int16_t *id1 ) +{ + if ( last_valid_band_idx < 0 ) /* Extrapolation */ + { + *id1 = valid_band_idx[0]; + *id0 = 0; + *w = 1; + } + else if ( last_valid_band_idx == idx ) /* Extrapolation */ + { + *id1 = valid_band_idx[last_valid_band_idx]; + *id0 = valid_band_idx[last_valid_band_idx]; + *w = 0; + } + else /* Interpolation */ + { + *id0 = valid_band_idx[last_valid_band_idx]; + *id1 = valid_band_idx[last_valid_band_idx + 1]; + *w = ( (float) ( b - *id0 ) ) / ( *id1 - *id0 ); + } + return; +} + +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 *w, + int16_t *id0, + int16_t *id1) +{ + if (last_valid_band_idx < 0) /* Extrapolation */ + { + *id1 = valid_band_idx[0]; + *id0 = 0; + *w = MAX_WORD16; + } + else if (last_valid_band_idx == idx) /* Extrapolation */ + { + *id1 = valid_band_idx[last_valid_band_idx]; + *id0 = valid_band_idx[last_valid_band_idx]; + *w = 0; + } + else /* Interpolation */ + { + *id0 = valid_band_idx[last_valid_band_idx]; + *id1 = valid_band_idx[last_valid_band_idx + 1]; + if ((b - *id0) == 0) + { + *w = 0; + } + else + { + *w = divide3232((b - *id0), (*id1 - *id0)); + } + } + return; +} + +#ifdef IVAS_FLOAT_FIXED +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_fill_invalid_bands_fx() + * + * Fill invalid bands in interpolation/extrapolation of valid bands + * when PLC is to be done with partial time differential coding + *-----------------------------------------------------------------------------------------*/ +static void ivas_spar_md_fill_invalid_bands_fx( + ivas_spar_dec_matrices_t *pSpar_coeffs, + ivas_spar_dec_matrices_t *pSpar_coeffs_prev, + const Word16 *valid_bands, + Word16 *base_band_age, + const Word16 num_bands, + const Word16 num_channels, + const Word16 num_md_sub_frames ) +{ + Word16 i, j, b, all_valid; + Word16 valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; + Word16 last_valid_band_idx[IVAS_MAX_NUM_BANDS]; + Word16 w_fx = 0; + 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) ) + { + FOR ( b = 0; b < num_bands; b++ ) + { + /* check against non zero in if and else if */ + + IF ( GT_16(base_band_age[b] , 3) ) /* old invalid bands */ + { + 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 ( i = 0; i < num_channels; i++ ) + { + FOR ( j = 0; j < num_channels; j++ ) + { + pSpar_coeffs->C_re_fx[i][j][b] = L_add(Mpy_32_16_1(pSpar_coeffs->C_re_fx[i][j][id0], sub(MAX_WORD16, w_fx)), Mpy_32_16_1(pSpar_coeffs->C_re_fx[i][j][id1], w_fx)); + move32(); + pSpar_coeffs->P_re_fx[i][j][b] = L_add(Mpy_32_16_1(pSpar_coeffs->P_re_fx[i][j][id0], sub(MAX_WORD16, w_fx)), Mpy_32_16_1(pSpar_coeffs->P_re_fx[i][j][id1], w_fx)); + move32(); + } + } + } + ELSE /* young invalid bands */ + { + IF ( EQ_16(valid_bands[b] , 0) ) + { + FOR ( i = 0; i < num_channels; i++ ) + { + FOR ( j = 0; j < num_channels; j++ ) + { + pSpar_coeffs->C_re_fx[i][j][b] = pSpar_coeffs_prev->C_re_fx[i][j][b]; + move32(); + pSpar_coeffs->P_re_fx[i][j][b] = pSpar_coeffs_prev->P_re_fx[i][j][b]; + move32(); + } + } + } + } + + IF ( EQ_16(valid_bands[b] , 0) ) + { + Word16 i_ts; + FOR ( i = 0; i < num_channels; i++ ) + { + FOR ( j = 0; j < num_channels; j++ ) + { + 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]; + move32(); + pSpar_coeffs->P_re_fx[i][j][add(b , i_ts * IVAS_MAX_NUM_BANDS)] = pSpar_coeffs->P_re_fx[i][j][b]; + move32(); + } + } + } + } + } + } + + return; +} +#else +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_fill_invalid_bands() + * + * Fill invalid bands in interpolation/extrapolation of valid bands + * when PLC is to be done with partial time differential coding + *-----------------------------------------------------------------------------------------*/ +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 num_channels, + const int16_t num_md_sub_frames ) +{ + int16_t i, j, 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; + 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 ) + { + for ( b = 0; b < num_bands; b++ ) + { + /* check against non zero in if and else if */ + if ( base_band_age[b] > 3 ) /* 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 ); + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + pSpar_coeffs->C_re[i][j][b] = ( 1 - w ) * pSpar_coeffs->C_re[i][j][id0] + w * pSpar_coeffs->C_re[i][j][id1]; + pSpar_coeffs->P_re[i][j][b] = ( 1 - w ) * pSpar_coeffs->P_re[i][j][id0] + w * pSpar_coeffs->P_re[i][j][id1]; + } + } + } + else /* young invalid bands */ + { + if ( valid_bands[b] == 0 ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + pSpar_coeffs->C_re[i][j][b] = pSpar_coeffs_prev->C_re[i][j][b]; + pSpar_coeffs->P_re[i][j][b] = pSpar_coeffs_prev->P_re[i][j][b]; + } + } + } + } + + if ( valid_bands[b] == 0 ) + { + int16_t i_ts; + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) + { + pSpar_coeffs->C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->C_re[i][j][b]; + pSpar_coeffs->P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->P_re[i][j][b]; + } + } + } + } + } + } + + return; +} +#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 int16_t *valid_bands, + int16_t *base_band_age, + int16_t *first_valid_frame, + const int16_t 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 w_fx = 0; + + 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 ) + { + 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 */ + { + int16_t id0, id1; + //ivas_spar_get_plc_interp_weights( valid_band_idx, last_valid_band_idx[b], + // idx, b, &w, &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++ ) + { + //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)); + } + + 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++ ) + { + // 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)); + } + } + + 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)); + } + } + else /* young invalid bands */ + { + if ( valid_bands[b] == 0 ) + { + 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]; + } + + 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++ ) + { + //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]; + } + } + + 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]; + } + } + } + } + } + else + { + *first_valid_frame = 1; + } + + return; +} +#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 ) +{ + 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; + + 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 ) + { + 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 */ + { + int16_t id0, id1; + ivas_spar_get_plc_interp_weights( valid_band_idx, last_valid_band_idx[b], + idx, b, &w, &id0, &id1 ); + + 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]; + } + + 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++ ) + { + pBand_coeffs[b].C_re[j][k] = ( 1 - w ) * pBand_coeffs[id0].C_re[j][k] + w * pBand_coeffs[id1].C_re[j][k]; + } + } + + 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]; + } + } + else /* young invalid bands */ + { + if ( valid_bands[b] == 0 ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + pBand_coeffs[b].pred_re[j] = pBand_coeffs_prev[b].pred_re[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++ ) + { + pBand_coeffs[b].C_re[j][k] = pBand_coeffs_prev[b].C_re[j][k]; + } + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + pBand_coeffs[b].P_re[j] = pBand_coeffs_prev[b].P_re[j]; + } + } + } + } + } + else + { + *first_valid_frame = 1; + } + + return; +} +#endif + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_dec_compute_ramp_down_post_matrix_fx() + * + * + *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( + ivas_spar_md_dec_state_t *hMdDec, + const Word16 num_bands_out, + const Word16 bfi, + const Word16 num_md_sub_frames) +{ + Word16 num_in_ch, num_out_ch, i, j, b; + num_in_ch = hMdDec->spar_md_cfg.num_umx_chs; + num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; + move16(); + move16(); + IF ( EQ_16(bfi , 0 )) + { + hMdDec->spar_plc_num_lost_frames = 0; + move16(); + } + ELSE + { + IF (EQ_16(hMdDec->td_decorr_flag , 0) ) + { + assert( 0 ); + } + + hMdDec->spar_plc_num_lost_frames =add(hMdDec->spar_plc_num_lost_frames, 1); + hMdDec->spar_plc_num_lost_frames = s_min( hMdDec->spar_plc_num_lost_frames, 100 ); /*hMdDec->spar_plc_num_lost_frames is always <=100*/ + + 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 */ + { + Word16 num_fade_frames; + Word16 gain_dB; + Word32 gain_fx; + Word32 post_matrix_fx[IVAS_SPAR_MAX_CH]; + Word16 Q_post_matrix; + Word16 Q_gain; + 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 = 0; /*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 ), 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*/ + } + Q_post_matrix = sub(add(Q_gain, norm_nff), 15); + /* apply the post matrix */ + FOR ( Word16 i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + FOR ( i = 0; i < num_out_ch; i++ ) + { + FOR ( j = 0; j < num_in_ch; j++ ) + { + 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->Q_mixer_mat = sub(add(Q_post_matrix, hMdDec->Q_mixer_mat), 31); + } + } + + 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, + const int16_t bfi, + const int16_t num_md_sub_frames ) +{ + int16_t num_in_ch, num_out_ch, i, j, b; + + num_in_ch = hMdDec->spar_md_cfg.num_umx_chs; + num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; + + if ( bfi == 0 ) + { + hMdDec->spar_plc_num_lost_frames = 0; + } + else + { + if ( hMdDec->td_decorr_flag == 0 ) + { + assert( 0 ); + } + + hMdDec->spar_plc_num_lost_frames += 1; + hMdDec->spar_plc_num_lost_frames = min( hMdDec->spar_plc_num_lost_frames, 100 ); + + if ( hMdDec->spar_plc_num_lost_frames > ivas_spar_dec_plc_num_frames_keep ) + { + int16_t num_fade_frames; + int16_t gain_dB; + float gain; + float post_matrix[IVAS_SPAR_MAX_CH]; + + num_fade_frames = max( hMdDec->spar_plc_num_lost_frames - ivas_spar_dec_plc_num_frames_keep, 0 ); + gain_dB = -min( num_fade_frames, ivas_spar_dec_plc_max_num_frames_ramp_down ) * ivas_spar_dec_plc_per_frame_ramp_down_gain_dB; + gain = powf( 10, ( ( (float) gain_dB ) / 20 ) ); + + for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) + { + post_matrix[i] = 1 + min( ( (float) num_fade_frames ) / ivas_spar_dec_plc_num_frames_fade_out, 1 ) * ( ivas_spar_dec_plc_spatial_target[i] - 1 ); + post_matrix[i] *= gain; + } + + /* apply the post matrix */ + for ( int16_t i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( i = 0; i < num_out_ch; i++ ) + { + for ( j = 0; j < num_in_ch; j++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] *= post_matrix[i]; + } + } + } + } + } + } + + return; +} +#endif // IVAS_FLOAT_FIXED + + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_unquant_dtx_indicies() + * + * Unquantize SPAR MD DYX indices + *-----------------------------------------------------------------------------------------*/ +#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 ) +{ + int16_t i, b; + int16_t q_lvl; + //float val; + Word32 val_fx; + int16_t 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]; + pr_min_max_fx[1] = pSpar_md->min_max_fx[1]; + + for ( b = 0; b < nB; b++ ) + { + 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); + + idx = pSpar_md->band_coeffs_idx[b].pred_index_re[i]; + 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 + } + + for ( i = 0; i < FOA_CHANNELS - ndm_per_band[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); + + idx = pSpar_md->band_coeffs_idx[b].decd_index_re[i]; + 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 + } + } + + return; +} +#else +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) +{ + int16_t i, b; + int16_t q_lvl; + float val; + int16_t idx; + float pr_min_max[2]; + + pr_min_max[0] = pSpar_md->min_max[0]; + pr_min_max[1] = pSpar_md->min_max[1]; + + for (b = 0; b < nB; b++) + { + 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; + } + + for (i = 0; i < FOA_CHANNELS - ndm_per_band[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; + } + } + + return; +} +#endif + +/*-----------------------------------------------------------------------------------------* + * Function ivas_parse_parameter_bitstream_dtx() + * + * parse DTX bitstream parameters + *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +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 ) +{ + int16_t i, j, ndec, ndm; + //float val; + Word32 val_fx; + int16_t idx; + //float pr_min_max[2]; + 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; + + sid_bits_len = st0->next_bit_pos; + //pr_min_max[0] = pSpar_md->min_max[0]; + pr_min_max_fx[0] = pSpar_md->min_max_fx[0]; + //pr_min_max[1] = pSpar_md->min_max[1]; + pr_min_max_fx[1] = pSpar_md->min_max_fx[1]; + + for ( i = 0; i < num_bands; i++ ) + { + ndec = num_dec_per_band[bw * i]; + ndm = num_dmx_per_band[bw * i]; + + 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; + + pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0]; + pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1]; + pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0]; + pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1]; + + 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]; + + if ( ( j + 1 ) > ndec ) + { + pd_q_lvls = 1; + } + else + { + pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1]; + } + + pr_pd_bits = ivas_get_bits_to_encode( 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]; + 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 ); + 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; + + //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 ); + 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; + + if ( ( j + 1 ) <= ndec ) + { + pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1] = pd; + } + + pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1] = pr; + } + } + } + + 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; + assert( zero_pad_bits >= 0 ); + if ( num_dmx_per_band[0] == 2 ) + { + zero_pad_bits -= 1; + } + + for ( j = 0; j < zero_pad_bits; j++ ) + { + get_next_indice( st0, 1 ); + } + + ivas_spar_unquant_dtx_indicies( pSpar_md, num_bands, bw, num_dmx_per_band ); + + return; +} +#else +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 ) +{ + int16_t i, j, ndec, ndm; + float val; + int16_t idx; + float pr_min_max[2]; + int16_t pr_q_lvls, pr, pd, pd_q_lvls, pr_pd_bits; + int16_t zero_pad_bits, sid_bits_len; + + sid_bits_len = st0->next_bit_pos; + pr_min_max[0] = pSpar_md->min_max[0]; + pr_min_max[1] = pSpar_md->min_max[1]; + + for ( i = 0; i < num_bands; i++ ) + { + ndec = num_dec_per_band[bw * i]; + ndm = num_dmx_per_band[bw * i]; + + 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; + + pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0]; + pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1]; + pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0]; + pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1]; + + 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]; + + if ( ( j + 1 ) > ndec ) + { + pd_q_lvls = 1; + } + else + { + pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1]; + } + + pr_pd_bits = ivas_get_bits_to_encode( 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]; + ivas_quantise_real_values( &val, pd_q_lvls, dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &idx, &val, 1 ); + pd = pd + idx; + + val = pr_min_max[0]; + ivas_quantise_real_values( &val, pr_q_lvls, pr_min_max[0], pr_min_max[1], &idx, &val, 1 ); + pr = pr + idx; + + if ( ( j + 1 ) <= ndec ) + { + pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1] = pd; + } + + pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1] = pr; + } + } + } + + 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; + assert( zero_pad_bits >= 0 ); + if ( num_dmx_per_band[0] == 2 ) + { + zero_pad_bits -= 1; + } + + for ( j = 0; j < zero_pad_bits; j++ ) + { + get_next_indice( st0, 1 ); + } + + ivas_spar_unquant_dtx_indicies( pSpar_md, num_bands, bw, num_dmx_per_band ); + + return; +} +#endif + +/*-----------------------------------------------------------------------------------------* + * Function ivas_deindex_real_index() + * + * Deindex real index + *-----------------------------------------------------------------------------------------*/ + +#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 dim ) +{ + int16_t i; + float q_step; + + if ( q_levels == 0 ) + { + return IVAS_ERR_INTERNAL; + } + + if ( q_levels == 1 ) + { + for ( i = 0; i < dim; i++ ) + { + quant[i] = 0; + } + } + else + { + q_step = ( max_value - min_value ) / ( q_levels - 1 ); + for ( i = 0; i < dim; i++ ) + { + quant[i] = index[i] * q_step; + } + } + + return IVAS_ERR_OK; +} +#else + +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 dim) +{ + int16_t i; + Word32 q_step_fx; + if (q_levels == 0) + { + return IVAS_ERR_INTERNAL; + } + + if (q_levels == 1) + { + for (i = 0; i < dim; i++) + { + quant[i] = 0; + } + } + 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++) + { + quant[i] = Mpy_32_32(L_shl(index[i], 31 - 6), q_step_fx);//(25+28)-31 = 22 + } + } + + return IVAS_ERR_OK; +} +#endif + + +#ifndef IVAS_FLOAT_FIXED +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_to_dirac() + * + * + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_to_dirac( + 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 ) +{ + 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]; + int16_t sba_order_internal; + float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float ele_dirac[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]; + float radius; + float en_ratio, res_pow; + 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]; + 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; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + active_w = ( dyn_active_w_flag == 1 ) || ( hMdDec->spar_md_cfg.active_w == 1 ); + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + start_band = 0; + end_band = 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( 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++ ) + { + float PR[3], Pd[3], dvnorm, g_pred; + + PR[0] = hMdDec->spar_md.band_coeffs[band].pred_re[2]; + PR[1] = hMdDec->spar_md.band_coeffs[band].pred_re[0]; + PR[2] = hMdDec->spar_md.band_coeffs[band].pred_re[1]; + g_pred = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; + if ( g_pred <= EPSILON ) + { + dvx[band] = 1.0f; + dvy[band] = 0.0f; + dvz[band] = 0.0f; + } + else + { + g_pred = sqrtf( g_pred ); + dvnorm = 1.0f / g_pred; + dvx[band] = PR[0] * dvnorm; + dvy[band] = PR[1] * dvnorm; + dvz[band] = PR[2] * dvnorm; + } + + radius = sqrtf( dvx[band] * dvx[band] + dvy[band] * dvy[band] ); + azi[band] = (int16_t)(max(-180.0f, min(180.0f, atan2f(dvy[band], dvx[band]) / EVS_PI * 180.0f)) + 0.5f); + ele[band] = (int16_t)(max(-90.0f, min(180.0f, atan2f(dvz[band], radius) / EVS_PI * 180.0f)) + 0.5f); + + if ( st_ivas->nchan_transport == 1 ) + { + float w_en_norm, f_scale; + if ( active_w ) + { + if ( dtx_vad == 0 ) + { + f_scale = IVAS_ACTIVEW_DM_F_SCALE_DTX; + } + else + { + f_scale = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; + } + } + else + { + f_scale = 0.0f; + } + + w_en_norm = ( 1.0f - ( f_scale * g_pred * g_pred ) ); + w_en_norm *= w_en_norm; + + 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]; + en_ratio = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; + res_pow = w_en_norm + en_ratio + ( Pd[0] * Pd[0] + Pd[1] * Pd[1] + Pd[2] * Pd[2] ); + 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.ref_pow_slow[band] = 0.75f * hMdDec->spar_md.ref_pow_slow[band] + 0.25f * res_pow; + en_ratio = sqrtf( hMdDec->spar_md.en_ratio_slow[band] ) / ( hMdDec->spar_md.ref_pow_slow[band] + EPSILON ); + } + else + { + en_ratio = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; + hMdDec->spar_md.en_ratio_slow[band] = 0.75f * hMdDec->spar_md.en_ratio_slow[band] + 0.25f * en_ratio; + en_ratio = sqrtf( hMdDec->spar_md.en_ratio_slow[band] ); + } + diffuseness[band] = 1.0f - en_ratio; /*compute diffuseness*/ + diffuseness[band] = ( ( diffuseness[band] < 1.0f ) ? ( ( diffuseness[band] < 0.0f ) ? 0.f : diffuseness[band] ) : 1.0f ); + } + + for ( band = start_band; band < end_band; band++ ) + { + int16_t azi_dith, ele_dith; + tmp_write_idx_param_band = hDirAC->spar_to_dirac_write_idx; + + en_ratio = 1.0f - diffuseness[band]; + masa_sq( 1.0f - en_ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + + qmf_band_start = band_grouping[band]; + qmf_band_end = band_grouping[band + 1]; + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + int16_t ts_start, ts_end, ts; + + ts_start = DirAC_block_grouping[block]; + ts_end = DirAC_block_grouping[block + 1]; + for ( b = qmf_band_start; b < qmf_band_end; b++ ) + { + + azi_dith = azi[band]; + ele_dith = ele[band]; + + hSpatParamRendCom->energy_ratio1[block][b] = en_ratio; + tmp_write_idx_band = tmp_write_idx_param_band; + + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness[band]; + } + else + { + for ( ts = ts_start; ts < ts_end; ts++ ) + { + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness[band]; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + } + tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + + /* update buffer write index */ + 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; + } + else + { + hDirAC->spar_to_dirac_write_idx = ( hDirAC->spar_to_dirac_write_idx + CLDFB_NO_COL_MAX ) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + else + { + band = end_band; + } + + /*read DirAC metadata, convert DirAC to SPAR*/ + for ( ; band < num_bands_out / bw; band++ ) + { + int16_t dirac_band_idx; + + dirac_band_idx = dirac_to_spar_md_bands[band] - enc_param_start_band; + + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( st_ivas->hQMetaData->useLowerRes ) + { + num_subframes = 1; + } + + 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; + } + 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]; + } + + diffuseness[band] = 1.0f - st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; + } + + /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ + if ( hMdDec->spar_md_cfg.nchan_transport > 1 ) + { + 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 ); + + /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ + for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) + { + 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]; + } + } + } + + int16_t 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 ); + 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 ); + + 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 ( 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]; + } + 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]; + } + } + } + } + + /* expand DirAC TC 20ms MD for residual channels to all subframes*/ + for ( block = 0; block < num_md_sub_frames; block++ ) + { + 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) */ + { + if ( ivas_is_res_channel( 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]; + } + } + } + } + + for ( b = end_band * bw; b < num_bands_out; b++ ) + { + hMdDec->valid_bands[b] = 1; + } + + return; +} + +#else +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) +{ + 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]; + Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS]; + int16_t sba_order_internal; + //float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + 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]; + 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, res_pow_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]; + 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; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + active_w = (dyn_active_w_flag == 1) || (hMdDec->spar_md_cfg.active_w == 1); + sba_order_internal = min(st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER); + start_band = 0; + end_band = 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(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++) + { + //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]; + PR_fx[1] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[0]; + //PR[2] = hMdDec->spar_md.band_coeffs[band].pred_re[1]; + 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]); + q_g_pred = Q22 + Q22 - Q31; + q_dvnorm = Q31 - q_g_pred; + q_g_pred = q_dvnorm; + IF ( LE_32 (g_pred_fx, EPSILON_FIX ) ) + { + dvx_fx[band] = ONE_IN_Q22; + dvy_fx[band] = 0; + dvz_fx[band] = 0; + + azi[band] = 0; + ele[band] = 0; + q_g_pred = Q22; + q_dvnorm = Q22; + } + 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) + { + g_pred_fx = L_shr(g_pred_fx, (-1 * q_g_pred)); + q_g_pred = 0; + } + + /*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); + dvy_fx[band] = Mpy_32_32(PR_fx[1], dvnorm_fx); + dvz_fx[band] = Mpy_32_32(PR_fx[2], dvnorm_fx); + Word16 q_1 = (22) + (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; + 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)) + { + check_azi_fx_res = negate(divide3232(L_negate(check_azi_fx_32), 1686629760)); + } + ELSE + { + 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)); + + Word16 check_ele_fx = BASOP_util_atan2(dvz_fx[band], radius_fx, (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)) + { + check_ele_fx_res = negate(divide3232(L_negate(check_ele_fx_32), 1686629760)); + } + 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)); + + + + //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); + ele[band] = max(-90, min(180, ele_res)); + } + + if (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 (dtx_vad == 0) + { + //f_scale = IVAS_ACTIVEW_DM_F_SCALE_DTX; + f_scale_fx = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; + } + 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; + } + } + else + { + //f_scale = 0.0f; + f_scale_fx = 0; + } + + //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]; + Pd_fx[0] = hMdDec->spar_md.band_coeffs[band].P_re_fx[1]; + Pd_fx[1] = hMdDec->spar_md.band_coeffs[band].P_re_fx[0]; + 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; + 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 ); + en_ratio_q = 31 - 13; + en_ratio_fx = Sqrt32(hMdDec->spar_md.en_ratio_slow_fx[band], &en_ratio_q); + if (en_ratio_q < 0) + { + en_ratio_fx = L_shr(en_ratio_fx, -1 * (en_ratio_q)); + en_ratio_q = 0; + } + 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]) + { + diffuseness_fx[band] = 0; + } + else if(en_ratio_fx_scaled == 0) + { + diffuseness_fx[band] = ONE_IN_Q30; + } + else if (en_ratio_fx_scaled == hMdDec->spar_md.ref_pow_slow_fx[band]) + { + diffuseness_fx[band] = ONE_IN_Q30; + } + else + { + en_ratio_fx = divide3232(en_ratio_fx_scaled, (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; + } + + } + 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_q = 31 - 13; + en_ratio_fx = Sqrt32( hMdDec->spar_md.en_ratio_slow_fx[band], &en_ratio_q); + if (en_ratio_q < 0) + { + en_ratio_fx = L_shr(en_ratio_fx, -1 * (en_ratio_q)); + en_ratio_q = 0; + } + Word32 en_ratio_fx_scaled = L_shr(en_ratio_fx, 1); + if (en_ratio_fx_scaled > ONE_IN_Q30) + { + diffuseness_fx[band] = 0; + } + else + { + diffuseness_fx[band] = ONE_IN_Q30 - en_ratio_fx_scaled; + } + + } + //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++) + { + int16_t azi_dith, ele_dith; + tmp_write_idx_param_band = hDirAC->spar_to_dirac_write_idx; + + //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]; + qmf_band_end = band_grouping[band + 1]; + + for (block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++) + { + int16_t ts_start, ts_end, ts; + + ts_start = DirAC_block_grouping[block]; + ts_end = DirAC_block_grouping[block + 1]; + for (b = qmf_band_start; b < qmf_band_end; b++) + { + + azi_dith = azi[band]; + ele_dith = ele[band]; + + hSpatParamRendCom->energy_ratio1[block][b] = en_ratio_fx / ((float)ONE_IN_Q30); + + hSpatParamRendCom->energy_ratio1_fx[block][b] = en_ratio_fx; + tmp_write_idx_band = tmp_write_idx_param_band; + + if (hDirAC->hConfig->dec_param_estim == FALSE) + { + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness_fx[band] / ((float)ONE_IN_Q30); + + hSpatParamRendCom->diffuseness_vector_fx[tmp_write_idx_band][b] = diffuseness_fx[band]; + + } + else + { + for (ts = ts_start; ts < ts_end; ts++) + { + hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; + hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; + hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness_fx[band] / ((float)ONE_IN_Q30); + + 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; + } + } + } + tmp_write_idx_param_band = (tmp_write_idx_param_band + num_slots_in_subfr) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + + /* update buffer write index */ + 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; + } + else + { + hDirAC->spar_to_dirac_write_idx = (hDirAC->spar_to_dirac_write_idx + CLDFB_NO_COL_MAX) % hSpatParamRendCom->dirac_md_buffer_length; + } + } + else + { + band = end_band; + } + + /*read DirAC metadata, convert DirAC to SPAR*/ + for (; band < num_bands_out / bw; band++) + { + int16_t dirac_band_idx; + + dirac_band_idx = dirac_to_spar_md_bands[band] - enc_param_start_band; + + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if (st_ivas->hQMetaData->useLowerRes) + { + num_subframes = 1; + } + + 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 ) + { + 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]); + } + //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]; + ele_dirac_fx[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation_fx[block]; +//#endif + } + + //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 + } + + /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ + if (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 + + /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ + for (pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++) + { + 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]; + } + } + } + + int16_t 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) + { + for (band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++) + { + 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) */ + { + //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]; + } + 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]; + } + } + } + } + + /* expand DirAC TC 20ms MD for residual channels to all subframes*/ + for (block = 0; block < num_md_sub_frames; block++) + { + 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) */ + { + if (ivas_is_res_channel(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]; + } + } + } + } + + for (b = end_band * bw; b < num_bands_out; b++) + { + hMdDec->valid_bands[b] = 1; + } + + return; +} +#endif + +#else + +/*------------------------------------------------------------------------------------------* + * Local constants + *------------------------------------------------------------------------------------------*/ + +#define IVAS_DEFAULT_DTX_CNG_RAMP ( 8 ) + +/* 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_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 }; + + +/*------------------------------------------------------------------------------------------* + * Static functions declaration + *------------------------------------------------------------------------------------------*/ + +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 ); + +static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t strat, const int32_t ivas_total_brate ); + +static void ivas_decode_huffman_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw ); + +static void ivas_fill_band_coeffs_idx( ivas_band_coeffs_ind_t *pBands_idx, const int16_t nB, int16_t *pSymbol_re, ivas_cell_dim_t *pCell_dims, ivas_coeffs_type_t coeff_type ); + +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 ); + +static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi, const int16_t num_md_sub_frames ); + +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 ); + +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 ); +static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC ); + +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 ); + +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 ); + +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 +); + + +/*------------------------------------------------------------------------- + * ivas_spar_md_dec_matrix_open() + * + * Allocate and initialize SPAR MD decoder matrices + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_md_dec_matrix_open( + 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 */ +) +{ + 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 ) + { + 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 ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); + } + if ( ( hMdDec->mixer_mat = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->mixer_mat[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs_prev.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs_prev.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs_prev.C_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs_prev.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs_prev.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs_prev.P_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs_tar.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs_tar.C_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs_tar.C_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + + if ( ( hMdDec->spar_coeffs_tar.P_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->spar_coeffs_tar.P_re[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->spar_coeffs_tar.P_re[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.C_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_prev.P_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_tar.C_re[i][j][k] = 0.0f; + hMdDec->spar_coeffs_tar.P_re[i][j][k] = 0.0f; + } + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_get_spar_dec_md_num_subframes() + * + * return number of MD subframes + *------------------------------------------------------------------------*/ + +/*! r: number of MD subframes */ +int16_t ivas_get_spar_dec_md_num_subframes( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int32_t ivas_last_active_brate /* i : IVAS last active bitrate */ +) +{ + int16_t num_subframes; + + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( sba_order > SBA_FOA_ORDER ) + { + if ( ivas_total_brate >= IVAS_512k ) + { + num_subframes = 1; + } + } + + if ( ( ivas_total_brate <= IVAS_SID_5k2 && ivas_last_active_brate < IVAS_24k4 ) || ( ivas_total_brate > IVAS_SID_5k2 && ivas_total_brate < IVAS_24k4 ) ) + { + + num_subframes = 1; + } + + return ( num_subframes ); +} + + +/*------------------------------------------------------------------------- + * ivas_spar_md_dec_open() + * + * Allocate and initialize SPAR MD decoder handle + *------------------------------------------------------------------------*/ + +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 */ +) +{ + ivas_spar_md_dec_state_t *hMdDec; + ivas_error error; + int16_t num_md_sub_frames; + + error = IVAS_ERR_OK; + + 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 ); + + if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels, num_md_sub_frames ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + if ( sid_format == SID_SBA_2TC ) + { + hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + else + { + hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + } + else + { + hMdDec->table_idx = ivas_get_spar_table_idx( hDecoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + + if ( ( error = ivas_spar_md_dec_init( hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK ) + { + return error; + } + + *hMdDec_out = hMdDec; + + return error; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_md_dec_matrix_close() + * + * Deallocate SPAR MD decoder matrices + *------------------------------------------------------------------------*/ + +void ivas_spar_md_dec_matrix_close( + ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ + const int16_t num_channels /* i : number of internal channels */ +) +{ + int16_t i, j; + + 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 ) + { + free( hMdDecoder->band_coeffs_prev ); + hMdDecoder->band_coeffs_prev = NULL; + } + + if ( hMdDecoder->mixer_mat != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->mixer_mat[i][j] ); + } + free( hMdDecoder->mixer_mat[i] ); + } + free( hMdDecoder->mixer_mat ); + } + + if ( hMdDecoder->spar_coeffs.C_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs.C_re[i][j] ); + } + free( hMdDecoder->spar_coeffs.C_re[i] ); + } + free( hMdDecoder->spar_coeffs.C_re ); + } + + if ( hMdDecoder->spar_coeffs.P_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs.P_re[i][j] ); + } + free( hMdDecoder->spar_coeffs.P_re[i] ); + } + free( hMdDecoder->spar_coeffs.P_re ); + } + + if ( hMdDecoder->spar_coeffs_prev.C_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs_prev.C_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_prev.C_re[i] ); + } + free( hMdDecoder->spar_coeffs_prev.C_re ); + } + + if ( hMdDecoder->spar_coeffs_prev.P_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs_prev.P_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_prev.P_re[i] ); + } + free( hMdDecoder->spar_coeffs_prev.P_re ); + } + + if ( hMdDecoder->spar_coeffs_tar.C_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs_tar.C_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_tar.C_re[i] ); + } + free( hMdDecoder->spar_coeffs_tar.C_re ); + } + + if ( hMdDecoder->spar_coeffs_tar.P_re != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->spar_coeffs_tar.P_re[i][j] ); + } + free( hMdDecoder->spar_coeffs_tar.P_re[i] ); + } + free( hMdDecoder->spar_coeffs_tar.P_re ); + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_spar_md_dec_close() + * + * Deallocate SPAR MD decoder handle + *------------------------------------------------------------------------*/ + +void ivas_spar_md_dec_close( + ivas_spar_md_dec_state_t **hMdDec /* i/o: SPAR MD decoder handle */ +) +{ + ivas_spar_md_dec_state_t *hMdDecoder; + int16_t num_channels; + + hMdDecoder = *hMdDec; + num_channels = hMdDecoder->spar_md_cfg.num_umx_chs; + + ivas_spar_md_dec_matrix_close( hMdDecoder, num_channels ); + + free( *hMdDec ); + *hMdDec = NULL; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_dec_init() + * + * SPAR MD decoder initialization + *-----------------------------------------------------------------------------------------*/ + +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 */ +) +{ + int16_t i, j; + int16_t nchan_transport; + float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; + ivas_error error; + + ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); + + ivas_sba_get_spar_hoa_ch_ind( 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 ); + + ivas_spar_set_bitrate_config( &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; + + /* get FB coefficients */ + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + pFC[i] = ivas_fb_fcs_12band_1ms[i] * hDecoderConfig->output_Fs * 0.5f; + } + + if ( ( error = ivas_spar_set_dec_config( hMdDec, nchan_transport, pFC ) ) != 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 ) ) ) + { + return IVAS_ERR_INTERNAL; + } + + /* DTX quant init */ + PR_minmax[0] = hMdDec->spar_md_cfg.quant_strat[0].PR.min; + PR_minmax[1] = hMdDec->spar_md_cfg.quant_strat[0].PR.max; + ivas_spar_quant_dtx_init( &hMdDec->spar_md, PR_minmax ); + + ivas_spar_arith_coeffs_com_init( &hMdDec->arith_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); + ivas_spar_huff_coeffs_com_init( &hMdDec->huff_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); + + hMdDec->spar_md_cfg.prev_quant_idx = -1; + + /* 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 ); + hMdDec->spar_plc_num_lost_frames = 0; + hMdDec->spar_plc_enable_fadeout_flag = 1; + hMdDec->dtx_md_smoothing_cntr = 1; + + 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 ); + 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; + hMdDec->td_decorr_flag = 1; + + 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 ); + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + set_zero( hMdDec->smooth_buf[i], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + + for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH; j++ ) + { + set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); + } + } + hMdDec->first_valid_frame = 1; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_set_dec_config() + * + * Set configuration for SPAR MD decoder + *-----------------------------------------------------------------------------------------*/ + +static ivas_error ivas_spar_set_dec_config( + ivas_spar_md_dec_state_t *hMdDec, + const int16_t nchan_transport, + float *pFC ) +{ + int16_t i, j, nchan, dmx_ch; + + 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; + } + + nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order, ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate ); + + switch ( nchan ) + { + case 4: /* FOA_CHANNELS */ + hMdDec->num_decorr = IVAS_TD_DECORR_OUT_3CH; + break; + case 9: /* IVAS_HOA_2_CH */ + hMdDec->num_decorr = IVAS_TD_DECORR_OUT_5CH; + break; + case 6: /* IVAS_HOA_2_CH */ + hMdDec->num_decorr = IVAS_TD_DECORR_OUT_2CH; + break; + case 8: /* IVAS_HOA_3_CH */ + hMdDec->num_decorr = IVAS_TD_DECORR_OUT_4CH; + break; + } + + hMdDec->spar_md_cfg.num_umx_chs = nchan; + + dmx_ch = 0; + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + dmx_ch = 0; + for ( j = 0; j < nchan_transport; j++ ) + { + if ( pFC[i] < hMdDec->spar_md_cfg.max_freq_per_chan[j] ) + { + 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; + } + + hMdDec->spar_md_cfg.nchan_transport = dmx_ch; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_dec_mono_sba_handling() + * + * + *-----------------------------------------------------------------------------------------*/ + +static void ivas_dec_mono_sba_handling( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + int16_t mono_flag, b, block; + + mono_flag = 1; + + for ( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) + { + float azimuth = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth[block]; + float elevation = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth[block]; + float energy_ratio = st_ivas->hQMetaData->q_direction[0].band_data[0].energy_ratio[block]; + if ( + ( azimuth != 0.0f ) || + ( elevation != 0.0f ) || + ( energy_ratio > 0.15f ) ) /* 0.15f is just above the lowest quantised value. */ + { + mono_flag = 0; + } + } + } + + /* Combine the SPAR prediction coefs flag with the azimuth, elevation and energy ratio flag.*/ + mono_flag = mono_flag && ivas_spar_chk_zero_coefs( st_ivas ); + + if ( mono_flag ) + { + /* Set Energy Ratio values to be zero */ + for ( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + set_zero( st_ivas->hQMetaData->q_direction[0].band_data[b].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + if ( st_ivas->hDirAC != NULL ) + { + for ( block = 0; block < st_ivas->hSpatParamRendCom->dirac_md_buffer_length; ++block ) + { + /* Set directional Energy Ratio values to be zero */ + set_zero( st_ivas->hSpatParamRendCom->energy_ratio1[block], st_ivas->hSpatParamRendCom->num_freq_bands ); + if ( st_ivas->hQMetaData->no_directions == 2 ) + { + set_zero( st_ivas->hSpatParamRendCom->energy_ratio2[block], st_ivas->hSpatParamRendCom->num_freq_bands ); + } + /* Set Diffuseness values to be 1.0 */ + set_f( st_ivas->hSpatParamRendCom->diffuseness_vector[block], 1.0f, st_ivas->hSpatParamRendCom->num_freq_bands ); + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_md_dec_process() + * + * SPAR Meta Data decoder process + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_md_dec_process( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t j, k, b, bw, dtx_vad, nB, i_ts; + ivas_spar_md_dec_state_t *hMdDec; + int16_t num_md_chs; + int16_t num_md_sub_frames; + int16_t dyn_active_w_flag; + int16_t active_w_vlbr; + + hMdDec = st_ivas->hSpar->hMdDec; + + active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; + + num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); + + if ( hMdDec->spar_md_cfg.nchan_transport > 1 && hMdDec->spar_md_cfg.nchan_transport <= 3 ) + { + hMdDec->spar_md.res_ind = 0; + dyn_active_w_flag = get_next_indice( st0, 1 ); + if ( dyn_active_w_flag == 1 ) + { + if ( hMdDec->spar_md_cfg.nchan_transport == 2 ) + { + hMdDec->spar_md.res_ind = get_next_indice( st0, 1 ); + hMdDec->spar_md.res_ind += hMdDec->spar_md_cfg.nchan_transport; + } + else if ( hMdDec->spar_md_cfg.nchan_transport == 3 ) + { + hMdDec->spar_md.res_ind = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order][hMdDec->spar_md_cfg.nchan_transport]; + } + } + } + else + { + dyn_active_w_flag = 0; + if ( hMdDec->spar_md_cfg.nchan_transport == FOA_CHANNELS ) + { + get_next_indice( st0, 1 ); + } + } + + ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, + st_ivas->hQMetaData->sba_inactive_mode + ); + + assert( nB == hMdDec->spar_md.num_bands ); + assert( bw == 1 ); + ivas_spar_md_fill_invalid_bandcoeffs( + hMdDec->spar_md.band_coeffs, + hMdDec->band_coeffs_prev, + &hMdDec->valid_bands[0], + &hMdDec->base_band_coeffs_age[0], + &hMdDec->first_valid_frame, + nB ); + + ivas_dec_mono_sba_handling( st_ivas ); + + /* SPAR to DirAC conversion */ + if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) + { + ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out, bw, dyn_active_w_flag ); + } + + /* set correct number of bands*/ + nB = IVAS_MAX_NUM_BANDS; + + /* expand DirAC MD to all time slots */ + for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( b = 0; b < hMdDec->spar_md.num_bands; b++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j] = hMdDec->spar_md.band_coeffs[b].pred_re[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++ ) + { + 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]; + } + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[j] = hMdDec->spar_md.band_coeffs[b].P_re[j]; + } + } + } + + ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, num_md_chs, active_w_vlbr, dyn_active_w_flag ); + +#ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS + { + static FILE *fid = 0; + int16_t band = 9; + if ( !fid ) + { + fid = fopen( "pred_coeffs_dec.txt", "wt" ); + } + fprintf( fid, "%.6f\n", hMdDec->mixer_mat[1][0][band] ); + } +#endif + ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, num_md_chs, num_md_sub_frames ); + + + hMdDec->dtx_md_smoothing_cntr = 1; + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_chk_zero_coefs() + * + * Check for zeroed SPAR coefficients + *-----------------------------------------------------------------------------------------*/ + +int16_t ivas_spar_chk_zero_coefs( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + int16_t j, k, b; + ivas_spar_md_dec_state_t *hMdDec; + int16_t mono = 1; + int16_t ndec, ndm; + + hMdDec = st_ivas->hSpar->hMdDec; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + + for ( b = 0; b < min( hMdDec->spar_md.num_bands, SPAR_DIRAC_SPLIT_START_BAND ); b++ ) + { + for ( j = 0; j < ndm + ndec - 1; j++ ) + { + if ( hMdDec->spar_md.band_coeffs[b].pred_re[j] != 0.0f ) + { + mono = 0; + } + } + for ( j = 0; j < ndec; j++ ) + { + for ( k = 0; k < ndm - 1; k++ ) + { + if ( hMdDec->spar_md.band_coeffs[b].C_re[j][k] != 0.0f ) + { + mono = 0; + } + } + } + for ( j = 0; j < ndec; j++ ) + { + if ( hMdDec->spar_md.band_coeffs[b].P_re[j] != 0.0f ) + { + mono = 0; + } + } + } + + return mono; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_smooth_md_dtx() + * + * Smooth MD during no data frame during DTX + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_smooth_md_dtx( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +) +{ + int16_t j, k, b, dmx_ch; + float ramp, tar, prev, new_val; + + ramp = (float) hMdDec->dtx_md_smoothing_cntr / IVAS_DEFAULT_DTX_CNG_RAMP; + + for ( b = 0; b < num_bands_out; b++ ) + { + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; + + for ( j = 1; j < FOA_CHANNELS; j++ ) + { + for ( k = dmx_ch; k < FOA_CHANNELS; k++ ) + { + prev = hMdDec->spar_coeffs_prev.P_re[j][k][b]; + tar = hMdDec->spar_coeffs_tar.P_re[j][k][b]; + new_val = prev + ( ramp * ( tar - prev ) ); + hMdDec->spar_coeffs.P_re[j][k][b] = new_val; + } + } + + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + for ( k = 0; k < dmx_ch; k++ ) + { + prev = hMdDec->spar_coeffs_prev.C_re[j][k][b]; + tar = hMdDec->spar_coeffs_tar.C_re[j][k][b]; + new_val = prev + ( ramp * ( tar - prev ) ); + hMdDec->spar_coeffs.C_re[j][k][b] = new_val; + } + } + } + + /* expand MD to all time slots */ + for ( int16_t i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; + + for ( j = 1; j < FOA_CHANNELS; j++ ) + { + for ( k = dmx_ch; k < FOA_CHANNELS; k++ ) + + { + hMdDec->spar_coeffs.P_re[j][k][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.P_re[j][k][b]; + } + } + + for ( j = 0; j < FOA_CHANNELS; j++ ) + { + for ( k = 0; k < dmx_ch; k++ ) + { + hMdDec->spar_coeffs.C_re[j][k][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re[j][k][b]; + } + } + } + } + + hMdDec->dtx_md_smoothing_cntr = min( hMdDec->dtx_md_smoothing_cntr + 1, IVAS_DEFAULT_DTX_CNG_RAMP ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_setup_md_smoothing() + * + * Set up smoothing of SPAR MD when SID update frame is received + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_setup_md_smoothing( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +) +{ + /* copy the coeffs */ + int16_t num_channels, i, j, k; + + num_channels = hMdDec->spar_md_cfg.num_umx_chs; + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.C_re[i][j][k] = hMdDec->spar_coeffs_tar.C_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.P_re[i][j][k] = hMdDec->spar_coeffs_tar.P_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_tar.C_re[i][j][k] = hMdDec->spar_coeffs.C_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_tar.P_re[i][j][k] = hMdDec->spar_coeffs.P_re[i][j][k]; + } + } + } + + ivas_spar_smooth_md_dtx( hMdDec, num_bands_out, num_md_sub_frames ); + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_update_md_hist() + * + * Update previous and target MD + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_update_md_hist( + ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ +) +{ + int16_t num_channels, i, j, k; + + num_channels = hMdDec->spar_md_cfg.num_umx_chs; + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.C_re[i][j][k] = hMdDec->spar_coeffs.C_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_prev.P_re[i][j][k] = hMdDec->spar_coeffs.P_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_tar.C_re[i][j][k] = hMdDec->spar_coeffs.C_re[i][j][k]; + } + } + } + + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdDec->spar_coeffs_tar.P_re[i][j][k] = hMdDec->spar_coeffs.P_re[i][j][k]; + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_spar_matrices() + * + * Get SPAR matrices + *-----------------------------------------------------------------------------------------*/ + +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 ) +{ + int16_t num_bands, dmx_ch, split_band; + int16_t i, j, k, m, b, i_ts, active_w; + const int16_t *order; + float active_w_dm_fac, re; + + + num_bands = num_bands_out; + order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order]; + + split_band = SPAR_DIRAC_SPLIT_START_BAND; + if ( split_band >= IVAS_MAX_NUM_BANDS ) + { + /*store previous 4x4 parameters for linear interpolation to current*/ + for ( i = 0; i < numch_out; i++ ) + { + for ( j = 0; j < numch_out; j++ ) + { + for ( b = 0; b < num_bands; b++ ) + { + hMdDec->mixer_mat_prev[0][i][j][b] = hMdDec->mixer_mat[i][j][b]; + } + } + } + } + + if ( bw == IVAS_RED_BAND_FACT ) + { + num_bands = num_bands >> 1; + } + + active_w = ( dyn_active_w_flag == 1 ) || ( hMdDec->spar_md_cfg.active_w == 1 ); + active_w_dm_fac = ( dtx_vad == 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX : ( ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE ); + + for ( i_ts = 0; i_ts < n_ts; i_ts++ ) + { + for ( i = 0; i < numch_out; i++ ) + { + for ( j = 0; j < numch_out; j++ ) + { + set_zero( &hMdDec->spar_coeffs.C_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS ); + set_zero( &hMdDec->spar_coeffs.P_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS ); + } + } + num_bands = min( num_bands, nB ); + + for ( b = 0; b < num_bands; b++ ) + { + float tmp_C1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float tmp_C2_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float tmp_dm_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bw * b]; + + for ( j = 0; j < numch_out; j++ ) + { + set_zero( tmp_C1_re[j], numch_out ); + set_zero( tmp_C2_re[j], numch_out ); + set_zero( tmp_dm_re[j], numch_out ); + + tmp_C1_re[j][j] = 1.0f; + tmp_C2_re[j][j] = 1.0f; + tmp_dm_re[j][j] = 1.0f; + } + + for ( j = 1; j < numch_out; j++ ) + { + tmp_C1_re[j][0] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j - 1]; + } + + if ( active_w == 1 ) + { + for ( j = 1; j < numch_out; j++ ) + { + tmp_C2_re[0][j] = active_w_dm_fac * -hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j - 1]; + } + + IVAS_RMULT_FLOAT( tmp_C2_re[0][1], tmp_C1_re[1][0], re ); + tmp_dm_re[0][0] = 1 + re; + + IVAS_RMULT_FLOAT( tmp_C2_re[0][2], tmp_C1_re[2][0], re ); + tmp_dm_re[0][0] += re; + + IVAS_RMULT_FLOAT( tmp_C2_re[0][3], tmp_C1_re[3][0], re ); + tmp_dm_re[0][0] += re; + + if ( dyn_active_w_flag == 1 ) + { + tmp_dm_re[0][0] *= IVAS_SPAR_DYN_ACTIVEW_THRESH; + } + + tmp_dm_re[0][1] = tmp_C2_re[0][1]; + + tmp_dm_re[0][2] = tmp_C2_re[0][2]; + + tmp_dm_re[0][3] = tmp_C2_re[0][3]; + + tmp_dm_re[1][0] = tmp_C1_re[1][0]; + + tmp_dm_re[2][0] = tmp_C1_re[2][0]; + + tmp_dm_re[3][0] = tmp_C1_re[3][0]; + + if ( hMdDec->spar_md_cfg.remix_unmix_order != 3 ) + { + ivas_mat_col_rearrange( tmp_dm_re, order, i_ts, hMdDec->mixer_mat, b, numch_out ); + } + } + else + { + if ( hMdDec->spar_md_cfg.remix_unmix_order != 3 ) + { + ivas_mat_col_rearrange( tmp_C1_re, order, i_ts, hMdDec->mixer_mat, b, numch_out ); + } + } + + if ( dmx_ch > 0 ) + { + float tmpC_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float tmpP_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + + for ( j = 0; j < numch_out; j++ ) + { + set_zero( tmpC_re[j], numch_out ); + set_zero( tmpP_re[j], numch_out ); + } + + for ( j = 0; j < numch_out; j++ ) + { + set_zero( tmpC_re[j], numch_out ); + } + + for ( k = 0; k < dmx_ch; k++ ) + { + tmpC_re[k][k] = 1; + } + + for ( j = dmx_ch; j < numch_out; j++ ) + { + for ( k = 1; k < dmx_ch; k++ ) + { + tmpC_re[j][k] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re[j - dmx_ch][k - 1]; + } + } + + for ( j = dmx_ch; j < numch_out; j++ ) + { + for ( k = dmx_ch; k < numch_out; k++ ) + { + if ( ( j - dmx_ch ) == ( k - dmx_ch ) ) + { + tmpP_re[j][k] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[k - dmx_ch]; + } + else + { + tmpP_re[j][k] = 0; + } + } + } + + for ( j = 1; j < numch_out; j++ ) + { + for ( k = dmx_ch; k < numch_out; k++ ) + { + for ( m = 0; m < numch_out; m++ ) + { + IVAS_RMULT_FLOAT( hMdDec->mixer_mat[j][m][b + i_ts * IVAS_MAX_NUM_BANDS], tmpP_re[m][k], re ); + hMdDec->spar_coeffs.P_re[j][k][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] += re; + } + } + } + + for ( j = 0; j < numch_out; j++ ) + { + for ( k = 0; k < dmx_ch; k++ ) + { + for ( m = 0; m < numch_out; m++ ) + { + IVAS_RMULT_FLOAT( hMdDec->mixer_mat[j][m][b + i_ts * IVAS_MAX_NUM_BANDS], tmpC_re[m][k], re ); + hMdDec->spar_coeffs.C_re[j][k][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] += re; + } + } + } + + hMdDec->spar_coeffs.C_re[0][0][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] = + max( 0, hMdDec->spar_coeffs.C_re[0][0][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] ); + } + } + + /* band mixing */ + if ( bw == IVAS_RED_BAND_FACT ) + { + for ( b = 0; b < num_bands_out; b = b + bw ) + { + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; + for ( j = 0; j < numch_out; j++ ) + { + for ( k = dmx_ch; k < numch_out; k++ ) + { + hMdDec->spar_coeffs.P_re[j][k][( b + 1 ) + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.P_re[j][k][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + + for ( j = 0; j < numch_out; j++ ) + { + for ( k = 0; k < dmx_ch; k++ ) + { + hMdDec->spar_coeffs.C_re[j][k][( b + 1 ) + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re[j][k][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + } + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_mat_col_rearrange() + * + * reorders the input matrix based on order + *-----------------------------------------------------------------------------------------*/ + +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 ) +{ + int16_t i, j, idx; + + for ( i = 0; i < num_ch; i++ ) + { + idx = order[i]; + + for ( j = 0; j < num_ch; j++ ) + { + mixer_mat[j][i][bands + i_ts * IVAS_MAX_NUM_BANDS] = in_re[j][idx]; + } + } + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_dec_gen_umx_mat() + * + * generates upmix matrix + *-----------------------------------------------------------------------------------------*/ + +void ivas_spar_dec_gen_umx_mat( + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t bfi, /* i : bad frame indicator */ + const int16_t num_md_sub_frames ) +{ + int16_t i, j, b, i_ts, num_out_ch; + + num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; + + for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + if ( hMdDec->td_decorr_flag == 1 ) + { + for ( i = 0; i < num_out_ch; i++ ) + { + for ( j = 0; j < nchan_transport; j++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + } + + for ( i = 0; i < num_out_ch; i++ ) + { + for ( j = nchan_transport; j < num_out_ch; j++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + } + } + else + { + for ( i = 0; i < num_out_ch; i++ ) + { + for ( j = 0; j < nchan_transport; j++ ) + { + for ( b = 0; b < num_bands_out; b++ ) + { + hMdDec->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS]; + } + } + } + } + + } + + ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi, num_md_sub_frames ); + + return; +} + +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 ) +{ + int16_t i, ii, jj, b, idx, bw_fact; + + bw_fact = *bands_bw / bw_final; + for ( i = *nB - 1; i >= 0; i-- ) + { + + for ( b = bw_fact - 1; b >= 0; b-- ) + { + idx = i * bw_fact + b; + for ( ii = 0; ii < ndec + ndm - 1; ii++ ) + { + band_coeffs[idx].pred_re[ii] = band_coeffs[i].pred_re[ii]; + } + for ( ii = 0; ii < ndec; ii++ ) + { + for ( jj = 0; jj < ndm - 1; jj++ ) + { + band_coeffs[idx].C_re[ii][jj] = band_coeffs[i].C_re[ii][jj]; + } + } + for ( jj = 0; jj < ndec; jj++ ) + { + band_coeffs[idx].P_re[jj] = band_coeffs[i].P_re[jj]; + } + valid_bands[idx] = valid_bands[i]; + } + } + *nB = ( *nB ) * ( *bands_bw ) / bw_final; + *bands_bw = bw_final; + + return; +} + +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_dec_parse_md_bs() + * + * Parse SPAR MD bitstream + *-----------------------------------------------------------------------------------------*/ + +static void ivas_spar_dec_parse_md_bs( + 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 +) +{ + int16_t i, j, k, num_bands; + int16_t ii, jj, ndec, ndm; + uint16_t 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]; + int16_t do_repeat[IVAS_MAX_NUM_BANDS]; + *dtx_vad = 1; + *bands_bw = 1; + qsi = 0; + num_bands = hMdDec->spar_md.num_bands; + + if ( ivas_total_brate > IVAS_SID_5k2 ) + { + if ( hMdDec->spar_md_cfg.quant_strat_bits > 0 ) + { + if ( 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 ) + { + *dtx_vad = 0; + } + } + else + { + if ( sba_inactive_mode == 1 ) + { + *dtx_vad = 0; + qsi = hMdDec->spar_md_cfg.quant_strat_bits + 1; + } + else + { + qsi = get_next_indice( st0, hMdDec->spar_md_cfg.quant_strat_bits ); + } + } + } + else + { + qsi = 0; + } + } + else + { + *dtx_vad = 0; + } + + hMdDec->dtx_vad = *dtx_vad; + + if ( *dtx_vad == 0 ) + { + *nB = SPAR_DTX_BANDS; + *bands_bw = num_bands / *nB; + + for ( i = 0; i < *nB; i++ ) + { + 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].P_re[j] = 0; + } + hMdDec->valid_bands[i] = 1; + } + + for ( i = 0; i < num_bands; i++ ) + { + 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++ ) + { + hMdDec->spar_md.band_coeffs[i].C_re[j][k] = 0; + } + } + } + + 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 ) + { + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + ivas_spar_md_band_upmix( + hMdDec->spar_md.band_coeffs, + nB, + bands_bw, + hMdDec->valid_bands, + 1, + ndec, + ndm ); + } + + return; + } + + qs = hMdDec->spar_md_cfg.quant_strat[qsi]; + + strat = get_next_indice( st0, 3 ); + + no_ec = 0; + + if ( strat < 2 ) + { + *bands_bw = strat + 1; + *nB = num_bands / *bands_bw; + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = 0; + } + } + else if ( strat < 4 ) + { + *bands_bw = strat - 1; + *nB = num_bands / *bands_bw; + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = 0; + } + no_ec = 1; + } + else if ( ivas_total_brate < IVAS_24k4 ) + { + *bands_bw = 2; + *nB = num_bands / *bands_bw; + + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = ( ( strat % 2 ) == ( ( i + 1 ) % 2 ) ); + } + } + else + { + *bands_bw = 1; + *nB = num_bands; + + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); + do_repeat[i] = 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; + + if ( no_ec == 0 ) + { + ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, strat, ivas_total_brate ); + } + else + { + ivas_decode_huffman_bs( hMdDec, st0, qsi, *nB, *bands_bw ); + } + + 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]; + + 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 ); + + j = 0; + for ( ii = 0; ii < ndec; ii++ ) + { + for ( jj = 0; jj < ndm - 1; jj++ ) + { + quant[j] = hMdDec->spar_md.band_coeffs[i].C_re[ii][jj]; + j++; + } + } + + 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 ) ); + + j = 0; + for ( ii = 0; ii < ndec; ii++ ) + { + for ( jj = 0; jj < ndm - 1; jj++ ) + { + hMdDec->spar_md.band_coeffs[i].C_re[ii][jj] = quant[j]; + j++; + } + } + + 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 ); + + /* Store prior coefficient indices */ + for ( j = 0; j < 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]; + } + for ( j = 0; j < ndec * ( 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]; + } + 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]; + } + hMdDec->valid_bands[i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0; + } + + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + if ( *bands_bw != 1 ) + { + ivas_spar_md_band_upmix( + hMdDec->spar_md.band_coeffs, + nB, + bands_bw, + hMdDec->valid_bands, + 1, + ndec, + ndm ); + } + + + return; +} + + +/*-----------------------------------------------------------------------------------------* + * Function ivas_decode_arith_bs() + * + * Decode bitstream with arith decoder + *-----------------------------------------------------------------------------------------*/ + +static void ivas_decode_arith_bs( + ivas_spar_md_dec_state_t *hMdDec, + Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ + const uint16_t qsi, + const int16_t nB, + const int16_t bands_bw, + int16_t *pDo_diff, + const int16_t strat, + const int32_t ivas_total_brate ) +{ + int16_t i, ndm, ndec; + int16_t j; + ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; + ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; + int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; + int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; + int16_t any_diff; + + for ( i = 0; i < nB; i++ ) + { + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) + { + pred_cell_dims[i].dim1 = 0; + pred_cell_dims[i].dim2 = 0; + drct_cell_dims[i].dim1 = 0; + drct_cell_dims[i].dim2 = 0; + decd_cell_dims[i].dim1 = 0; + decd_cell_dims[i].dim2 = 0; + decx_cell_dims[i].dim1 = 0; + decx_cell_dims[i].dim2 = 0; + } + else + { + pred_cell_dims[i].dim1 = ndm + ndec - 1; + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + } + } + pred_cell_dims[i].dim2 = 1; + drct_cell_dims[i].dim1 = ndec; + drct_cell_dims[i].dim2 = ndm - 1; + decd_cell_dims[i].dim1 = ndec; + decd_cell_dims[i].dim2 = 1; + decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; + decx_cell_dims[i].dim2 = 1; + } + } + + any_diff = 0; + for ( i = 0; i < nB; i++ ) + { + if ( pDo_diff[i] != 0 ) + { + any_diff = 1; + break; + } + } + + if ( any_diff == 1 ) + { + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) + { + for ( i = 0; i < nB; i++ ) + { + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) + { + hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j] = + hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + } + } + } + } + + ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF ); + } ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.pred_arith_re[qsi], &hMdDec->arith_coeffs.pred_arith_re_diff[qsi], st0, pred_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re ); @@ -2891,43 +7310,6 @@ static void ivas_spar_get_plc_interp_weights( return; } -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 *w, - int16_t *id0, - int16_t *id1) -{ - if (last_valid_band_idx < 0) /* Extrapolation */ - { - *id1 = valid_band_idx[0]; - *id0 = 0; - *w = MAX_WORD16; - } - else if (last_valid_band_idx == idx) /* Extrapolation */ - { - *id1 = valid_band_idx[last_valid_band_idx]; - *id0 = valid_band_idx[last_valid_band_idx]; - *w = 0; - } - else /* Interpolation */ - { - *id0 = valid_band_idx[last_valid_band_idx]; - *id1 = valid_band_idx[last_valid_band_idx + 1]; - if ((b - *id0) == 0) - { - *w = 0; - } - else - { - *w = divide3232((b - *id0), (*id1 - *id0)); - } - } - return; -} - /*-----------------------------------------------------------------------------------------* * Function ivas_spar_md_fill_invalid_bands() * @@ -2947,7 +7329,6 @@ static void ivas_spar_md_fill_invalid_bands( 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 w_fx = 0; 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 */ @@ -2957,24 +7338,17 @@ static void ivas_spar_md_fill_invalid_bands( for ( b = 0; b < num_bands; b++ ) { /* check against non zero in if and else if */ - if ( base_band_age[b] > 3 ) /* 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 ); - ivas_spar_get_plc_interp_weights_fx(valid_band_idx, last_valid_band_idx[b], - idx, b, &w_fx, &id0, &id1); for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) { pSpar_coeffs->C_re[i][j][b] = ( 1 - w ) * pSpar_coeffs->C_re[i][j][id0] + w * pSpar_coeffs->C_re[i][j][id1]; pSpar_coeffs->P_re[i][j][b] = ( 1 - w ) * pSpar_coeffs->P_re[i][j][id0] + w * pSpar_coeffs->P_re[i][j][id1]; -#ifdef IVAS_FLOAT_FIXED - pSpar_coeffs->C_re_fx[i][j][b] = L_add(Mpy_32_16_1(pSpar_coeffs->C_re_fx[i][j][id0], sub(MAX_WORD16, w_fx)), Mpy_32_16_1(pSpar_coeffs->C_re_fx[i][j][id1], w_fx)); - pSpar_coeffs->P_re_fx[i][j][b] = L_add(Mpy_32_16_1(pSpar_coeffs->P_re_fx[i][j][id0], sub(MAX_WORD16, w_fx)), Mpy_32_16_1(pSpar_coeffs->P_re_fx[i][j][id1], w_fx)); -#endif } } } @@ -2988,10 +7362,6 @@ static void ivas_spar_md_fill_invalid_bands( { pSpar_coeffs->C_re[i][j][b] = pSpar_coeffs_prev->C_re[i][j][b]; pSpar_coeffs->P_re[i][j][b] = pSpar_coeffs_prev->P_re[i][j][b]; -#ifdef IVAS_FLOAT_FIXED - pSpar_coeffs->C_re_fx[i][j][b] = pSpar_coeffs_prev->C_re_fx[i][j][b]; - pSpar_coeffs->P_re_fx[i][j][b] = pSpar_coeffs_prev->P_re_fx[i][j][b]; -#endif } } } @@ -3008,10 +7378,6 @@ static void ivas_spar_md_fill_invalid_bands( { pSpar_coeffs->C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->C_re[i][j][b]; pSpar_coeffs->P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->P_re[i][j][b]; -#ifdef IVAS_FLOAT_FIXED - pSpar_coeffs->C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->C_re_fx[i][j][b]; - pSpar_coeffs->P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->P_re_fx[i][j][b]; -#endif } } } @@ -3034,7 +7400,6 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( 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 w_fx = 0; ivas_spar_plc_get_band_age( valid_bands, base_band_age, num_bands, last_valid_band_idx, valid_band_idx, &all_valid, &idx ); @@ -3051,13 +7416,10 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( int16_t id0, id1; ivas_spar_get_plc_interp_weights( valid_band_idx, last_valid_band_idx[b], idx, b, &w, &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++ ) { 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)); } for ( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) @@ -3065,14 +7427,12 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( 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)); } } 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)); } } else /* young invalid bands */ @@ -3082,7 +7442,6 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( 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]; } for ( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) @@ -3090,14 +7449,12 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( 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]; } } 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]; } } } @@ -3113,79 +7470,10 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( /*-----------------------------------------------------------------------------------------* - * Function ivas_spar_dec_compute_ramp_down_post_matrix_fx() + * Function ivas_spar_dec_compute_ramp_down_post_matrix() * * - *-----------------------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( - ivas_spar_md_dec_state_t *hMdDec, - const Word16 num_bands_out, - const Word16 bfi, - const Word16 num_md_sub_frames) -{ - Word16 num_in_ch, num_out_ch, i, j, b; - num_in_ch = hMdDec->spar_md_cfg.num_umx_chs; - num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; - move16(); - move16(); - IF ( EQ_16(bfi , 0 )) - { - hMdDec->spar_plc_num_lost_frames = 0; - move16(); - } - ELSE - { - IF (EQ_16(hMdDec->td_decorr_flag , 0) ) - { - assert( 0 ); - } - - hMdDec->spar_plc_num_lost_frames =add(hMdDec->spar_plc_num_lost_frames, 1); - hMdDec->spar_plc_num_lost_frames = s_min( hMdDec->spar_plc_num_lost_frames, 100 ); /*hMdDec->spar_plc_num_lost_frames is always <=100*/ - - 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 */ - { - Word16 num_fade_frames; - Word16 gain_dB; - Word32 gain_fx; - Word32 post_matrix_fx[IVAS_SPAR_MAX_CH]; - Word16 Q_post_matrix; - Word16 Q_gain; - 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 = 0; /*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 ), 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*/ - } - Q_post_matrix = sub(add(Q_gain, norm_nff), 15); - /* apply the post matrix */ - FOR ( Word16 i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) - { - FOR ( i = 0; i < num_out_ch; i++ ) - { - FOR ( j = 0; j < num_in_ch; j++ ) - { - 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->Q_mixer_mat = sub(add(Q_post_matrix, hMdDec->Q_mixer_mat), 31); - } - } - - return; -} -#endif // IVAS_FLOAT_FIXED + *-----------------------------------------------------------------------------------------*/ static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, @@ -3255,66 +7543,12 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( * * Unquantize SPAR MD DYX indices *-----------------------------------------------------------------------------------------*/ -#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 ) -{ - int16_t i, b; - int16_t q_lvl; - //float val; - Word32 val_fx; - int16_t 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]; - pr_min_max_fx[1] = pSpar_md->min_max_fx[1]; - - for ( b = 0; b < nB; b++ ) - { - 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); - - idx = pSpar_md->band_coeffs_idx[b].pred_index_re[i]; - 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; - pSpar_md->band_coeffs[b].pred_re[i] = (float)val_fx / (1 << 22); - } - - for ( i = 0; i < FOA_CHANNELS - ndm_per_band[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); - - idx = pSpar_md->band_coeffs_idx[b].decd_index_re[i]; - 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; - pSpar_md->band_coeffs[b].P_re[i] = (float)val_fx / (1 << 22); - } - } - return; -} -#else 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) + int16_t *ndm_per_band ) { int16_t i, b; int16_t q_lvl; @@ -3325,132 +7559,35 @@ static void ivas_spar_unquant_dtx_indicies( pr_min_max[0] = pSpar_md->min_max[0]; pr_min_max[1] = pSpar_md->min_max[1]; - 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); + 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; } - for (i = 0; i < FOA_CHANNELS - ndm_per_band[bw * b]; i++) + for ( i = 0; i < FOA_CHANNELS - ndm_per_band[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); + 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; } } return; } -#endif + /*-----------------------------------------------------------------------------------------* * Function ivas_parse_parameter_bitstream_dtx() * * parse DTX bitstream parameters *-----------------------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -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 ) -{ - int16_t i, j, ndec, ndm; - //float val; - Word32 val_fx; - int16_t idx; - //float pr_min_max[2]; - 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; - - sid_bits_len = st0->next_bit_pos; - //pr_min_max[0] = pSpar_md->min_max[0]; - pr_min_max_fx[0] = pSpar_md->min_max_fx[0]; - //pr_min_max[1] = pSpar_md->min_max[1]; - pr_min_max_fx[1] = pSpar_md->min_max_fx[1]; - - for ( i = 0; i < num_bands; i++ ) - { - ndec = num_dec_per_band[bw * i]; - ndm = num_dmx_per_band[bw * i]; - - 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; - - pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0]; - pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1]; - pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0]; - pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1]; - - 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]; - - if ( ( j + 1 ) > ndec ) - { - pd_q_lvls = 1; - } - else - { - pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1]; - } - - pr_pd_bits = ivas_get_bits_to_encode( 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]; - 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 ); - 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; - - //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 ); - 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; - - if ( ( j + 1 ) <= ndec ) - { - pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1] = pd; - } - - pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1] = pr; - } - } - } - - 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; - assert( zero_pad_bits >= 0 ); - if ( num_dmx_per_band[0] == 2 ) - { - zero_pad_bits -= 1; - } - - for ( j = 0; j < zero_pad_bits; j++ ) - { - get_next_indice( st0, 1 ); - } - - ivas_spar_unquant_dtx_indicies( pSpar_md, num_bands, bw, num_dmx_per_band ); - return; -} -#else static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ @@ -3539,7 +7676,7 @@ static void ivas_parse_parameter_bitstream_dtx( return; } -#endif + /*-----------------------------------------------------------------------------------------* * Function ivas_deindex_real_index() @@ -3582,41 +7719,6 @@ static ivas_error ivas_deindex_real_index( return IVAS_ERR_OK; } -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 dim) -{ - int16_t i; - Word32 q_step_fx; - if (q_levels == 0) - { - return IVAS_ERR_INTERNAL; - } - - if (q_levels == 1) - { - for (i = 0; i < dim; i++) - { - quant[i] = 0; - } - } - 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++) - { - quant[i] = Mpy_32_32(L_shl(index[i], 31 - 6), q_step_fx);//(25+28)-31 = 22 - } - } - - return IVAS_ERR_OK; -} - /*-----------------------------------------------------------------------------------------* * Function ivas_spar_to_dirac() @@ -3637,27 +7739,18 @@ void ivas_spar_to_dirac( int16_t block, b; int16_t *band_grouping; float diffuseness[IVAS_MAX_NUM_BANDS]; - Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS]; int16_t sba_order_internal; float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - 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]; - Word32 dvx_q, dvy_q, dvz_q; - Word32 dvx_fx[IVAS_MAX_NUM_BANDS], dvy_fx[IVAS_MAX_NUM_BANDS], dvz_fx[IVAS_MAX_NUM_BANDS]; float radius; - Word32 radius_fx,radius_q; float en_ratio, res_pow; - Word32 en_ratio_fx, res_pow_fx; - Word32 en_ratio_q, res_pow_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]; - 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; @@ -3686,205 +7779,70 @@ void ivas_spar_to_dirac( 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]; - PR_fx[1] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[0]; PR[2] = hMdDec->spar_md.band_coeffs[band].pred_re[1]; - 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]); - q_g_pred = 22 + 22 - 31; - q_g_pred = 31 - q_g_pred; - q_dvnorm = q_g_pred; if ( g_pred <= EPSILON ) { dvx[band] = 1.0f; dvy[band] = 0.0f; dvz[band] = 0.0f; - - azi[band] = 0; - ele[band] = 0; - q_g_pred = 0; - q_dvnorm = 0; } else { g_pred = sqrtf( 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) - { - g_pred_fx = L_shr(g_pred_fx, (-1 * q_g_pred)); - q_g_pred = 0; - } - 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); - dvy_fx[band] = Mpy_32_32(PR_fx[1], dvnorm_fx); - dvz_fx[band] = Mpy_32_32(PR_fx[2], dvnorm_fx); - Word16 q_1 = (22) + (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; - 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 (check_azi_fx_32 < 0) - { - check_azi_fx_res = negate(divide3232(L_negate(check_azi_fx_32), 1686629760)); - } - else - { - 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)); - - Word16 check_ele_fx = BASOP_util_atan2(dvz_fx[band], radius_fx, (9+ q_dvnorm)-q_temp); - Word32 check_ele_fx_32 = L_shl(check_ele_fx, 16); - Word16 check_ele_fx_res; - if (check_azi_fx_32 < 0) - { - check_ele_fx_res = negate(divide3232(L_negate(check_ele_fx_32), 1686629760)); - } - 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)); - - - 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); - ele[band] = max(-90, min(180, ele_res)); } - Word16 en_ratio_q = 0; + radius = sqrtf( dvx[band] * dvx[band] + dvy[band] * dvy[band] ); + azi[band] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( dvy[band], dvx[band] ) / EVS_PI * 180.0f ) ) + 0.5f ); + ele[band] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( dvz[band], radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + if ( 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 ( dtx_vad == 0 ) { f_scale = IVAS_ACTIVEW_DM_F_SCALE_DTX; - f_scale_fx = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; } 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; } } else { f_scale = 0.0f; - f_scale_fx = 0; } 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]; - Pd_fx[0] = hMdDec->spar_md.band_coeffs[band].P_re_fx[1]; - Pd_fx[1] = hMdDec->spar_md.band_coeffs[band].P_re_fx[0]; - 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; - 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 ); - en_ratio_q = 31 - 13; - en_ratio_fx = Sqrt32(hMdDec->spar_md.en_ratio_slow_fx[band], &en_ratio_q); - if (en_ratio_q < 0) - { - en_ratio_fx = L_shr(en_ratio_fx, -1 * (en_ratio_q)); - en_ratio_q = 0; - } - 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]) - { - diffuseness_fx[band] = 0; - } - else if(en_ratio_fx_scaled == 0) - { - diffuseness_fx[band] = ONE_IN_Q30; - } - else if (en_ratio_fx_scaled == hMdDec->spar_md.ref_pow_slow_fx[band]) - { - diffuseness_fx[band] = ONE_IN_Q30; - } - else - { - en_ratio_fx = divide3232(en_ratio_fx_scaled, (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; - } - } 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_q = 31 - 13; - en_ratio_fx = Sqrt32( hMdDec->spar_md.en_ratio_slow_fx[band], &en_ratio_q); - if (en_ratio_q < 0) - { - en_ratio_fx = L_shr(en_ratio_fx, -1 * (en_ratio_q)); - en_ratio_q = 0; - } - Word32 en_ratio_fx_scaled = L_shr(en_ratio_fx, 1); - if (en_ratio_fx_scaled > ONE_IN_Q30) - { - diffuseness_fx[band] = 0; - } - else - { - diffuseness_fx[band] = ONE_IN_Q30 - en_ratio_fx_scaled; - } - } 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++ ) @@ -3893,13 +7851,7 @@ void ivas_spar_to_dirac( tmp_write_idx_param_band = hDirAC->spar_to_dirac_write_idx; 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]; qmf_band_end = band_grouping[band + 1]; @@ -3917,9 +7869,6 @@ void ivas_spar_to_dirac( ele_dith = ele[band]; hSpatParamRendCom->energy_ratio1[block][b] = en_ratio; -#ifdef IVAS_FLOAT_FIXED - hSpatParamRendCom->energy_ratio1_fx[block][b] = en_ratio_fx; -#endif tmp_write_idx_band = tmp_write_idx_param_band; if ( hDirAC->hConfig->dec_param_estim == FALSE ) @@ -3927,9 +7876,6 @@ void ivas_spar_to_dirac( hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness[band]; -#ifdef IVAS_FLOAT_FIXED - hSpatParamRendCom->diffuseness_vector_fx[tmp_write_idx_band][b] = diffuseness_fx[band]; -#endif } else { @@ -3938,9 +7884,6 @@ void ivas_spar_to_dirac( hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; hSpatParamRendCom->diffuseness_vector[tmp_write_idx_band][b] = diffuseness[band]; -#ifdef IVAS_FLOAT_FIXED - hSpatParamRendCom->diffuseness_vector_fx[tmp_write_idx_band][b] = diffuseness_fx[band]; -#endif tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; } } @@ -3985,26 +7928,15 @@ void ivas_spar_to_dirac( } 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]; - ele_dirac_fx[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation_fx[block]; -#endif } 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 } /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ if ( hMdDec->spar_md_cfg.nchan_transport > 1 ) { -#ifdef IVAS_FLOAT_FIXED - ivas_get_spar_md_from_dirac_fx( 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 ); -#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 /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) @@ -4012,18 +7944,14 @@ void ivas_spar_to_dirac( 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]; } } } int16_t 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, 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 ); -#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 ) { for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) @@ -4033,12 +7961,10 @@ void ivas_spar_to_dirac( 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]; } 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]; } } } @@ -4055,7 +7981,6 @@ void ivas_spar_to_dirac( { /* 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]; } } } @@ -4068,3 +7993,4 @@ void ivas_spar_to_dirac( return; } +#endif \ No newline at end of file diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index a312c195baaec9340fe2f76e421ec797d77cce53..5cf0a60b8d22941c3184c36f5248182bb02005fc 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -63,18 +63,21 @@ typedef struct /* basic allpass structure */ typedef struct { +#ifndef IVAS_FLOAT_FIXED float gains[3]; - int16_t delays[3]; +#endif + Word16 delays[3]; +#ifndef IVAS_FLOAT_FIXED float buffer[3][STEREO_DFT_ALLPASS_BUFFERLEN]; - int16_t pos; +#endif + Word16 pos; #ifdef IVAS_FLOAT_FIXED - Word32 gains_fx[3]; - Word32 buffer_fx[3][STEREO_DFT_ALLPASS_BUFFERLEN]; + Word32 gains_fx[3]; /* Q31 */ + Word32 buffer_fx[3][STEREO_DFT_ALLPASS_BUFFERLEN]; /* Q(q_buffer_fx) */ Word16 q_buffer_fx; #endif - } basic_allpass_t; @@ -96,7 +99,6 @@ typedef struct stereo_dft_dec_data_struct int16_t dft_trigo_step; #ifdef IVAS_FLOAT_FIXED - Word32 ONE_NFFT; /* Size of DFT */ const Word16 *dft_trigo_fx; /* Q15 */ const Word16 *dft_trigo_12k8_fx; /* Q15 */ const Word16 *dft_trigo_16k_fx; /* Q15 */ @@ -201,7 +203,9 @@ typedef struct stereo_dft_dec_data_struct Word32 res_pred_gain_fx[STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX]; /* prediction gain for the residual HFs */ /* Q31 */ #endif int16_t res_pred_band_min; /* Band min for prediction of residual */ +#ifndef IVAS_FLOAT_FIXED float DFT_past_DMX[STEREO_DFT_PAST_MAX][STEREO_DFT32MS_N_32k]; /* Past DMX for residual prediction */ +#endif int16_t past_DMX_pos; int16_t res_pred_flag_0; int16_t res_pred_flag_1; @@ -223,18 +227,16 @@ typedef struct stereo_dft_dec_data_struct int16_t res_cod_line_max; #ifndef IVAS_FLOAT_FIXED float res_hb_nrg_mem; -#endif float bpf_error_signal_last; -#ifndef IVAS_FLOAT_FIXED float bpf_error_ratio_mem; #endif #ifdef IVAS_FLOAT_FIXED - Word32 DFT_past_DMX_fx[STEREO_DFT_PAST_MAX][STEREO_DFT32MS_N_32k]; /* Past DMX for residual prediction */ - Word32 past_res_pred_gain_fx[STEREO_DFT_PAST_MAX][STEREO_DFT_BAND_MAX]; /* Q31 */ - Word32 res_gains_ind_fx[2][2 * STEREO_DFT_BAND_MAX]; /* Q26 */ - Word32 res_hb_nrg_mem_fx; /* Q0 */ - Word32 bpf_error_signal_last_fx; - Word16 bpf_error_ratio_mem_fx; /* Q13 */ + Word32 DFT_past_DMX_fx[STEREO_DFT_PAST_MAX][STEREO_DFT32MS_N_32k]; /* Past DMX for residual prediction */ /* Q(q_DFT_past_DMX_fx) */ + Word32 past_res_pred_gain_fx[STEREO_DFT_PAST_MAX][STEREO_DFT_BAND_MAX]; /* Q31 */ + Word32 res_gains_ind_fx[2][2 * STEREO_DFT_BAND_MAX]; /* Q26 */ + Word32 res_hb_nrg_mem_fx; /* Q0 */ + Word32 bpf_error_signal_last_fx; /* Q15 */ + Word16 bpf_error_ratio_mem_fx; /* Q13 */ Word16 q_dft; Word16 q_ip_mem; Word16 q_ap_delay_mem_fx; @@ -242,11 +244,13 @@ typedef struct stereo_dft_dec_data_struct Word16 q_DFT_past_DMX_fx[STEREO_DFT_PAST_MAX]; Word32 res_global_gain_fx; /* Q15 */ #endif // IVAS_FLOAT_FIXED +#ifndef IVAS_FLOAT_FIXED float res_cod_mem[STEREO_DFT_OVL_8k]; float buff_LBTCX_mem[NS2SA( 16000, STEREO_DFT32MS_OVL_NS )]; +#endif // IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED - Word32 res_cod_mem_fx[STEREO_DFT_OVL_8k]; - Word32 buff_LBTCX_mem_fx[NS2SA( 16000, STEREO_DFT32MS_OVL_NS )]; + Word32 res_cod_mem_fx[STEREO_DFT_OVL_8k]; /* Q(q_res_cod_mem_fx) */ + Word32 buff_LBTCX_mem_fx[NS2SA( 16000, STEREO_DFT32MS_OVL_NS )]; /* Q11 */ Word16 q_res_cod_mem_fx; #endif @@ -260,27 +264,29 @@ typedef struct stereo_dft_dec_data_struct int16_t attackPresent; int16_t wasTransient; +#ifndef IVAS_FLOAT_FIXED float lt_pred_gain; float lt_pred_gain_variation; float lt_var_mean_ratio; -#ifndef IVAS_FLOAT_FIXED float stefi_short_gain; float stefi_long_gain; #endif basic_allpass_t ap1, ap2, ap3; +#ifndef IVAS_FLOAT_FIXED float ap_delay_mem[NS2SA( 16000, DELAY_BWE_TOTAL_NS )]; float ap_fade_mem[STEREO_DFT_ALLPASS_FADELEN_16k]; +#endif #ifdef IVAS_FLOAT_FIXED Word16 stab_fac_smooth_res_fx; /* low-pass filtered stability factor */ /* Q15 */ - Word32 lt_pred_gain_fx; - Word32 lt_pred_gain_variation_fx; - Word32 lt_var_mean_ratio_fx; - Word16 stefi_short_gain_fx; /* Q15 */ - Word16 stefi_long_gain_fx; /* Q15 */ + Word32 lt_pred_gain_fx; /* Q(q_lt_pred_gain) */ + Word32 lt_pred_gain_variation_fx; /* Q(q_lt_pred_gain) */ + Word32 lt_var_mean_ratio_fx; /* Q31 */ + Word16 stefi_short_gain_fx; /* Q15 */ + Word16 stefi_long_gain_fx; /* Q15 */ Word16 q_lt_pred_gain; - Word32 ap_delay_mem_fx[NS2SA( 16000, DELAY_BWE_TOTAL_NS )]; - Word32 ap_fade_mem_fx[STEREO_DFT_ALLPASS_FADELEN_16k]; + Word32 ap_delay_mem_fx[NS2SA( 16000, DELAY_BWE_TOTAL_NS )]; /* Q(q_ap_fade_mem_fx) */ + Word32 ap_fade_mem_fx[STEREO_DFT_ALLPASS_FADELEN_16k]; /* Q(q_ap_fade_mem_fx) */ Word16 q_ap_fade_mem_fx; #endif @@ -290,11 +296,19 @@ typedef struct stereo_dft_dec_data_struct float smooth_res_nrg[STEREO_DFT_BAND_MAX]; #endif int16_t core_hist[STEREO_DFT_CORE_HIST_MAX]; +#ifndef IVAS_FLOAT_FIXED float hb_stefi_sig[L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS )]; +#endif int16_t hb_stefi_delay; +#ifndef IVAS_FLOAT_FIXED float hb_nrg[STEREO_DFT_CORE_HIST_MAX]; +#endif +#ifndef IVAS_FLOAT_FIXED float hb_nrg_subr[STEREO_DFT_NBDIV]; +#endif +#ifndef IVAS_FLOAT_FIXED float td_gain[STEREO_DFT_CORE_HIST_MAX]; +#endif #ifdef IVAS_FLOAT_FIXED Word32 smooth_dmx_nrg_fx[STEREO_DFT_BAND_MAX]; /* Q(q_smoothed_nrg) */ Word32 smooth_res_nrg_fx[STEREO_DFT_BAND_MAX]; /* Q(q_smoothed_nrg) */ @@ -329,26 +343,28 @@ typedef struct stereo_dft_dec_data_struct #endif /* PLC on residual signal */ +#ifndef IVAS_FLOAT_FIXED float res_mem[STEREO_DFT_RES_BW_MAX]; +#endif int16_t time_offs; - float past_dmx_nrg; #ifndef IVAS_FLOAT_FIXED + float past_dmx_nrg; float sg_mean; #endif int16_t sg_mem_corrupt; int16_t recovery_flg; - float smooth_buf[SBA_DIRAC_STEREO_NUM_BANDS][SBA_DIRAC_NRG_SMOOTH_LONG + 1]; #ifndef IVAS_FLOAT_FIXED + float smooth_buf[SBA_DIRAC_STEREO_NUM_BANDS][SBA_DIRAC_NRG_SMOOTH_LONG + 1]; float smooth_fac[NB_DIV][SBA_DIRAC_STEREO_NUM_BANDS]; #endif #ifdef IVAS_FLOAT_FIXED /* PLC on residual signal */ - Word32 sg_mean_fx; /* Q31 */ - Word32 res_mem_fx[STEREO_DFT_RES_BW_MAX]; - Word32 past_dmx_nrg_fx; - Word32 smooth_buf_fx[SBA_DIRAC_STEREO_NUM_BANDS][SBA_DIRAC_NRG_SMOOTH_LONG + 1]; - Word16 smooth_fac_fx[NB_DIV][SBA_DIRAC_STEREO_NUM_BANDS]; /* Q15 */ + Word32 sg_mean_fx; /* Q31 */ + Word32 res_mem_fx[STEREO_DFT_RES_BW_MAX]; /* Q(q_res_mem) */ + Word32 past_dmx_nrg_fx; /* Q(2 * q_dft) */ + Word32 smooth_buf_fx[SBA_DIRAC_STEREO_NUM_BANDS][SBA_DIRAC_NRG_SMOOTH_LONG + 1]; /* Q(q_smooth_buf_fx) */ + Word16 smooth_fac_fx[NB_DIV][SBA_DIRAC_STEREO_NUM_BANDS]; /* Q15 */ Word16 q_smooth_buf_fx; Word16 q_hb_nrg; Word16 q_hb_nrg_subr; @@ -374,17 +390,20 @@ typedef struct stereo_dft_dec_data_struct /* DFT Stereo mono output structure */ typedef struct stereo_dft_dmx_out_data_structure { - float targetGain; /* TCA gain norm applied on target (or right) channel in current frame */ +#ifndef IVAS_FLOAT_FIXED + float targetGain; /* TCA gain norm applied on target (or right) channel in current frame */ float prevTargetGain; /* TCA gain norm applied on target (or right) channel in previous frame */ -#ifdef IVAS_FLOAT_FIXED - Word32 targetGain_fx; - Word32 prevTargetGain_fx; +#else + Word32 targetGain_fx; /* Q29 */ + Word32 prevTargetGain_fx; /* Q29 */ #endif + +#ifndef IVAS_FLOAT_FIXED float memOutHB[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; float memTransitionHB[NS2SA( 48000, STEREO_DFT32MS_OVL_NS )]; -#ifdef IVAS_FLOAT_FIXED - Word32 memOutHB_fx[NS2SA(48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS)]; - Word32 memTransitionHB_fx[NS2SA(48000, STEREO_DFT32MS_OVL_NS)]; +#else + Word32 memOutHB_fx[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; /* Q11 */ + Word32 memTransitionHB_fx[NS2SA( 48000, STEREO_DFT32MS_OVL_NS )]; /* Q11 */ #endif } STEREO_DFT_DMX_DATA, *STEREO_DFT_DMX_DATA_HANDLE; @@ -396,36 +415,46 @@ typedef struct stereo_dft_dmx_out_data_structure typedef struct stereo_dec_cng { +#ifndef IVAS_FLOAT_FIXED float coh[STEREO_DFT_BAND_MAX + 1]; /* coherence */ float cm[STEREO_DFT_BAND_MAX]; /* cm */ -#ifdef IVAS_FLOAT_FIXED - Word16 cm_fx[STEREO_DFT_BAND_MAX]; /* cm */ - Word16 coh_fx[STEREO_DFT_BAND_MAX + 1]; /* coherence */ -#endif - int16_t first_SID; /* first SID indicator */ - int16_t first_SID_after_TD; /* first SID after TD-stereo indicator */ - int16_t prev_sid_nodata; /* previous frame SID/FRAME_NO_DATA indicator */ - int16_t last_tdm_idx; /* last tdm index */ - float c_LR_LT; /* left right cross correlation */ - Word32 c_LR_LT_fx; /* left right cross correlation */ - int16_t active_frame_counter; /* counter for active frames */ - int16_t xfade_frame_counter; /* xfade counter */ - int16_t xfade_length; /* number of frames to perform xfade */ - int16_t nr_dft_frames; /* dft frame counter */ - int16_t nr_corr_frames; /* correlation frame counter */ - int16_t nr_sid_frames; /* SID frame counter */ - int16_t last_act_element_mode; /* Element mode of last active frame */ - float olapBufferSynth22[FFTLEN]; /* overlap buffer for secondary channel CNA */ - Word16 olapBufferSynth22_fx[FFTLEN]; /* overlap buffer for secondary channel CNA */ - Word32 olapBufferSynth22_32fx[FFTLEN]; /* overlap buffer for secondary channel CNA */ - int16_t flag_cna_fade; /* flag enabling CNA fade out */ - float maskingNoiseS[L_FRAME16k]; /* masking noise (CNA) for secondary channel */ - Word16 maskingNoiseS_fx[L_FRAME16k]; /* masking noise (CNA) for secondary channel */ - int16_t enableSecCNA; /* flag enabling secondary channel CNA */ - float c_PS_LT; /* long term cross-correlation between primary and secondary channel */ - Word16 c_PS_LT_fx; /* long term cross-correlation between primary and secondary channel */ // Assumed Q15 for initialization. Can be modified later if reqd. - const int16_t *frameSize; /* Frame size in samples */ - const int16_t *fftlen; /* FFT length used for the decomposition */ +#else + Word16 cm_fx[STEREO_DFT_BAND_MAX]; /* cm */ /* Q15 */ + Word16 coh_fx[STEREO_DFT_BAND_MAX + 1]; /* coherence */ /* Q15 */ +#endif + int16_t first_SID; /* first SID indicator */ + int16_t first_SID_after_TD; /* first SID after TD-stereo indicator */ + int16_t prev_sid_nodata; /* previous frame SID/FRAME_NO_DATA indicator */ + int16_t last_tdm_idx; /* last tdm index */ +#ifndef IVAS_FLOAT_FIXED + float c_LR_LT; /* left right cross correlation */ +#else + Word32 c_LR_LT_fx; /* left right cross correlation */ /* Q31 */ +#endif + int16_t active_frame_counter; /* counter for active frames */ + int16_t xfade_frame_counter; /* xfade counter */ + int16_t xfade_length; /* number of frames to perform xfade */ + int16_t nr_dft_frames; /* dft frame counter */ + int16_t nr_corr_frames; /* correlation frame counter */ + int16_t nr_sid_frames; /* SID frame counter */ + int16_t last_act_element_mode; /* Element mode of last active frame */ +#ifndef IVAS_FLOAT_FIXED + float olapBufferSynth22[FFTLEN]; /* overlap buffer for secondary channel CNA */ +#endif + Word16 olapBufferSynth22_fx[FFTLEN]; /* overlap buffer for secondary channel CNA */ + Word32 olapBufferSynth22_32fx[FFTLEN]; /* overlap buffer for secondary channel CNA */ + int16_t flag_cna_fade; /* flag enabling CNA fade out */ +#ifndef IVAS_FLOAT_FIXED + float maskingNoiseS[L_FRAME16k]; /* masking noise (CNA) for secondary channel */ +#endif + Word16 maskingNoiseS_fx[L_FRAME16k]; /* masking noise (CNA) for secondary channel */ + int16_t enableSecCNA; /* flag enabling secondary channel CNA */ +#ifndef IVAS_FLOAT_FIXED + float c_PS_LT; /* long term cross-correlation between primary and secondary channel */ +#endif + Word16 c_PS_LT_fx; /* long term cross-correlation between primary and secondary channel */ // Assumed Q15 for initialization. Can be modified later if reqd. + const int16_t *frameSize; /* Frame size in samples */ + const int16_t *fftlen; /* FFT length used for the decomposition */ } STEREO_CNG_DEC, *STEREO_CNG_DEC_HANDLE; @@ -444,7 +473,7 @@ typedef struct stereo_td_dec_data_structure int16_t tdm_lp_reuse_flag; /* Flag that indicate if it is possible to reuse the LP coefficient from the primary channel or not */ int16_t tdm_low_rate_mode; /* secondary channel low rate mode flag */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float tdm_Pri_pitch_buf[NB_SUBFR]; #endif Word16 tdm_Pri_pitch_buf_fx[NB_SUBFR]; @@ -452,15 +481,17 @@ typedef struct stereo_td_dec_data_structure int16_t tdm_LRTD_flag; int16_t flag_skip_DMX; /* flag that indicates whether the TD downmixing is skipped */ +#ifndef IVAS_FLOAT_FIXED float TCX_old_syn_Overl[L_FRAME16k / 2]; /* past ovrl buffer for possible switching from TD stereo ACELP to MDCT stereo TCX frame */ - Word32 TCX_old_syn_Overl_fx[L_FRAME16k / 2]; /* past ovrl buffer for possible switching from TD stereo ACELP to MDCT stereo TCX frame */ - float prevSP_ratio; /* previous SP ratio */ - Word32 prevSP_ratio_fx; /* previous SP ratio */ float SP_ratio_LT; /* longterm SP ratio */ - Word32 SP_ratio_LT_fx; /* longterm SP ratio */ float c_LR_LT; /* left-right cross-correlation */ +#else + Word32 TCX_old_syn_Overl_fx[L_FRAME16k / 2]; /* past ovrl buffer for possible switching from TD stereo ACELP to MDCT stereo TCX frame */ /* Q11 */ + Word16 prevSP_ratio_fx; /* previous SP ratio */ + Word32 SP_ratio_LT_fx; /* longterm SP ratio */ Word32 c_LR_LT_fx; /* left-right cross-correlation */ +#endif } STEREO_TD_DEC_DATA, *STEREO_TD_DEC_DATA_HANDLE; @@ -618,7 +649,7 @@ typedef struct stereo_icbwe_dec_data_structure Word16 icbweM2Ref_prev_fx; /* Q14 */ #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float nlExc16k[L_FRAME16k]; float mixExc16k[L_FRAME16k]; float shbSynthRef[L_FRAME16k]; @@ -629,7 +660,7 @@ typedef struct stereo_icbwe_dec_data_structure Word16 shbSynthRef_fx[L_FRAME16k]; /* Q(st->prev_Qx) */ #endif Word16 MSFlag; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lpSHBRef[LPC_SHB_ORDER + 1]; float gshapeRef[NUM_SHB_SUBFR]; float gFrameRef; @@ -733,6 +764,7 @@ typedef struct ivas_dirac_dec_data_structure typedef struct dirac_output_synthesis_cov_state_structure { /* only pointer to local buffers */ +#ifndef IVAS_FLOAT_FIXED float *direct_power_factor; float *diffuse_power_factor; @@ -746,7 +778,7 @@ typedef struct dirac_output_synthesis_cov_state_structure float *proto_diffuse_buffer_f; /* Buffer for diffuse sound prototype signals. Size: 2*num_freq_bands*num_channels*buffer_length (complex interleaved). */ float *proto_power; /* Smoothed power of the prototype signals. Size: num_freq_bands*num_channels. */ float *proto_power_diff; - +#endif float *cx_old[CLDFB_NO_CHANNELS_MAX]; float *cy_old[CLDFB_NO_CHANNELS_MAX]; float *mixing_matrix_old[CLDFB_NO_CHANNELS_MAX]; @@ -760,6 +792,13 @@ typedef struct dirac_output_synthesis_cov_state_structure Word32 *mixing_matrix_fx[CLDFB_NO_CHANNELS_MAX]; Word32 *mixing_matrix_res_old_fx[CLDFB_NO_CHANNELS_MAX]; Word32 *mixing_matrix_res_fx[CLDFB_NO_CHANNELS_MAX]; + + Word16 * cx_old_e; + Word16 *cy_old_e; + Word16 *mixing_matrix_old_exp; + Word16 *mixing_matrix_res_old_exp; + Word16 *mixing_matrix_exp; + Word16 *mixing_matrix_res_exp; #endif // IVAS_FLOAT_FIXED } DIRAC_OUTPUT_SYNTHESIS_COV_STATE; @@ -789,10 +828,11 @@ typedef struct ivas_param_mc_dec_data_structure float *Cldfb_RealBuffer_tc; float *Cldfb_ImagBuffer_tc; #ifdef IVAS_FLOAT_FIXED - Word32 *Cldfb_RealBuffer_tc_fx; + Word32 *Cldfb_RealBuffer_tc_fx; // Q12 Word16 Cldfb_RealBuffer_tc_e; - Word32 *Cldfb_ImagBuffer_tc_fx; + Word32 *Cldfb_ImagBuffer_tc_fx; // Q12 Word16 Cldfb_ImagBuffer_tc_e; + Word16 sz; #endif int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; int16_t nb_subframes; @@ -819,6 +859,10 @@ typedef struct ivas_param_mc_dec_data_structure #ifdef IVAS_FLOAT_FIXED Word32 *proto_frame_dec_f_fx; Word16 exp_proto_frame_dec_f; + + Word32 *proto_frame_f_fx; // Q11 + Word16 proto_frame_f_len; + Word16 proto_frame_dec_f_len; #endif DIRAC_OUTPUT_SYNTHESIS_COV_STATE h_output_synthesis_cov_state; @@ -832,14 +876,16 @@ typedef struct ivas_param_mc_dec_data_structure Word16 *icld_q_fx; #endif int16_t max_param_band_abs_cov; +#ifndef IVAS_FLOAT_FIXED float *ls_conv_dmx_matrix; +#endif float *proto_matrix_int; #ifdef IVAS_FLOAT_FIXED - Word32 *proto_frame_f_fx; Word16 q_proto_frame_f; Word32 *ls_conv_dmx_matrix_fx; Word16 ls_conv_dmx_e; Word32 *proto_matrix_int_fx; + Word16 proto_matrix_int_e; #endif /*sub-modules*/ @@ -862,20 +908,33 @@ typedef struct ivas_mc_paramupmix_dec_data_structure { int16_t num_freq_bands; ivas_td_decorr_state_t *hTdDecorr[MC_PARAMUPMIX_COMBINATIONS]; + int32_t alpha_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int32_t beta_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int16_t first_frame; + int16_t free_param_interpolator; + + +#ifdef IVAS_FLOAT_FIXED + Word32 alphas_fx[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; // Q28 + Word32 betas_fx[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; // Q28 + Word32 alpha_prev_fx[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; // Q28 + Word32 beta_prev_fx[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; // Q28 + Word32 *pcm_delay_fx[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS]; + Word16 *param_interpolator_fx; // Q15 + Word32 alpha_sf_fx[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];//Q28 + Word32 beta_sf_fx[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];//Q28 + Word32 *hoa_encoder_fx; +#else float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; float alpha_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; float beta_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; - int32_t alpha_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; - int32_t beta_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; - int16_t first_frame; float *pcm_delay[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS]; float *param_interpolator; float alpha_sf[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; float beta_sf[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; - int16_t free_param_interpolator; float *hoa_encoder; - +#endif // IVAS_FLOAT_FIXED } MC_PARAMUPMIX_DEC_DATA, *MC_PARAMUPMIX_DEC_HANDLE; @@ -886,9 +945,10 @@ typedef struct ivas_mc_paramupmix_dec_data_structure /* SPAR MD structure */ typedef struct ivas_spar_dec_matrices_t { +#ifndef IVAS_FLOAT_FIXED float ***C_re; float ***P_re; -#ifdef IVAS_FLOAT_FIXED +#else Word32 ***C_re_fx; Word32 ***P_re_fx; #endif // DEBUG @@ -909,8 +969,10 @@ typedef struct ivas_spar_md_dec_state_t int16_t num_decorr; int16_t td_decorr_flag; int16_t spar_plc_enable_fadeout_flag; +#ifndef IVAS_FLOAT_FIXED float ***mixer_mat; float mixer_mat_prev[MAX_PARAM_SPATIAL_SUBFRAMES + 1][IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; +#endif ivas_spar_md_com_cfg spar_md_cfg; ivas_arith_coeffs_t arith_coeffs; ivas_huff_coeffs_t huff_coeffs; @@ -919,13 +981,16 @@ typedef struct ivas_spar_md_dec_state_t int16_t spar_hoa_md_flag; int16_t spar_hoa_dirac2spar_md_flag; int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; + float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; float smooth_fac[IVAS_MAX_NUM_BANDS]; #ifdef IVAS_FLOAT_FIXED Word32 smooth_buf_fx[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; Word16 smooth_fac_fx[IVAS_MAX_NUM_BANDS]; #endif +#ifndef IVAS_FLOAT_FIXED float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; +#endif int16_t first_valid_frame; ivas_band_coeffs_t *band_coeffs_prev; int16_t base_band_coeffs_age[IVAS_MAX_NUM_BANDS]; @@ -944,11 +1009,12 @@ typedef struct ivas_spar_md_dec_state_t /* AGC structure */ typedef struct ivas_agc_dec_chan_state_t { +#ifndef IVAS_FLOAT_FIXED float lastGain; -#ifdef IVAS_FLOAT_FIXED - Word16 lastGain_fx; +#else + Word16 lastGain_fx; /* Q15 */ #endif // IVAS_FLOAT_FIXED - int16_t gainExpVal; + Word16 gainExpVal; } ivas_agc_dec_chan_state_t; @@ -964,10 +1030,14 @@ typedef struct ivas_agc_dec_state_t /* PCA structure */ typedef struct { +#ifndef IVAS_FLOAT_FIXED float prev_ql[IVAS_PCA_INTERP]; float prev_qr[IVAS_PCA_INTERP]; +#endif int16_t prev_pca_bypass; +#ifndef IVAS_FLOAT_FIXED float mem_eigVec_interp[IVAS_PCA_LEN_INTERP_EIG_DEC]; +#endif /* parser output: */ int16_t pca_bypass; int32_t index[2]; @@ -1026,11 +1096,11 @@ typedef struct sce_dec_data_structure /* core coder handle */ DEC_CORE_HANDLE hCoreCoder[1]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_hb_synth[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; /* HB synthesis synchro buffer */ -#endif float *save_synth; float *save_hb_synth; +#endif #ifdef IVAS_FLOAT_FIXED Word32 prev_hb_synth_fx[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; /* HB synthesis synchro buffer */ @@ -1059,7 +1129,7 @@ typedef struct cpe_dec_data_structure int16_t stereo_switching_counter; int16_t NbFrameMod; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lt_es_em; #endif /* core coder handle */ @@ -1075,17 +1145,19 @@ typedef struct cpe_dec_data_structure STEREO_CNG_DEC_HANDLE hStereoCng; /* Stereo CNG data structure */ int16_t nchan_out; /* number of output channels (1: mono dmx, 2: default stereo) */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_hb_synth[CPE_CHANNELS][NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; float *prev_synth_chs[CPE_CHANNELS]; -#endif float prev_synth[CPE_CHANNELS][NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS )]; +#endif /* DFT stereo I/O channel buffer memories that need to be updated for TD->DFT stereo switching */ +#ifndef IVAS_FLOAT_FIXED float *input_mem[CPE_CHANNELS]; float *input_mem_LB[CPE_CHANNELS]; float *input_mem_BPF[1]; float *output_mem[CPE_CHANNELS]; +#endif #ifdef IVAS_FLOAT_FIXED Word32 lt_es_em_fx;//24 @@ -1094,11 +1166,11 @@ typedef struct cpe_dec_data_structure Word32 prev_synth_fx[CPE_CHANNELS][NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS )]; Word16 q_prev_synth_fx; - Word32 *input_mem_fx[CPE_CHANNELS]; - Word32 *input_mem_LB_fx[CPE_CHANNELS]; - Word32 *input_mem_BPF_fx[1]; + Word32 *input_mem_fx[CPE_CHANNELS]; /* Q11 */ + Word32 *input_mem_LB_fx[CPE_CHANNELS]; /* Q11 */ + Word32 *input_mem_BPF_fx[1]; /* Q11 */ - Word32 *output_mem_fx[CPE_CHANNELS]; + Word32 *output_mem_fx[CPE_CHANNELS]; /* Q(q_output_mem_fx) */ Word16 q_output_mem_fx[CPE_CHANNELS]; Word32 *prev_synth_chs_fx[CPE_CHANNELS]; @@ -1108,7 +1180,7 @@ typedef struct cpe_dec_data_structure #endif /* buffers used for fading between MDCT and DFT Stereo */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_out_mdct[STEREO_MDCT2DFT_FADE_LEN_48k]; float old_outLB_mdct[2 * STEREO_MDCT2DFT_FADE_LEN_48k]; #endif @@ -1153,22 +1225,29 @@ typedef struct ivas_lfe_dec_data_structure { ivas_filters_process_state_t filter_state; LFE_WINDOW_HANDLE pWindow_state; - const uint16_t *cum_freq_models[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; - int16_t lfe_dec_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; + const UWord16 *cum_freq_models[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; + Word16 lfe_dec_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; +#ifndef IVAS_FLOAT_FIXED float lfe_block_delay_s; - int16_t lfe_prior_buf_len; +#else + Word16 lfe_block_delay_s_fx; /* Q15 */ +#endif + Word16 lfe_prior_buf_len; +#ifndef IVAS_FLOAT_FIXED float prior_out_buffer[L_FRAME48k]; +#else + Word32 prior_out_buffer_fx[L_FRAME48k]; /* Q9 */ +#endif float prevsynth_buf[LFE_PLC_BUFLEN]; +#ifndef IVAS_FLOAT_FIXED float *lfe_delay_buf; -#ifdef IVAS_FLOAT_FIXED - Word16 lfe_block_delay_s_fx; - Word32 prior_out_buffer_fx[L_FRAME48k]; - Word32 prevsynth_buf_fx[LFE_PLC_BUFLEN]; - Word32 *lfe_delay_buf_fx; +#else + Word32 prevsynth_buf_fx[LFE_PLC_BUFLEN]; /* Q9 */ + Word32 *lfe_delay_buf_fx; /* Q9 */ #endif // IVAS_FLOAT_FIXED - int16_t lfe_addl_delay; - int16_t bfi_count; + Word16 lfe_addl_delay; + Word16 bfi_count; } LFE_DEC_DATA, *LFE_DEC_HANDLE; @@ -1179,16 +1258,17 @@ typedef struct ivas_lfe_dec_data_structure typedef struct renderer_struct { - float prev_gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; - float *interpolator; #ifdef IVAS_FLOAT_FIXED Word32 prev_gains_fx[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; Word16 *interpolator_fx; Word16 interpolator_len; Word32 gains_fx[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; -#endif +#else + float prev_gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; + float *interpolator; int16_t interpolator_length; float gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; +#endif } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; @@ -1434,8 +1514,9 @@ typedef struct Decoder_Struct uint16_t *bit_stream; /* Pointer to bitstream buffer */ int16_t writeFECoffset; /* parameter for debugging JBM stuff */ - +#ifndef IVAS_FLOAT_FIXED float **mem_hp20_out; /* output signals HP filter memories */ +#endif IVAS_LIMITER_HANDLE hLimiter; /* Limiter handle */ float *p_output_f[MAX_OUTPUT_CHANNELS+MAX_NUM_OBJECTS]; /* floating-point output audio buffers */ @@ -1515,6 +1596,8 @@ typedef struct Decoder_Struct Word32 **mem_hp20_out_fx; Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* floating-point output audio buffers */ Word16 p_out_len;/*Stores the total no of channels for which memory is allocated to p_output_fx*/ + Word16 num_src; + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; #endif } Decoder_Struct; diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 55874bb333814546b33dffd693b82135ec1d3365..b549879e01187f92a9c3237bb780a1787e3535cb 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -1340,11 +1340,14 @@ static void stereo_dft_generate_comfort_noise_fx( IF( EQ_16( chan, 0 ) && LE_32( st->core_brate, SID_2k40 ) ) { + Word32 max_smoothed_psd = 0; move32(); + (void)maximum_32_fx(&st->hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand], sub(hFdCngCom->stopFFTbin, hFdCngCom->startBand), &max_smoothed_psd); /* update smoothed periodogram used by stereo CNA in SID and NO_DATA frames from cngNoiseLevel_flt */ FOR( i = hFdCngCom->startBand; i < hFdCngCom->stopFFTbin; i++ ) { Word16 l_shift_val = sub(st->hFdCngDec->q_smoothed_psd, hFdCngCom->q_cngNoiseLevel); move16(); + l_shift_val = max_smoothed_psd == 0 ? 0 :l_shift_val; ftmp = hFdCngCom->cngNoiseLevel[i - hFdCngCom->startBand]; move32(); IF( !st->hFdCngDec->first_cna_noise_updated ) @@ -1357,7 +1360,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 ), st->hFdCngDec->smoothed_psd_fx[i] ) ) + IF( GT_32( st->hFdCngDec->smoothed_psd_fx[i], 0 ) && GT_32( Mpy_32_16_1( ftmp, (Word16) 0x3333 ), L_shr(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)); @@ -1377,10 +1380,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], 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 ); - - st->hFdCngDec->first_cna_noise_updated = 1; - move16(); + 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); + Scale_sig32(st->hFdCngDec->msNoiseEst, NPART_SHAPING, sub( st->hFdCngDec->msNoiseEst_exp, 27 ) ); + st->hFdCngDec->msNoiseEst_exp = 27; + st->hFdCngDec->first_cna_noise_updated = 1; move16(); Copy32( st->hFdCngDec->msNoiseEst, st->hFdCngDec->msPeriodog_ST_fx, st->hFdCngDec->nFFTpart_shaping ); st->hFdCngDec->ms_last_inactive_bwidth = st->bwidth; move16(); @@ -1484,15 +1487,18 @@ void stereo_cng_dec_update( const Word32 ivas_total_brate /* i : IVAS total bitrate */ ) { - IF( hCPE->hCoreCoder[0]->core_brate > SID_2k40 ) + IF( GT_32( hCPE->hCoreCoder[0]->core_brate, SID_2k40 ) ) { hCPE->hStereoCng->last_act_element_mode = hCPE->element_mode; - IF( hCPE->hStereoCng->active_frame_counter > SKIP_XFADE_FRAMES ) + move16(); + IF( GT_16( hCPE->hStereoCng->active_frame_counter, SKIP_XFADE_FRAMES ) ) { hCPE->hStereoCng->xfade_frame_counter = 0; + move16(); hCPE->hStereoCng->xfade_length = 0; + move16(); } - IF( hCPE->hStereoCng->active_frame_counter < MAX_FRAME_COUNTER ) + IF( LT_16( hCPE->hStereoCng->active_frame_counter, MAX_FRAME_COUNTER ) ) { hCPE->hStereoCng->active_frame_counter++; } @@ -1500,25 +1506,30 @@ void stereo_cng_dec_update( ELSE { hCPE->hStereoCng->active_frame_counter = 0; - IF( hCPE->hStereoCng->xfade_frame_counter < MAX_FRAME_COUNTER ) + move16(); + IF( LT_16( hCPE->hStereoCng->xfade_frame_counter, MAX_FRAME_COUNTER ) ) { hCPE->hStereoCng->xfade_frame_counter++; } } - IF( hCPE->element_mode == IVAS_CPE_DFT ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { - IF( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) + test(); + IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) { hCPE->hStereoCng->prev_sid_nodata = 1; + move16(); } ELSE { hCPE->hStereoCng->prev_sid_nodata = 0; + move16(); } } hCPE->hCoreCoder[0]->hFdCngDec->hFdCngCom->active_frame_counter = hCPE->hStereoCng->active_frame_counter; + move16(); return; } @@ -1674,12 +1685,15 @@ void stereo_cng_compute_PScorr( return; } + + /*-------------------------------------------------------------------* * Function stereo_cng_compute_LRcorr() * * CNA for TD stereo, compute LR correlation *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void stereo_cng_compute_LRcorr( CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ float *output[CPE_CHANNELS], /* i : Output signal */ @@ -1723,7 +1737,7 @@ static void stereo_cng_compute_LRcorr( return; } - +#else static void stereo_cng_compute_LRcorr_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ Word32 *output_fx[CPE_CHANNELS], /* i : Output signal */ @@ -1816,10 +1830,6 @@ static void stereo_cng_compute_LRcorr_fx( c_fx = BASOP_Util_Divide3232_Scale( (Word32) enrL_fx, (Word32) enrR_fx, &div_q ); c_q = 15 - div_q + ( enrR_q - enrL_q ); - // to be delete - hCPE->hStereoCng->c_LR_LT = (float) hCPE->hStereoCng->c_LR_LT_fx / ( ONE_IN_Q31 ); - hCPE->hStereoTD->c_LR_LT = (float) hCPE->hStereoTD->c_LR_LT_fx / ( ONE_IN_Q31 ); - 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 ) ) ); hCPE->hStereoCng->c_LR_LT_fx = hCPE->hStereoTD->c_LR_LT_fx; @@ -1881,8 +1891,6 @@ static void stereo_cng_compute_LRcorr_fx( 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 ) ); - // to be deleted - hCPE->hStereoTD->SP_ratio_LT = (float) hCPE->hStereoTD->SP_ratio_LT_fx / ONE_IN_Q31; IF( hCPE->hStereoCng->nr_corr_frames < CM_INIT ) { hCPE->hStereoCng->nr_corr_frames++; @@ -1892,7 +1900,7 @@ static void stereo_cng_compute_LRcorr_fx( return; } - +#endif /*-------------------------------------------------------------------* @@ -1995,13 +2003,14 @@ static void FindEmEs_fx( return; } -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------* * Function stereo_cna_update_params() * * compute LR correlation and update long-term parameters for stereo CNA *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void stereo_cna_update_params( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ float *output[CPE_CHANNELS], /* i : Output signal */ @@ -2316,12 +2325,15 @@ void stereo_cna_update_params_fx( return; } #endif + + /*------------------------------------------------------------------- * stereo_cng_init_dec() * * Initialized stereo CNG *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void stereo_cng_init_dec( STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ const int16_t *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 */ @@ -2338,17 +2350,17 @@ void stereo_cng_init_dec( hStereoCng->nr_dft_frames = 0; hStereoCng->nr_corr_frames = 0; hStereoCng->nr_sid_frames = 0; - set_f( hStereoCng->olapBufferSynth22, 0.0f, FFTLEN ); hStereoCng->flag_cna_fade = 0; + set_f( hStereoCng->olapBufferSynth22, 0.0f, FFTLEN ); set_zero( hStereoCng->maskingNoiseS, L_FRAME16k ); - hStereoCng->enableSecCNA = 0; hStereoCng->c_PS_LT = 0.5f; + hStereoCng->enableSecCNA = 0; hStereoCng->frameSize = frameSize; hStereoCng->last_act_element_mode = IVAS_CPE_DFT; return; } -#ifdef IVAS_FLOAT_FIXED +#else void stereo_cng_init_dec_fx( STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ const Word16 *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 */ @@ -2386,13 +2398,6 @@ void stereo_cng_init_dec_fx( hStereoCng->last_act_element_mode = IVAS_CPE_DFT; move16(); -#if 1 - set_f( hStereoCng->olapBufferSynth22, 0.0f, FFTLEN ); - set_f( hStereoCng->coh, 0.5f, STEREO_DFT_BAND_MAX + 1 ); - set_zero( hStereoCng->cm, STEREO_DFT_BAND_MAX ); - hStereoCng->c_PS_LT = 0.5f; -#endif - return; } #endif diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 9f3b0ba788288340c9535c18ca1a457e965a6334..c7540036229895858cd8aad4d1c14bc86e21dd9f 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -251,62 +251,8 @@ void stereo_dft_dequantize_itd( * Create DFT stereo handle *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error stereo_dft_dec_create( -#ifdef IVAS_FLOAT_FIXED - STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 element_brate, /* i : element bitrate */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const Word16 nchan_transport /* i : number of transport channels */ -) -{ - STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc; - Word16 tmpS; - - IF ( *hStereoDft != NULL ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" ); - } - - IF ( ( hStereoDft_loc = (STEREO_DFT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) ); - } - - IF ( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) ); - } - - IF ( ( hStereoDft_loc->hBpf = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF handle\n" ) ); - } - - IF ( ( hStereoDft_loc->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); - } - - hStereoDft_loc->hConfig->force_mono_transmission = 0; - move16(); - - IF ( sba_dirac_stereo_flag ) - { - ivas_sba_dirac_stereo_config( hStereoDft_loc->hConfig ); - } - ELSE - { - stereo_dft_config( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS ); - } - - stereo_dft_dec_open( hStereoDft_loc, output_Fs, nchan_transport ); - - *hStereoDft = hStereoDft_loc; - - return IVAS_ERR_OK; -} -#else STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ const int32_t element_brate, /* i : element bitrate */ const int32_t output_Fs, /* i : output sampling rate */ @@ -350,11 +296,7 @@ ivas_error stereo_dft_dec_create( } else { -#ifdef IVAS_FLOAT_FIXED - stereo_dft_config_fx( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS ); -#else stereo_dft_config( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS ); -#endif } stereo_dft_dec_open( hStereoDft_loc, output_Fs, nchan_transport ); @@ -372,102 +314,7 @@ ivas_error stereo_dft_dec_create( * Open DFT decoder stereo handle *-------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -void stereo_dft_dec_open( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 nchan_transport /* i : number of transport channels */ -) -{ - /*Sizes*/ - hStereoDft->N = (Word16) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); - - /*Init. DFT sizes*/ - hStereoDft->NFFT = (Word16) ( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); - - SWITCH (output_Fs) - { - case 48000: - hStereoDft->ONE_NFFT = (Word32) ( 0x00222222 ); - BREAK; - case 32000: - hStereoDft->ONE_NFFT = (Word32) ( 0x00333333 ); - BREAK; - case 16000: - hStereoDft->ONE_NFFT = (Word32) ( 0x00666666 ); - BREAK; - case 8000: - hStereoDft->ONE_NFFT = (Word32) ( 0x00CCCCCC ); - BREAK; - default: - assert(0); - } - 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 = (Word16) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); - 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 = (Word16) ( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); - 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; - - - IF ( EQ_32( output_Fs, 16000 ) ) - { - hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; - hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; - hStereoDft->win232ms_fx = dft_win232ms_16k_fx; - hStereoDft->win32ms_fx = dft_win232ms_16k_fx + 1; - } - ELSE IF ( EQ_32( output_Fs, 32000 ) ) - { - hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; - hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; - hStereoDft->win232ms_fx = dft_win232ms_32k_fx; - hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; - } - ELSE - { - assert( EQ_32( output_Fs, 48000 ) ); - - hStereoDft->dft_trigo_fx = dft_trigo_48k_fx; - hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; - hStereoDft->win232ms_fx = dft_win232ms_48k_fx; - hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; - } - - hStereoDft->win_8k_fx = dft_win_8k_fx; - - /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ - set_s( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB ); - - hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); - hStereoDft->hb_stefi_delay = NS2SA( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); - - IF ( GT_16( nchan_transport, 2 ) ) - { - hStereoDft->min_smooth_gains_fx = min_smooth_gains2_fx; - hStereoDft->max_smooth_gains_fx = max_smooth_gains2_fx; - } - ELSE - { - hStereoDft->min_smooth_gains_fx = min_smooth_gains1_fx; - hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; - } - hStereoDft->q_hb_stefi_sig_fx = Q31; - hStereoDft->q_ap_fade_mem_fx = Q31; - - /* reset DFT stereo memories */ - stereo_dft_dec_reset( hStereoDft ); - - return; -} -#else +#ifndef IVAS_FLOAT_FIXED void stereo_dft_dec_open( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ const int32_t output_Fs, /* i : output sampling rate */ @@ -483,51 +330,16 @@ void stereo_dft_dec_open( hStereoDft->dft_trigo_8k = dft_trigo_32k; hStereoDft->dft_trigo_12k8 = dft_trigo_12k8; hStereoDft->dft_trigo_16k = dft_trigo_32k; -#ifdef IVAS_FLOAT_FIXED - switch (output_Fs) - { - case 48000: - hStereoDft->ONE_NFFT = (Word32) ( 0x00222222 ); - BREAK; - case 32000: - hStereoDft->ONE_NFFT = (Word32) ( 0x00333333 ); - BREAK; - case 16000: - hStereoDft->ONE_NFFT = (Word32) ( 0x00666666 ); - BREAK; - case 8000: - hStereoDft->ONE_NFFT = (Word32) ( 0x00CCCCCC ); - BREAK; - default: - assert(0); - } - 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; -#endif - hStereoDft->dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); hStereoDft->win232ms_8k = dft_win232ms_8k; hStereoDft->win232ms_12k8 = dft_win232ms_12k8; hStereoDft->win232ms_16k = dft_win232ms_16k; -#ifdef IVAS_FLOAT_FIXED - hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx; - hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx; - hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx; -#endif - hStereoDft->dft32ms_ovl2 = (int16_t) ( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); hStereoDft->win32ms_8k = dft_win232ms_8k + 1; hStereoDft->win32ms_12k8 = dft_win232ms_12k8 + 1; hStereoDft->win32ms_16k = dft_win232ms_16k + 1; -#ifdef IVAS_FLOAT_FIXED - 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; -#endif - if ( output_Fs == 16000 ) { @@ -535,12 +347,6 @@ void stereo_dft_dec_open( hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; hStereoDft->win232ms = dft_win232ms_16k; hStereoDft->win32ms = dft_win232ms_16k + 1; - -#ifdef IVAS_FLOAT_FIXED - hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; - hStereoDft->win232ms_fx = dft_win232ms_16k_fx; - hStereoDft->win32ms_fx = dft_win232ms_16k_fx + 1; -#endif } else if ( output_Fs == 32000 ) { @@ -548,12 +354,6 @@ void stereo_dft_dec_open( hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; hStereoDft->win232ms = dft_win232ms_32k; hStereoDft->win32ms = dft_win232ms_32k + 1; - -#ifdef IVAS_FLOAT_FIXED - hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; - hStereoDft->win232ms_fx = dft_win232ms_32k_fx; - hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; -#endif } else { @@ -562,27 +362,14 @@ void stereo_dft_dec_open( hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; hStereoDft->win232ms = dft_win232ms_48k; hStereoDft->win32ms = dft_win232ms_48k + 1; - -#ifdef IVAS_FLOAT_FIXED - hStereoDft->dft_trigo_fx = dft_trigo_48k_fx; - hStereoDft->win232ms_fx = dft_win232ms_48k_fx; - hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; -#endif } hStereoDft->win_8k = dft_win_8k; -#ifdef IVAS_FLOAT_FIXED - hStereoDft->win_8k_fx = dft_win_8k_fx; -#endif /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ set_s( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB ); -#ifdef IVAS_FLOAT_FIXED - hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); -#else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); -#endif hStereoDft->hb_stefi_delay = NS2SA( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); if ( nchan_transport > 2 ) @@ -596,19 +383,6 @@ void stereo_dft_dec_open( hStereoDft->max_smooth_gains = max_smooth_gains1; } -#ifdef IVAS_FLOAT_FIXED - if ( nchan_transport > 2 ) - { - hStereoDft->min_smooth_gains_fx = min_smooth_gains2_fx; - hStereoDft->max_smooth_gains_fx = max_smooth_gains2_fx; - } - else - { - hStereoDft->min_smooth_gains_fx = min_smooth_gains1_fx; - hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; - } -#endif - /* reset DFT stereo memories */ stereo_dft_dec_reset( hStereoDft ); @@ -623,6 +397,7 @@ void stereo_dft_dec_open( * Reset DFT stereo memories *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void stereo_dft_dec_reset( STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle */ ) @@ -642,94 +417,43 @@ void stereo_dft_dec_reset( for ( i = 0; i < STEREO_DFT_PAST_MAX; i++ ) { set_zero( hStereoDft->DFT_past_DMX[i], STEREO_DFT32MS_N_32k ); -#ifndef IVAS_FLOAT_FIXED set_zero( hStereoDft->past_res_pred_gain[i], STEREO_DFT_BAND_MAX ); -#else - set32_fx( hStereoDft->past_res_pred_gain_fx[i], 0, STEREO_DFT_BAND_MAX ); -#endif - } - -#ifdef IVAS_FLOAT_FIXED - FOR ( i = 0; i < STEREO_DFT_PAST_MAX; i++ ) - { - set_val_Word32( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k ); - set_val_Word32( hStereoDft->past_res_pred_gain_fx[i], 0, STEREO_DFT_BAND_MAX ); - hStereoDft->q_DFT_past_DMX_fx[i] = 0; } -#endif hStereoDft->past_DMX_pos = 0; set_s( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX ); -#ifndef IVAS_FLOAT_FIXED for ( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) { hStereoDft->res_gains_ind[0][i] = 15.f; } set_zero( hStereoDft->res_gains_ind[1], STEREO_DFT_BAND_MAX ); -#else - FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) - { - hStereoDft->res_gains_ind_fx[0][i] = 1006632960; /* 15.0f in Q26 */ - } - - set_val_Word32( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX ); -#endif /*residual coding*/ set_s( 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]; set_zero( hStereoDft->res_cod_mem, STEREO_DFT_OVL_8k ); -#ifdef IVAS_FLOAT_FIXED - set_l( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); -#endif hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); -#ifndef IVAS_FLOAT_FIXED hStereoDft->stab_fac_smooth_res = 0.f; -#else - hStereoDft->stab_fac_smooth_res_fx = 0; -#endif -#ifdef IVAS_FLOAT_FIXED - bass_psfilter_init_fx(hStereoDft->hBpf); -#endif + bass_psfilter_init( hStereoDft->hBpf ); + tcxltp_dec_init( hStereoDft->hTcxLtpDec, 0, MODE1, IVAS_CPE_DFT, PIT_MAX, 12800 ); hStereoDft->reverb_flag = 0; hStereoDft->bpf_error_signal_last = 0.0f; -#ifndef IVAS_FLOAT_FIXED hStereoDft->bpf_error_ratio_mem = 1.0f; hStereoDft->res_hb_nrg_mem = 0.0f; -#else - hStereoDft->res_hb_nrg_mem_fx = 0; - hStereoDft->bpf_error_signal_last_fx = 0; - hStereoDft->bpf_error_ratio_mem_fx = ONE_IN_Q13; -#endif // IVAS_FLOAT_FIXED /*reset parameters*/ -#ifndef IVAS_FLOAT_FIXED set_zero( hStereoDft->side_gain, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); set_zero( hStereoDft->gipd, STEREO_DFT_DEC_DFT_NB ); set_zero( hStereoDft->itd, STEREO_DFT_DEC_DFT_NB ); set_zero( hStereoDft->res_pred_gain, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); -#else - set32_fx( hStereoDft->side_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); - set32_fx( hStereoDft->gipd_fx, 0, STEREO_DFT_DEC_DFT_NB ); - set32_fx( hStereoDft->itd_fx, 0, STEREO_DFT_DEC_DFT_NB ); - set32_fx( hStereoDft->res_pred_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); -#endif - -#ifdef IVAS_FLOAT_FIXED - /*reset parameters*/ - set_val_Word32( hStereoDft->side_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); - set_val_Word32( hStereoDft->gipd_fx, 0, STEREO_DFT_DEC_DFT_NB ); - set_val_Word32( hStereoDft->itd_fx, 0, STEREO_DFT_DEC_DFT_NB ); - set_val_Word32( hStereoDft->res_pred_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); -#endif hStereoDft->wasTransient = 0; hStereoDft->attackPresent = 0; @@ -737,40 +461,20 @@ void stereo_dft_dec_reset( hStereoDft->lt_pred_gain = 0.0f; hStereoDft->lt_pred_gain_variation = 0.0f; hStereoDft->lt_var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT; -#ifndef IVAS_FLOAT_FIXED hStereoDft->stefi_short_gain = 1.0f; hStereoDft->stefi_long_gain = 0.0f; -#else - hStereoDft->lt_pred_gain_fx = 0; - hStereoDft->lt_pred_gain_variation_fx = 0; - hStereoDft->lt_var_mean_ratio_fx = STEREO_DFT_RES_RATIO_LIMIT_FX; - hStereoDft->stefi_short_gain_fx = MAX_16; - hStereoDft->stefi_long_gain_fx = 0; - hStereoDft->q_lt_pred_gain = 0; -#endif -#ifdef IVAS_FLOAT_FIXED - set_val_Word16( hStereoDft->g_state_fx, 0, STEREO_DFT_BAND_MAX ); - init_basic_allpass( &hStereoDft->ap1, dft_ap_gains[0], dft_ap_gains_fx[0], dft_ap_delays[0] ); - init_basic_allpass( &hStereoDft->ap2, dft_ap_gains[1], dft_ap_gains_fx[1], dft_ap_delays[1] ); - init_basic_allpass( &hStereoDft->ap3, dft_ap_gains[2], dft_ap_gains_fx[2], dft_ap_delays[2] ); -#else set_zero( hStereoDft->g_state, STEREO_DFT_BAND_MAX ); + init_basic_allpass( &hStereoDft->ap1, dft_ap_gains[0], dft_ap_delays[0] ); init_basic_allpass( &hStereoDft->ap2, dft_ap_gains[1], dft_ap_delays[1] ); init_basic_allpass( &hStereoDft->ap3, dft_ap_gains[2], dft_ap_delays[2] ); -#endif set_zero( hStereoDft->ap_delay_mem, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) ); set_zero( hStereoDft->ap_fade_mem, STEREO_DFT_ALLPASS_FADELEN_16k ); hStereoDft->ap_wasTransient = 0; -#ifdef IVAS_FLOAT_FIXED - set32_fx( hStereoDft->smooth_dmx_nrg_fx, 0, STEREO_DFT_BAND_MAX ); - set32_fx( hStereoDft->smooth_res_nrg_fx, 0, STEREO_DFT_BAND_MAX ); -#else - set_zero(hStereoDft->smooth_dmx_nrg, STEREO_DFT_BAND_MAX); - set_zero(hStereoDft->smooth_res_nrg, STEREO_DFT_BAND_MAX); -#endif + set_zero( hStereoDft->smooth_dmx_nrg, STEREO_DFT_BAND_MAX ); + set_zero( hStereoDft->smooth_res_nrg, STEREO_DFT_BAND_MAX ); set_s( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX ); @@ -778,20 +482,11 @@ void stereo_dft_dec_reset( set_zero( hStereoDft->hb_nrg, STEREO_DFT_CORE_HIST_MAX ); set_zero( hStereoDft->td_gain, STEREO_DFT_CORE_HIST_MAX ); -#ifdef IVAS_FLOAT_FIXED - set32_fx(hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA(48000, STEREO_DFT_TD_STEFI_DELAY_NS)); - set32_fx(hStereoDft->td_gain_fx, 0, STEREO_DFT_CORE_HIST_MAX); -#endif - /* PLC parameters */ set_zero( hStereoDft->res_mem, STEREO_DFT_RES_BW_MAX ); hStereoDft->time_offs = 0; hStereoDft->past_dmx_nrg = 0; -#ifdef IVAS_FLOAT_FIXED - hStereoDft->sg_mean_fx = 0; -#else hStereoDft->sg_mean = 0.0f; -#endif hStereoDft->sg_mem_corrupt = 0; hStereoDft->recovery_flg = 0; @@ -799,54 +494,19 @@ void stereo_dft_dec_reset( { set_zero( hStereoDft->smooth_buf[i], SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); } -#ifndef IVAS_FLOAT_FIXED set_zero( hStereoDft->smooth_fac[0], SBA_DIRAC_STEREO_NUM_BANDS ); set_zero( hStereoDft->smooth_fac[1], SBA_DIRAC_STEREO_NUM_BANDS ); -#else - set16_fx( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS ); - set16_fx( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS ); -#endif -#ifdef IVAS_FLOAT_FIXED - hStereoDft->itd_xfade_target_fx = 0; - hStereoDft->itd_xfade_step_fx = 0; -#else hStereoDft->itd_xfade_target = 0.0f; hStereoDft->itd_xfade_step = 0.0f; -#endif hStereoDft->itd_xfade_counter = 0; -#ifdef IVAS_FLOAT_FIXED - hStereoDft->itd_xfade_prev_fx = 0; -#else hStereoDft->itd_xfade_prev = 0.0f; -#endif hStereoDft->last_active_element_brate = 0; -#ifdef IVAS_FLOAT_FIXED - hStereoDft->ipd_xfade_target_fx = 0; - hStereoDft->ipd_xfade_step_fx = 0; -#else hStereoDft->ipd_xfade_target = 0.0f; hStereoDft->ipd_xfade_step = 0.0f; -#endif hStereoDft->ipd_xfade_counter = 0; -#ifdef IVAS_FLOAT_FIXED - hStereoDft->ipd_xfade_prev_fx = 0; -#else hStereoDft->ipd_xfade_prev = 0.0f; -#endif -#ifdef IVAS_FLOAT_FIXED - FOR( b = 0; b < hStereoDft->nbands; b++ ) - { - FOR( i = 0; i < 2; i++ ) - { - FOR( j = 0; j < 4; j++ ) - { - hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0; - } - } - } -#else for ( b = 0; b < hStereoDft->nbands; b++ ) { for ( i = 0; i < 2; i++ ) @@ -857,74 +517,20 @@ void stereo_dft_dec_reset( } } } -#endif hStereoDft->first_frame = 1; -#ifdef IVAS_FLOAT_FIXED - hStereoDft->g_L_prev_fx = 0; - hStereoDft->g_R_prev_fx = 0; -#else hStereoDft->g_L_prev = 0.f; hStereoDft->g_R_prev = 0.f; -#endif - -#ifdef IVAS_FLOAT_FIXED - set_val_Word32( hStereoDft->ap_delay_mem_fx, 0, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) ); - set_val_Word32( hStereoDft->ap_fade_mem_fx, 0, STEREO_DFT_ALLPASS_FADELEN_16k ); - set_val_Word32( hStereoDft->smooth_dmx_nrg_fx, 0, STEREO_DFT_BAND_MAX ); - set_val_Word32( hStereoDft->smooth_res_nrg_fx, 0, STEREO_DFT_BAND_MAX ); - - set_s( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX ); - - set_val_Word32( hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) ); - set_val_Word32( hStereoDft->hb_nrg_fx, 0, STEREO_DFT_CORE_HIST_MAX ); - set_val_Word32( hStereoDft->td_gain_fx, 0, STEREO_DFT_CORE_HIST_MAX ); - set_val_Word32( hStereoDft->q_td_gain, 0, STEREO_DFT_CORE_HIST_MAX ); - - /* PLC parameters */ - set_val_Word32( hStereoDft->res_mem_fx, 0, STEREO_DFT_RES_BW_MAX ); - hStereoDft->past_dmx_nrg_fx = 0; - hStereoDft->sg_mean_fx = 0; - hStereoDft->q_dft = 0; - hStereoDft->q_smoothed_nrg = 0; - - FOR ( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ ) - { - set_val_Word32( hStereoDft->smooth_buf_fx[i], 0, SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); - } - set_val_Word16( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS ); - set_val_Word16( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS ); - - hStereoDft->itd_xfade_target_fx = 0; - hStereoDft->itd_xfade_step_fx = 0; - hStereoDft->itd_xfade_prev_fx = 0; - hStereoDft->ipd_xfade_target_fx = 0; - hStereoDft->ipd_xfade_step_fx = 0; - hStereoDft->ipd_xfade_prev_fx = 0; - - FOR ( b = 0; b < hStereoDft->nbands; b++ ) - { - FOR ( i = 0; i < 2; i++ ) - { - FOR ( j = 0; j < 4; j++ ) - { - hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0; - } - } - } - hStereoDft->g_L_prev_fx = 0; - hStereoDft->g_R_prev_fx = 0; -#endif return; } - +#endif /*------------------------------------------------------------------------- * stereo_dft_dec_update() * * Update DFT memories for new frame *-------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void stereo_dft_dec_update( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ const int16_t output_frame, /* i : output frame length */ @@ -937,77 +543,58 @@ void stereo_dft_dec_update( k_offset = STEREO_DFT_OFFSET; /*Add an offset*/ /* Update parameters */ -#ifndef IVAS_FLOAT_FIXED - for ( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ ) + for (i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++) { hStereoDft->side_gain[i] = hStereoDft->side_gain[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; hStereoDft->res_pred_gain[i] = hStereoDft->res_pred_gain[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; } -#else - FOR( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ ) - { - hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; - hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; - } -#endif -#ifndef IVAS_FLOAT_FIXED - for ( i = 0; i < k_offset; i++ ) + for (i = 0; i < k_offset; i++) { hStereoDft->gipd[i] = hStereoDft->gipd[STEREO_DFT_NBDIV + i]; } -#else - FOR(i = 0; i < k_offset; i++) - { - hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[STEREO_DFT_NBDIV + i]; - } -#endif /* Update configuration memories */ - for ( i = 0; i < k_offset; i++ ) + for (i = 0; i < k_offset; i++) { hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV]; -#ifndef IVAS_FLOAT_FIXED hStereoDft->itd[i] = hStereoDft->itd[STEREO_DFT_NBDIV + i]; -#else - hStereoDft->itd_fx[i] = hStereoDft->itd_fx[STEREO_DFT_NBDIV + i]; -#endif hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV]; hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV]; } /* 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 ); + 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); /*Update attack info*/ - if ( hStereoDft->attackPresent ) + if (hStereoDft->attackPresent) { hStereoDft->wasTransient = 1; } - else if ( hStereoDft->wasTransient ) + else if (hStereoDft->wasTransient) { hStereoDft->wasTransient = 0; } - for ( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- ) + for (i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i--) { hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; } - mvr2r( hStereoDft->hb_stefi_sig + output_frame, hStereoDft->hb_stefi_sig, hStereoDft->hb_stefi_delay ); - mvr2r( hStereoDft->hb_nrg, hStereoDft->hb_nrg + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); - mvr2r( hStereoDft->td_gain, hStereoDft->td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); + mvr2r(hStereoDft->hb_stefi_sig + output_frame, hStereoDft->hb_stefi_sig, hStereoDft->hb_stefi_delay); + mvr2r(hStereoDft->hb_nrg, hStereoDft->hb_nrg + 1, STEREO_DFT_CORE_HIST_MAX - 1); + mvr2r(hStereoDft->td_gain, hStereoDft->td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1); - if ( sba_dirac_stereo_flag ) + if (sba_dirac_stereo_flag) { /* buffer update, push back by 2 because of 2 subframes */ - for ( b = 0; b < hStereoDft->nbands; b++ ) + for (b = 0; b < hStereoDft->nbands; b++) { - for ( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- ) + for (i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i--) { hStereoDft->smooth_buf[b][i] = hStereoDft->smooth_buf[b][i - 2]; } @@ -1016,7 +603,7 @@ void stereo_dft_dec_update( return; } - +#endif /*------------------------------------------------------------------------- * stereo_dft_dec_destroy() @@ -1064,57 +651,21 @@ void stereo_dft_dec_destroy( *-------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -void stereo_dft_dec_analyze( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - // const Word32 *input_fx, /* i : input signal */ - // Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - - const float *input, /* i : input signal */ - float out_DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - - const Word16 chan, /* i : channel number */ - const Word16 input_frame, /* i : input frame size */ - const Word16 output_frame, /* i : output frame size */ - const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ - const Word16 k_offset, /* i : offset of DFT */ - const Word16 delay /* i : delay in samples FOR input signal */ - /*Word16 *q, - Word16 *q_out_DFT*/ -) -{ - - Word16 q = 11; - Word32 output_Fs = hCPE->hCoreCoder[0]->output_Fs; - Word32 input_fx[2000]; - FOR( int i = 0; i < 960; i++ ) - { - input_fx[i] = (Word32)(input[i] * ( 1 << q )); - } - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_BPF_fx[0][i] = (Word32)(hCPE->input_mem_BPF[0][i] * ( 1 << q )); - FOR( int i = 0; i < NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ); i++ ) - hCPE->input_mem_fx[0][i] = (Word32)(hCPE->input_mem[0][i] * ( 1 << q )); - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_LB_fx[0][i] = (Word32)(hCPE->input_mem_LB[0][i] * ( 1 << q )); - FOR( int i = 0; i < NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ); i++ ) - hCPE->input_mem_fx[1][i] = (Word32)(hCPE->input_mem[1][i] * ( 1 << q )); - FOR( int i = 0; i < STEREO_DFT32MS_OVL_16k; i++ ) - hCPE->input_mem_LB_fx[1][i] = (Word32)(hCPE->input_mem_LB[1][i] * ( 1 << q )); - Word16 q_out_DFT[2] = { 3, 3 }; - Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX]; - IF( out_DFT ) - { - FOR( int i = 0; i < CPE_CHANNELS; i++ ) - FOR( int j = 0; j < STEREO_DFT_BUF_MAX; j++ ) - IF( abs( (Word32) out_DFT[i][j] ) != 0 ) - q_out_DFT[i] = min( q_out_DFT[i], norm_l( (Word32) out_DFT[i][j] ) ); - - FOR( int i = 0; i < CPE_CHANNELS; i++ ) - FOR( int j = 0; j < STEREO_DFT_BUF_MAX; j++ ) - out_DFT_fx[i][j] = (Word32)(out_DFT[i][j] * ( 1 << q_out_DFT[i] )); - } - ////////////////////////////////////////////////////////// - Word16 i, k; +void stereo_dft_dec_analyze_fx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word32 *input_fx, /* i : input signal */ + Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const Word16 chan, /* i : channel number */ + const Word16 input_frame, /* i : input frame size */ + const Word16 output_frame, /* i : output frame size */ + const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ + const Word16 k_offset, /* i : offset of DFT */ + const Word16 delay, /* i : delay in samples FOR input signal */ + Word16 *q, + Word16 *q_out_DFT ) +{ + + Word16 i, k; STEREO_DFT_DEC_DATA_HANDLE hStereoDft; Word32 *pInput_fx, *pInput_buff_fx; Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; @@ -1317,7 +868,7 @@ void stereo_dft_dec_analyze( } } Word16 q_DFT, q_shift, guarded_bits; - q_DFT = q; + q_DFT = *q; guarded_bits = find_guarded_bits_fx( NFFT ); q_shift = L_norm_arr( DFT_fx, NFFT ) - guarded_bits; @@ -1406,59 +957,38 @@ void stereo_dft_dec_analyze( } } } - /////////////////////////////////////////////////////// - FOR( int j = 0; j < STEREO_DFT32MS_OVL_16k; j++ ) - hCPE->input_mem_BPF[0][j] = (float) hCPE->input_mem_BPF_fx[0][j] / (float) ( 1 << q ); - FOR( int j = 0; j < NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ); j++ ) - hCPE->input_mem[0][j] = (float) hCPE->input_mem_fx[0][j] / (float) ( 1 << q ); - FOR( int j = 0; j < STEREO_DFT32MS_OVL_16k; j++ ) - hCPE->input_mem_LB[0][j] = (float) hCPE->input_mem_LB_fx[0][j] / (float) ( 1 << q ); - FOR( int j = 0; j < NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ); j++ ) - hCPE->input_mem[1][j] = (float) hCPE->input_mem_fx[1][j] / (float) ( 1 << q ); - FOR( int j = 0; j < STEREO_DFT32MS_OVL_16k; j++ ) - hCPE->input_mem_LB[1][j] = (float) hCPE->input_mem_LB_fx[1][j] / (float) ( 1 << q ); - - IF( out_DFT ) - { - FOR( k = 0; k < CPE_CHANNELS; k++ ) - FOR( int j = 0; j < STEREO_DFT_BUF_MAX; j++ ) - { - out_DFT[k][j] = (float) out_DFT_fx[k][j] / (float) ( 1 << q_out_DFT[k] ); - } - } - //////////////////////////////////////////////////////////////// + pop_wmops(); return; } -void stereo_dft_dec_analyze_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 *input_fx, /* i : input signal */ - Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - const Word16 chan, /* i : channel number */ - const Word16 input_frame, /* i : input frame size */ - const Word16 output_frame, /* i : output frame size */ - const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ - const Word16 k_offset, /* i : offset of DFT */ - const Word16 delay, /* i : delay in samples FOR input signal */ - Word16 *q, - Word16 *q_out_DFT ) +#else +void stereo_dft_dec_analyze( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const float *input, /* i : input signal */ + float out_DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ + const int16_t chan, /* i : channel number */ + const int16_t input_frame, /* i : input frame size */ + const int16_t output_frame, /* i : output frame size */ + const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ + const int16_t k_offset, /* i : offset of DFT */ + const int16_t delay /* i : delay in samples for input signal */ +) { - - Word16 i, k; + int16_t i, k; STEREO_DFT_DEC_DATA_HANDLE hStereoDft; - Word32 *pInput_fx, *pInput_buff_fx; - Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; - Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx; - Word16 NFFT, NFFT_core, ovl, zp; - Word16 offset; - Word32 fac_fx; - const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx; - Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1]; - Word16 trigo_step; - Word32 inputFs; - Word16 delay_dec; - Word16 mem_size; - Word16 ovl2; + float *pInput, *pInput_buff; + float *mem, input_buff[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; + float DFT[STEREO_DFT32MS_N_MAX], *pDFT_out; + int16_t NFFT, NFFT_core, ovl, zp; + int16_t offset; + float fac; + const float *trigo, *win_left, *win_right, *win2; + float trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1]; + int16_t trigo_step; + int32_t inputFs; + int16_t delay_dec; + int16_t mem_size; + int16_t ovl2; push_wmops( "DFT_analysis" ); @@ -1470,93 +1000,93 @@ void stereo_dft_dec_analyze_fx( * Initialization *-----------------------------------------------------------------*/ - IF( input_frame == output_frame ) + if ( input_frame == output_frame ) { - trigo_fx = hStereoDft->dft_trigo_fx; + trigo = hStereoDft->dft_trigo; trigo_step = 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; + win_right = hStereoDft->win32ms; + win_left = hStereoDft->win32ms; + win2 = hStereoDft->win232ms; - IF( ana_type == DFT_STEREO_DEC_ANA_BPF ) + if ( 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]; + assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); + mem = hCPE->input_mem_BPF[chan]; } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) { - mem_fx = hCPE->input_mem_LB_fx[chan]; + mem = hCPE->input_mem_LB[chan]; } - ELSE + else { - mem_fx = hCPE->input_mem_fx[chan]; + mem = hCPE->input_mem[chan]; } } - ELSE IF( input_frame == L_FRAME ) + else if ( input_frame == L_FRAME ) { - trigo_fx = hStereoDft->dft_trigo_12k8_fx; + trigo = hStereoDft->dft_trigo_12k8; trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; - win_right_fx = hStereoDft->win32ms_12k8_fx; - win_left_fx = hStereoDft->win32ms_12k8_fx; - win2_fx = hStereoDft->win232ms_12k8_fx; + win_right = hStereoDft->win32ms_12k8; + win_left = hStereoDft->win32ms_12k8; + win2 = hStereoDft->win232ms_12k8; - IF( ana_type == DFT_STEREO_DEC_ANA_BPF ) + if ( 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]; + assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); + mem = hCPE->input_mem_BPF[chan]; } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) { - mem_fx = hCPE->input_mem_LB_fx[chan]; + mem = hCPE->input_mem_LB[chan]; } - ELSE + else { - assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" ); - mem_fx = hCPE->input_mem_fx[chan]; + assert( ( chan == 1 ) && "12.8kHz sampling rate only for second channel, i.e. residual coding or allpass signal" ); + mem = hCPE->input_mem[chan]; } } - ELSE IF( input_frame == L_FRAME16k ) + else if ( input_frame == L_FRAME16k ) { - trigo_fx = hStereoDft->dft_trigo_16k_fx; + trigo = hStereoDft->dft_trigo_16k; trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; - win_right_fx = hStereoDft->win32ms_16k_fx; - win_left_fx = hStereoDft->win32ms_16k_fx; - win2_fx = hStereoDft->win232ms_16k_fx; + win_right = hStereoDft->win32ms_16k; + win_left = hStereoDft->win32ms_16k; + win2 = hStereoDft->win232ms_16k; - IF( ana_type == DFT_STEREO_DEC_ANA_BPF ) + if ( 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]; + assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); + mem = hCPE->input_mem_BPF[chan]; } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) { - mem_fx = hCPE->input_mem_LB_fx[chan]; + mem = hCPE->input_mem_LB[chan]; } - ELSE + else { - 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]; + assert( ( chan == 1 ) && hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF && "16kHz sampling rate only for second channel with allpass signal" ); + mem = hCPE->input_mem[chan]; } } - ELSE IF( input_frame == L_FRAME8k ) + else if ( input_frame == L_FRAME8k ) { - assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" ); - trigo_fx = hStereoDft->dft_trigo_8k_fx; + assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only for residual coding" ); + trigo = hStereoDft->dft_trigo_8k; trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; - win_right_fx = hStereoDft->win32ms_8k_fx; - win_left_fx = hStereoDft->win32ms_8k_fx; - win2_fx = hStereoDft->win232ms_8k_fx; - mem_fx = hCPE->input_mem_fx[chan]; + win_right = hStereoDft->win32ms_8k; + win_left = hStereoDft->win32ms_8k; + win2 = hStereoDft->win232ms_8k; + mem = hCPE->input_mem[chan]; } - ELSE + 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 */ - win_right_fx = NULL; /* to avoid compilation warning */ - win_left_fx = NULL; /* to avoid compilation warning */ - win2_fx = NULL; /* to avoid compilation warning */ + mem = NULL; /* to avoid compilation warning */ + trigo = NULL; /* to avoid compilation warning */ + trigo_step = -1; /* to avoid compilation warning */ + win_right = NULL; /* to avoid compilation warning */ + win_left = NULL; /* to avoid compilation warning */ + win2 = NULL; /* to avoid compilation warning */ } inputFs = input_frame * FRAMES_PER_SEC; @@ -1564,26 +1094,20 @@ void stereo_dft_dec_analyze_fx( zp = NS2SA( inputFs, STEREO_DFT32MS_ZP_NS ); ovl = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS ); NFFT = NS2SA( inputFs, STEREO_DFT32MS_N_NS ); - Word16 w1, w2, qw1, qw2, qfac_fx; - qw1 = norm_s( hStereoDft->NFFT ); - qw2 = norm_s( NFFT ); - w1 = shl( hStereoDft->NFFT, qw1 - 1 ); - w2 = shl( NFFT, qw2 ); - fac_fx = L_shl( div_s( w1, w2 ), 16 ); - qfac_fx = 31 - ( qw2 - ( qw1 - 1 ) ); + fac = (float) ( hStereoDft->NFFT ) / (float) ( NFFT ); ovl2 = NS2SA( inputFs, STEREO_DFT32MS_OVL2_NS ); - /* Offset FOR the time buffers */ + /* 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; /* Update buffers */ - Copy32( mem_fx, input_buff_fx, mem_size ); - Copy32( input_fx, input_buff_fx + mem_size, input_frame ); - Copy32( input_buff_fx + input_frame, mem_fx, mem_size ); - pInput_buff_fx = input_buff_fx; + mvr2r( mem, input_buff, mem_size ); + mvr2r( input, input_buff + mem_size, input_frame ); + mvr2r( input_buff + input_frame, mem, mem_size ); + pInput_buff = input_buff; - IF( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + if ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) { pop_wmops(); return; @@ -1596,143 +1120,109 @@ void stereo_dft_dec_analyze_fx( assert( k_offset <= STEREO_DFT_NBDIV ); - FOR( i = 0; i < NFFT / 4; i++ ) + for ( i = 0; i < NFFT / 4; i++ ) { - trigo_dec_fx[i] = trigo_fx[i * trigo_step]; - trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step]; + trigo_dec[i] = trigo[i * trigo_step]; + trigo_dec[NFFT / 2 - i] = trigo[i * trigo_step]; } - trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step]; + trigo_dec[NFFT / 4] = trigo[NFFT / 4 * trigo_step]; - FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) + for ( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) { - set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX ); - IF( k == 0 ) + set_f( DFT, 0, STEREO_DFT32MS_N_MAX ); + if ( k == 0 ) { offset = 0; } - ELSE + else { /* If OVL2 = OVL offset = 10ms */ offset = NS2SA( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); } - pInput_fx = pInput_buff_fx + offset; - pDFT_out_fx = out_DFT_fx[chan] + k * STEREO_DFT32MS_N_MAX; + pInput = pInput_buff + offset; + pDFT_out = out_DFT[chan] + k * STEREO_DFT32MS_N_MAX; /*Forwards FFT: L and R*/ /* Zero Padding & Flat Portion */ - Copy32( pInput_fx, DFT_fx + zp, NFFT - 2 * zp ); + mvr2r( pInput, DFT + zp, NFFT - 2 * zp ); /* Overlapping portions */ - IF( k == 0 ) + if ( k == 0 ) { - FOR( i = 0; i < ovl; i++ ) + 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[i + zp] *= win_left[STEREO_DFT32MS_STEP * i]; } - FOR( i = 0; i < ovl2; i++ ) + 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[NFFT - zp - 1 - i] *= win2[i]; } } - ELSE + else { - FOR( i = 0; i < ovl2; i++ ) + for ( i = 0; i < ovl2; i++ ) { - DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); + DFT[i + zp] *= win2[i]; } - FOR( i = 0; i < ovl; i++ ) + 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[NFFT - zp - i - 1] *= win_right[STEREO_DFT32MS_STEP * i]; } } - Word16 q_DFT, q_shift, guarded_bits; - q_DFT = *q; - guarded_bits = find_guarded_bits_fx( NFFT ); - q_shift = 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 ); - } - - q_DFT += q_shift; - rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 ); - - q_shift = L_norm_arr( DFT_fx, NFFT ) - ( 31 - qfac_fx ); - FOR( Word16 j = 0; j < NFFT; j++ ) - { - DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); - } - q_DFT += q_shift; - IF( 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 ); - } - q_out_DFT[chan] = q_DFT; - } - ELSE - { - FOR( int j = 0; j < NFFT; j++ ) - { - DFT_fx[j] = L_shr( DFT_fx[j], q_DFT - q_out_DFT[chan] ); - } - q_DFT = q_out_DFT[chan]; - } + rfft( DFT, trigo_dec, NFFT, -1 ); /*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 ) + if ( ana_type == DFT_STEREO_DEC_ANA_FB || ana_type == DFT_STEREO_DEC_ANA_LB || 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[0] = DFT[0] * fac; /*DC*/ + if ( NFFT == hStereoDft->NFFT ) /*Nyquist*/ { - pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), 31 - qfac_fx ); + pDFT_out[1] = DFT[1] * fac; } - ELSE + else { - pDFT_out_fx[1] = 0; + pDFT_out[1] = 0.f; } - FOR( i = 2; i < NFFT; i++ ) + 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[i] = DFT[i] * fac; } - FOR( i = NFFT; i < hStereoDft->NFFT; i++ ) + for ( i = NFFT; i < hStereoDft->NFFT; i++ ) { - pDFT_out_fx[i] = 0; + pDFT_out[i] = 0.f; } } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_BPF ) + else if ( 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[0] -= DFT[0] * fac * dft_bpf_weights[0]; - FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ ) + 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[2 * i] -= DFT[2 * i] * fac * dft_bpf_weights[i]; + pDFT_out[2 * i + 1] -= DFT[2 * i + 1] * fac * dft_bpf_weights[i]; } } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_HB_ADD ) + else if ( ana_type == DFT_STEREO_DEC_ANA_HB_ADD ) { NFFT_core = NS2SA( hCPE->hCoreCoder[0]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_N_NS ); - FOR( i = NFFT_core; i < NFFT; i++ ) + 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[i] += DFT[i] * fac; } } - ELSE + 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[0] += DFT[0] * fac; /*DC*/ + if ( 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[1] += DFT[1] * fac; } - FOR( i = 2; i < NFFT; i++ ) + 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[i] += DFT[i] * fac; } } } @@ -1740,609 +1230,332 @@ void stereo_dft_dec_analyze_fx( pop_wmops(); return; } -#else -void stereo_dft_dec_analyze( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const float *input, /* i : input signal */ - float out_DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - const int16_t chan, /* i : channel number */ - const int16_t input_frame, /* i : input frame size */ - const int16_t output_frame, /* i : output frame size */ - const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ - const int16_t k_offset, /* i : offset of DFT */ - const int16_t delay /* i : delay in samples for input signal */ +#endif + +#ifndef IVAS_FLOAT_FIXED +/*------------------------------------------------------------------------- + * stereo_dft_dec_synthesize() + * + * Inverse DFT on a 20ms frame + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_synthesize( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */ + const int16_t chan, /* i : channel number */ + float output[L_FRAME48k], /* o : output synthesis signal */ + const int16_t output_frame /* i : output frame length */ ) { int16_t i, k; - STEREO_DFT_DEC_DATA_HANDLE hStereoDft; - float *pInput, *pInput_buff; - float *mem, input_buff[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; - float DFT[STEREO_DFT32MS_N_MAX], *pDFT_out; - int16_t NFFT, NFFT_core, ovl, zp; int16_t offset; - float fac; - const float *trigo, *win_left, *win_right, *win2; + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + float *p_DFT; + const float *win, *win2; float trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1]; int16_t trigo_step; - int32_t inputFs; - int16_t delay_dec; - int16_t mem_size; - int16_t ovl2; + int16_t ovl, zp, NFFT; + int32_t outputFs; + int16_t ovl2, flat_portion_end; + float ola_buff[STEREO_DFT32MS_OVL2_MAX]; + int16_t moffset; + push_wmops( "DFT_synthesis" ); - push_wmops( "DFT_analysis" ); + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ hStereoDft = hCPE->hStereoDft; - assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N ); + outputFs = output_frame * FRAMES_PER_SEC; + + zp = NS2SA( outputFs, STEREO_DFT32MS_ZP_NS ); + ovl = NS2SA( outputFs, STEREO_DFT32MS_OVL_NS ); + win = hStereoDft->win32ms; + NFFT = NS2SA( outputFs, STEREO_DFT32MS_N_NS ); + ovl2 = NS2SA( outputFs, STEREO_DFT32MS_OVL2_NS ); + flat_portion_end = NS2SA( outputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); + win2 = hStereoDft->win232ms; + + p_DFT = DFT[chan]; + set_f( output, 0, NS2SA( outputFs, FRAME_SIZE_NS ) ); + + /* deactivating the spectrum scrambling on active speech */ + if ( ( chan == 0 && hCPE->hCoreCoder[0]->last_coder_type > UNVOICED ) || hCPE->last_element_mode == IVAS_CPE_MDCT || hCPE->last_element_mode < IVAS_CPE_DFT ) + { + hCPE->stereo_switching_counter = 10; + } + + if ( hCPE->stereo_switching_counter == 0 ) + { + /* Set the level of dispersion */ + hCPE->NbFrameMod = (int16_t) ( 12.0f * max( -0.1f, min( 0.4, hCPE->lt_es_em ) ) + 1.2f + 0.5f ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ + } + moffset = max( 0, 6 - hCPE->NbFrameMod ); /*-----------------------------------------------------------------* - * Initialization + * Synthesis *-----------------------------------------------------------------*/ - if ( input_frame == output_frame ) + trigo_step = hStereoDft->dft_trigo_step * STEREO_DFT_TRIGO_DEC_STEP; + for ( i = 0; i < NFFT / 4; i++ ) { - trigo = hStereoDft->dft_trigo; - trigo_step = hStereoDft->dft_trigo_step * STEREO_DFT_TRIGO_DEC_STEP; - win_right = hStereoDft->win32ms; - win_left = hStereoDft->win32ms; - win2 = hStereoDft->win232ms; + trigo_dec[i] = hStereoDft->dft_trigo[i * trigo_step]; + trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo[i * trigo_step]; + } + trigo_dec[NFFT / 4] = hStereoDft->dft_trigo[NFFT / 4 * trigo_step]; - if ( ana_type == DFT_STEREO_DEC_ANA_BPF ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); - mem = hCPE->input_mem_BPF[chan]; - } - else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + for ( k = 0; k < STEREO_DFT_NBDIV; k++ ) + { + /* scrambling the spectrum */ + if ( hCPE->stereo_switching_counter <= 6 && chan == 1 && ( hCPE->lt_es_em > -0.4f || hCPE->NbFrameMod > 4 ) ) { - mem = hCPE->input_mem_LB[chan]; + for ( i = 3; i < NFFT - moffset - 1; i++ ) + { + p_DFT[i] = -p_DFT[i + moffset + 1]; + } } - else + else if ( hCPE->stereo_switching_counter < 7 && ( hCPE->lt_es_em > 0.2f || hCPE->NbFrameMod > 4 ) ) { - mem = hCPE->input_mem[chan]; + for ( i = 16 - hCPE->NbFrameMod; i < NFFT - moffset - 1; i++ ) + { + p_DFT[i - 2] = -p_DFT[i + moffset + 1]; + } } - } - else if ( input_frame == L_FRAME ) - { - trigo = hStereoDft->dft_trigo_12k8; - trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; - win_right = hStereoDft->win32ms_12k8; - win_left = hStereoDft->win32ms_12k8; - win2 = hStereoDft->win232ms_12k8; - if ( ana_type == DFT_STEREO_DEC_ANA_BPF ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); - mem = hCPE->input_mem_BPF[chan]; - } - else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + /*IFFT*/ + rfft( p_DFT, trigo_dec, NFFT, +1 ); + + if ( k == 0 ) { - mem = hCPE->input_mem_LB[chan]; + offset = 0; + + /* Left OLA - 3.125ms */ + for ( i = 0; i < ovl; i++ ) + { + output[offset + i] = hCPE->output_mem[chan][i] + p_DFT[zp + i] * win[STEREO_DFT32MS_STEP * i]; + } + /* Flat Portion */ + for ( i = ovl; i < flat_portion_end; i++ ) + { + output[offset + i] = p_DFT[zp + i]; + } + /* Right OLA */ + for ( i = 0; i < ovl2; i++ ) + { + ola_buff[i] = win2[ovl2 - 1 - i] * p_DFT[NFFT - zp - ovl2 + i]; + } } else { - assert( ( chan == 1 ) && "12.8kHz sampling rate only for second channel, i.e. residual coding or allpass signal" ); - mem = hCPE->input_mem[chan]; + /* If OVL2 = OVL offset = 10ms */ + offset = flat_portion_end; + + /* Left OLA */ + for ( i = 0; i < ovl2; i++ ) + { + output[offset + i] = ola_buff[i] + p_DFT[zp + i] * win2[i]; + } + /* Flat Portion */ + for ( i = ovl2; i < NFFT - 2 * zp - ovl; i++ ) + { + output[offset + i] = p_DFT[zp + i]; + } + /* Right OLA - 3.125ms */ + for ( i = 0; i < ovl; i++ ) + { + hCPE->output_mem[chan][i] = win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] * p_DFT[NFFT - zp - ovl + i]; + } } + + p_DFT += STEREO_DFT32MS_N_MAX; } - else if ( input_frame == L_FRAME16k ) - { - trigo = hStereoDft->dft_trigo_16k; - trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; - win_right = hStereoDft->win32ms_16k; - win_left = hStereoDft->win32ms_16k; - win2 = hStereoDft->win232ms_16k; - if ( ana_type == DFT_STEREO_DEC_ANA_BPF ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" ); - mem = hCPE->input_mem_BPF[chan]; - } - else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) - { - mem = hCPE->input_mem_LB[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" ); - mem = hCPE->input_mem[chan]; - } - } - else if ( input_frame == L_FRAME8k ) - { - assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only for residual coding" ); - trigo = hStereoDft->dft_trigo_8k; - trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; - win_right = hStereoDft->win32ms_8k; - win_left = hStereoDft->win32ms_8k; - win2 = hStereoDft->win232ms_8k; - mem = hCPE->input_mem[chan]; - } - else - { - IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" ); - mem = NULL; /* to avoid compilation warning */ - trigo = NULL; /* to avoid compilation warning */ - trigo_step = -1; /* to avoid compilation warning */ - win_right = NULL; /* to avoid compilation warning */ - win_left = NULL; /* to avoid compilation warning */ - win2 = NULL; /* to avoid compilation warning */ - } - inputFs = input_frame * FRAMES_PER_SEC; - delay_dec = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS ); - zp = NS2SA( inputFs, STEREO_DFT32MS_ZP_NS ); - ovl = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS ); - NFFT = NS2SA( inputFs, STEREO_DFT32MS_N_NS ); - fac = (float) ( hStereoDft->NFFT ) / (float) ( NFFT ); - ovl2 = NS2SA( inputFs, STEREO_DFT32MS_OVL2_NS ); + pop_wmops(); + return; +} - /* 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; - /* Update buffers */ - mvr2r( mem, input_buff, mem_size ); - mvr2r( input, input_buff + mem_size, input_frame ); - mvr2r( input_buff + input_frame, mem, mem_size ); - pInput_buff = input_buff; +/*------------------------------------------------------------------------- + * stereo_dft_dec() + * + * DFT-based stereo main processing function + *-------------------------------------------------------------------------*/ - if ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) - { - pop_wmops(); - return; - } +void stereo_dft_dec( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ + float *input_mem, /* i/o: mem of buffer DFT analysis */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ + const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */ + ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ + const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ + const int32_t output_Fs, /* i : Fs for delay calculation */ + const int16_t nchan_transport, /* i : number of transpor channels */ + const int16_t num_md_sub_frames /* i : number of MD subframes */ +) +{ + int16_t i, k, b, N_div, stop; + float DFT_L[STEREO_DFT32MS_N_MAX]; + float DFT_R[STEREO_DFT32MS_N_MAX]; + float DFT_PRED_RES[STEREO_DFT32MS_N_32k]; + float *pDFT_DMX; + float *pDFT_DMX1; + float *pDFT_RES; + float g, tmp; + float *pPredGain; + float *pSideGain; + float c0, s0; + int16_t k_offset; + float *pgIpd; + int16_t NFFT_inner; + float gamma; + float samp_ratio; + int16_t prev_bfi; + float dmx_nrg; + int16_t idx_k0, idx_k1; + int16_t output_frame; + int16_t plocs[STEREO_DFT_RES_N_PEAKS_MAX]; + int16_t num_plocs; + float plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; + float ftmp, N1, N2, coh; + float lev1, lev2, cna_level, scale_fact0, scale_fact, *ptr_per; + HANDLE_FD_CNG_DEC hFdCngDec = st0->hFdCngDec; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom; + int16_t *cna_seed = &( hFdCngCom->seed ); + float DFT_W, DFT_Y; + output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC ); - /*-----------------------------------------------------------------* - * DFT Analysis: loop over frame + /*------------------------------------------------------------------* + * Initialization *-----------------------------------------------------------------*/ - assert( k_offset <= STEREO_DFT_NBDIV ); + samp_ratio = (float) st0->sr_core / (float) st0->output_Fs; - for ( i = 0; i < NFFT / 4; i++ ) + stop = STEREO_DFT32MS_N_32k / 2; + + /* Analyze nature of current frame */ + hStereoDft->trans = ( ( ( st0->clas_dec == ONSET ) || ( st0->clas_dec == SIN_ONSET ) || ( st0->clas_dec == UNVOICED_CLAS ) || ( st0->clas_dec == UNVOICED_TRANSITION ) ) || ( st0->stab_fac <= 0.25f ) ) || + ( st0->core == TCX_20_CORE && ( ( st0->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) || ( st0->hTcxCfg->tcx_last_overlap_mode == HALF_OVERLAP ) ) ) || ( st0->core == TCX_10_CORE ); + + + /* Initialization */ + k_offset = 1; + N_div = STEREO_DFT_NBDIV; + prev_bfi = st0->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame. + 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 */ + if ( output_frame < inner_frame_tbl[st0->bwidth] && !sba_dirac_stereo_flag ) { - trigo_dec[i] = trigo[i * trigo_step]; - trigo_dec[NFFT / 2 - i] = trigo[i * trigo_step]; + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); } - trigo_dec[NFFT / 4] = trigo[NFFT / 4 * trigo_step]; - for ( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) + if ( !st0->bfi ) { - set_f( DFT, 0, STEREO_DFT32MS_N_MAX ); - if ( k == 0 ) + /* Smoothing for the current frame */ + if ( sba_dirac_stereo_flag ) { - offset = 0; + ivas_sba_dirac_stereo_smooth_parameters( hStereoDft, hMdDec, cross_fade_start_offset, output_Fs, num_md_sub_frames ); } else { - /* If OVL2 = OVL offset = 10ms */ - offset = NS2SA( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); + stereo_dft_dec_smooth_parameters( hStereoDft, hStereoCng->prev_sid_nodata, hStereoCng->active_frame_counter, st0->element_brate ); } + } - pInput = pInput_buff + offset; - pDFT_out = out_DFT[chan] + k * STEREO_DFT32MS_N_MAX; + dmx_nrg = 0.0f; + if ( prev_bfi ) + { + dmx_nrg = stereo_dft_dmx_swb_nrg( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); + } - /*Forwards FFT: L and R*/ - /* Zero Padding & Flat Portion */ - mvr2r( pInput, DFT + zp, NFFT - 2 * zp ); - /* Overlapping portions */ - if ( k == 0 ) +#ifdef DEBUG_PRINT + printf( "\nframe: %d\n", frame ); +#endif + for ( k = 0; k < N_div; k++ ) + { + pDFT_DMX = DFT[0] + k * STEREO_DFT32MS_N_MAX; + pDFT_RES = DFT[1] + k * STEREO_DFT32MS_N_MAX; + pDFT_DMX1 = 0; + if ( nchan_transport > 1 ) { - for ( i = 0; i < ovl; i++ ) - { - DFT[i + zp] *= win_left[STEREO_DFT32MS_STEP * i]; - } - for ( i = 0; i < ovl2; i++ ) - { - DFT[NFFT - zp - 1 - i] *= win2[i]; - } + pDFT_DMX1 = DFT[1] + k * STEREO_DFT32MS_N_MAX; } - else + + /*Apply Stereo*/ + if ( hStereoDft->hConfig->dmx_active ) { - for ( i = 0; i < ovl2; i++ ) - { - DFT[i + zp] *= win2[i]; - } - for ( i = 0; i < ovl; i++ ) - { - DFT[NFFT - zp - i - 1] *= win_right[STEREO_DFT32MS_STEP * i]; - } - } + g = 1.f; + c0 = 1.f; + s0 = 0.f; - rfft( DFT, trigo_dec, NFFT, -1 ); + /* since delay is just 3.125ms, the parameters received are used for the second window */ + pSideGain = hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; + pgIpd = hStereoDft->gipd + ( k + k_offset ); + pPredGain = hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; - /*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 ) - { - pDFT_out[0] = DFT[0] * fac; /*DC*/ - if ( NFFT == hStereoDft->NFFT ) /*Nyquist*/ +#ifdef DEBUG_PRINT + if ( k == 0 ) { - pDFT_out[1] = DFT[1] * fac; + printf( "Window0\n" ); } else { - pDFT_out[1] = 0.f; + printf( "Window1\n" ); } - for ( i = 2; i < NFFT; i++ ) + for ( b = 0; b < hStereoDft->nbands; b++ ) + printf( "%.6f ", pSideGain[b] ); + printf( "\n" ); + for ( b = 0; b < hStereoDft->nbands; b++ ) + printf( "%.6f ", pPredGain[b] ); + printf( "\n" ); +#endif + + /* Use coarse band partition in inactive frames */ + if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { - pDFT_out[i] = DFT[i] * fac; + NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[st0->bwidth] / L_FRAME48k; + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, 2, NFFT_inner, DEC ); } - for ( i = NFFT; i < hStereoDft->NFFT; i++ ) + + + if ( st0->bfi ) { - pDFT_out[i] = 0.f; + hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; } - } - else if ( ana_type == DFT_STEREO_DEC_ANA_BPF ) - { - pDFT_out[0] -= DFT[0] * fac * dft_bpf_weights[0]; - for ( i = 1; i < STEREO_DFT_BPF_SIZE; i++ ) + if ( !( sba_dirac_stereo_flag && nchan_transport >= 2 ) ) { - pDFT_out[2 * i] -= DFT[2 * i] * fac * dft_bpf_weights[i]; - pDFT_out[2 * i + 1] -= DFT[2 * i + 1] * fac * dft_bpf_weights[i]; + stereo_dft_generate_res_pred( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); } - } - else if ( ana_type == DFT_STEREO_DEC_ANA_HB_ADD ) - { - NFFT_core = NS2SA( hCPE->hCoreCoder[0]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_N_NS ); - for ( i = NFFT_core; i < NFFT; i++ ) + if ( hStereoDft->res_cod_band_max > 0 ) { - pDFT_out[i] += DFT[i] * fac; + if ( !st0->bfi ) + { + if ( k == 1 ) + { + mvr2r( pDFT_RES, hStereoDft->res_mem, 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max] ); + hStereoDft->time_offs = 0; + } + } + else + { + stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); + } } - } - else - { - pDFT_out[0] += DFT[0] * fac; /*DC*/ - if ( NFFT == hStereoDft->NFFT ) /*Nyquist*/ + + /* Apply active DMX */ + /* pDFT_RES is used for the second channel in inactive frames */ + if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { - pDFT_out[1] += DFT[1] * fac; - } - for ( i = 2; i < NFFT; i++ ) - { - pDFT_out[i] += DFT[i] * fac; - } - } - } - - pop_wmops(); - return; -} -#endif - -#ifndef IVAS_FLOAT_FIXED -/*------------------------------------------------------------------------- - * stereo_dft_dec_synthesize() - * - * Inverse DFT on a 20ms frame - *-------------------------------------------------------------------------*/ - -void stereo_dft_dec_synthesize( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */ - const int16_t chan, /* i : channel number */ - float output[L_FRAME48k], /* o : output synthesis signal */ - const int16_t output_frame /* i : output frame length */ -) -{ - int16_t i, k; - int16_t offset; - STEREO_DFT_DEC_DATA_HANDLE hStereoDft; - float *p_DFT; - const float *win, *win2; - float trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1]; - int16_t trigo_step; - int16_t ovl, zp, NFFT; - int32_t outputFs; - int16_t ovl2, flat_portion_end; - float ola_buff[STEREO_DFT32MS_OVL2_MAX]; - int16_t moffset; - push_wmops( "DFT_synthesis" ); - - /*-----------------------------------------------------------------* - * Initialization - *-----------------------------------------------------------------*/ - - hStereoDft = hCPE->hStereoDft; - - outputFs = output_frame * FRAMES_PER_SEC; - - zp = NS2SA( outputFs, STEREO_DFT32MS_ZP_NS ); - ovl = NS2SA( outputFs, STEREO_DFT32MS_OVL_NS ); - win = hStereoDft->win32ms; - NFFT = NS2SA( outputFs, STEREO_DFT32MS_N_NS ); - ovl2 = NS2SA( outputFs, STEREO_DFT32MS_OVL2_NS ); - flat_portion_end = NS2SA( outputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); - win2 = hStereoDft->win232ms; - - p_DFT = DFT[chan]; - set_f( output, 0, NS2SA( outputFs, FRAME_SIZE_NS ) ); - - /* deactivating the spectrum scrambling on active speech */ - if ( ( chan == 0 && hCPE->hCoreCoder[0]->last_coder_type > UNVOICED ) || hCPE->last_element_mode == IVAS_CPE_MDCT || hCPE->last_element_mode < IVAS_CPE_DFT ) - { - hCPE->stereo_switching_counter = 10; - } - - if ( hCPE->stereo_switching_counter == 0 ) - { - /* Set the level of dispersion */ - hCPE->NbFrameMod = (int16_t) ( 12.0f * max( -0.1f, min( 0.4, hCPE->lt_es_em ) ) + 1.2f + 0.5f ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ - } - moffset = max( 0, 6 - hCPE->NbFrameMod ); - - /*-----------------------------------------------------------------* - * Synthesis - *-----------------------------------------------------------------*/ - - trigo_step = hStereoDft->dft_trigo_step * STEREO_DFT_TRIGO_DEC_STEP; - for ( i = 0; i < NFFT / 4; i++ ) - { - trigo_dec[i] = hStereoDft->dft_trigo[i * trigo_step]; - trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo[i * trigo_step]; - } - trigo_dec[NFFT / 4] = hStereoDft->dft_trigo[NFFT / 4 * trigo_step]; - - for ( k = 0; k < STEREO_DFT_NBDIV; k++ ) - { - /* scrambling the spectrum */ - if ( hCPE->stereo_switching_counter <= 6 && chan == 1 && ( hCPE->lt_es_em > -0.4f || hCPE->NbFrameMod > 4 ) ) - { - for ( i = 3; i < NFFT - moffset - 1; i++ ) - { - p_DFT[i] = -p_DFT[i + moffset + 1]; - } - } - else if ( hCPE->stereo_switching_counter < 7 && ( hCPE->lt_es_em > 0.2f || hCPE->NbFrameMod > 4 ) ) - { - for ( i = 16 - hCPE->NbFrameMod; i < NFFT - moffset - 1; i++ ) - { - p_DFT[i - 2] = -p_DFT[i + moffset + 1]; - } - } - - /*IFFT*/ - rfft( p_DFT, trigo_dec, NFFT, +1 ); - - if ( k == 0 ) - { - offset = 0; - - /* Left OLA - 3.125ms */ - for ( i = 0; i < ovl; i++ ) - { - output[offset + i] = hCPE->output_mem[chan][i] + p_DFT[zp + i] * win[STEREO_DFT32MS_STEP * i]; - } - /* Flat Portion */ - for ( i = ovl; i < flat_portion_end; i++ ) - { - output[offset + i] = p_DFT[zp + i]; - } - /* Right OLA */ - for ( i = 0; i < ovl2; i++ ) - { - ola_buff[i] = win2[ovl2 - 1 - i] * p_DFT[NFFT - zp - ovl2 + i]; - } - } - else - { - /* If OVL2 = OVL offset = 10ms */ - offset = flat_portion_end; - - /* Left OLA */ - for ( i = 0; i < ovl2; i++ ) - { - output[offset + i] = ola_buff[i] + p_DFT[zp + i] * win2[i]; - } - /* Flat Portion */ - for ( i = ovl2; i < NFFT - 2 * zp - ovl; i++ ) - { - output[offset + i] = p_DFT[zp + i]; - } - /* Right OLA - 3.125ms */ - for ( i = 0; i < ovl; i++ ) - { - hCPE->output_mem[chan][i] = win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] * p_DFT[NFFT - zp - ovl + i]; - } - } - - p_DFT += STEREO_DFT32MS_N_MAX; - } - - - pop_wmops(); - return; -} - - -/*------------------------------------------------------------------------- - * stereo_dft_dec() - * - * DFT-based stereo main processing function - *-------------------------------------------------------------------------*/ - -void stereo_dft_dec( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - Decoder_State *st0, /* i/o: decoder state structure */ - float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ - float *input_mem, /* i/o: mem of buffer DFT analysis */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ - const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */ - ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ - const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ - const int32_t output_Fs, /* i : Fs for delay calculation */ - const int16_t nchan_transport, /* i : number of transpor channels */ - const int16_t num_md_sub_frames /* i : number of MD subframes */ -) -{ - int16_t i, k, b, N_div, stop; - float DFT_L[STEREO_DFT32MS_N_MAX]; - float DFT_R[STEREO_DFT32MS_N_MAX]; - float DFT_PRED_RES[STEREO_DFT32MS_N_32k]; - float *pDFT_DMX; - float *pDFT_DMX1; - float *pDFT_RES; - float g, tmp; - float *pPredGain; - float *pSideGain; - float c0, s0; - int16_t k_offset; - float *pgIpd; - int16_t NFFT_inner; - float gamma; - float samp_ratio; - int16_t prev_bfi; - float dmx_nrg; - int16_t idx_k0, idx_k1; - int16_t output_frame; - int16_t plocs[STEREO_DFT_RES_N_PEAKS_MAX]; - int16_t num_plocs; - float plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; - float ftmp, N1, N2, coh; - float lev1, lev2, cna_level, scale_fact0, scale_fact, *ptr_per; - HANDLE_FD_CNG_DEC hFdCngDec = st0->hFdCngDec; - HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom; - int16_t *cna_seed = &( hFdCngCom->seed ); - float DFT_W, DFT_Y; - - output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC ); - - /*------------------------------------------------------------------* - * Initialization - *-----------------------------------------------------------------*/ - - samp_ratio = (float) st0->sr_core / (float) st0->output_Fs; - - stop = STEREO_DFT32MS_N_32k / 2; - - /* Analyze nature of current frame */ - hStereoDft->trans = ( ( ( st0->clas_dec == ONSET ) || ( st0->clas_dec == SIN_ONSET ) || ( st0->clas_dec == UNVOICED_CLAS ) || ( st0->clas_dec == UNVOICED_TRANSITION ) ) || ( st0->stab_fac <= 0.25f ) ) || - ( st0->core == TCX_20_CORE && ( ( st0->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) || ( st0->hTcxCfg->tcx_last_overlap_mode == HALF_OVERLAP ) ) ) || ( st0->core == TCX_10_CORE ); - - - /* Initialization */ - k_offset = 1; - N_div = STEREO_DFT_NBDIV; - prev_bfi = st0->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame. - 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 */ - if ( output_frame < inner_frame_tbl[st0->bwidth] && !sba_dirac_stereo_flag ) - { -#ifdef IVAS_FLOAT_FIXED - hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); -#else - hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); -#endif - } - - if ( !st0->bfi ) - { - /* Smoothing for the current frame */ - if ( sba_dirac_stereo_flag ) - { - ivas_sba_dirac_stereo_smooth_parameters( hStereoDft, hMdDec, cross_fade_start_offset, output_Fs, num_md_sub_frames ); - } - else - { - stereo_dft_dec_smooth_parameters( hStereoDft, hStereoCng->prev_sid_nodata, hStereoCng->active_frame_counter, st0->element_brate ); - } - } - - dmx_nrg = 0.0f; - if ( prev_bfi ) - { - dmx_nrg = stereo_dft_dmx_swb_nrg( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); - } - - -#ifdef DEBUG_PRINT - printf( "\nframe: %d\n", frame ); -#endif - for ( k = 0; k < N_div; k++ ) - { - pDFT_DMX = DFT[0] + k * STEREO_DFT32MS_N_MAX; - pDFT_RES = DFT[1] + k * STEREO_DFT32MS_N_MAX; - pDFT_DMX1 = 0; - if ( nchan_transport > 1 ) - { - pDFT_DMX1 = DFT[1] + k * STEREO_DFT32MS_N_MAX; - } - - /*Apply Stereo*/ - if ( hStereoDft->hConfig->dmx_active ) - { - g = 1.f; - c0 = 1.f; - s0 = 0.f; - - /* since delay is just 3.125ms, the parameters received are used for the second window */ - pSideGain = hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; - pgIpd = hStereoDft->gipd + ( k + k_offset ); - pPredGain = hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; - -#ifdef DEBUG_PRINT - if ( k == 0 ) - { - printf( "Window0\n" ); - } - else - { - printf( "Window1\n" ); - } - for ( b = 0; b < hStereoDft->nbands; b++ ) - printf( "%.6f ", pSideGain[b] ); - printf( "\n" ); - for ( b = 0; b < hStereoDft->nbands; b++ ) - printf( "%.6f ", pPredGain[b] ); - printf( "\n" ); -#endif - - /* Use coarse band partition in inactive frames */ - if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) - { - NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[st0->bwidth] / L_FRAME48k; -#ifdef IVAS_FLOAT_FIXED - hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, 2, NFFT_inner, DEC ); -#else - hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, 2, NFFT_inner, DEC ); -#endif - } - - - if ( st0->bfi ) - { - hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; - } - - if ( !( sba_dirac_stereo_flag && nchan_transport >= 2 ) ) - { - stereo_dft_generate_res_pred( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); - } - - if ( hStereoDft->res_cod_band_max > 0 ) - { - if ( !st0->bfi ) - { - if ( k == 1 ) - { - mvr2r( pDFT_RES, hStereoDft->res_mem, 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max] ); - hStereoDft->time_offs = 0; - } - } - else - { - stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); - } - } - - /* Apply active DMX */ - /* pDFT_RES is used for the second channel in inactive frames */ - if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) - { - DFT_L[0] = pDFT_DMX[0]; - DFT_R[0] = pDFT_RES[0]; + DFT_L[0] = pDFT_DMX[0]; + DFT_R[0] = pDFT_RES[0]; } else { @@ -2799,22 +2012,7 @@ void stereo_dft_dec_res( bass_psfilter( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, output, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off, hCPE->hCoreCoder[0]->stab_fac, &hCPE->hStereoDft->stab_fac_smooth_res, hCPE->hCoreCoder[0]->last_coder_type, bpf_error_signal_8k ); -#ifndef IVAS_FLOAT_FIXED res_bpf_flag = res_bpf_adapt( hCPE->hStereoDft, bpf_error_signal_8k, res_buf ); -#else - Word32 bpf_error_signal_8k_fx[L_FRAME8k]; - Word32 res_buf_fx[STEREO_DFT_N_8k]; - FOR( int k = 0; k < STEREO_DFT_N_8k; k++ ) - { - res_buf_fx[k] = (Word32) ( res_buf[k] * ONE_IN_Q12 ); - } - FOR( int k = 0; k < L_FRAME8k; k++ ) - { - bpf_error_signal_8k_fx[k] = (Word32) ( bpf_error_signal_8k[k] * ONE_IN_Q16 ); - } - - res_bpf_flag = res_bpf_adapt_fx( hCPE->hStereoDft, bpf_error_signal_8k_fx, res_buf_fx ); -#endif // IVAS_FLOAT_FIXED if ( prev_bfi ) { @@ -3537,290 +2735,594 @@ void stereo_dft_generate_res_pred( rev_nrg += ap_filt_DMX[2 * i] * ap_filt_DMX[2 * i] + ap_filt_DMX[2 * i + 1] * ap_filt_DMX[2 * i + 1]; } - /* smoothing */ - hStereoDft->smooth_res_nrg[b] = alpha * hStereoDft->smooth_res_nrg[b] + ( 1 - alpha ) * rev_nrg; - hStereoDft->smooth_dmx_nrg[b] = alpha * hStereoDft->smooth_dmx_nrg[b] + ( 1 - alpha ) * dmx_nrg; + /* smoothing */ + hStereoDft->smooth_res_nrg[b] = alpha * hStereoDft->smooth_res_nrg[b] + ( 1 - alpha ) * rev_nrg; + hStereoDft->smooth_dmx_nrg[b] = alpha * hStereoDft->smooth_dmx_nrg[b] + ( 1 - alpha ) * dmx_nrg; + + /* normalization factor */ + norm_fac = sqrtf( hStereoDft->smooth_dmx_nrg[b] / hStereoDft->smooth_res_nrg[b] ); + + /* gain compressor */ + norm_fac *= min( max( 0.8f, 1 / norm_fac ), 1.25f ); + + /* gain limiter */ + norm_fac = min( norm_fac, gain_limit ); + + for ( i = hStereoDft->band_limits[b]; i < min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) + { + DFT_PRED_RES[2 * i] = norm_fac * pPredGain[b] * ap_filt_DMX[2 * i]; + DFT_PRED_RES[2 * i + 1] = norm_fac * pPredGain[b] * ap_filt_DMX[2 * i + 1]; + } + } + } + else if ( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET] == STEREO_DFT_RESPRED_STEFI ) + { + /* stefi in lowband */ + set_zero( DFT_PRED_RES, 2 * hStereoDft->band_limits[lb_stefi_start_band] ); + + for ( b = lb_stefi_start_band; b <= band0; b++ ) + { + d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; + d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; + /* 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 ); + + /* Even number of window sliding (assymmetric OLA) */ + d_short_ind = 2 * ( d_short_ind / 2 ); + d_long_ind = 2 * ( d_long_ind / 2 ); + + d_short = STEREO_DFT_PAST_MAX - d_short_ind; + d_long = STEREO_DFT_PAST_MAX - d_long_ind; + + d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + d_long_ind = ( d_long_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + + g_short = hStereoDft->stefi_short_gain; + g_long = hStereoDft->stefi_long_gain; + + /* change mixing ratio if long and short delay are the same */ + if ( d_short == d_long ) + { + g_short = 1; + g_long = 0; + } + + /* Avoid transient components */ + if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 && hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + { + g_long = 0.0f; + g_short = 0.0f; + } + else if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 ) + { + g_long = 1.0f; + g_short = 0.0f; + } + else if ( hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + { + g_long = 0.0f; + g_short = 1.0f; + } + + if ( max( g_short, g_long ) > 0 ) + { + past_dmx_nrg = EPSILON; + dmx_nrg = EPSILON; + for ( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) + { + dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + + DFT_PRED_RES[2 * i] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i] ); + DFT_PRED_RES[2 * i + 1] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i + 1] ); + + 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]; + } + if ( !bfi || b >= hStereoDft->res_cod_band_max ) + { + norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); + g2 = pPredGain[b] * norm_fac; + pred_gain_avg = g_short * hStereoDft->past_res_pred_gain[d_short_ind][b] + + g_long * hStereoDft->past_res_pred_gain[d_long_ind][b]; + + g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + + for ( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) + { + DFT_PRED_RES[2 * i] *= g2; + DFT_PRED_RES[2 * i + 1] *= g2; + } + } + } + else + { + set_zero( DFT_PRED_RES + 2 * hStereoDft->band_limits[b], 2 * ( min( bin0, hStereoDft->band_limits[b + 1] ) - hStereoDft->band_limits[b] ) ); + } + } + } + + if ( hStereoDft->band_limits[nbands_respred] > bin0 ) + { + /* apply stereo filling in ACELP BWE region */ + 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; + } + else if ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) + { + /* ACELP -> TCX/HQ core transition */ + /* calculate high band energy only */ + dmx_nrg = EPSILON; + for ( i = bin0; i < hStereoDft->NFFT / 2; i++ ) + { + dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + } + + hStereoDft->hb_nrg[0] += dmx_nrg * 2 / hStereoDft->NFFT; + *stop = bin0; + } + 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[k]; + d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY; + + d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + + /* calculate high band energy of past dmx */ + past_dmx_nrg = EPSILON; + for ( i = bin0; i < min( hStereoDft->NFFT / 2, STEREO_DFT32MS_N_32k / 2 ); i++ ) + { + past_dmx_nrg += hStereoDft->DFT_past_DMX[d_short_ind][2 * i] * hStereoDft->DFT_past_DMX[d_short_ind][2 * i] + hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] * hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1]; + } + + for ( b = band0; b < nbands_respred; b++ ) + { + g_short = hStereoDft->past_res_pred_gain[d_short_ind][b] < 0 ? 0 : ( 1.f + hStereoDft->stefi_short_gain ) / 2; + + if ( g_short > 0 ) + { + norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); + g2 = pPredGain[b] * norm_fac; + pred_gain_avg = hStereoDft->past_res_pred_gain[d_short_ind][b] * g_short; + + g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + { + DFT_PRED_RES[2 * i] = g2 * hStereoDft->DFT_past_DMX[d_short_ind][2 * i]; + DFT_PRED_RES[2 * i + 1] = g2 * hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1]; + } + } + else + { + begin = max( hStereoDft->band_limits[b], bin0 ); + end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); + set_zero( DFT_PRED_RES + 2 * begin, 2 * ( end - begin ) ); + } + } + } + else + { + for ( b = band0; b < nbands_respred; b++ ) + { + /* TCX/HQ core -> TCX/HQ core: business as usual */ + d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; + d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; + /* 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 ); + + /* Even number of window sliding (assymmetric OLA) */ + d_short_ind = 2 * ( d_short_ind / 2 ); + d_long_ind = 2 * ( d_long_ind / 2 ); + + d_short = STEREO_DFT_PAST_MAX - d_short_ind; + d_long = STEREO_DFT_PAST_MAX - d_long_ind; + + d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + d_long_ind = ( d_long_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + + g_short = hStereoDft->stefi_short_gain; + g_long = hStereoDft->stefi_long_gain; + + /* change mixing ratio if long and short delay are the same */ + if ( d_short == d_long ) + { + g_short = 1; + g_long = 0; + } + + /* Avoid transient components */ + if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 && hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + { + g_long = 0.0f; + g_short = 0.0f; + } + else if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 ) + { + g_long = 1.0f; + g_short = 0.0f; + } + else if ( hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + { + g_long = 0.0f; + g_short = 1.0f; + } + if ( hStereoDft->core_hist[d_short / 2] == ACELP_CORE ) + { + g_short = 0; + } + if ( hStereoDft->core_hist[d_long / 2] == ACELP_CORE ) + { + g_long = 0; + } + + if ( max( g_short, g_long ) > 0 ) + { + past_dmx_nrg = EPSILON; + dmx_nrg = EPSILON; + for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + { + dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; - /* normalization factor */ - norm_fac = sqrtf( hStereoDft->smooth_dmx_nrg[b] / hStereoDft->smooth_res_nrg[b] ); + DFT_PRED_RES[2 * i] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i] ); + DFT_PRED_RES[2 * i + 1] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i + 1] ); - /* gain compressor */ - norm_fac *= min( max( 0.8f, 1 / norm_fac ), 1.25f ); + 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]; + } - /* gain limiter */ - norm_fac = min( norm_fac, gain_limit ); + norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); + g2 = pPredGain[b] * norm_fac; + pred_gain_avg = g_short * hStereoDft->past_res_pred_gain[d_short_ind][b] + g_long * hStereoDft->past_res_pred_gain[d_long_ind][b]; - for ( i = hStereoDft->band_limits[b]; i < min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) - { - DFT_PRED_RES[2 * i] = norm_fac * pPredGain[b] * ap_filt_DMX[2 * i]; - DFT_PRED_RES[2 * i + 1] = norm_fac * pPredGain[b] * ap_filt_DMX[2 * i + 1]; + g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + + for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + { + DFT_PRED_RES[2 * i] *= g2; + DFT_PRED_RES[2 * i + 1] *= g2; + } + } + else + { + begin = max( hStereoDft->band_limits[b], bin0 ); + end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); + set_zero( DFT_PRED_RES + 2 * begin, 2 * ( end - begin ) ); + } } } } - else if ( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET] == STEREO_DFT_RESPRED_STEFI ) - { - /* stefi in lowband */ - set_zero( DFT_PRED_RES, 2 * hStereoDft->band_limits[lb_stefi_start_band] ); - for ( b = lb_stefi_start_band; b <= band0; b++ ) + /* update buffers */ + for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ ) + { + if ( hStereoDft->attackPresent || hStereoDft->wasTransient ) { - d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; - d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; - /* 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 ); + hStereoDft->past_res_pred_gain[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = -1; + } + else + { + hStereoDft->past_res_pred_gain[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b]; + } + } - /* Even number of window sliding (assymmetric OLA) */ - d_short_ind = 2 * ( d_short_ind / 2 ); - d_long_ind = 2 * ( d_long_ind / 2 ); + pop_wmops(); + return; +} +#endif - d_short = STEREO_DFT_PAST_MAX - d_short_ind; - d_long = STEREO_DFT_PAST_MAX - d_long_ind; +/*--------------------------------------------------------------- + * stereo_dft_dec_smooth_parameters() + * + * + * ---------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED +#if 1 +void stereo_dft_dec_smooth_parameters( + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const int16_t prev_sid_nodata, /* i : Previous SID/No data indicator */ + const int16_t active_frame_counter, /* i : Active frame counter */ + const int32_t element_brate /* i : Element bitrate */ +) +{ + int16_t k_offset, k, k2, b, N_div; + float *pIpd, *pInterpol; + float *pgIpd; + float *pSideGain; + float diff_ipd; + int16_t nbands; + int16_t max_res_pred_ind; - d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; - d_long_ind = ( d_long_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + N_div = STEREO_DFT_NBDIV; + k_offset = STEREO_DFT_OFFSET; - g_short = hStereoDft->stefi_short_gain; - g_long = hStereoDft->stefi_long_gain; + if ( hStereoDft->frame_sid_nodata || prev_sid_nodata ) + { + k = 1; + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + *( hStereoDft->side_gain + ( ( k + k_offset ) - 1 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b ); + } - /* change mixing ratio if long and short delay are the same */ - if ( d_short == d_long ) + if ( hStereoDft->frame_sid_nodata ) + { + /* set new xfade target if new itd received */ +#ifdef NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO + if ( hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE ) +#else + if ( hStereoDft->gipd[k + k_offset] != hStereoDft->ipd_xfade_target ) +#endif { - g_short = 1; - g_long = 0; + if ( ( hStereoDft->gipd[k + k_offset] - hStereoDft->ipd_xfade_prev ) > EVS_PI ) + { + hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset] - 2 * EVS_PI; + hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter ); + } + else if ( ( hStereoDft->ipd_xfade_prev - hStereoDft->gipd[k + k_offset] ) > EVS_PI ) + { + hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset] + 2 * EVS_PI; + hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter ); + } + else + { + hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset]; + hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter ); + } } - /* Avoid transient components */ - if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 && hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + /* xfade */ + if ( hStereoDft->ipd_xfade_prev != hStereoDft->ipd_xfade_target && hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 ) { - g_long = 0.0f; - g_short = 0.0f; + hStereoDft->gipd[k + k_offset] = hStereoDft->ipd_xfade_prev + hStereoDft->ipd_xfade_step; + hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset]; + hStereoDft->ipd_xfade_counter++; } - else if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 ) + } + else + { + /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */ + if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET ) { - g_long = 1.0f; - g_short = 0.0f; + hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset]; + hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset]; + hStereoDft->ipd_xfade_counter = 0; } - else if ( hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) + } + + for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) + { + hStereoDft->gipd[( k + k_offset ) - k2] = hStereoDft->gipd[k + k_offset]; + } + + if ( hStereoDft->frame_sid_nodata ) + { + /* set new xfade target if new itd received */ +#ifdef NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO + if ( hStereoDft->itd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE ) +#else + if ( hStereoDft->itd[k + k_offset] != hStereoDft->itd_xfade_target ) +#endif { - g_long = 0.0f; - g_short = 1.0f; + hStereoDft->itd_xfade_target = hStereoDft->itd[k + k_offset]; + hStereoDft->itd_xfade_step = ( hStereoDft->itd_xfade_target - hStereoDft->itd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->itd_xfade_counter ); } - if ( max( g_short, g_long ) > 0 ) + /* xfade */ + if ( hStereoDft->itd_xfade_prev != hStereoDft->itd_xfade_target && hStereoDft->itd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 ) { - past_dmx_nrg = EPSILON; - dmx_nrg = EPSILON; - for ( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) - { - dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + hStereoDft->itd[k + k_offset] = hStereoDft->itd_xfade_prev + hStereoDft->itd_xfade_step; + hStereoDft->itd_xfade_prev = hStereoDft->itd[k + k_offset]; + hStereoDft->itd_xfade_counter++; + } + } + else + { + /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */ + if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET ) + { + hStereoDft->itd_xfade_target = hStereoDft->itd[k + k_offset]; + hStereoDft->itd_xfade_prev = hStereoDft->itd[k + k_offset]; + hStereoDft->itd_xfade_counter = 0; + } - DFT_PRED_RES[2 * i] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i] ); - DFT_PRED_RES[2 * i + 1] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i + 1] ); + hStereoDft->last_active_element_brate = element_brate; + } + for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) + { + hStereoDft->itd[( k + k_offset ) - k2] = hStereoDft->itd[k + k_offset]; + } - 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]; - } - if ( !bfi || b >= hStereoDft->res_cod_band_max ) - { - norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); - g2 = pPredGain[b] * norm_fac; - pred_gain_avg = g_short * hStereoDft->past_res_pred_gain[d_short_ind][b] + - g_long * hStereoDft->past_res_pred_gain[d_long_ind][b]; + return; + } - g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + /* Active frame, "reset" everything "reset" everything if long enough active encoding */ + if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET ) + { + hStereoDft->itd_xfade_counter = 0; + hStereoDft->itd_xfade_target = hStereoDft->itd[STEREO_DFT_NBDIV - 1]; + hStereoDft->itd_xfade_prev = hStereoDft->itd[STEREO_DFT_NBDIV - 1]; + hStereoDft->ipd_xfade_counter = 0; + hStereoDft->ipd_xfade_target = hStereoDft->gipd[STEREO_DFT_NBDIV - 1]; + hStereoDft->ipd_xfade_prev = hStereoDft->gipd[STEREO_DFT_NBDIV - 1]; + } - for ( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) - { - DFT_PRED_RES[2 * i] *= g2; - DFT_PRED_RES[2 * i + 1] *= g2; - } + hStereoDft->last_active_element_brate = element_brate; + + for ( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] ) + { + max_res_pred_ind = 0; + + if ( hStereoDft->reverb_flag == 1 ) + { + nbands = min( 10, hStereoDft->nbands_respred ); + + /*Shift 2 last bands residual prediction gains for SWB/FB*/ + if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_HIGH ) + { + for ( b = hStereoDft->nbands_respred - 1; b >= nbands; b-- ) + { + hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = + hStereoDft->res_gains_ind[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX] = 0; + } + } + + /* Get maximal index */ + for ( b = hStereoDft->res_pred_band_min; b < ( nbands - STEREO_DFT_RES_PRED_BAND_MIN_CONST ); b++ ) + { + if ( max_res_pred_ind < hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] ) + { + max_res_pred_ind = (int16_t) hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; } } - else + + /* predictive values */ + for ( ; b < nbands; b++ ) { - set_zero( DFT_PRED_RES + 2 * hStereoDft->band_limits[b], 2 * ( min( bin0, hStereoDft->band_limits[b + 1] ) - hStereoDft->band_limits[b] ) ); + assert( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] == 0 ); + hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind; } } - } - if ( hStereoDft->band_limits[nbands_respred] > bin0 ) - { - /* apply stereo filling in ACELP BWE region */ - 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; - } - else if ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) + for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->res_cod_band_max; b++ ) { - /* ACELP -> TCX/HQ core transition */ - /* calculate high band energy only */ - dmx_nrg = EPSILON; - for ( i = bin0; i < hStereoDft->NFFT / 2; i++ ) + float tmp; + int16_t tmps1, tmps2; + + hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + /*stereo_dft_dequantize_res_gains_f(&hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b+STEREO_DFT_BAND_MAX],hStereoDft->side_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, hStereoDft->res_pred_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, 1);*/ + tmps1 = (int16_t) ( hStereoDft->res_gains_ind[0][b] ); + tmps2 = (int16_t) ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] ); + stereo_dft_dequantize_res_gains( &tmps1, &tmps2, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + + if ( hStereoDft->attackPresent ) { - dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + hStereoDft->res_gains_ind[1][b] = 0.8f * hStereoDft->res_gains_ind[1][b]; + } + else if ( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) ) + { + hStereoDft->res_gains_ind[1][b] = 0.6f * hStereoDft->res_gains_ind[1][b] + 0.4f * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; + } + else + { + hStereoDft->res_gains_ind[1][b] = dft_alpha_s2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; } - hStereoDft->hb_nrg[0] += dmx_nrg * 2 / hStereoDft->NFFT; - *stop = bin0; + stereo_dft_dequantize_res_gains_f( &hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b], &tmp, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); } - 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[k]; - d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY; - - d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; - /* calculate high band energy of past dmx */ - past_dmx_nrg = EPSILON; - for ( i = bin0; i < min( hStereoDft->NFFT / 2, STEREO_DFT32MS_N_32k / 2 ); i++ ) + /* Smoothing of prediction gains between ftrames */ + for ( ; b < hStereoDft->nbands; b++ ) + { + if ( hStereoDft->attackPresent ) { - past_dmx_nrg += hStereoDft->DFT_past_DMX[d_short_ind][2 * i] * hStereoDft->DFT_past_DMX[d_short_ind][2 * i] + hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] * hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1]; + hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind[1][b] = 0.8f * hStereoDft->res_gains_ind[1][b]; } - - for ( b = band0; b < nbands_respred; b++ ) + else if ( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) ) { - g_short = hStereoDft->past_res_pred_gain[d_short_ind][b] < 0 ? 0 : ( 1.f + hStereoDft->stefi_short_gain ) / 2; + hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; - if ( g_short > 0 ) + if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW ) { - norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); - g2 = pPredGain[b] * norm_fac; - pred_gain_avg = hStereoDft->past_res_pred_gain[d_short_ind][b] * g_short; - - g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); - for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) - { - DFT_PRED_RES[2 * i] = g2 * hStereoDft->DFT_past_DMX[d_short_ind][2 * i]; - DFT_PRED_RES[2 * i + 1] = g2 * hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1]; - } + hStereoDft->res_gains_ind[1][b] = dft_alpha_w_b2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_w_b2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; } else { - begin = max( hStereoDft->band_limits[b], bin0 ); - end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); - set_zero( DFT_PRED_RES + 2 * begin, 2 * ( end - begin ) ); + hStereoDft->res_gains_ind[1][b] = dft_alpha_w[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_w[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; } } - } - else - { - for ( b = band0; b < nbands_respred; b++ ) + else { - /* TCX/HQ core -> TCX/HQ core: business as usual */ - d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2; - d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4; - /* 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 ); - - /* Even number of window sliding (assymmetric OLA) */ - d_short_ind = 2 * ( d_short_ind / 2 ); - d_long_ind = 2 * ( d_long_ind / 2 ); - - d_short = STEREO_DFT_PAST_MAX - d_short_ind; - d_long = STEREO_DFT_PAST_MAX - d_long_ind; - - d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; - d_long_ind = ( d_long_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; - - g_short = hStereoDft->stefi_short_gain; - g_long = hStereoDft->stefi_long_gain; - - /* change mixing ratio if long and short delay are the same */ - if ( d_short == d_long ) - { - g_short = 1; - g_long = 0; - } - - /* Avoid transient components */ - if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 && hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) - { - g_long = 0.0f; - g_short = 0.0f; - } - else if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 ) - { - g_long = 1.0f; - g_short = 0.0f; - } - else if ( hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 ) - { - g_long = 0.0f; - g_short = 1.0f; - } - if ( hStereoDft->core_hist[d_short / 2] == ACELP_CORE ) + if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW ) { - g_short = 0; + hStereoDft->res_gains_ind[0][b] = dft_alpha_s_b2[b] * hStereoDft->res_gains_ind[0][b] + ( 1 - dft_alpha_s_b2[b] ) * hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind[1][b] = dft_alpha_s2_b2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2_b2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; } - if ( hStereoDft->core_hist[d_long / 2] == ACELP_CORE ) + else { - g_long = 0; + hStereoDft->res_gains_ind[0][b] = dft_alpha_s[b] * hStereoDft->res_gains_ind[0][b] + ( 1 - dft_alpha_s[b] ) * hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind[1][b] = dft_alpha_s2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX]; } + } - if ( max( g_short, g_long ) > 0 ) - { - past_dmx_nrg = EPSILON; - dmx_nrg = EPSILON; - for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) - { - dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1]; + if ( !hStereoDft->recovery_flg ) + { + stereo_dft_dequantize_res_gains_f( &hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b], hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + } + } - DFT_PRED_RES[2 * i] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i] ); - DFT_PRED_RES[2 * i + 1] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i + 1] ); + /* Smoothing of IPDs*/ + pgIpd = hStereoDft->gipd + ( k + k_offset ); + diff_ipd = pgIpd[0] - pgIpd[-hStereoDft->prm_res[k + k_offset]]; + if ( diff_ipd < -EVS_PI ) + { + pgIpd[0] += PI2; + } + else if ( diff_ipd > EVS_PI ) + { + pgIpd[0] -= PI2; + } - 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]; - } + if ( !hStereoDft->attackPresent ) + { + if ( hStereoDft->wasTransient ) + { + pgIpd[0] = 0.8f * pgIpd[0] + 0.2f * pgIpd[-hStereoDft->prm_res[k + k_offset]]; + } + else + { + pgIpd[0] = 0.5f * pgIpd[0] + 0.5f * pgIpd[-hStereoDft->prm_res[k + k_offset]]; + } + } - norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) ); - g2 = pPredGain[b] * norm_fac; - pred_gain_avg = g_short * hStereoDft->past_res_pred_gain[d_short_ind][b] + g_long * hStereoDft->past_res_pred_gain[d_long_ind][b]; - g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT ); + if ( !hStereoDft->attackPresent ) + { + pSideGain = hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX; + for ( b = 0; b < hStereoDft->res_cod_band_max; b++ ) + { + pSideGain[b] = dft_res_cod_alpha[b] * pSideGain[b] + ( 1 - dft_res_cod_alpha[b] ) * pSideGain[b - hStereoDft->prm_res[k + k_offset] * STEREO_DFT_BAND_MAX]; + } + } - for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) - { - DFT_PRED_RES[2 * i] *= g2; - DFT_PRED_RES[2 * i + 1] *= g2; - } + /*Interpolation between DFT slots*/ + for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) + { + pInterpol = hStereoDft->gipd + ( ( k + k_offset ) - k2 ); + pIpd = hStereoDft->gipd + ( k + k_offset ); + if ( hStereoDft->attackPresent ) + { + *( pInterpol ) = *( pIpd ); + } + else + { + *( pInterpol ) = *( hStereoDft->gipd + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) ); + } + + for ( b = 0; b < hStereoDft->nbands; b++ ) + { + *( hStereoDft->res_pred_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->res_pred_gain + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) * STEREO_DFT_BAND_MAX + b ); + + if ( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) ) + { + *( hStereoDft->side_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b ); } else { - begin = max( hStereoDft->band_limits[b], bin0 ); - end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); - set_zero( DFT_PRED_RES + 2 * begin, 2 * ( end - begin ) ); + *( hStereoDft->side_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) * STEREO_DFT_BAND_MAX + b ); } } - } - } - /* update buffers */ - for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ ) - { - if ( hStereoDft->attackPresent || hStereoDft->wasTransient ) - { - hStereoDft->past_res_pred_gain[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = -1; - } - else - { - hStereoDft->past_res_pred_gain[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b]; - } + hStereoDft->itd[( k + k_offset ) - k2] = hStereoDft->itd[k + k_offset]; + } /*end of interpolation*/ } - pop_wmops(); return; } - - -/*--------------------------------------------------------------- - * stereo_dft_dec_smooth_parameters() - * - * - * ---------------------------------------------------------------*/ - +#else void stereo_dft_dec_smooth_parameters( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ const int16_t prev_sid_nodata, /* i : Previous SID/No data indicator */ @@ -4123,8 +3625,10 @@ void stereo_dft_dec_smooth_parameters( return; } +#endif +#endif - +#ifndef IVAS_FLOAT_FIXED /*--------------------------------------------------------------- * stereo_dft_adapt_sf_delay() * @@ -4211,4 +3715,4 @@ static void stereo_dft_adapt_sf_delay( return; } -#endif +#endif \ No newline at end of file diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index ae5a608014bdc8bab278dcb8cc6c43a1572b265f..4397532953f3dfc8f60adc1e28eaffe8703105a2 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -55,6 +55,7 @@ * Reset DFT stereo mono output memories *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void stereo_dft_dmx_out_reset( STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ ) @@ -67,43 +68,46 @@ void stereo_dft_dmx_out_reset( return; } - -#ifdef IVAS_FLOAT_FIXED +#else void stereo_dft_dmx_out_reset_fx( - STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ + STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ ) { -#if 1 /*TODO: Remove float dft_dmx_reset*/ +#if 0 /*TODO: Remove float dft_dmx_reset*/ hStereoDftDmx->targetGain = 1.0f; hStereoDftDmx->prevTargetGain = 1.0f; #endif - hStereoDftDmx->targetGain_fx = ONE_IN_Q29; - hStereoDftDmx->prevTargetGain_fx = ONE_IN_Q29; + hStereoDftDmx->targetGain_fx = ONE_IN_Q29; + move32(); + hStereoDftDmx->prevTargetGain_fx = ONE_IN_Q29; + move32(); -#if 1 /*TODO: Remove float dft_dmx_reset*/ +#if 0 /*TODO: Remove float dft_dmx_reset*/ set_zero(hStereoDftDmx->memOutHB, NS2SA(48000, STEREO_DFT32MS_OVL_NS)); set_zero(hStereoDftDmx->memTransitionHB, NS2SA(48000, STEREO_DFT32MS_OVL_NS)); #endif - set32_fx(hStereoDftDmx->memOutHB_fx, 0, NS2SA(48000, STEREO_DFT32MS_OVL_NS)); - set32_fx(hStereoDftDmx->memTransitionHB_fx, 0, NS2SA(48000, STEREO_DFT32MS_OVL_NS)); + set32_fx( hStereoDftDmx->memOutHB_fx, 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + set32_fx( hStereoDftDmx->memTransitionHB_fx, 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - return; + return; } #endif + /*------------------------------------------------------------------------- * stereo_dft_unify_dmx() * * create a uniform dmx in case of residual coding by converting from passive * to active dmx in residual coding region *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED void stereo_dft_unify_dmx_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ - Decoder_State *st0, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ - const Word16 prev_sid_nodata /* i : Previous SID/No data indicator */ + const Word16 prev_sid_nodata /* i : Previous SID/No data indicator */ ) { Word16 i, k, b, N_div; @@ -111,9 +115,9 @@ void stereo_dft_unify_dmx_fx( Word32 DFT_R[STEREO_DFT32MS_N_MAX]; Word32 *pDFT_DMX; Word32 *pDFT_RES; - Word32 g, tmp; + Word32 tmp; Word32 *pSideGain; - Word16 k_offset; + Word16 k_offset, g; /* Variables for stereo residual PLC */ Word32 DFT_PRED_RES[STEREO_DFT32MS_N_32k]; @@ -127,56 +131,66 @@ void stereo_dft_unify_dmx_fx( Word16 num_plocs; Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; - output_frame = (Word16)(st0->output_Fs / FRAMES_PER_SEC); - samp_ratio = BASOP_Util_Divide3232_Scale(st0->sr_core, st0->output_Fs, &q_samp_ratio); - samp_ratio = shr(samp_ratio, sub(Q15 - Q12, q_samp_ratio)); + output_frame = (Word16) ( st0->output_Fs / FRAMES_PER_SEC ); + samp_ratio = BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio ); + samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) ); - prev_bfi = st0->prev_old_bfi; move32(); + prev_bfi = st0->prev_old_bfi; + move32(); /* Initialization */ - k_offset = 1; move16(); - N_div = STEREO_DFT_NBDIV; move16(); + k_offset = 1; + move16(); + N_div = STEREO_DFT_NBDIV; + move16(); - dmx_nrg = 0; move32(); + dmx_nrg = 0; + move32(); /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ - IF ( LT_16(output_frame, inner_frame_tbl[st0->bwidth] )) + IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) ) { hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); } - IF ( prev_bfi ) + IF( prev_bfi ) { - //dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), hStereoDft->q_dft, hStereoDft->q_dft ); - 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); + 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 ); } /* 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)); + 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 ) ); /* Smoothing for the current frame */ stereo_dft_dec_smooth_parameters_fx( hStereoDft, prev_sid_nodata, st0->hFdCngDec->hFdCngCom->active_frame_counter, st0->element_brate ); - FOR ( k = 0; k < N_div; k++ ) + FOR( k = 0; k < N_div; k++ ) { - pDFT_DMX = DFT[0] + i_mult(k, STEREO_DFT32MS_N_MAX); - pDFT_RES = DFT[1] + i_mult(k, STEREO_DFT32MS_N_MAX); + pDFT_DMX = DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ); + pDFT_RES = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); assert( hStereoDft->hConfig->dmx_active ); /*Apply Stereo*/ g = MAX_16; move16(); /* since delay is just 3.125ms, the parameters received are used for the second window */ - pSideGain = hStereoDft->side_gain_fx + i_mult(add(k, k_offset), STEREO_DFT_BAND_MAX); + 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( GT_16( hStereoDft->res_cod_band_max, 0 ) ) { - IF ( !st0->bfi ) + IF( !st0->bfi ) { - IF ( EQ_16(k, 1 )) + IF( EQ_16( k, 1 ) ) { - Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl(hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1) ); + Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); hStereoDft->q_res_mem = hStereoDft->q_dft; hStereoDft->time_offs = 0; move16(); @@ -186,8 +200,8 @@ void stereo_dft_unify_dmx_fx( { hStereoDft->nbands = hStereoDft->res_cod_band_max; /* Limit nbands since residual PLC only needs the low frequency range of the stereo filling */ 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; + 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; 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; @@ -200,29 +214,29 @@ void stereo_dft_unify_dmx_fx( DFT_R[0] = pDFT_DMX[0]; /* upmix residual part */ - FOR ( b = 0; b < hStereoDft->res_cod_band_max; b++ ) + FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ ) { - g = extract_h(pSideGain[b]); + g = extract_h( pSideGain[b] ); move16(); - FOR ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { - tmp = Madd_32_16(pDFT_RES[2 * i], pDFT_DMX[2 * i], g); + tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); - DFT_L[2 * i] = L_add(pDFT_DMX[2 * i], tmp); - DFT_R[2 * i] = L_sub(pDFT_DMX[2 * i], tmp); + DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); + DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); - tmp = Madd_32_16(pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g); + 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_R[2 * i + 1] = L_sub(pDFT_DMX[2 * i + 1], tmp); + DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); + DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); } } /* downmix residual part with active downmix */ - FOR ( b = 0; b < hStereoDft->res_cod_band_max; b++ ) + FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ ) { - Word16 j, max_e; + Word16 j; Word32 sum_nrg_Mid, sum_abs, dot_prod_abs; Word16 wR, wL; Word16 norm_sum_nrg_L, norm_sum_nrg_R, norm_dot_prod_real, norm_dot_prod_imag, guard_bit, min_norm, q_sum_nrg_L, q_sum_nrg_R, q_dot_prod_real; @@ -231,60 +245,63 @@ void stereo_dft_unify_dmx_fx( Word64 sum_nrg_L = 0, sum_nrg_R = 0; Word64 dot_prod_real = 0, dot_prod_img = 0; - FOR ( j = hStereoDft->band_limits[b]; j < hStereoDft->band_limits[b + 1]; j++ ) + 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]))); - - 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]))); + 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] ) ) ); + + 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] ) ) ); } - norm_sum_nrg_L = W_norm(sum_nrg_L); - norm_sum_nrg_R = W_norm(sum_nrg_R); - norm_dot_prod_real = W_norm(dot_prod_real); - norm_dot_prod_imag = W_norm(dot_prod_img); - - guard_bit = find_guarded_bits_fx(4); - min_norm = s_min(s_min(s_min(norm_sum_nrg_L, norm_sum_nrg_R), norm_dot_prod_real), norm_dot_prod_imag) - guard_bit; - sum_nrg_L_32 = W_extract_h(W_shl(sum_nrg_L, min_norm)); - sum_nrg_R_32 = W_extract_h(W_shl(sum_nrg_R, min_norm)); - dot_prod_real_32 = W_extract_h(W_shl(dot_prod_real, min_norm)); - dot_prod_img_32 = W_extract_h(W_shl(dot_prod_img, min_norm)); - - q_sum_nrg_L = sub(add(shl(hStereoDft->q_dft, 1), min_norm), 31); - q_sum_nrg_R = sub(add(shl(hStereoDft->q_dft, 1), min_norm), 31); - q_dot_prod_real = sub(add(shl(hStereoDft->q_dft, 1), min_norm), 31); - - exp_sum_nrg_l = sub(31, q_sum_nrg_L); - exp_sum_nrg_R = sub(31, q_sum_nrg_R); - exp_dot_prod_abs = sub(31, sub(shl(q_dot_prod_real, 1), 31)); - exp_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, &exp_sum_nrg_l); - Word32 tmp_nrg_R = Sqrt32(sum_nrg_R_32, &exp_sum_nrg_R); + norm_sum_nrg_L = W_norm( sum_nrg_L ); + norm_sum_nrg_R = W_norm( sum_nrg_R ); + norm_dot_prod_real = W_norm( dot_prod_real ); + norm_dot_prod_imag = W_norm( dot_prod_img ); + + guard_bit = find_guarded_bits_fx( 4 ); + min_norm = s_min( s_min( s_min( norm_sum_nrg_L, norm_sum_nrg_R ), norm_dot_prod_real ), norm_dot_prod_imag ) - guard_bit; + sum_nrg_L_32 = W_extract_h( W_shl( sum_nrg_L, min_norm ) ); + sum_nrg_R_32 = W_extract_h( W_shl( sum_nrg_R, min_norm ) ); + dot_prod_real_32 = W_extract_h( W_shl( dot_prod_real, min_norm ) ); + dot_prod_img_32 = W_extract_h( W_shl( dot_prod_img, min_norm ) ); + + q_sum_nrg_L = sub( add( shl( hStereoDft->q_dft, 1 ), min_norm ), 31 ); + q_sum_nrg_R = sub( add( shl( hStereoDft->q_dft, 1 ), min_norm ), 31 ); + q_dot_prod_real = sub( add( shl( hStereoDft->q_dft, 1 ), min_norm ), 31 ); + + exp_sum_nrg_l = sub( 31, q_sum_nrg_L ); + exp_sum_nrg_R = sub( 31, q_sum_nrg_R ); + exp_dot_prod_abs = sub( 31, sub( shl( q_dot_prod_real, 1 ), 31 ) ); + exp_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, &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; - 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 = 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)); - 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)); - 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 )) + 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 ) ); + 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 ) ); + 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 ) ) { - exp_wR = E_num; move16(); + exp_wR = E_num; + move16(); } Word16 wR_temp; - IF( EQ_32(num_sqrt, 0) && EQ_32(sum_abs, 0) ) + IF( EQ_32( num_sqrt, 0 ) && EQ_32( sum_abs, 0 ) ) { wR_temp = 6364; // 0.776887059 in Q13 move16(); @@ -302,61 +319,59 @@ void stereo_dft_unify_dmx_fx( 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 )) + IF( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) { - exp_wL = exp_sum_nrg_Mid; move16(); + exp_wL = exp_sum_nrg_Mid; + move16(); } Word16 wL_temp; - IF( EQ_32(sum_nrg_Mid_sqrt, 0) && EQ_32(sum_abs, 0) ) + IF( EQ_32( sum_nrg_Mid_sqrt, 0 ) && EQ_32( sum_abs, 0 ) ) { - wL_temp = 6364; move16(); + wL_temp = 6364; + move16(); } ELSE IF( sum_nrg_Mid_sqrt == 0 && sum_abs != 0 ) { - wL_temp = 5793; move16(); + wL_temp = 5793; + move16(); } 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 ); } - wR = wR_temp; move16(); - wL = add(wR, mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, wL_temp ) ) ); + wR = wR_temp; /* Q13 */ + move16(); + wL = add( wR, mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, wL_temp ) ) ); /* Q13 */ - FOR ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) + FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*DMX Mapping*/ - pDFT_DMX[2 * i] = 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); - pDFT_DMX[2 * i + 1] = 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); + 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 + 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) */ } } - Scale_sig32(pDFT_DMX, (hStereoDft->band_limits[0]), -2); - Scale_sig32(pDFT_DMX + hStereoDft->band_limits[hStereoDft->res_cod_band_max + 1], hStereoDft->NFFT - hStereoDft->band_limits[hStereoDft->res_cod_band_max + 1], -2); - - Copy32( pDFT_DMX, DFT[0] + i_mult(k, STEREO_DFT32MS_N_MAX), hStereoDft->NFFT ); + 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; Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); - //Scale_sig32(hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min(hStereoDft->NFFT, STEREO_DFT32MS_N_32k), -2); - hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = sub(add(hStereoDft->q_dft, 13), 15); - IF ( st0->bfi && !prev_bfi ) + hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft; + 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; - idx_k1 = ( add(idx_k0, 1) ) % STEREO_DFT_PAST_MAX; - 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]); + idx_k0 = ( add( hStereoDft->past_DMX_pos, 1 ) ) % STEREO_DFT_PAST_MAX; + idx_k1 = ( add( idx_k0, 1 ) ) % STEREO_DFT_PAST_MAX; + 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] ); /*dmx energy memory*/ - hStereoDft->past_dmx_nrg = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1); + hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1 ); } } - hStereoDft->q_dft = sub(add(hStereoDft->q_dft, 13), 15); - return; } #else @@ -524,6 +539,7 @@ void stereo_dft_unify_dmx( } #endif + /*-------------------------------------------------------------------* * add_HB_to_mono_dmx() * @@ -646,11 +662,15 @@ void add_HB_to_mono_dmx_fx( Word32 *memOutHB_fx, *memTransitionHB_fx; output_Fs = hCPE->hCoreCoder[0]->output_Fs; +#if 0 Word16 q_memOutHB = Q_factor_arr(hCPE->hStereoDftDmx->memOutHB, NS2SA(48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS)); floatToFixed_arrL(hCPE->hStereoDftDmx->memOutHB, hCPE->hStereoDftDmx->memOutHB_fx, q_memOutHB, NS2SA(48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS)); +#endif memOutHB_fx = hCPE->hStereoDftDmx->memOutHB_fx; +#if 0 Word16 q_memTransitionHB = Q_factor_arr(hCPE->hStereoDftDmx->memTransitionHB, NS2SA(48000, STEREO_DFT32MS_OVL_NS)); floatToFixed_arrL(hCPE->hStereoDftDmx->memTransitionHB, hCPE->hStereoDftDmx->memTransitionHB_fx, q_memTransitionHB, NS2SA(48000, STEREO_DFT32MS_OVL_NS)); +#endif memTransitionHB_fx = hCPE->hStereoDftDmx->memTransitionHB_fx; memOffset = NS2SA(output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS); diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 72c52a0d70126b91ef75cb6b5edd69fa9b5b64eb..c76c8ce0e7af60aa6719bc22de3eed951adda4cd 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -50,7 +50,6 @@ #include "ivas_prot_fx.h" #include "basop_util.h" #include "prot_fx1.h" -#endif // IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * Local constants @@ -108,11 +107,12 @@ void stereo_dft_dec_reset_fx( /*residual prediction*/ set_s( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB ); - FOR ( i = 0; i < STEREO_DFT_PAST_MAX; i++ ) + FOR( i = 0; i < STEREO_DFT_PAST_MAX; i++ ) { - set_val_Word32( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k ); - set_val_Word32( hStereoDft->past_res_pred_gain_fx[i], 0, STEREO_DFT_BAND_MAX ); + set32_fx( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k ); + set32_fx( hStereoDft->past_res_pred_gain_fx[i], 0, STEREO_DFT_BAND_MAX ); hStereoDft->q_DFT_past_DMX_fx[i] = 0; + move16(); } hStereoDft->past_DMX_pos = 0; @@ -120,27 +120,28 @@ void stereo_dft_dec_reset_fx( set_s( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX ); - FOR ( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) + FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) { - hStereoDft->res_gains_ind_fx[0][i] = (Word32)0x3C000000; + hStereoDft->res_gains_ind_fx[0][i] = 1006632960; /* 15.0f in Q26 */ move32(); } - set_val_Word32( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX ); + 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 ); hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode]; - set_val_Word32( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); + set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); + hStereoDft->q_res_cod_mem_fx = Q16; + move16(); hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); move32(); hStereoDft->stab_fac_smooth_res_fx = 0; move16(); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) - bass_psfilter_init( hStereoDft->hBpf ); -#endif + bass_psfilter_init_fx( hStereoDft->hBpf ); + tcxltp_dec_init( hStereoDft->hTcxLtpDec, 0, MODE1, IVAS_CPE_DFT, PIT_MAX, 12800 ); hStereoDft->reverb_flag = 0; @@ -154,10 +155,10 @@ void stereo_dft_dec_reset_fx( move16(); /*reset parameters*/ - set_val_Word32( hStereoDft->side_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); - set_val_Word32( hStereoDft->gipd_fx, 0, STEREO_DFT_DEC_DFT_NB ); - set_val_Word32( hStereoDft->itd_fx, 0, STEREO_DFT_DEC_DFT_NB ); - set_val_Word32( hStereoDft->res_pred_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); + set32_fx( hStereoDft->side_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); + set32_fx( hStereoDft->gipd_fx, 0, STEREO_DFT_DEC_DFT_NB ); + set32_fx( hStereoDft->itd_fx, 0, STEREO_DFT_DEC_DFT_NB ); + set32_fx( hStereoDft->res_pred_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX ); hStereoDft->wasTransient = 0; move16(); @@ -165,34 +166,47 @@ void stereo_dft_dec_reset_fx( move16(); hStereoDft->lt_pred_gain_fx = 0; + move32(); hStereoDft->lt_pred_gain_variation_fx = 0; + move32(); hStereoDft->lt_var_mean_ratio_fx = STEREO_DFT_RES_RATIO_LIMIT_FX; + move32(); hStereoDft->stefi_short_gain_fx = MAX_16; + move16(); hStereoDft->stefi_long_gain_fx = 0; + move16(); hStereoDft->q_lt_pred_gain = 0; + move16(); - set_val_Word16( &hStereoDft->g_state_fx[0], 0, STEREO_DFT_BAND_MAX ); + set16_fx( &hStereoDft->g_state_fx[0], 0, STEREO_DFT_BAND_MAX ); - init_basic_allpass( &hStereoDft->ap1, dft_ap_gains[0], dft_ap_gains_fx[0], dft_ap_delays[0] ); - init_basic_allpass( &hStereoDft->ap2, dft_ap_gains[1], dft_ap_gains_fx[1], dft_ap_delays[1] ); - init_basic_allpass( &hStereoDft->ap3, dft_ap_gains[2], dft_ap_gains_fx[2], dft_ap_delays[2] ); + init_basic_allpass_fx( &hStereoDft->ap1, dft_ap_gains_fx[0], dft_ap_delays[0] ); + init_basic_allpass_fx( &hStereoDft->ap2, dft_ap_gains_fx[1], dft_ap_delays[1] ); + init_basic_allpass_fx( &hStereoDft->ap3, dft_ap_gains_fx[2], dft_ap_delays[2] ); - set_val_Word32( hStereoDft->ap_delay_mem_fx, 0, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) ); - set_val_Word32( hStereoDft->ap_fade_mem_fx, 0, STEREO_DFT_ALLPASS_FADELEN_16k ); + set32_fx( hStereoDft->ap_delay_mem_fx, 0, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) ); + set32_fx( hStereoDft->ap_fade_mem_fx, 0, STEREO_DFT_ALLPASS_FADELEN_16k ); + hStereoDft->q_ap_delay_mem_fx = Q11; + move16(); hStereoDft->ap_wasTransient = 0; move16(); - set_val_Word32( hStereoDft->smooth_dmx_nrg_fx, 0, STEREO_DFT_BAND_MAX ); - set_val_Word32( hStereoDft->smooth_res_nrg_fx, 0, STEREO_DFT_BAND_MAX ); + set32_fx( hStereoDft->smooth_dmx_nrg_fx, 0, STEREO_DFT_BAND_MAX ); + set32_fx( hStereoDft->smooth_res_nrg_fx, 0, STEREO_DFT_BAND_MAX ); + hStereoDft->q_smoothed_nrg = 0; + move16(); set_s( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX ); - set_val_Word32( hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) ); - set_val_Word32( hStereoDft->hb_nrg_fx, 0, STEREO_DFT_CORE_HIST_MAX ); - set_val_Word32( hStereoDft->td_gain_fx, 0, STEREO_DFT_CORE_HIST_MAX ); - set_val_Word32( hStereoDft->q_td_gain, 0, STEREO_DFT_CORE_HIST_MAX ); + set32_fx( hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) ); + set32_fx( hStereoDft->hb_nrg_fx, 0, STEREO_DFT_CORE_HIST_MAX ); + set32_fx( hStereoDft->td_gain_fx, 0, STEREO_DFT_CORE_HIST_MAX ); + set32_fx( hStereoDft->q_td_gain, 0, STEREO_DFT_CORE_HIST_MAX ); + + hStereoDft->q_dft = 0; + move16(); /* PLC parameters */ - set_val_Word32( hStereoDft->res_mem_fx, 0, STEREO_DFT_RES_BW_MAX ); + set32_fx( hStereoDft->res_mem_fx, 0, STEREO_DFT_RES_BW_MAX ); hStereoDft->time_offs = 0; move16(); hStereoDft->past_dmx_nrg_fx = 0; @@ -204,36 +218,51 @@ void stereo_dft_dec_reset_fx( hStereoDft->recovery_flg = 0; move16(); - FOR ( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ ) + FOR( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ ) { - set_val_Word32( hStereoDft->smooth_buf_fx[i], 0, SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + set32_fx( hStereoDft->smooth_buf_fx[i], 0, SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); } - set_val_Word16( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS ); - set_val_Word16( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS ); + hStereoDft->q_smooth_buf_fx = Q7; + move16(); + set16_fx( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS ); + set16_fx( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS ); - hStereoDft->itd_xfade_target_fx = 0; move32(); - hStereoDft->itd_xfade_step_fx = 0; move32(); - hStereoDft->itd_xfade_counter = 0; move16(); - hStereoDft->itd_xfade_prev_fx = 0; move32(); - hStereoDft->last_active_element_brate = 0; move32(); - hStereoDft->ipd_xfade_target_fx = 0; move32(); - hStereoDft->ipd_xfade_step_fx = 0; move32(); - hStereoDft->ipd_xfade_counter = 0; move16(); - hStereoDft->ipd_xfade_prev_fx = 0; move32(); + hStereoDft->itd_xfade_target_fx = 0; + move32(); + hStereoDft->itd_xfade_step_fx = 0; + move32(); + hStereoDft->itd_xfade_counter = 0; + move16(); + hStereoDft->itd_xfade_prev_fx = 0; + move32(); + hStereoDft->last_active_element_brate = 0; + move32(); + hStereoDft->ipd_xfade_target_fx = 0; + move32(); + hStereoDft->ipd_xfade_step_fx = 0; + move32(); + hStereoDft->ipd_xfade_counter = 0; + move16(); + hStereoDft->ipd_xfade_prev_fx = 0; + move32(); - FOR ( b = 0; b < hStereoDft->nbands; b++ ) + FOR( b = 0; b < hStereoDft->nbands; b++ ) { - FOR ( i = 0; i < 2; i++ ) + FOR( i = 0; i < 2; i++ ) { - FOR ( j = 0; j < 4; j++ ) + FOR( j = 0; j < 4; j++ ) { - hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0; move32(); + hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0; + move32(); } } } - hStereoDft->first_frame = 1; move16(); - hStereoDft->g_L_prev_fx = 0; move32(); - hStereoDft->g_R_prev_fx = 0; move32(); + hStereoDft->first_frame = 1; + move16(); + hStereoDft->g_L_prev_fx = 0; + move32(); + hStereoDft->g_R_prev_fx = 0; + move32(); return; } @@ -246,41 +275,43 @@ void stereo_dft_dec_reset_fx( static void stereo_dft_dec_open_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 nchan_transport /* i : number of transport channels */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 nchan_transport /* i : number of transport channels */ ) { /*Sizes*/ - hStereoDft->N = (int16_t) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); + hStereoDft->N = extract_l( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); /*Init. DFT sizes*/ - hStereoDft->NFFT = (int16_t) ( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); + hStereoDft->NFFT = extract_l( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); 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 = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl = extract_l( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); 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 = (int16_t) ( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl2 = extract_l( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); 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; - IF ( EQ_32(output_Fs , 16000) ) + IF( EQ_32( output_Fs, 16000 ) ) { hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; + move16(); hStereoDft->win232ms_fx = dft_win232ms_16k_fx; hStereoDft->win32ms_fx = dft_win232ms_16k_fx + 1; } - ELSE IF ( EQ_32(output_Fs , 32000) ) + ELSE IF( EQ_32( output_Fs, 32000 ) ) { hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; + move16(); hStereoDft->win232ms_fx = dft_win232ms_32k_fx; hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; } @@ -289,6 +320,7 @@ static void stereo_dft_dec_open_fx( assert( output_Fs == 48000 ); hStereoDft->dft_trigo_fx = dft_trigo_48k_fx; hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; + move16(); hStereoDft->win232ms_fx = dft_win232ms_48k_fx; hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; } @@ -301,7 +333,7 @@ static void stereo_dft_dec_open_fx( hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); hStereoDft->hb_stefi_delay = NS2SA( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); - IF ( GT_16(nchan_transport , 2) ) + IF( GT_16( nchan_transport, 2 ) ) { hStereoDft->min_smooth_gains_fx = min_smooth_gains2_fx; hStereoDft->max_smooth_gains_fx = max_smooth_gains2_fx; @@ -312,7 +344,9 @@ static void stereo_dft_dec_open_fx( hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; } hStereoDft->q_hb_stefi_sig_fx = Q31; + move16(); hStereoDft->q_ap_fade_mem_fx = Q31; + move16(); /* reset DFT stereo memories */ stereo_dft_dec_reset_fx( hStereoDft ); @@ -329,36 +363,36 @@ static void stereo_dft_dec_open_fx( ivas_error stereo_dft_dec_create_fx( STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 element_brate, /* i : element bitrate */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const Word16 nchan_transport /* i : number of transport channels */ + const Word32 element_brate, /* i : element bitrate */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ + const Word16 nchan_transport /* i : number of transport channels */ ) { STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc; Word16 tmpS; - IF ( *hStereoDft != NULL ) + IF( *hStereoDft != NULL ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" ); } - IF ( ( hStereoDft_loc = (STEREO_DFT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DEC_DATA ) ) ) == NULL ) + IF( ( hStereoDft_loc = (STEREO_DFT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DEC_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) ); } - IF ( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL ) + IF( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) ); } - IF ( ( hStereoDft_loc->hBpf = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) + IF( ( hStereoDft_loc->hBpf = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF handle\n" ) ); } - IF ( ( hStereoDft_loc->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) + IF( ( hStereoDft_loc->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); } @@ -366,7 +400,7 @@ ivas_error stereo_dft_dec_create_fx( hStereoDft_loc->hConfig->force_mono_transmission = 0; move16(); - IF ( sba_dirac_stereo_flag ) + IF( sba_dirac_stereo_flag ) { ivas_sba_dirac_stereo_config( hStereoDft_loc->hConfig ); } @@ -377,10 +411,6 @@ ivas_error stereo_dft_dec_create_fx( stereo_dft_dec_open_fx( hStereoDft_loc, output_Fs, nchan_transport ); -#if 1 // TODO: To be removed later - stereo_dft_dec_open( hStereoDft_loc, output_Fs, nchan_transport ); -#endif - *hStereoDft = hStereoDft_loc; return IVAS_ERR_OK; @@ -458,7 +488,8 @@ static void stereo_dft_dequantize_res_gains_f_fx( ij = (Word16)L_min( fi < ONE_IN_Q25 ? i1 : i1 + 1, 15 ); /* interpolate values from table */ - IF ( LT_32(i1, L_shl(15, Q26)) ) + // IF ( LT_32(i1, L_shl(15, Q26)) ) + 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) ); move32(); @@ -501,8 +532,8 @@ static void stereo_dft_dequantize_res_gains_f_fx( void stereo_dft_dec_update_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 output_frame, /* i : output frame length */ - const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ + const Word16 output_frame, /* i : output frame length */ + const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ) { Word16 b, i, k_offset; @@ -511,7 +542,7 @@ void stereo_dft_dec_update_fx( k_offset = STEREO_DFT_OFFSET; /*Add an offset*/ move16(); /* Update parameters */ - FOR ( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ ) + FOR( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ ) { hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; move32(); @@ -519,14 +550,14 @@ void stereo_dft_dec_update_fx( move32(); } - FOR ( i = 0; i < k_offset; i++ ) + FOR( i = 0; i < k_offset; i++ ) { hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[STEREO_DFT_NBDIV + i]; move32(); } /* Update configuration memories */ - FOR ( i = 0; i < k_offset; i++ ) + FOR( i = 0; i < k_offset; i++ ) { hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; move16(); @@ -547,18 +578,18 @@ void stereo_dft_dec_update_fx( set_s( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV ); /*Update attack info*/ - IF ( hStereoDft->attackPresent ) + IF( hStereoDft->attackPresent ) { hStereoDft->wasTransient = 1; move16(); } - ELSE IF ( hStereoDft->wasTransient ) + ELSE IF( hStereoDft->wasTransient ) { hStereoDft->wasTransient = 0; move16(); } - FOR ( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- ) + FOR( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- ) { hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; move16(); @@ -567,14 +598,14 @@ void stereo_dft_dec_update_fx( Copy32( hStereoDft->hb_stefi_sig_fx + output_frame, hStereoDft->hb_stefi_sig_fx, hStereoDft->hb_stefi_delay ); Copy32( hStereoDft->hb_nrg_fx, hStereoDft->hb_nrg_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); Copy32( hStereoDft->td_gain_fx, hStereoDft->td_gain_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); - Copy32( hStereoDft->q_td_gain, hStereoDft->q_td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1); + Copy32( hStereoDft->q_td_gain, hStereoDft->q_td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); - IF ( sba_dirac_stereo_flag ) + IF( sba_dirac_stereo_flag ) { /* buffer update, push back by 2 because of 2 subframes */ - FOR ( b = 0; b < hStereoDft->nbands; b++ ) + FOR( b = 0; b < hStereoDft->nbands; b++ ) { - FOR ( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- ) + FOR( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- ) { hStereoDft->smooth_buf_fx[b][i] = hStereoDft->smooth_buf_fx[b][i - 2]; move32(); @@ -1203,6 +1234,7 @@ void stereo_dft_dec_res_fx( IF ( EQ_16(hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1], STEREO_DFT_RES_COD_OFF) ) { set_val_Word32( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); + hCPE->hStereoDft->q_res_cod_mem_fx = Q16; 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; @@ -1216,20 +1248,20 @@ void stereo_dft_dec_res_fx( { /*OLA*/ /*overlapping parts*/ - Word16 q_shift = hCPE->hStereoDft->q_res_cod_mem_fx; + Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 ); move16(); - FOR ( i = 0; i < STEREO_DFT_OVL_8k; i++ ) + 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))); + 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 ) ) ); move16(); - hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult(win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i]); + 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( NE_16( q_shift, 0 ) ) { - v_shr_16(&win[STEREO_DFT_OVL_8k], negate(q_shift), &win[STEREO_DFT_OVL_8k], L_FRAME8k); + v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k ); } - hCPE->hStereoDft->q_res_cod_mem_fx = 0; + hCPE->hStereoDft->q_res_cod_mem_fx = Q16; move16(); } ELSE @@ -1263,7 +1295,7 @@ void stereo_dft_dec_res_fx( 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, hCPE->hCoreCoder[0]->stab_fac_fx, &hCPE->hStereoDft->stab_fac_smooth_res_fx, hCPE->hCoreCoder[0]->last_coder_type, 0, bpf_error_signal_8k_16 ); Copy_Scale_sig_16_32(bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15); - res_bpf_flag = res_bpf_adapt_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf ); + res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf ); IF ( prev_bfi ) { @@ -2218,26 +2250,24 @@ static void stereo_dft_compute_td_stefi_params_fx( } wsum = L_shl(wsum, sub(Q16 , shift_g)); pred_g = BASOP_Util_Divide3232_Scale(pred_g, wsum, &q_div); - IF (GT_16(q_div, 16)) + IF (GT_16(sub(15, q_div), 15)) { - pred_g = L_shl(pred_g, 16); - q_pred_g = sub(q_div , 16); + pred_g = L_shl(pred_g, q_div); + q_pred_g = 15; } ELSE { - pred_g = L_shl(pred_g, q_div); - q_pred_g = 0; + q_pred_g = sub(15, q_div); } pred_gain_avg = BASOP_Util_Divide3232_Scale(pred_gain_avg, wsum, &q_div); - IF (GT_16(q_div, 16)) + IF (GT_16(sub(15, q_div), 15)) { - pred_gain_avg = L_shl(pred_gain_avg, 16); - q_pred_gain_avg = sub(q_div , 16); + pred_gain_avg = L_shl(pred_gain_avg, q_div); + q_pred_gain_avg = 15; } ELSE { - pred_gain_avg = L_shl(pred_gain_avg, q_div); - q_pred_gain_avg = 0; + q_pred_gain_avg = sub(15, q_div);; } nrg_DMX = hStereoDft->hb_nrg_fx[0]; nrg_pred_DMX = hStereoDft->hb_nrg_fx[1]; @@ -2273,9 +2303,8 @@ static void stereo_dft_compute_td_stefi_params_fx( } hStereoDft->td_gain_fx[0] = L_deposit_h((Word16)g2); + hStereoDft->q_td_gain[0] = add(16, q_pred_gain_avg); move32(); - if (q_pred_gain_avg != 0) - hStereoDft->q_td_gain[0] = q_pred_gain_avg; move16(); #ifdef DBG_TD_STEFI @@ -3097,10 +3126,10 @@ void stereo_dft_dec_sid_coh_fx( FOR( i = 0; i < b; i++ ) { - pred_fx = add( pred_fx, shl(mult( ( *pptr_fx++ ), cohBandq_fx[i] ), 2) ); /*q-13*/ + pred_fx = add( pred_fx, shl( mult( ( *pptr_fx++ ), cohBandq_fx[i] ), 2 ) ); /*q-13*/ } /* Weighted intra/inter-frame prediction */ - pred_fx = add( mult( alpha_fx, pred_fx ), mult( sub( 32767, alpha_fx ), coh_fx[b] ) ); /*q-13*/ + pred_fx = add( mult( alpha_fx, pred_fx ), mult( sub( 32767, alpha_fx ), shr( coh_fx[b], 2 ) ) ); /*q-13*/ /* Read residual index from bitstream */ IF( LT_16( *nb_bits, nr_of_sid_stereo_bits ) ) /* If the bit limit is reached, res_index = 0 is assumed for remaining indices */ @@ -3130,9 +3159,9 @@ void stereo_dft_dec_sid_coh_fx( cohBandq_fx[b] = 0; move16(); } - coh_fx[b] = cohBandq_fx[b]; /* Update memory for next frame */ - pred_fx = 0; + coh_fx[b] = shl_sat( cohBandq_fx[b], 2 ); /* Update memory for next frame */ move16(); + pred_fx = 0; move16(); } @@ -3736,4 +3765,5 @@ void stereo_dft_dec_read_BS_fx( return; } -#endif \ No newline at end of file +#endif +#endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index fd39b1cec1cf8a893cf76fadb5bfe2487811ba33..37d3841e0d62bd49bd3507de962403e3b1f11323 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -129,6 +129,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; 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; diff --git a/lib_dec/ivas_stereo_esf_dec.c b/lib_dec/ivas_stereo_esf_dec.c index 5fda7188efa9ab2dcd2c326afd59adb5c2178561..efec50708f4e657ca6ec909a4da9e8ff02dacc49 100644 --- a/lib_dec/ivas_stereo_esf_dec.c +++ b/lib_dec/ivas_stereo_esf_dec.c @@ -44,12 +44,10 @@ * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void init_basic_allpass( basic_allpass_t *ap, const float *gains, -#ifdef IVAS_FLOAT_FIXED - const Word32 *gains_fx, -#endif const int16_t *delays ) { int16_t i, j; @@ -58,26 +56,47 @@ void init_basic_allpass( { ap->gains[i] = gains[i]; ap->delays[i] = delays[i]; -#ifdef IVAS_FLOAT_FIXED - ap->gains_fx[i] = gains_fx[i]; -#endif for ( j = 0; j < STEREO_DFT_ALLPASS_BUFFERLEN; j++ ) { ap->buffer[i][j] = 0.f; -#ifdef IVAS_FLOAT_FIXED + } + } + + ap->pos = 0; + + return; +} +#else +void init_basic_allpass_fx( + basic_allpass_t *ap, + const Word32 *gains_fx, + const Word16 *delays ) +{ + Word16 i, j; + + FOR( i = 0; i < 3; i++ ) + { + ap->delays[i] = delays[i]; + move16(); + ap->gains_fx[i] = gains_fx[i]; + move32(); + + FOR( j = 0; j < STEREO_DFT_ALLPASS_BUFFERLEN; j++ ) + { ap->buffer_fx[i][j] = 0; -#endif + move32(); } -#ifdef IVAS_FLOAT_FIXED ap->q_buffer_fx = 0; -#endif + move16(); } ap->pos = 0; + move16(); return; } +#endif /*-------------------------------------------------------------------* @@ -86,6 +105,7 @@ void init_basic_allpass( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void filter_with_allpass( const float *sig, float *out, @@ -136,14 +156,13 @@ void filter_with_allpass( return; } - -#ifdef IVAS_FLOAT_FIXED +#else void filter_with_allpass_fx( const Word32 *sig, Word32 *out, const Word16 len, basic_allpass_t *ap, - Word16 q_shift) + Word16 q_shift ) { Word16 k; Word16 pos, mask; @@ -152,43 +171,72 @@ void filter_with_allpass_fx( Word32 g1_fx, g2_fx, g3_fx, *D1_fx, *D2_fx, *D3_fx; P1_fx = P2_fx = P3_fx = P4_fx = P5_fx = 0; - mask = STEREO_DFT_ALLPASS_BUFFERLEN - 1; + move32(); + move32(); + move32(); + move32(); + move32(); + mask = sub( STEREO_DFT_ALLPASS_BUFFERLEN, 1 ); + move32(); pos = ap->pos; + move16(); g1_fx = ap->gains_fx[0]; + move32(); g2_fx = ap->gains_fx[1]; + move32(); g3_fx = ap->gains_fx[2]; + move32(); d1 = ap->delays[0]; + move16(); d2 = ap->delays[1]; + move16(); d3 = ap->delays[2]; + move16(); D1_fx = ap->buffer_fx[0]; + move32(); D2_fx = ap->buffer_fx[1]; + move32(); D3_fx = ap->buffer_fx[2]; + move32(); - IF (NE_16(q_shift, ap->q_buffer_fx)) + IF( NE_16( q_shift, ap->q_buffer_fx ) ) { - FOR (k = 0; k < sizeof(ap->buffer_fx[0]) / sizeof(ap->buffer_fx[0][0]); k++) + FOR( k = 0; k < sizeof( ap->buffer_fx[0] ) / sizeof( ap->buffer_fx[0][0] ); k++ ) { - D1_fx[k] = L_shr(D1_fx[k], sub(ap->q_buffer_fx, q_shift)); - D2_fx[k] = L_shr(D2_fx[k], sub(ap->q_buffer_fx, q_shift)); - D3_fx[k] = L_shr(D3_fx[k], sub(ap->q_buffer_fx, q_shift)); + D1_fx[k] = L_shr( D1_fx[k], sub( ap->q_buffer_fx, q_shift ) ); + move32(); + D2_fx[k] = L_shr( D2_fx[k], sub( ap->q_buffer_fx, q_shift ) ); + move32(); + D3_fx[k] = L_shr( D3_fx[k], sub( ap->q_buffer_fx, q_shift ) ); + move32(); } ap->q_buffer_fx = q_shift; + move16(); } - Word32 D1_upd = pos + d1, D2_upd = pos + d2, D3_upd = pos + d3; + Word32 D1_upd = add( pos, d1 ), D2_upd = add( pos, d2 ), D3_upd = add( pos, d3 ); FOR( k = 0; k <= mask; k++ ) { - IF( pos == D1_upd ) - D1_upd = -1; - IF( pos == D2_upd ) - D2_upd = -1; - IF( pos == D3_upd ) - D3_upd = -1; + IF( EQ_32( pos, D1_upd ) ) + { + D1_upd = -1; + move32(); + } + IF( EQ_32( pos, D2_upd ) ) + { + D2_upd = -1; + move32(); + } + IF( EQ_32( pos, D3_upd ) ) + { + D3_upd = -1; + move32(); + } P1_fx = L_sub_sat( sig[k], Mpy_32_32( g3_fx, D3_fx[pos] ) ); P2_fx = L_sub_sat( P1_fx, Mpy_32_32( g1_fx, D1_fx[pos] ) ); @@ -196,12 +244,16 @@ void filter_with_allpass_fx( P4_fx = L_add_sat( D2_fx[pos], Mpy_32_32( g2_fx, P3_fx ) ); P5_fx = L_add_sat( D3_fx[pos], Mpy_32_32( g3_fx, P1_fx ) ); out[k] = P5_fx; /* could overwrite sig */ + move32(); D1_fx[( pos + d1 ) & mask] = P2_fx; + move32(); D2_fx[( pos + d2 ) & mask] = P3_fx; + move32(); D3_fx[( pos + d3 ) & mask] = P4_fx; + move32(); - pos = ( pos + 1 ) & mask; + pos = s_and( add( pos, 1 ), mask ); } FOR( k = mask + 1; k < len; k++ ) @@ -213,15 +265,20 @@ void filter_with_allpass_fx( P4_fx = L_add( D2_fx[pos], Mpy_32_32( g2_fx, P3_fx ) ); P5_fx = L_add( D3_fx[pos], Mpy_32_32( g3_fx, P1_fx ) ); out[k] = P5_fx; /* could overwrite sig */ + move32(); D1_fx[( pos + d1 ) & mask] = P2_fx; + move32(); D2_fx[( pos + d2 ) & mask] = P3_fx; + move32(); D3_fx[( pos + d3 ) & mask] = P4_fx; + move32(); - pos = ( pos + 1 ) & mask; + pos = s_and( add( pos, 1 ), mask ); } ap->pos = pos; + move16(); return; } diff --git a/lib_dec/ivas_stereo_ica_dec.c b/lib_dec/ivas_stereo_ica_dec.c index 9c1f34218c728359d777049b10ab8869bda3351a..0286ac027daf76203dfba06af52ef1be8c522fb1 100644 --- a/lib_dec/ivas_stereo_ica_dec.c +++ b/lib_dec/ivas_stereo_ica_dec.c @@ -85,15 +85,11 @@ void stereo_tca_dec_fx( { IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { - // to be deleted next MR - hCPE->hStereoDftDmx->targetGain = 1.0f; hCPE->hStereoDftDmx->targetGain_fx = ONE_IN_Q29; move32(); } /* save the target gain for next frame */ - // to be deleted next MR - hCPE->hStereoDftDmx->prevTargetGain = hCPE->hStereoDftDmx->targetGain; hCPE->hStereoDftDmx->prevTargetGain_fx = hCPE->hStereoDftDmx->targetGain_fx; move32(); } @@ -122,11 +118,12 @@ void stereo_tca_dec_fx( Copy32( bufChanR_fx + output_frame, hStereoTCA->memChanR_fx, L_DEC_MEM_LEN_ICA ); /* TCA parameter de-quantize */ - dsFactor = (Word16) ( output_Fs / 8000 ); + dsFactor = extract_l( output_Fs / 8000 ); tempMax = NS2SA( output_Fs, L_NCSHIFT_NS ); hStereoTCA->corrLagStats = s_min( hStereoTCA->indx_ica_NCShift * dsFactor, tempMax ); bothChannelShift = 0; + move16(); test(); IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) || EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { @@ -182,7 +179,7 @@ void stereo_tca_dec_fx( IF( NE_16( currentNCShift, 0 ) ) { - currentNCShift = add( mult( 19660, prevNCShift ), mult( 13106, currentNCShift ) ); + currentNCShift = add( mult( 19660 /* 0.6 in Q15 */, prevNCShift ), mult( 13106 /* 0.4 in Q15 */, currentNCShift ) ); } prevNCShift = hStereoTCA->interp_dec_prevNCShift; diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index 7e0d1ab82abc730263c9524b84e58200698f16b6..150df7e1d9d9191a7f7fd657c06d24756c7a5344 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -645,6 +645,7 @@ void stereo_icBWE_dec_fx( hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg2_fx; move32(); + hStereoDft->q_hb_nrg_subr = sub(add(*Q_syn, synthRef_shift), 31); hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); hb_nrg2_fx = 0; move32(); @@ -660,6 +661,8 @@ void stereo_icBWE_dec_fx( hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); Copy32( synthRef_fx, hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame ); + + Scale_sig32(hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame, -5); } ELSE { @@ -669,7 +672,7 @@ void stereo_icBWE_dec_fx( move32(); hCPE->hStereoDft->hb_nrg_subr_fx[1] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[1], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 move32(); - hCPE->hStereoDft->Q_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 40 ); + hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 40 ); hCPE->hStereoDft->hb_nrg_fx[0] = hb_nrg_fx; // 2 * (Qx + SynthRef_shift) - 31 move32(); hCPE->hStereoDft->td_gain_fx[0] = 0; @@ -2017,6 +2020,8 @@ void stereo_icBWE_decproc_fx( dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; move16(); + //Scale_sig32(hCPE->hStereoDft->td_gain_fx, STEREO_DFT_CORE_HIST_MAX, -12); + FOR( i = 0; i < dftOvlLen; i++ ) { win_in_fx = L_mult( win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )], win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )] ); /* Q31 */ diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index 4fc77c669eace9b483d4197bac3b9e77e7a6cac3..2a25d8a3b096965427c2d61ca62ff2ee5e12d7ae 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -750,7 +750,7 @@ static void run_min_stats( } } - noisy_speech_detection_flt( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, power_spec ); + 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 @@ -762,7 +762,7 @@ static void run_min_stats( if ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || st->bfi ) { - ApplyFdCng_flt( NULL, st->bfi ? NULL : power_spec, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng( NULL, st->bfi ? NULL : power_spec, NULL, NULL, st, st->bfi, 0 ); } /* restore VAD (see above) */ diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 1f92f548a252037e95ceb37decf986d07b001193..0da7235e9c73545d14980bfa1e93be7910bab116 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -455,7 +455,7 @@ void stereo_mdct_core_dec_fx( { s = getScaleFactor32(sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN); Scale_sig32(sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, s); - sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = add(sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, s); + sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub(sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, s); } 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); @@ -1013,7 +1013,7 @@ static void run_min_stats_fx( Copy_Scale_sig32_16(power_spec, power_spec_16, L_FRAME16k, 0); - noisy_speech_detection( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, power_spec_16, sub(15, power_spec_e)); + noisy_speech_detection_fx( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, power_spec_16, sub(15, power_spec_e)); st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx = L_add(Mpy_32_32(Q31_0_99, st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx), Mpy_32_32(st->hFdCngDec->hFdCngCom->flag_noisy_speech, Q31_0_01)); st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = extract_h( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ); @@ -1022,9 +1022,19 @@ static void run_min_stats_fx( } IF ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || st->bfi ) - { + { + //for ( int p = 0; p < FFTCLDFBLEN; p++ ) + { + //st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = L_shr ( st->hFdCngDec->hFdCngCom->cngNoiseLevel[p], sub( 28, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ); + } + Scale_sig32(st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub(st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 28) ); + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q3; // Q3 + Scale_sig32(st->hFdCngDec->msNoiseEst, NPART_SHAPING, sub(st->hFdCngDec->msNoiseEst_exp, 27) ); + st->hFdCngDec->msNoiseEst_exp = 27; + //Scale_sig32(power_spec, L_FRAME16k, sub(power_spec_e, 31)); + //power_spec_e = 31; /*=================================================*/ - ApplyFdCng_fx( NULL, 0, st->bfi ? NULL : power_spec, sub(31, power_spec_e), NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_ivas_fx( NULL, 0, st->bfi ? NULL : power_spec, sub(31, power_spec_e), NULL, NULL, NULL, st, st->bfi, 0 ); /*=================================================*/ } diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index dc352d85892d33fc69e555bd175d269d093036f9..866e53366e51a23a4244ddeb382558279f5b67a1 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -891,16 +891,16 @@ ivas_error initMdctStereoDtxData_fx( IF( st->hFdCngDec == NULL ) { /* Create FD_CNG instance */ - IF( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + IF( ( error = createFdCngDec_fx( &st->hFdCngDec ) ) != IVAS_ERR_OK ) { return error; } /* Init FD-CNG */ #if 1/*TODO: To be removed later*/ - initFdCngDec_flt( st ); + initFdCngDec( st ); #endif - ivas_initFdCngDec_fx( st, st->cldfbSyn->scale ); + initFdCngDec_ivas_fx( st, st->cldfbSyn->scale ); } IF( EQ_16( st->first_CNG, 0 ) ) @@ -950,16 +950,16 @@ ivas_error initMdctStereoDtxData( IF ( st->hFdCngDec == NULL ) { /* Create FD_CNG instance */ - IF ( ( error = createFdCngDec_flt( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + IF ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) { return error; } /* Init FD-CNG */ - initFdCngDec_flt( st ); + initFdCngDec( st ); #ifdef IVAS_FLOAT_FIXED st->cldfbSyn->scale = (Word16) ( st->cldfbSyn->scale_flt * ( 1u << norm_s( (Word16) st->cldfbSyn->scale_flt ) ) ); - ivas_initFdCngDec_fx( st, st->cldfbSyn->scale ); + initFdCngDec_ivas_fx( st, st->cldfbSyn->scale ); #endif IVAS_FLOAT_FIXED } @@ -1032,14 +1032,14 @@ void synchonize_channels_mdct_sid_fx( test(); IF( EQ_16( sts[0]->first_CNG, 1 ) && EQ_16( sts[1]->first_CNG, 0 ) ) { - configureFdCngDec_fx( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec_ivas_fx( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); } } IF( EQ_16( 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_fx( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec_ivas_fx( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); } } @@ -1069,14 +1069,14 @@ void synchonize_channels_mdct_sid( /* configure when there is a switching from DFT CNG to MDCT CNG */ if ( sts[0]->first_CNG == 1 && sts[1]->first_CNG == 0 ) { - configureFdCngDec_flt( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); } } 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_flt( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); } } @@ -1121,7 +1121,16 @@ static void update_exp( Word16 *a_exp, Word16 *b_exp, Word16 *buff_a, Word16 *bu } return; } - +static Word16 norm_arr(Word16 *arr, int size) +{ + Word16 q = 15; + for (int i = 0; i < size; i++) + if (arr[i] != 0) + { + q = min(q, norm_s(arr[i])); + } + return q; +} void updateBuffersForDmxMdctStereo_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ const Word16 output_frame, /* i : output frame length */ @@ -1201,12 +1210,30 @@ void updateBuffersForDmxMdctStereo_fx( Word16 sum_tcx_ltp = 0, sum_delay_buf = 0, sum_tcx_ltp_out = 0, sum_old_out = 0; + 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); + + 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_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); + + + + Scale_sig(&sts[0]->hTcxLtpDec->tcxltp_mem_in[0], TCXLTP_MAX_DELAY, sub(15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_in)); + Scale_sig(&sts[1]->hTcxLtpDec->tcxltp_mem_in[0], TCXLTP_MAX_DELAY, sub(15, sts[1]->hTcxLtpDec->exp_tcxltp_mem_in)); + + Scale_sig(&sts[0]->hTcxLtpDec->tcxltp_mem_out[0], TCXLTP_MAX_DELAY, sub(15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_out)); + Scale_sig(&sts[1]->hTcxLtpDec->tcxltp_mem_out[0], TCXLTP_MAX_DELAY, sub(15, sts[1]->hTcxLtpDec->exp_tcxltp_mem_out)); + + update_exp( &sts[0]->hTcxLtpDec->exp_tcxltp_mem_in, &sts[1]->hTcxLtpDec->exp_tcxltp_mem_in, sts[0]->hTcxLtpDec->tcxltp_mem_in, sts[1]->hTcxLtpDec->tcxltp_mem_in, TCXLTP_MAX_DELAY ); - //update_exp( &sts[1]->exp_delay_buf_out, &sts[1]->exp_delay_buf_out, - // sts[0]->delay_buf_out_fx, sts[1]->delay_buf_out_fx, HQ_DELTA_MAX * HQ_DELAY_COMP ); - update_exp( &sts[0]->hHQ_core->exp_old_out, &sts[1]->hHQ_core->exp_old_out, sts[0]->hHQ_core->old_out_fx, sts[1]->hHQ_core->old_out_fx, L_FRAME48k ); @@ -1252,6 +1279,9 @@ void updateBuffersForDmxMdctStereo_fx( sts[0]->hTcxLtpDec->exp_tcxltp_mem_in = add( sts[0]->hTcxLtpDec->exp_tcxltp_mem_in, 1 ); sts[0]->hHQ_core->exp_old_out = add( sts[0]->hHQ_core->exp_old_out, 1 ); sts[0]->hTcxLtpDec->exp_tcxltp_mem_out = add( sts[0]->hTcxLtpDec->exp_tcxltp_mem_out, 1 ); + + 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))); } return; diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 88457bb8d230c804cc0aef17d5a5c78f8c5544e4..78f8b26ddd02c04f70f5c3c1dd90758101da9d1a 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -59,10 +59,12 @@ * Allocate CoreCoder TCX modules *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static ivas_error allocate_CoreCoder_TCX( DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ ) { +#ifndef IVAS_FLOAT_FIXED if ( st->hTcxDec == NULL ) { if ( ( st->hTcxDec = (TCX_DEC_HANDLE) malloc( sizeof( TCX_DEC_DATA ) ) ) == NULL ) @@ -76,7 +78,7 @@ static ivas_error allocate_CoreCoder_TCX( set_zero( st->hTcxDec->old_synth_float, OLD_SYNTH_INTERNAL_DEC ); set_zero( st->hTcxDec->synth_history, L_PROT48k + L_FRAME48k ); } - +#endif if ( st->hTcxCfg == NULL ) { if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) @@ -131,8 +133,7 @@ static ivas_error allocate_CoreCoder_TCX( return IVAS_ERR_OK; } - -#ifdef IVAS_FLOAT_FIXED +#else static ivas_error allocate_CoreCoder_TCX_fx( DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ ) @@ -145,16 +146,16 @@ static ivas_error allocate_CoreCoder_TCX_fx( } reset_tcx_overl_buf_fx( st->hTcxDec ); - st->hTcxDec->CngLevelBackgroundTrace_bfi = 0; //initializing to avoid garbage overflow; + //st->hTcxDec->CngLevelBackgroundTrace_bfi = 0; //initializing to avoid garbage overflow; set16_fx( st->hTcxDec->syn_OverlFB, 0, L_FRAME48k / 2 ); set16_fx( st->hTcxDec->old_synth, 0, OLD_SYNTH_INTERNAL_DEC ); set16_fx( st->hTcxDec->synth_history_fx, 0, L_PROT48k + L_FRAME48k ); #if 1 // TODO: TO be removed later - reset_tcx_overl_buf( st->hTcxDec ); - set_zero( st->hTcxDec->syn_OverlFB_float, L_FRAME48k / 2 ); - set_zero( st->hTcxDec->old_synth_float, OLD_SYNTH_INTERNAL_DEC ); - set_zero( st->hTcxDec->synth_history, L_PROT48k + L_FRAME48k ); + //reset_tcx_overl_buf( st->hTcxDec ); + //set_zero( st->hTcxDec->syn_OverlFB_float, L_FRAME48k / 2 ); + //set_zero( st->hTcxDec->old_synth_float, OLD_SYNTH_INTERNAL_DEC ); + //set_zero( st->hTcxDec->synth_history, L_PROT48k + L_FRAME48k ); #endif } @@ -189,7 +190,7 @@ static ivas_error allocate_CoreCoder_TCX_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for HQ core\n" ) ); } - HQ_core_dec_init( st->hHQ_core ); + HQ_core_dec_init_fx( st->hHQ_core ); #if 1 // TODO: To be removed later HQ_core_dec_init_flt( st->hHQ_core ); #endif @@ -227,13 +228,14 @@ static ivas_error allocate_CoreCoder_TCX_fx( } #endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------* * Function allocate_CoreCoder() * * Allocate CoreCoder modules *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static ivas_error allocate_CoreCoder( DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ ) @@ -261,7 +263,7 @@ static ivas_error allocate_CoreCoder( Init_post_filter_ivas( st->hPFstat ); #ifdef IVAS_FLOAT_FIXED - Init_post_filter(st->hPFstat); + Init_post_filter_fx(st->hPFstat); #endif // IVAS_FLOAT_FIXED st->psf_lp_noise = 0.0f; } @@ -316,9 +318,7 @@ static ivas_error allocate_CoreCoder( return error; } -#endif - -#ifdef IVAS_FLOAT_FIXED +#else static ivas_error allocate_CoreCoder_fx( DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ ) @@ -344,11 +344,11 @@ static ivas_error allocate_CoreCoder_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for NB/formant postflter\n" ) ); } - Init_post_filter( st->hPFstat ); + Init_post_filter_fx( st->hPFstat ); st->psf_lp_noise_fx = 0; move16(); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED Init_post_filter_ivas( st->hPFstat ); st->psf_lp_noise = 0.0f; #endif @@ -455,6 +455,7 @@ static void deallocate_CoreCoder_TCX( * Deallocate CoreCoder modules *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void deallocate_CoreCoder( DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ ) @@ -503,7 +504,7 @@ static void deallocate_CoreCoder( return; } -#ifdef IVAS_FLOAT_FIXED +#else static void deallocate_CoreCoder_fx( DEC_CORE_HANDLE st /* i/o: Core decoder state structure */ ) @@ -706,7 +707,7 @@ ivas_error stereo_memory_dec( if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) { cpy_tcx_ltp_data( hCPE->hCoreCoder[1]->hTcxLtpDec, hCPE->hStereoDft->hTcxLtpDec, output_Fs ); - deleteFdCngDec_flt( &hCPE->hCoreCoder[1]->hFdCngDec ); + deleteFdCngDec( &hCPE->hCoreCoder[1]->hFdCngDec ); } /* memory update - needed in TD stereo, TCX/HQ frame -> DFT stereo, ACELP frame switching */ @@ -743,7 +744,7 @@ ivas_error stereo_memory_dec( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); } - td_cng_dec_init_flt( st ); + td_cng_dec_init( st ); } } @@ -771,7 +772,7 @@ ivas_error stereo_memory_dec( if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) { - deleteFdCngDec_flt( &hCPE->hCoreCoder[1]->hFdCngDec ); + deleteFdCngDec( &hCPE->hCoreCoder[1]->hFdCngDec ); } /* allocate TD stereo data structure */ @@ -872,12 +873,12 @@ ivas_error stereo_memory_dec( if ( st->hFdCngDec == NULL ) { /* Create FD_CNG instance */ - if ( ( error = createFdCngDec_flt( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) { return error; } - initFdCngDec_flt( st ); - configureFdCngDec_flt( st->hFdCngDec, st->bwidth, st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + initFdCngDec( st ); + configureFdCngDec( st->hFdCngDec, st->bwidth, st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); } /* allocate stereo CNG structure */ @@ -974,13 +975,13 @@ ivas_error stereo_memory_dec( } /* allocate Fd-Cng structure for second channel */ - if ( ( error = createFdCngDec_flt( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) { return error; } /* Init FD-CNG */ - initFdCngDec_flt( st ); + initFdCngDec( st ); if ( hCPE->last_element_mode == IVAS_CPE_DFT ) { @@ -1241,7 +1242,7 @@ ivas_error stereo_memory_dec( /* deallocate the FdCNG handle */ for ( i = 0; i < CPE_CHANNELS; ++i ) { - deleteFdCngDec_flt( &hCPE->hCoreCoder[i]->hFdCngDec ); + deleteFdCngDec( &hCPE->hCoreCoder[i]->hFdCngDec ); } } else @@ -1259,11 +1260,11 @@ ivas_error stereo_memory_dec( if ( hCPE->hCoreCoder[i]->hFdCngDec == NULL ) { - if ( ( error = createFdCngDec_flt( &hCPE->hCoreCoder[i]->hFdCngDec ) ) != IVAS_ERR_OK ) + if ( ( error = createFdCngDec( &hCPE->hCoreCoder[i]->hFdCngDec ) ) != IVAS_ERR_OK ) { return error; } - initFdCngDec_flt( hCPE->hCoreCoder[i] ); + initFdCngDec( hCPE->hCoreCoder[i] ); } } } @@ -1370,7 +1371,7 @@ ivas_error stereo_memory_dec_fx( IF ( EQ_16(hCPE->last_element_mode, IVAS_CPE_MDCT) ) { cpy_tcx_ltp_data_fx( hCPE->hCoreCoder[1]->hTcxLtpDec, hCPE->hStereoDft->hTcxLtpDec, output_Fs ); - deleteFdCngDec( &hCPE->hCoreCoder[1]->hFdCngDec ); + deleteFdCngDec_fx( &hCPE->hCoreCoder[1]->hFdCngDec ); } /* memory update - needed in TD stereo, TCX/HQ frame -> DFT stereo, ACELP frame switching */ @@ -1397,7 +1398,7 @@ ivas_error stereo_memory_dec_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) ); } - HQ_core_dec_init( st->hHQ_core ); + HQ_core_dec_init_fx( st->hHQ_core ); #if 1 // TODO: to be removed later HQ_core_dec_init_flt( st->hHQ_core ); #endif @@ -1411,9 +1412,9 @@ ivas_error stereo_memory_dec_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) ); } - td_cng_dec_init( st ); + td_cng_dec_init_fx( st ); #if 1 // TODO: To be removed later - //td_cng_dec_init_flt( st ); + //td_cng_dec_init( st ); #endif } } @@ -1442,7 +1443,7 @@ ivas_error stereo_memory_dec_fx( IF ( EQ_16(hCPE->last_element_mode, IVAS_CPE_MDCT) ) { - deleteFdCngDec( &hCPE->hCoreCoder[1]->hFdCngDec ); + deleteFdCngDec_fx( &hCPE->hCoreCoder[1]->hFdCngDec ); } /* allocate TD stereo data structure */ @@ -1539,10 +1540,6 @@ ivas_error stereo_memory_dec_fx( td_bwe_dec_init_ivas_fx( st, st->hBWE_TD, st->output_Fs ); -#if 1 // TODO: To be removed later - td_bwe_dec_init( st->hBWE_TD, -1, st->output_Fs ); -#endif - st->prev_Q_bwe_exc = 31; st->prev_Qx = 0; st->prev_ener_fx_Q = 31; @@ -1573,14 +1570,14 @@ ivas_error stereo_memory_dec_fx( IF ( st->hFdCngDec == NULL ) { /* Create FD_CNG instance */ - IF ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + IF ( ( error = createFdCngDec_fx( &st->hFdCngDec ) ) != IVAS_ERR_OK ) { return error; } - ivas_initFdCngDec_fx( st, st->cldfbSyn->scale ); + initFdCngDec_ivas_fx( st, st->cldfbSyn->scale ); - configureFdCngDec_fx( st->hFdCngDec, st->bwidth, st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + configureFdCngDec_ivas_fx( st->hFdCngDec, st->bwidth, st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); } /* allocate stereo CNG structure */ @@ -1679,15 +1676,15 @@ ivas_error stereo_memory_dec_fx( } /* allocate Fd-Cng structure for second channel */ - IF ( NE_16(( error = createFdCngDec( &st->hFdCngDec ) ), IVAS_ERR_OK) ) + IF ( NE_16(( error = createFdCngDec_fx( &st->hFdCngDec ) ), IVAS_ERR_OK) ) { return error; } /* Init FD-CNG */ - ivas_initFdCngDec_fx( st, st->cldfbSyn->scale); + initFdCngDec_ivas_fx( st, st->cldfbSyn->scale); #if 1 // TODO: To be removed later - initFdCngDec_flt( st ); + initFdCngDec( st ); #endif IF ( EQ_16(hCPE->last_element_mode, IVAS_CPE_DFT) ) @@ -1724,9 +1721,9 @@ ivas_error stereo_memory_dec_fx( st->hTcxDec->prev_good_synth_fx = st->hTcxDec->old_synthFB_fx + NS2SA(st->output_Fs, PH_ECU_LOOKAHEAD_NS); #if 1 // To be removed later - set_f( st->hTcxDec->FBTCXdelayBuf_float, 0.0f, 111 ); - st->hTcxDec->old_synthFB = st->hTcxDec->synth_history + NS2SA( st->output_Fs, PH_ECU_MEM_NS ); - st->hTcxDec->prev_good_synth = st->hTcxDec->old_synthFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ); + //set_f( st->hTcxDec->FBTCXdelayBuf_float, 0.0f, 111 ); + //st->hTcxDec->old_synthFB = st->hTcxDec->synth_history + NS2SA( st->output_Fs, PH_ECU_MEM_NS ); + //st->hTcxDec->prev_good_synth = st->hTcxDec->old_synthFB + NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ); #endif /* allocate and initialize MDCT stereo structure */ @@ -1781,9 +1778,7 @@ ivas_error stereo_memory_dec_fx( } td_bwe_dec_init_ivas_fx( st, st->hBWE_TD, st->output_Fs ); -#if 1 // TODO: To be removed later - td_bwe_dec_init( st->hBWE_TD, -1, st->output_Fs ); -#endif + st->prev_Q_bwe_exc = 31; st->prev_Qx = 0; st->prev_ener_fx_Q = 31; @@ -1987,7 +1982,7 @@ ivas_error stereo_memory_dec_fx( /* deallocate the FdCNG handle */ FOR ( i = 0; i < CPE_CHANNELS; ++i ) { - deleteFdCngDec( &hCPE->hCoreCoder[i]->hFdCngDec ); + deleteFdCngDec_fx( &hCPE->hCoreCoder[i]->hFdCngDec ); } } ELSE @@ -2005,13 +2000,13 @@ ivas_error stereo_memory_dec_fx( IF ( hCPE->hCoreCoder[i]->hFdCngDec == NULL ) { - IF ( NE_16(( error = createFdCngDec( &hCPE->hCoreCoder[i]->hFdCngDec ) ), IVAS_ERR_OK) ) + IF ( NE_16(( error = createFdCngDec_fx( &hCPE->hCoreCoder[i]->hFdCngDec ) ), IVAS_ERR_OK) ) { return error; } - ivas_initFdCngDec_fx( hCPE->hCoreCoder[i], hCPE->hCoreCoder[i]->cldfbSyn->scale ); + initFdCngDec_ivas_fx( hCPE->hCoreCoder[i], hCPE->hCoreCoder[i]->cldfbSyn->scale ); #if 1 - initFdCngDec_flt( hCPE->hCoreCoder[i] ); + initFdCngDec( hCPE->hCoreCoder[i] ); #endif } } @@ -2135,83 +2130,7 @@ void synchro_synthesis( if ( hCPE->element_mode != IVAS_CPE_MDCT ) { -#ifdef IVAS_FLOAT_FIXED - Word32 *output_fx[2]; - Word16 q = 11; - Word32 op[2][L_FRAME48k]; - output_fx[0] = op[0]; - output_fx[1] = op[1]; - - for ( int p = 0; p < L_FRAME48k; p++ ) - { - output_fx[0][p] = (Word32) ( output[0][p] * ( 1u << q ) ); - output_fx[1][p] = (Word32) ( output[1][p] * ( 1u << q ) ); - - if ( p < NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ) - { - hCPE->output_mem_fx[0][p] = (Word32) ( hCPE->output_mem[0][p] * ( 1u << q ) ); - hCPE->output_mem_fx[1][p] = (Word32) ( hCPE->output_mem[1][p] * ( 1u << q ) ); - } - - hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q ) ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q ) ); - } - } - if ( !( ( hCPE->hCoreCoder[0]->element_mode != IVAS_CPE_DFT && !( sba_dirac_stereo_flag && hCPE->hCoreCoder[0]->element_mode != IVAS_CPE_MDCT ) ) || ( hCPE->hCoreCoder[0]->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) ) - { - for ( int p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q ) ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q ) ); - } - } - hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain = (Word16) ( hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain_float * ONE_IN_Q15 ); - } - hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_gain = (Word16) ( hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_gain_float * ONE_IN_Q15 ); - //for ( int p = 0; p < 111; p++ ) - //{ - // hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_32[p] = (Word32) ( hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_float[p] * ( 1u << q ) ); - //} - - ivas_post_proc_fx( NULL, hCPE, 0, output_fx[0], output_fx, output_frame, sba_dirac_stereo_flag ); - - for ( int p = 0; p < L_FRAME48k; p++ ) - { - output[0][p] = (float) output_fx[0][p] / ( 1u << q ); - output[1][p] = (float) output_fx[1][p] / ( 1u << q ); - - if ( p < NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ) - { - hCPE->output_mem[0][p] = (float) hCPE->output_mem_fx[0][p] / ( 1u << q ); - hCPE->output_mem[1][p] = (float) hCPE->output_mem_fx[1][p] / ( 1u << q ); - } - - hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q ); - } - } - hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_gain_float = (float) hCPE->hCoreCoder[0]->hTcxLtpDec->tcxltp_gain / ONE_IN_Q15; - if ( !( ( hCPE->hCoreCoder[0]->element_mode != IVAS_CPE_DFT && !( sba_dirac_stereo_flag && hCPE->hCoreCoder[0]->element_mode != IVAS_CPE_MDCT ) ) || ( hCPE->hCoreCoder[0]->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) ) - { - for ( int p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q ); - } - } - hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain_float = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_gain / ONE_IN_Q15; - } -#else ivas_post_proc( NULL, hCPE, 0, output[0], output, output_frame, sba_dirac_stereo_flag ); -#endif // IVAS_FLOAT_FIXED } /* zero padding in order to synchronize the upmixed DFT stereo synthesis with the TD/MDCT stereo synthesis */ @@ -2408,46 +2327,7 @@ void synchro_synthesis( { mvr2r( sts[n]->prev_synth_buffer + delay_comp_DFT, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float, delay_diff ); delay_signal_float( output[n], output_frame, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float, delay_diff ); -#ifdef IVAS_FLOAT_FIXED - Word32 *output_fx[2]; - Word32 op[2][L_FRAME48k]; - Word16 q = 11; - output_fx[0] = op[0]; - output_fx[1] = op[1]; - for ( int p = 0; p < L_FRAME48k; p++ ) - { - output_fx[0][p] = (Word32) ( output[0][p] * ( 1u << q ) ); - output_fx[1][p] = (Word32) ( output[1][p] * ( 1u << q ) ); - - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] = (Word32) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] * ( 1u << q ) ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] = (Word32) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] * ( 1u << q ) ); - } - } - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain = (Word16) ( hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain_float * ONE_IN_Q15 ); - //for ( int p = 0; p < 111; p++ ) - //{ - // hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[p] = (Word32) ( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[p] * ( 1u << q ) ); - //} - - ivas_post_proc_fx( NULL, hCPE, n, output_fx[n], output_fx, output_frame, 0 ); - - for ( int p = 0; p < L_FRAME48k; p++ ) - { - output[0][p] = (float) output_fx[0][p] / ( 1u << q ); - output[1][p] = (float) output_fx[1][p] / ( 1u << q ); - - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << q ); - if ( p < TCXLTP_MAX_DELAY ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << q ); - } - } - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain_float = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_gain / ONE_IN_Q15; -#else ivas_post_proc( NULL, hCPE, n, output[n], output, output_frame, 0 ); -#endif // IVAS_FLOAT_FIXED delay_signal_float( output[n], output_frame, sts[n]->prev_synth_buffer, delay_comp_DFT ); mvr2r( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float, sts[n]->prev_synth_buffer + delay_comp_DFT, delay_diff ); } @@ -2507,9 +2387,6 @@ void synchro_synthesis_fx( const Word16 sba_dirac_stereo_flag /* i : signal stereo output FOR SBA DirAC */ ) { - - Word16 output_q = OUTPUT_Q; - Word16 n, delay_comp_TD, delay_comp_DFT; Word32 output_Fs; Decoder_State **sts; @@ -2529,15 +2406,6 @@ void synchro_synthesis_fx( sts = hCPE->hCoreCoder; output_Fs = sts[0]->output_Fs; - IF( hCPE->hStereoDft != NULL ) - { - output_q = hCPE->hStereoDft->q_dft; - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - Scale_sig32( hCPE->prev_hb_synth_fx[n], NS2SA_fx2( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), -( Q11 - output_q ) ); - } - } - 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 ) ) @@ -2656,13 +2524,13 @@ void synchro_synthesis_fx( { case 16000: inv_fade_len_fx = 71582792; - break; + BREAK; case 32000: inv_fade_len_fx = 35791396; - break; + BREAK; case 48000: inv_fade_len_fx = 23860930; - break; + BREAK; default: assert( 0 ); } @@ -2700,15 +2568,15 @@ void synchro_synthesis_fx( case 16000: inv_fade_len_1_fx = 71582792; inv_fade_len_2_fx = 107374184; - break; + BREAK; case 32000: inv_fade_len_1_fx = 35791396; inv_fade_len_2_fx = 53687092; - break; + BREAK; case 48000: inv_fade_len_1_fx = 23860930; inv_fade_len_2_fx = 35791396; - break; + BREAK; default: assert( 0 ); } @@ -2813,13 +2681,13 @@ void synchro_synthesis_fx( { case 16000: tmpF_fx = 71582792; - break; + BREAK; case 32000: tmpF_fx = 35791396; - break; + BREAK; case 48000: tmpF_fx = 23860930; - break; + BREAK; default: assert( 0 ); } @@ -2864,13 +2732,13 @@ void synchro_synthesis_fx( { case 16000: step_fx = 33554432; - break; + BREAK; case 32000: step_fx = 16777216; - break; + BREAK; case 48000: step_fx = 11184811; - break; + BREAK; default: assert( 0 ); } @@ -2916,13 +2784,13 @@ void synchro_synthesis_fx( { case 16000: tmpF_fx = 107374184; - break; + BREAK; case 32000: tmpF_fx = 53687092; - break; + BREAK; case 48000: tmpF_fx = 35791396; - break; + BREAK; default: assert( 0 ); } @@ -2942,13 +2810,13 @@ void synchro_synthesis_fx( { case 16000: tmpF_fx = 71582792; - break; + BREAK; case 32000: tmpF_fx = 35791396; - break; + BREAK; case 48000: tmpF_fx = 23860930; - break; + BREAK; default: assert( 0 ); } @@ -2966,13 +2834,13 @@ void synchro_synthesis_fx( { case 16000: tmpF_fx = 107374184; - break; + BREAK; case 32000: tmpF_fx = 53687092; - break; + BREAK; case 48000: tmpF_fx = 35791396; - break; + BREAK; default: assert( 0 ); } @@ -2988,85 +2856,6 @@ void synchro_synthesis_fx( } } - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->hStereoDft != NULL ) - { - Scale_sig32( hCPE->prev_hb_synth_fx[n], NS2SA_fx2( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ), Q11 - output_q ); - } - } - - - IF( hCPE->hStereoDft != NULL ) - { - IF( hCPE->hStereoDft->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << output_q ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hStereoDft->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << output_q ); - } - } - } - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - IF( hCPE->output_mem[n] != NULL ) - { - FOR( Word32 k = 0; k < NS2SA( hCPE->hCoreCoder[0]->output_Fs, STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->output_mem[n][k] = (float) hCPE->output_mem_fx[n][k] / ( 1u << 11 ); - } - } - IF( hCPE->hCoreCoder[n] != NULL ) - { - IF( hCPE->hCoreCoder[n]->hTcxLtpDec != NULL ) - { - FOR( Word32 p = 0; p < L_FRAME48k; p++ ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_out_32[p] / ( 1u << output_q ); - } - FOR( Word32 p = 0; p < TCXLTP_MAX_DELAY; p++ ) - { - hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_float[p] = (float) hCPE->hCoreCoder[n]->hTcxLtpDec->tcxltp_mem_in_32[p] / ( 1u << output_q ); - } - } - //FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); k++ ) - //{ - // hCPE->hCoreCoder[n]->prev_synth_buffer[k] = (float) hCPE->hCoreCoder[n]->prev_synth_buffer32_fx[k] / ( 1 << output_q ); - //} - //FOR( Word32 k = 0; k < HQ_DELTA_MAX * HQ_DELAY_COMP; k++ ) - //{ - // hCPE->hCoreCoder[n]->delay_buf_out[k] = (float) hCPE->hCoreCoder[n]->delay_buf_out32_fx[k] / ( 1 << output_q ); - //} - IF( hCPE->hCoreCoder[n]->hTcxDec != NULL ) - { - FOR( Word32 k = 0; k < 111; k++ ) - { - //hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_float[k] = (float) hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32[k] / ( 1 << output_q ); - } - } - } - IF( hCPE->input_mem[n] != NULL ) - { - FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) - { - hCPE->input_mem_LB[n][ind] = ( (float) hCPE->input_mem_LB_fx[n][ind] / ( 1 << output_q ) ); - } - } - //FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); k++ ) - //{ - // hCPE->prev_hb_synth[n][k] = (float) hCPE->prev_hb_synth_fx[n][k] / ( 1 << output_q ); - //} - FOR( Word32 k = 0; k < NS2SA( 48000, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); k++ ) - { - hCPE->prev_synth[n][k] = (float) hCPE->prev_synth_fx[n][k] / ( 1 << output_q ); - } - } - - return; } @@ -3240,10 +3029,8 @@ void stereo_switching_dec( } /* reset residual coding / ESF (secondary channel) */ -#ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - set_zero( hCPE->hStereoDft->res_cod_mem, STEREO_DFT_OVL_8k ); -#endif set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); + hCPE->hStereoDft->q_res_cod_mem_fx = Q16; set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( sts[0]->output_Fs, STEREO_DFT32MS_OVL_NS ) ); } @@ -3317,10 +3104,10 @@ void stereo_switching_dec( sts[1]->prev_bfi = sts[0]->prev_bfi; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f(sts[1]->old_pitch_buf, (float)L_SUBFR, 2 * NB_SUBFR16k); sts[1]->old_fpitchFB_float = 2 * (float) L_SUBFR; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED // fix need to do correctly set32_fx( sts[1]->old_pitch_buf_fx, L_deposit_h( L_SUBFR ), 2 * NB_SUBFR16k ); @@ -3371,11 +3158,11 @@ void stereo_switching_dec( #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED mvr2r( sts[0]->hHQ_core->old_out, sts[1]->hHQ_core->old_out, L_FRAME48k ); - mvr2r( sts[0]->hTcxDec->old_syn_Overl_float, sts[1]->hTcxDec->old_syn_Overl_float, 256 ); + //mvr2r( sts[0]->hTcxDec->old_syn_Overl_float, sts[1]->hTcxDec->old_syn_Overl_float, 256 ); #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED mvr2r(sts[0]->delay_buf_out, sts[1]->delay_buf_out, HQ_DELTA_MAX * HQ_DELAY_COMP); -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED // 32bit buffer Copy32( sts[0]->hHQ_core->oldOut_fx, sts[1]->hHQ_core->oldOut_fx, L_FRAME48k ); @@ -3407,7 +3194,7 @@ void stereo_switching_dec( sts[1]->pit_res_max = sts[0]->pit_res_max; sts[1]->pit_res_max_past = sts[0]->pit_res_max_past; sts[1]->hTcxDec->L_frameTCX = sts[0]->hTcxDec->L_frameTCX; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#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; @@ -3824,7 +3611,7 @@ void stereo_td2dft_update_fx( } } } - ELSE IF( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->input_mem[0] != NULL ) + ELSE IF( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->input_mem_fx[0] != NULL ) { /* update DFT stereo OLA memories */ @@ -3918,7 +3705,6 @@ void stereo_mdct2dft_update( return; } #else - void stereo_mdct2dft_update_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 output0_fx[], /* i/o: synthesis @internal Fs, ch0 */ @@ -3943,13 +3729,13 @@ void stereo_mdct2dft_update_fx( { case 16000: tmpF_fx = 53687092; - break; + BREAK; case 32000: tmpF_fx = 26843546; - break; + BREAK; case 48000: tmpF_fx = 17895698; - break; + BREAK; } for ( i = 0; i < fade_len; i++ ) { @@ -3973,25 +3759,25 @@ void stereo_mdct2dft_update_fx( { case 80: tmpF_fx = 71582792; - break; + BREAK; case 160: tmpF_fx = 35791396; - break; + BREAK; case 256: tmpF_fx = 22369622; - break; + BREAK; case 320: tmpF_fx = 17895698; - break; + BREAK; case 512: tmpF_fx = 11184811; - break; + BREAK; case 640: tmpF_fx = 8947849; - break; + BREAK; case 960: tmpF_fx = 5965232; - break; + BREAK; default: assert( 0 ); } @@ -4015,6 +3801,9 @@ void stereo_mdct2dft_update_fx( return; } #endif + + +#ifndef IVAS_FLOAT_FIXED static float ncross_corr_self( float *signal, const int16_t x, @@ -4050,7 +3839,7 @@ static float ncross_corr_self( return c_c; } - +#else static Word32 ncross_corr_self_fx( Word32 *signal_fx, const Word16 x, @@ -4062,7 +3851,7 @@ static Word32 ncross_corr_self_fx( Word32 c_c_fx_return; Word16 c_c_fx_q; Word64 energy_xy_fx, energy_x_fx, energy_y_fx; - uint16_t j; + UWord16 j; Word32 *signal_a_fx, *signal_b_fx; Word32 temp_x, temp_y; Word16 headroom_left_x, headroom_left_y; @@ -4070,11 +3859,14 @@ static Word32 ncross_corr_self_fx( Word16 x_q, y_q; Word16 res_q; c_c_fx = 0; + move64(); energy_x_fx = 0; + move64(); energy_y_fx = 0; + move64(); signal_a_fx = &signal_fx[x]; signal_b_fx = &signal_fx[y]; - FOR ( j = 0; j < corr_len; j += subsampling ) + 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] ); @@ -4083,19 +3875,19 @@ static Word32 ncross_corr_self_fx( headroom_left_x = W_norm( energy_x_fx ); headroom_left_y = W_norm( energy_y_fx ); - IF ( headroom_left_x < 32 ) + IF( 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, (Word16) ( 32 - headroom_left_x ) ); + x_q = (Word16) ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_x ) ) ); } ELSE { x_q = 31 - ( 2 * OUTPUT_Q ); } - IF ( headroom_left_y < 32 ) + IF( 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, (Word16) ( 32 - headroom_left_y ) ); + y_q = (Word16) ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_y ) ) ); } ELSE { @@ -4104,16 +3896,16 @@ static Word32 ncross_corr_self_fx( x_inv_q = x_q; y_inv_q = y_q; - - temp_x = Sqrt32((Word32)energy_x_fx, &x_q ); - if ( x_q < 0 ) + + temp_x = Sqrt32( (Word32) energy_x_fx, &x_q ); + IF( x_q < 0 ) { temp_x = L_shr( temp_x, -1 * x_q ); x_q = 0; } - temp_y = Sqrt32((Word32)energy_y_fx, &y_q ); - IF ( y_q < 0 ) + temp_y = Sqrt32( (Word32) energy_y_fx, &y_q ); + IF( y_q < 0 ) { temp_y = L_shr( temp_y, -1 * y_q ); y_q = 0; @@ -4122,7 +3914,7 @@ static Word32 ncross_corr_self_fx( energy_xy_fx = Mpy_32_32( temp_x, temp_y ); res_q = 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, (Word16) res_q ) ) || energy_xy_fx == 0 ) { energy_xy_fx = ONE_IN_Q31; /* conceal silent frames */ res_q = 0; @@ -4130,27 +3922,29 @@ 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( (Word32) energy_x_fx, &x_inv_q ); + Word32 temp_y_inv = ISqrt32( (Word32) energy_y_fx, &y_inv_q ); Word16 headroom_left_c_c; - energy_xy_fx = (Word32)Mpy_32_32( temp_x_inv, temp_y_inv ); + energy_xy_fx = (Word32) Mpy_32_32( temp_x_inv, temp_y_inv ); res_q = 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 ) { - c_c_fx = W_shr( c_c_fx, (Word16)(32 - headroom_left_c_c) ); + 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 = (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 = (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_return = (Word32)c_c_fx; + c_c_fx_return = (Word32) c_c_fx; return c_c_fx_return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif + + /*-------------------------------------------------------------------* * Function smooth_dft2td_transition() * @@ -4158,6 +3952,7 @@ static Word32 ncross_corr_self_fx( * switching from DFT stereo to TD stereo *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void smooth_dft2td_transition( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ float *output[CPE_CHANNELS], /* i/o: synthesis @external Fs */ @@ -4303,12 +4098,11 @@ void smooth_dft2td_transition( return; } -#endif -#ifdef IVAS_FLOAT_FIXED +#else void smooth_dft2td_transition_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output_fx[CPE_CHANNELS], /* i/o: synthesis @external Fs */ - const Word16 output_frame /* i : output frame lenght */ + const Word16 output_frame /* i : output frame lenght */ ) { @@ -4317,63 +4111,73 @@ void smooth_dft2td_transition_fx( Word32 flen_fx, ftmp_corr_fx, fmaxcorr_fx, fac_fs_fx; Word32 tmp_out_fx[L_FRAME48k + L_FRAME48k / 2], tmp_out2_fx[L_FRAME48k], *ptO2_fx, *ptO_fx, *pt1_fx, *ptE_fx; - IF ( hCPE == NULL ) + IF( hCPE == NULL ) { return; } /* initialization */ sts = hCPE->hCoreCoder; - IF ( ( hCPE->element_mode == IVAS_CPE_TD && ( hCPE->last_element_mode == IVAS_CPE_DFT || hCPE->last_element_mode == IVAS_CPE_MDCT ) && ( sts[0]->clas_dec == VOICED_CLAS && sts[0]->coder_type < TRANSITION && sts[0]->coder_type > UNVOICED && sts[0]->last_coder_type > UNVOICED && sts[1]->coder_type > UNVOICED ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && ( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) && ( EQ_16( sts[0]->clas_dec, VOICED_CLAS ) && LT_16( sts[0]->coder_type, TRANSITION ) && GT_16( sts[0]->coder_type, UNVOICED ) && GT_16( sts[0]->last_coder_type, UNVOICED ) && GT_16( sts[1]->coder_type, UNVOICED ) ) ) ) { /* length of OVA */ - ilen = output_frame / 2; + ilen = shr( output_frame, 1 ); /* correlation length */ corr_len = output_frame / 20; subsampl = 4; - FOR ( ch = 0; ch < hCPE->nchan_out; ch++ ) + FOR( ch = 0; ch < hCPE->nchan_out; ch++ ) { /* 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))); + 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 ) ) ); /* 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 = (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); + 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 = (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 ); - IF ( ( ipit_max + corr_len ) > ilen ) /*ensure the search is performed on the available memory*/ + IF( GT_16( add( ipit_max, corr_len ), ilen ) ) /*ensure the search is performed on the available memory*/ { - continue; + CONTINUE; } - lsearch = ipit_max - ipit_min + corr_len; - lsearch = min( lsearch, output_frame / 4 ); + lsearch = add( sub( ipit_max, ipit_min ), corr_len ); + 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; idiff = 0; + move16(); fmaxcorr_fx = -ONE_IN_Q31; - FOR ( i = 0; i < lsearch; i++ ) + move32(); + FOR( i = 0; i < lsearch; i++ ) { - ftmp_corr_fx = ncross_corr_self_fx(ptE_fx, i, ipit_max, corr_len, subsampl); - IF (ftmp_corr_fx > fmaxcorr_fx) + ftmp_corr_fx = ncross_corr_self_fx( ptE_fx, i, ipit_max, corr_len, subsampl ); + IF( GT_32( ftmp_corr_fx, fmaxcorr_fx ) ) { idiff = i; + move16(); } - fmaxcorr_fx = max( fmaxcorr_fx, ftmp_corr_fx ); + fmaxcorr_fx = L_max( fmaxcorr_fx, ftmp_corr_fx ); } - ipit = ipit_max - idiff; + ipit = sub( ipit_max, idiff ); ptO_fx = tmp_out_fx + output_frame; /* If the correlation is too low, don't use the prediction */ - IF ( fmaxcorr_fx < DFT2TD_CORR_THRESH_FX ) + IF( LT_32( fmaxcorr_fx, DFT2TD_CORR_THRESH_FX ) ) { Copy32( &output_fx[ch][0], ptO_fx, ilen ); } @@ -4381,89 +4185,102 @@ void smooth_dft2td_transition_fx( { Copy32( hCPE->prev_synth_chs_fx[ch], tmp_out_fx, output_frame ); pt1_fx = tmp_out_fx + output_frame - ipit; - FOR ( i = 0; i < ilen; i++ ) + FOR( i = 0; i < ilen; i++ ) { ptO_fx[i] = pt1_fx[i]; + move32(); } } /* 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 ); - FOR ( i = 0; i < output_frame; i++ ) + FOR( i = 0; i < output_frame; i++ ) { tmp_out2_fx[i] = output_fx[ch][output_frame - 1 - i]; + move32(); } /* ptr init for search of the best correlation of the current frame */ ptE_fx = ptO2_fx - ( ipit_max + corr_len ); idiff = 0; + move16(); fmaxcorr_fx = -ONE_IN_Q31; - FOR ( i = 0; i < lsearch; i++ ) + move32(); + FOR( i = 0; i < lsearch; i++ ) { - ftmp_corr_fx = ncross_corr_self_fx(ptE_fx, i, ipit_max, corr_len, subsampl); - IF (ftmp_corr_fx > fmaxcorr_fx) + ftmp_corr_fx = ncross_corr_self_fx( ptE_fx, i, ipit_max, corr_len, subsampl ); + IF( GT_32( ftmp_corr_fx, fmaxcorr_fx ) ) { - idiff = i; + idiff = i; + move16(); } - fmaxcorr_fx = max( fmaxcorr_fx, ftmp_corr_fx); + fmaxcorr_fx = L_max( fmaxcorr_fx, ftmp_corr_fx ); } - ipit = ipit_max - idiff; + ipit = sub( ipit_max, idiff ); /* If the correlation is too low, don't use the prediction */ - IF ( fmaxcorr_fx > DFT2TD_CORR_THRESH_FX ) + IF( GT_32( fmaxcorr_fx, DFT2TD_CORR_THRESH_FX ) ) { pt1_fx = tmp_out2_fx + output_frame - ilen - ipit; - FOR ( i = 0; i < ilen; i++ ) + FOR( i = 0; i < ilen; i++ ) { ptO2_fx[i] = pt1_fx[i]; + move32(); } } /* perform OVA between predicted signals */ - SWITCH (ilen) - { - case 160: - flen_fx = 13421772; - break; - case 320: - flen_fx = 6710886; - break; - case 480: - flen_fx = 4473924; - break; - default: - assert(0); - break; - } - 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); + SWITCH( ilen ) + { + case 160: + flen_fx = 13421772; + move32(); + BREAK; + case 320: + flen_fx = 6710886; + move32(); + BREAK; + case 480: + flen_fx = 4473924; + move32(); + BREAK; + default: + assert( 0 ); + BREAK; + } + 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); + output_fx[ch][i] = (Word32) W_shr( ( W_add( temp_a, temp_b ) * flen_fx ), 31 ); + move32(); } - FOR ( ; i < ilen - 4; i++ ) + FOR( ; i < 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 = (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 ); + move32(); } j = 0; - FOR ( ; i < ilen; i++ ) + move16(); + 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_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 ); + move32(); j++; } } } - ELSE IF ( hCPE->element_mode == IVAS_CPE_DFT ) + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { /* Updates */ - FOR ( ch = 0; ch < hCPE->nchan_out; ch++ ) + FOR( ch = 0; ch < hCPE->nchan_out; ch++ ) { Copy32( output_fx[ch], hCPE->prev_synth_chs_fx[ch], output_frame ); } diff --git a/lib_dec/ivas_stereo_td_dec.c b/lib_dec/ivas_stereo_td_dec.c index 7af9d7b22d39c467551a5c4306890dc76329d681..ceec414f04b73853c55faa5c943ae7a09bd78171 100644 --- a/lib_dec/ivas_stereo_td_dec.c +++ b/lib_dec/ivas_stereo_td_dec.c @@ -43,6 +43,7 @@ #include "ivas_cnst.h" #include "wmc_auto.h" +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * stereo_td_init_dec() * @@ -75,8 +76,9 @@ void stereo_td_init_dec( return; } +#endif - +#ifdef IVAS_FLOAT_FIXED 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 */ @@ -87,11 +89,11 @@ void stereo_td_init_dec_fx( hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_MID_IS_PRIM; hStereoTD->tdm_prev_last_SM_flag = 0; hStereoTD->tdm_LRTD_flag = 0; - hStereoTD->prevSP_ratio = 0.5f; - hStereoTD->prevSP_ratio_fx = ONE_IN_Q30; //.5 - hStereoTD->SP_ratio_LT = 0.0f; + //hStereoTD->prevSP_ratio = 0.5f; + hStereoTD->prevSP_ratio_fx = ONE_IN_Q14; //.5 + //hStereoTD->SP_ratio_LT = 0.0f; hStereoTD->SP_ratio_LT_fx = 0; - hStereoTD->c_LR_LT = 0.5f; + //hStereoTD->c_LR_LT = 0.5f; hStereoTD->c_LR_LT_fx = ONE_IN_Q30; //.5 hStereoTD->flag_skip_DMX = 0; @@ -102,12 +104,11 @@ void stereo_td_init_dec_fx( hStereoTD->tdm_LRTD_flag = 1; } - set_f( hStereoTD->TCX_old_syn_Overl, 0.0f, L_FRAME16k / 2 ); set32_fx( hStereoTD->TCX_old_syn_Overl_fx, 0, L_FRAME16k / 2 ); return; } - +#endif /*-------------------------------------------------------------------* * tdm_configure_dec() @@ -268,9 +269,6 @@ void tdm_configure_dec( 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 ); } hCPE->hStereoDftDmx->targetGain_fx = power_table[tmpS]; -#ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - //hCPE->hStereoDftDmx->targetGain = fixedToFloat(hCPE->hStereoDftDmx->targetGain_fx, 29 ); -#endif } ELSE { diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index 6212dab02a7e6ee7e7ac6d71d88fd37041a3b723..21745b288cedee0639cf772b3f66da9daca14a21 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -156,7 +156,7 @@ void stereo_tcx_init_dec_fx( return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void stereo_tcx_init_dec( Decoder_State *st, /* i/o: decoder state structure */ const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ @@ -338,8 +338,6 @@ void stereo_tcx_core_dec_fx( IF( st->tcxonly ) { st->p_bpf_noise_buf_32 = NULL; - // To be removed - st->p_bpf_noise_buf_float = NULL; } ELSE { @@ -347,14 +345,12 @@ void stereo_tcx_core_dec_fx( st->p_bpf_noise_buf = st->bpf_noise_buf; set_s( pitch, L_SUBFR, st->nb_subfr ); set16_fx( pit_gain_fx, 0, st->nb_subfr ); - // To be removed - st->p_bpf_noise_buf_float = st->bpf_noise_buf_float; } /* Initialize pointers */ synth_fx = synth_buf_fx + hTcxDec->old_synth_len; synthFB_fx = synth_bufFB_fx + hTcxDec->old_synth_lenFB; - Copy( hTcxDec->old_synth, synth_buf_fx, hTcxDec->old_synth_len ); + Copy_Scale_sig( hTcxDec->old_synth, synth_buf_fx, hTcxDec->old_synth_len, -st->Q_syn); Copy( hTcxDec->old_synthFB_fx, synth_bufFB_fx, hTcxDec->old_synth_lenFB ); set16_fx( synth_fx, 0, L_FRAME_PLUS + M ); set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); @@ -381,37 +377,6 @@ void stereo_tcx_core_dec_fx( st->core = GetPLCModeDecision_ivas_fx( st ); } -#if 1 // TO BE REMOVED - IF( bfi && ( NE_16( st->last_core, -1 ) && EQ_16( st->nbLostCmpt, 1 ) ) ) - { - IF( !( st->rf_flag && st->use_partial_copy && ( EQ_16( st->rf_frame_type, RF_TCXTD1 ) || EQ_16( st->rf_frame_type, RF_TCXTD2 ) ) ) ) - { - IF( st->hTonalMDCTConc != NULL && st->last_core == TCX_20_CORE && st->second_last_core == TCX_20_CORE && ( ( st->old_fpitch <= L_shl(st->L_frame, 15) ) || ( st->hTcxDec->tcxltp_last_gain_unmodified <= 13107 /*0.4f*/ ) ) - /* it is fine to call the detection even if no ltp information - is available, meaning that st->old_fpitch == - st->tcxltp_second_last_pitch == st->L_frame */ - && ( st->old_fpitch == st->hTcxDec->tcxltp_second_last_pitch ) && !st->last_tns_active && !st->second_last_tns_active ) - { - //st->hTonalMDCTConc->pTCI->numIndexes = st->hTonalMDCTConc->pTCI->numIndexes; - FOR( i = 0; i < st->hTonalMDCTConc->pTCI->numIndexes; ++i ) - { - st->hTonalMDCTConc->pTCI->indexOfTonalPeak[i] = st->hTonalMDCTConc->pTCI->indexOfTonalPeak[i]; - st->hTonalMDCTConc->pTCI->lowerIndex[i] = st->hTonalMDCTConc->pTCI->lowerIndex[i]; - st->hTonalMDCTConc->pTCI->upperIndex[i] = st->hTonalMDCTConc->pTCI->upperIndex[i]; - } - FOR( i = 0; i < st->hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - st->hTonalMDCTConc->pTCI->phaseDiff_float[i] = fixedToFloat( st->hTonalMDCTConc->pTCI->phaseDiff[i], Q12 ); - } - FOR( i = 0; i < MAX_NUMBER_OF_IDX * GROUP_LENGTH; i++ ) - { - st->hTonalMDCTConc->pTCI->phase_currentFramePredicted_float[i] = fixedToFloat( st->hTonalMDCTConc->pTCI->phase_currentFramePredicted[i], Q13 ); - } - } - } - } -#endif // 1 - /*--------------------------------------------------------------------------------* * LPC PARAMETERS *--------------------------------------------------------------------------------*/ @@ -455,7 +420,7 @@ void stereo_tcx_core_dec_fx( hTcxDec->envWeighted = 0; } - lpc_unquantize( st, lsf_fx, lsp_fx, M, param_lpc, lspmid_fx, lsfmid_fx, AUDIO, &LSF_Q_prediction ); + lpc_unquantize_fx( st, lsf_fx, lsp_fx, M, param_lpc, lspmid_fx, lsfmid_fx, AUDIO, &LSF_Q_prediction ); FOR( k = 0; k < st->numlpc; ++k ) { @@ -551,7 +516,7 @@ void stereo_tcx_core_dec_fx( } /* PLC: [TCX: TD PLC] */ - con_tcx( st, &synthFB_fx[0] /*, -1.f, NULL, 0, NULL */ ); + con_tcx_fx( st, &synthFB_fx[0] /*, -1.f, NULL, 0, NULL */ ); IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || hTcxDec->tcxConceal_recalc_exc ) { Copy_Scale_sig( &synthFB_fx[-( st->hTcxDec->L_frameTCX / 2 + hTcxDec->pit_max_TCX + 2 * M )], &synthFB_fx[-( st->hTcxDec->L_frameTCX / 2 + hTcxDec->pit_max_TCX + 2 * M )], st->hTcxDec->L_frameTCX / 2 + hTcxDec->pit_max_TCX + 2 * M, -( st->Q_exc - 1 ) ); @@ -628,7 +593,7 @@ void stereo_tcx_core_dec_fx( } /* TCX decoder */ - decoder_tcx_fx( st, prm, Aq_fx, Aind, &synth_fx[0], &synthFB_fx[0], bfi, 0, sba_dirac_stereo_flag ); + decoder_tcx_ivas_fx( st, prm, Aq_fx, Aind, &synth_fx[0], &synthFB_fx[0], bfi, 0, sba_dirac_stereo_flag ); } /*--------------------------------------------------------------------------------* @@ -657,7 +622,7 @@ void stereo_tcx_core_dec_fx( } /* TCX decoder */ - decoder_tcx_fx( st, prm, Aq_fx, Aind, &synth_fx[k * st->L_frame / 2], &synthFB_fx[k * hTcxDec->L_frameTCX / 2], bfi, k, sba_dirac_stereo_flag ); + decoder_tcx_ivas_fx( st, prm, Aq_fx, Aind, &synth_fx[k * st->L_frame / 2], &synthFB_fx[k * hTcxDec->L_frameTCX / 2], bfi, k, sba_dirac_stereo_flag ); } } @@ -688,12 +653,9 @@ void stereo_tcx_core_dec_fx( IF( !bfi && st->hTonalMDCTConc != NULL ) { TonalMDCTConceal_SaveTimeSignal( st->hTonalMDCTConc, synthFB_fx, hTcxDec->L_frameTCX ); - // To be removed - fixedToFloat_arr( st->hTonalMDCTConc->secondLastPcmOut, st->hTonalMDCTConc->secondLastPcmOut_float, 0, st->hTonalMDCTConc->nSamples / 2 ); - fixedToFloat_arr( st->hTonalMDCTConc->lastPcmOut, st->hTonalMDCTConc->lastPcmOut_float, 0, st->hTonalMDCTConc->nSamples ); } - decoder_tcx_post( st, synth_fx, synthFB_fx, Aq_fx, bfi ); + decoder_tcx_post_fx( st, synth_fx, synthFB_fx, Aq_fx, bfi ); IF( EQ_16( st->core, TCX_20_CORE ) ) { @@ -751,7 +713,7 @@ void stereo_tcx_core_dec_fx( } /* Update past buffers */ - Copy( synth_buf_fx + st->L_frame, hTcxDec->old_synth, hTcxDec->old_synth_len ); + Copy_Scale_sig( synth_buf_fx + st->L_frame, hTcxDec->old_synth, hTcxDec->old_synth_len, 0); Copy( hTcxDec->old_synthFB_fx + hTcxDec->L_frameTCX - NS2SA_fx2( st->output_Fs, PH_ECU_MEM_NS ), hTcxDec->synth_history_fx, NS2SA_fx2( st->output_Fs, PH_ECU_MEM_NS ) ); Copy( synth_bufFB_fx + hTcxDec->L_frameTCX, hTcxDec->old_synthFB_fx, hTcxDec->old_synth_lenFB ); Copy( st->hHQ_core->old_out_fx + NS2SA_fx2( st->output_Fs, N_ZERO_MDCT_NS ), hTcxDec->old_synthFB_fx + hTcxDec->old_synth_lenFB, NS2SA_fx2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); @@ -806,8 +768,17 @@ void stereo_tcx_core_dec_fx( st->last_is_cng = 0; /* Postfiltering */ + 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 ) ); + } + post_decoder( st, synth_buf_fx, pit_gain_fx, pitch, signal_out_fx, st->p_bpf_noise_buf ); + IF( st->p_bpf_noise_buf_32 ) + { + Copy_Scale_sig_16_32_no_sat( st->p_bpf_noise_buf, st->p_bpf_noise_buf_32, st->L_frame, Q11 ); + } IF( signal_outFB_fx ) { Copy( synthFB_fx, signal_outFB_fx, hTcxDec->L_frameTCX ); @@ -848,7 +819,7 @@ void stereo_tcx_core_dec_fx( IF( st->hFdCngDec != NULL && ( EQ_32( st->sr_core, INT_FS_12k8 ) || EQ_32( st->sr_core, INT_FS_16k ) ) && LE_32( st->total_brate, MAX_ACELP_BRATE ) ) { - noisy_speech_detection( st->hFdCngDec, st->VAD && EQ_16( st->m_frame_type, ACTIVE_FRAME ), signal_out_fx, 0 ); + noisy_speech_detection_fx( st->hFdCngDec, st->VAD && EQ_16( st->m_frame_type, ACTIVE_FRAME ), signal_out_fx, 0 ); 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 ); @@ -861,11 +832,11 @@ void stereo_tcx_core_dec_fx( { Word16 buffer[L_FRAME16k]; lerp( signal_outFB_fx, buffer, st->L_frame, hTcxDec->L_frameTCX ); - ApplyFdCng_fx( buffer, 0 /* Q of buffer */, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_ivas_fx( buffer, 0 /* Q of buffer */, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } ELSE { - ApplyFdCng_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_ivas_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -881,19 +852,19 @@ void stereo_tcx_core_dec_fx( } expand_range( st->hFdCngDec->msPsd, psd_part_fx, &psd_part_e, st->hFdCngDec->nFFTpart_shaping ); scalebands_fx( psd_part_fx, st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->midband_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand, psd_fx, 1 ); - // generate_stereo_masking_noise_fx( signal_out, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); - generate_stereo_masking_noise_16fx( signal_out_fx, 0, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); + + generate_stereo_masking_noise_fx( signal_out_fx, 0, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); } ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) { - // generate_masking_noise_flt( signal_out, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); - generate_masking_noise( signal_out_fx, 0, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); + // generate_masking_noise( signal_out, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + generate_masking_noise_fx( signal_out_fx, 0, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); } } IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 0 ) ) { - ApplyFdCng_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_ivas_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -1028,7 +999,7 @@ void stereo_tcx_core_dec( /* PLC: [Common: mode decision] * PLC: Decide which Concealment to use. Update pitch lags if needed */ - st->core = GetPLCModeDecision_flt( st ); + st->core = GetPLCModeDecision( st ); } /*--------------------------------------------------------------------------------* @@ -1073,7 +1044,7 @@ void stereo_tcx_core_dec( hTcxDec->envWeighted = 0; } - lpc_unquantize_flt( st, lsf, lsp, param_lpc, lspmid, lsfmid, AUDIO, &LSF_Q_prediction ); + lpc_unquantize( st, lsf, lsp, param_lpc, lspmid, lsfmid, AUDIO, &LSF_Q_prediction ); for ( k = 0; k < st->numlpc; ++k ) { @@ -1168,7 +1139,7 @@ void stereo_tcx_core_dec( } /* PLC: [TCX: TD PLC] */ - con_tcx_flt( st, &synthFB[0], -1.f, NULL, 0, NULL ); + con_tcx( st, &synthFB[0], -1.f, NULL, 0, NULL ); lerp_flt( synthFB, synth, st->L_frame, hTcxDec->L_frameTCX ); st->con_tcx = 1; set_f( &st->mem_pitch_gain_float[2], st->lp_gainp, st->nb_subfr ); @@ -1235,7 +1206,7 @@ void stereo_tcx_core_dec( } /* TCX decoder */ - decoder_tcx_flt( st, prm, Aq, Aind, &synth[0], &synthFB[0], bfi, 0, sba_dirac_stereo_flag ); + decoder_tcx( st, prm, Aq, Aind, &synth[0], &synthFB[0], bfi, 0, sba_dirac_stereo_flag ); } /*--------------------------------------------------------------------------------* @@ -1263,7 +1234,7 @@ void stereo_tcx_core_dec( } /* TCX decoder */ - decoder_tcx_flt( st, prm, Aq, Aind, &synth[k * st->L_frame / 2], &synthFB[k * hTcxDec->L_frameTCX / 2], bfi, k, sba_dirac_stereo_flag ); + decoder_tcx( st, prm, Aq, Aind, &synth[k * st->L_frame / 2], &synthFB[k * hTcxDec->L_frameTCX / 2], bfi, k, sba_dirac_stereo_flag ); } } @@ -1296,7 +1267,7 @@ void stereo_tcx_core_dec( TonalMDCTConceal_SaveTimeSignal_ivas( st->hTonalMDCTConc, synthFB, hTcxDec->L_frameTCX ); } - decoder_tcx_post_flt( st, synth, synthFB, Aq, bfi, 0 ); + decoder_tcx_post( st, synth, synthFB, Aq, bfi, 0 ); if ( st->core == TCX_20_CORE ) { @@ -1441,7 +1412,7 @@ void stereo_tcx_core_dec( if ( st->hFdCngDec != NULL && ( st->sr_core == INT_FS_12k8 || st->sr_core == INT_FS_16k ) && st->total_brate <= MAX_ACELP_BRATE ) { - noisy_speech_detection_flt( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, signal_out ); + noisy_speech_detection( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, signal_out ); 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; @@ -1453,11 +1424,11 @@ void stereo_tcx_core_dec( { float buffer[L_FRAME16k]; lerp_flt( signal_outFB, buffer, st->L_frame, hTcxDec->L_frameTCX ); - ApplyFdCng_flt( buffer, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng( buffer, NULL, NULL, NULL, st, st->bfi, 0 ); } else { - ApplyFdCng_flt( signal_out, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng( signal_out, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -1477,13 +1448,13 @@ void stereo_tcx_core_dec( } else if ( st->element_mode != IVAS_CPE_DFT ) { - generate_masking_noise_flt( signal_out, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + generate_masking_noise( signal_out, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); } } if ( st->element_mode == IVAS_CPE_TD && st->idchan == 0 ) { - ApplyFdCng_flt( signal_out, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng( signal_out, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -1610,7 +1581,7 @@ static void dec_prm_tcx( return; } #endif // IVAS_FLOAT_FIXED -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------* * Function stereo_tcx_dec_mode_switch_reconf() * @@ -1647,7 +1618,7 @@ static void stereo_tcx_dec_mode_switch_reconf( } /* Reconfigure Core */ - mode_switch_decoder_LPD_flt( st, st->bwidth, st->bits_frame_nominal * FRAMES_PER_SEC, st->last_bits_frame_nominal * FRAMES_PER_SEC, frame_size_index, MCT_flag, last_element_mode ); + mode_switch_decoder_LPD( st, st->bwidth, st->bits_frame_nominal * FRAMES_PER_SEC, st->last_bits_frame_nominal * FRAMES_PER_SEC, frame_size_index, MCT_flag, last_element_mode ); return; } @@ -1786,7 +1757,7 @@ static void dec_prm_tcx_ivas_fx( * LPC parameters *--------------------------------------------------------------------------------*/ - getLPCparam( st, param_lpc, st, -1, 0 ); + getLPCparam_fx( st, param_lpc, st, -1, 0 ); bits_common = sub( st->next_bit_pos, start_bit_pos ); @@ -1797,7 +1768,7 @@ static void dec_prm_tcx_ivas_fx( IF( EQ_16( st->use_partial_copy, 0 ) ) { - getTCXparam( st, st, hm_cfg, param, bits_common, start_bit_pos, NULL, NULL, NULL, -1 ); + getTCXparam_fx( st, st, hm_cfg, param, bits_common, start_bit_pos, NULL, NULL, NULL, -1 ); } IF( !st->use_partial_copy ) @@ -1813,7 +1784,7 @@ static void dec_prm_tcx_ivas_fx( #if 1 /*Fixed to float changes*/ //st->hTcxLtpDec->tcxltp_gain_float = fixedToFloat( st->hTcxLtpDec->tcxltp_gain, 15 ); - st->hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat( st->hTcxDec->tcxltp_last_gain_unmodified, 15 ); + //st->hTcxDec->tcxltp_last_gain_unmodified_float = fixedToFloat( st->hTcxDec->tcxltp_last_gain_unmodified, 15 ); #endif // Ends here return; } diff --git a/lib_dec/ivas_td_low_rate_dec.c b/lib_dec/ivas_td_low_rate_dec.c index 17ece8eb856e10eb604e118aa1a12b74a90c31ee..4b8ed6467a62947a2c3c38eefa15b9efdc46487b 100644 --- a/lib_dec/ivas_td_low_rate_dec.c +++ b/lib_dec/ivas_td_low_rate_dec.c @@ -42,7 +42,7 @@ #include "prot_fx2.h" #include "ivas_prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * tdm_low_rate_dec() * @@ -357,7 +357,7 @@ void tdm_low_rate_dec_fx( * * Decode generic (GC), 2 subframes mode *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void decod_gen_2sbfr( Decoder_State *st, /* i/o: decoder static memory */ const int16_t sharpFlag, /* i : formant sharpening flag */ diff --git a/lib_dec/jbm_jb4sb.c b/lib_dec/jbm_jb4sb.c index 640c322839b08adf39bb2415763186c5079230d5..f0a01be30b475639d616990d0b2e124b66f36106 100644 --- a/lib_dec/jbm_jb4sb.c +++ b/lib_dec/jbm_jb4sb.c @@ -862,16 +862,16 @@ static void JB4_adaptActivePlayout( { IF ( convertToLateLoss ) { -#ifdef EVS_FLOAT +#ifndef IVAS_FLOAT_FIXED JB4_dropFromBuffer( h ); #else JB4_dropFromBuffer( h ); h->nLostOrStretched = L_add( h->nLostOrStretched, 1 ); -#endif // EVS_FLOAT +#endif } ELSE IF ( dropEarly ) { -#ifdef EVS_FLOAT +#ifndef IVAS_FLOAT_FIXED JB4_dropFromBuffer( h ); ++h->nLostOrStretched; #else diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index 1164e7b07c31c9af71b5660b30609a966c7af0df..1586051d64aaec0ef1b246dc575cf976fb36d4e5 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -67,7 +67,7 @@ struct apa_state_t { Word16 signalScaleForCorrelation; - Word16 frmInScaled[2 * 48000 / 50]; + Word16 frmInScaled[6 * 2 * 48000 / 50 * 2 ]; /* output buffer */ bool evs_compat_mode; float *buf_out; @@ -338,7 +338,7 @@ bool apa_set_rate( /* (the resulting maximum pitch is then p_min+l_search = 240 samples at 16 kHz) */ ps->l_search = ( ps->rate / 80 ) * ps->num_channels; -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED ps->win_fx = pcmdsp_window_hann_640; move16(); ps->l_halfwin_fx = 320; @@ -1219,7 +1219,7 @@ static Word8 logarithmic_search_fx(const apa_state_t * ps, { coeff_max = 0x80000000; /* will always be overwritten with result of first correlation */ move32(); - FOR(i = s_start; i < s_start + inlen; i += css) + FOR(i = s_start; i < s_start + inlen; i += css * ps->num_channels ) { test(); IF(EQ_16(wss,1) && EQ_16(ps->num_channels,1)) @@ -1381,7 +1381,8 @@ static Word16 find_synch_fx( apa_state_t *ps, fixed_pos, corr_len, ps->wss, - i_mult2( ps->css, ps->num_channels ), + //i_mult2( ps->css, ps->num_channels ), + ps->css, synch_pos ); /* assert synch_pos is cleanly divisible by number of channels */ assert( *synch_pos % ps->num_channels == 0 ); @@ -1464,6 +1465,7 @@ static bool copy_frm( * ******************************************************************************** */ +#ifdef IVAS_FLOAT_FIXED static bool shrink_frm( apa_state_t *ps, const float frm_in[], @@ -1485,9 +1487,9 @@ static bool shrink_frm( /* only 2nd input frame is used */ frm_in += l_frm; -#ifndef EVS_FLOAT - Word16 frm_in_fx[960]; - for ( i = 0; i < 960; i++ ) +#ifdef IVAS_FLOAT_FIXED + Word16 frm_in_fx[960*4]; + for ( i = 0; i < l_frm/*960*ps->num_channels*/; i++ ) { frm_in_fx[i] = (Word16) frm_in[i]; } @@ -1501,7 +1503,7 @@ static bool shrink_frm( } /* calculate overlap position */ -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED if ( isSilence_fx( frm_in_fx, l_seg, 10 ) ) #else if ( isSilence( frm_in, l_seg, 10 ) ) @@ -1541,13 +1543,15 @@ static bool shrink_frm( else { /* find synch */ -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED Word16 energyQ8; Word32 qualityQ16=0; + //ps->signalScaleForCorrelation += 2; scaleSignal16( frm_in_fx, ps->frmInScaled, l_frm, ps->signalScaleForCorrelation ); findSynchResult = find_synch_fx( ps, ps->frmInScaled, l_frm, s_start, (uint16_t) ( s_end - s_start ), 0, l_seg, 0, &energyQ8, &qualityQ16, &xtract ); energy = fixedToFloat( energyQ8, 8 ); quality = fixedToFloat( qualityQ16, 16 ); + //ps->signalScaleForCorrelation -= 2; #else findSynchResult = find_synch( ps, frm_in, l_frm, s_start, (uint16_t) ( s_end - s_start ), 0, l_seg, 0, &energy, &quality, &xtract ); #endif @@ -1593,21 +1597,18 @@ static bool shrink_frm( { return 1; } -#ifdef EVS_FLOAT - if ( ps->evs_compat_mode == true ) + Word16 frm_out_fx[960*8]; + IF ( ps->evs_compat_mode == true ) { - overlapAddEvs( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + //overlapAddEvs_fx( frm_in_fx, frm_in_fx + xtract, frm_out_fx, l_seg, ps->num_channels, ps->win_fx + ps->l_halfwin_fx, ps->win_fx ); + overlapAdd( frm_in_fx, frm_in_fx + xtract, frm_out_fx, l_seg, ps->num_channels, ps->win_fx + ps->l_halfwin_fx, ps->win_fx , ps->win_incrementor); } - else + ELSE { - overlapAdd_ivas( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + overlapAdd( frm_in_fx, frm_in_fx + xtract, frm_out_fx, l_seg, ps->num_channels, ps->win_fx + ps->l_halfwin_fx, ps->win_fx , ps->win_incrementor); } -#else - Word16 frm_out_fx[960]; - overlapAdd( frm_in_fx, frm_in_fx + xtract, frm_out_fx, l_seg, ps->num_channels, ps->win_fx + ps->l_halfwin_fx, ps->win_fx , ps->win_incrementor); for ( i = 0; i < l_seg; i++ ) frm_out[i] = (float)frm_out_fx[i]; -#endif // EVS_FLOAT } else { @@ -1630,8 +1631,147 @@ static bool shrink_frm( return 0; } +#else +static bool shrink_frm( + apa_state_t *ps, + const float frm_in[], + uint16_t maxScaling, + float frm_out[], + uint16_t *l_frm_out ) +{ + bool findSynchResult = 0; + int16_t xtract, l_rem, s_start, s_end; + uint16_t i; + uint16_t over; + float energy, quality = 0.0f; + uint16_t l_frm; + uint16_t l_seg; + + l_frm = ps->l_frm; + l_seg = ps->l_seg; + + /* only 2nd input frame is used */ + frm_in += l_frm; + + /* set search range */ + s_start = ( ps->p_min / ps->num_channels ) * ps->num_channels; + s_end = s_start + ps->l_search; + if ( ( s_end + l_seg ) >= l_frm ) + { + s_end = ( l_frm - l_seg ); + } + + /* calculate overlap position */ + if ( isSilence( frm_in, l_seg, 10 ) ) + { + /* maximum scaling */ + energy = -65; + quality = 5; + if ( ps->evs_compat_mode == false ) + { + + xtract = maxScaling; + /* take samples already in the renderer buf into account */ + xtract += ps->l_r_buf; + /* snap to renderer time slot borders */ + xtract -= ( ps->l_ts - ( l_frm - xtract + ps->l_r_buf ) % ps->l_ts ); + while ( xtract < 0 ) + { + xtract += ps->l_ts; + } + while ( xtract > ( s_end - ps->num_channels ) ) + { + /* exceeded the possible shrinking, go back one renderer ts*/ + xtract -= ps->l_ts; + } + } + else if ( maxScaling != 0U && s_end > maxScaling + 1 ) + { + xtract = maxScaling; + } + else + { + /* set to last valid element (i.e. element[len - 1] but note for stereo last element is last pair of samples) */ + xtract = s_end - ps->num_channels; + } + } + else + { + /* find synch */ + findSynchResult = find_synch( ps, frm_in, l_frm, s_start, (uint16_t) ( s_end - s_start ), 0, l_seg, 0, &energy, &quality, &xtract ); + } + /* assert synch_pos is cleanly divisible by number of channels */ + assert( xtract % ps->num_channels == 0 ); + + /* set frame overlappable - reset if necessary */ + over = 1; + /* test whether frame has sufficient quality */ + if ( quality < ( ps->targetQuality - ( ps->bad_frame_count * 0.1f ) + ( ps->good_frame_count * 0.2f ) ) ) + { + /* not sufficient */ + over = 0; + if ( ps->bad_frame_count < ps->qualityred ) + { + ++ps->bad_frame_count; + } + if ( ps->good_frame_count > 0U ) + { + --ps->good_frame_count; + } + } + else + { + /* sufficient quality */ + if ( ps->bad_frame_count > 0U ) + { + --ps->bad_frame_count; + } + if ( ps->good_frame_count < ps->qualityrise ) + { + ++ps->good_frame_count; + } + } + + /* Calculate output data */ + if ( over && xtract ) + { + if ( findSynchResult == 1 ) + { + return 1; + } + if ( ps->evs_compat_mode == true ) + { + overlapAddEvs( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + else + { + overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + } + else + { + xtract = 0; + for ( i = 0; i < l_seg; i++ ) + { + frm_out[i] = frm_in[i]; + } + } + + /* append remaining samples */ + l_rem = l_frm - xtract - l_seg; + for ( i = 0; i < l_rem; i++ ) + { + frm_out[l_seg + i] = frm_in[l_frm - l_rem + i]; + } + + /* set output length */ + *l_frm_out = l_seg + l_rem; + + return 0; +} +#endif /* ******************************************************************************** * @@ -1652,6 +1792,7 @@ static bool shrink_frm( * ******************************************************************************** */ +#ifdef IVAS_FLOAT_FIXED static bool extend_frm( apa_state_t *ps, const float frm_in[], @@ -1751,18 +1892,32 @@ static bool extend_frm( over[n] = 0; /* don't search/overlap (just copy down) */ } } -#ifndef EVS_FLOAT - Word16 frm_in_fx[1920]; - for ( i = 0; i < 1920; i++ ) +#ifdef IVAS_FLOAT_FIXED + Word16 frm_in_fx[1920*2*2*2]; + Word16 max_flag = 0; + for ( i = 0; i < 2*l_frm; i++ ) { - frm_in_fx[i] = (Word16) frm_in[i]; + if(frm_in[i] > 32767) + { + max_flag = 1; + frm_in_fx[i] = 32767; + } + else if( frm_in[i] < -32767 ) + { + max_flag = 1; + frm_in_fx[i] = -32767; + } + else + { + frm_in_fx[i] = (Word16) frm_in[i]; + } } -#endif // !EVS_FLOAT +#endif if ( over[n] ) { /* calculate overlap position */ -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED if ( isSilence_fx( frm_in_fx, l_seg, 10 ) ) #else if ( isSilence( frm_in, l_seg, 10 ) ) @@ -1782,15 +1937,23 @@ static bool extend_frm( } else { -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED Word16 energyQ8=0,*frmInScaled; Word32 qualityQ16=0; frmInScaled = ps->frmInScaled; + if(max_flag) + { + ps->signalScaleForCorrelation += 1; + } assert( sizeof( ps->frmInScaled ) / sizeof( ps->frmInScaled[0] ) >= 2 * (size_t) l_frm ); scaleSignal16( frm_in_fx, frmInScaled, shl(l_frm, 1), ps->signalScaleForCorrelation ); - findSynchResult = find_synch_fx( ps, frmInScaled, 2 * l_frm, s_start, s_end - s_start, sync_start, l_seg, l_frm, &energyQ8, &qualityQ16, &xtract[n] ); + findSynchResult = find_synch_fx( ps, frmInScaled, 2 * l_frm, s_start, s_end - s_start, sync_start, l_seg, l_frm, &energyQ8, &qualityQ16, &xtract[n] ); energy = fixedToFloat( energyQ8, 8 ); quality = fixedToFloat( qualityQ16, 16 ); + if(max_flag) + { + ps->signalScaleForCorrelation -= 1; + } #else /* find synch */ findSynchResult = find_synch( ps, frm_in, 2 * l_frm, s_start, s_end - s_start, sync_start, l_seg, l_frm, &energy, &quality, &xtract[n] ); @@ -1846,26 +2009,23 @@ static bool extend_frm( fadeOut = frm_in + l_frm + xtract[n - 1] + l_seg; fadeIn = frm_in + l_frm + xtract[n]; out = frm_out + ( n - 2 ) * l_seg; -#ifdef EVS_FLOAT - if ( ps->evs_compat_mode == true ) + Word16 fadeOut_fx[960*8], fadeIn_fx[960*8], out_fx[960*8]; + for ( i = 0; i < l_seg; i++ ) { - overlapAddEvs( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + fadeOut_fx[i] = (Word16) fadeOut[i]; + fadeIn_fx[i] = (Word16) fadeIn[i]; } - else + IF ( ps->evs_compat_mode == true ) { - overlapAdd_ivas( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + //overlapAddEvs_fx( fadeOut_fx, fadeIn_fx, out_fx, l_seg, ps->num_channels, ps->win_fx + ps->l_halfwin_fx, ps->win_fx ); + overlapAdd( fadeOut_fx, fadeIn_fx, out_fx, l_seg, ps->num_channels, ps->win_fx + ps->l_halfwin_fx, ps->win_fx ,ps->win_incrementor); } -#else - Word16 fadeOut_fx[960], fadeIn_fx[960], out_fx[960]; - for ( i = 0; i < 960; i++ ) + ELSE { - fadeOut_fx[i] = (Word16) fadeOut[i]; - fadeIn_fx[i] = (Word16) fadeIn[i]; + overlapAdd( fadeOut_fx, fadeIn_fx, out_fx, l_seg, ps->num_channels, ps->win_fx + ps->l_halfwin_fx, ps->win_fx ,ps->win_incrementor); } - overlapAdd( fadeOut_fx, fadeIn_fx, out_fx, l_seg, ps->num_channels, ps->win_fx + ps->l_halfwin_fx, ps->win_fx ,ps->win_incrementor); for ( i = 0; i < l_seg; i++ ) out[i] = (float) out_fx[i]; -#endif // EVS_FLOAT } else { @@ -1893,3 +2053,214 @@ static bool extend_frm( return 0; } + +#else +static bool extend_frm( + apa_state_t *ps, + const float frm_in[], + float frm_out[], + uint16_t *l_frm_out ) +{ + bool findSynchResult = 0; + uint16_t l_frm_out_target; + uint16_t n, i; + int16_t N; + int16_t s[MAXN + 2], s_max, s_min; + int16_t xtract[MAXN + 2], sync_start, s_end; + uint16_t over[MAXN + 2]; + int16_t l_rem; + int16_t s_start = 0; + float energy, quality = 0.0f; + uint16_t l_frm, l_seg; + const float *fadeOut, *fadeIn; + float *out; + + + l_frm = ps->l_frm; + l_seg = ps->l_seg; + + /* number of segments/iterations */ + l_frm_out_target = (uint16_t) ( (float) l_frm * 1.5f ); + N = ( l_frm_out_target / l_seg ) - 1; + if ( N < 1 ) + { + N = 1; + } + if ( N > MAXN ) + { + return 1; + } + /* calculate equally spaced search regions */ + /* s[n] are given relative to 2nd frame and point to the start of */ + /* the search region. The first segment (n=1) will not be moved. */ + /* Hence, the iterations will start with n=2. */ + s_min = -( ps->l_search ) - ( ps->p_min ); + /* (make sure not to exceed array dimension) */ + if ( l_frm + s_min < 0 ) + { + s_min = -( l_frm ); + } + s_max = l_frm - 2 * l_seg - ps->l_search; + if ( s_max < s_min ) + { + N = 1; + } + /* for just one segment start at s_min */ + if ( N == 1 ) + { + s[2] = s_min; + } + /* else, spread linear in between s_min and s_max */ + /* (including s_min and s_max) */ + else + { + for ( n = 2; n <= ( N + 1 ); n++ ) + { + s[n] = s_min + ( ( s_max - s_min ) * ( n - 2 ) ) / ( N - 1 ); + } + } + + /* + * Planning Phase + */ + + xtract[1] = -( l_seg ); /* make sync_start=0 in 1st iteration */ + n = 2; + + /* define synch segment (to be correlated with search region) */ + sync_start = xtract[n - 1] + l_seg; + over[n] = 1; /* will be reset if overlap is not required */ + /* check end of search region: should be at least p_min */ + /* samples on the left of synch_start */ + if ( ( s[n] + ps->l_search ) < ( sync_start - ( ps->p_min ) ) ) + { + s_start = s[n]; + s_end = s_start + ps->l_search; + } + else + { + /* shrink search region to enforce minimum shift */ + s_end = sync_start - ( ps->p_min ); + if ( s[n] + ps->l_search < sync_start ) + { + s_start = s[n]; /* just do it with normal start position */ + } + else if ( n == ( N + 1 ) ) /* move search region left for last segment */ + { + s_start = s_end - ( ps->l_search - ps->p_min ); + } + else + { + over[n] = 0; /* don't search/overlap (just copy down) */ + } + } + + if ( over[n] ) + { + /* calculate overlap position */ + if ( isSilence( frm_in, l_seg, 10 ) ) + { + /* maximum scaling */ + energy = -65; + quality = 5; + xtract[n] = s_start + ps->num_channels; + if ( ps->evs_compat_mode == false ) + { + /* take renderer buffer samples into accout */ + xtract[n] += ps->l_r_buf; + /* snap to next renderer time slot border to resynchronize */ + xtract[n] -= ( ( N - 1 ) * l_seg - xtract[n] + ps->l_r_buf ) % ps->l_ts; + } + } + else + { + /* find synch */ + findSynchResult = find_synch( ps, frm_in, 2 * l_frm, s_start, s_end - s_start, sync_start, l_seg, l_frm, &energy, &quality, &xtract[n] ); + } + /* assert synch_pos is cleanly divisible by number of channels */ + assert( xtract[n] % ps->num_channels == 0 ); + + /* test for sufficient quality */ + if ( quality < ( ps->targetQuality - ( ps->bad_frame_count * 0.1f ) + ( ps->good_frame_count * 0.2f ) ) ) + { + /* not sufficient */ + over[n] = 0; + xtract[n] = sync_start; + if ( ps->bad_frame_count < ps->qualityred ) + { + ++ps->bad_frame_count; + } + if ( ps->good_frame_count > 0U ) + { + --ps->good_frame_count; + } + } + else + { + /* sufficient quality */ + if ( ps->bad_frame_count > 0U ) + { + --ps->bad_frame_count; + } + if ( ps->good_frame_count < ps->qualityrise ) + { + ++ps->good_frame_count; + } + } + if ( findSynchResult ) + { + return 1; + } + } + else + { + xtract[n] = sync_start; + } + + + /* Calculate output data */ + for ( n = 2; n <= N; n++ ) + { + if ( over[n] && xtract[n - 1] + l_seg != xtract[n] ) + { + /* mix 2nd half of previous segment with 1st half of current segment */ + fadeOut = frm_in + l_frm + xtract[n - 1] + l_seg; + fadeIn = frm_in + l_frm + xtract[n]; + out = frm_out + ( n - 2 ) * l_seg; + if ( ps->evs_compat_mode == true ) + { + overlapAddEvs( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + else + { + overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + } + else + { + /* just copy down 1st half of current segment (= 2nd half of previous segment) */ + float *frm_out_ptr; + const float *frm_in_ptr; + frm_out_ptr = &( frm_out[( n - 2 ) * l_seg] ); + frm_in_ptr = &( frm_in[l_frm + xtract[n]] ); + for ( i = 0; i < l_seg; i++ ) + { + frm_out_ptr[i] = frm_in_ptr[i]; + } + } + } + + /* append remaining samples */ + l_rem = l_frm - ( xtract[N] + l_seg ); + for ( i = 0; i < l_rem; i++ ) + { + frm_out[( N - 1 ) * l_seg + i] = frm_in[2 * l_frm - l_rem + i]; + } + + /* set output length */ + *l_frm_out = ( N - 1 ) * l_seg + l_rem; + + return 0; +} + +#endif \ No newline at end of file diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.c b/lib_dec/jbm_pcmdsp_similarityestimation.c index 852d4b789fa79c648540c4d404a26ed1f20e6b6f..a90d4412c17bee8e2e3ca28da446063f1dbb809d 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation.c @@ -66,7 +66,6 @@ float cross_correlation_self( return c_c; } -#ifndef EVS_FLOAT void scaleSignal16( const Word16 *src, Word16 *dst, Word16 n, Word16 rightShift ) { Word16 i; @@ -77,7 +76,6 @@ void scaleSignal16( const Word16 *src, Word16 *dst, Word16 n, Word16 rightShift move16(); } } -#endif // !EVS_FLOAT /* Calculates cross correlation coefficient for template segment. */ Word32 cross_correlation_subsampled_self_fx( const Word16 *signal, Word16 x, diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window.c index d05b112570a02fa928ef4b6df451c61cc8e7e52b..3b38ba115ca10185c3cc309ab9bf64f4e36dfca2 100644 --- a/lib_dec/jbm_pcmdsp_window.c +++ b/lib_dec/jbm_pcmdsp_window.c @@ -75,8 +75,7 @@ void hannWindow( * * Overlap/Add of two signal with a given window *-----------------------------------------------------------------------*/ - -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED void overlapAdd( const Word16 *fadeOut, const Word16 *fadeIn, Word16 *out, Word16 n, Word16 nChannels, const Word16 *fadeOutWin, const Word16 *fadeInWin, Word16 hannIncrementor ) { Word32 fdOutVal, fdInVal; @@ -102,85 +101,90 @@ void overlapAdd( const Word16 *fadeOut, const Word16 *fadeIn, Word16 *out, Word1 } } } -#endif // EVS_FLOAT -void overlapAdd_ivas( - const float *fadeOut, - const float *fadeIn, - float *out, - uint16_t n, - uint16_t nChannels, - const float *fadeOutWin, - const float *fadeInWin ) -{ - float fdOutVal, fdInVal; - int16_t i, j, hannIter; - float combinedVal; - for ( j = 0; j < nChannels; j++ ) +#else +void overlapAdd( + const float *fadeOut, + const float *fadeIn, + float *out, + uint16_t n, + uint16_t nChannels, + const float *fadeOutWin, + const float *fadeInWin) +{ + float fdOutVal, fdInVal; + int16_t i, j, hannIter; + float combinedVal; + + for (j = 0; j < nChannels; j++) + { + /* reset Hann window iterator to beginning (both channels use same window) */ + hannIter = 0; + for (i = j; i < n; i += nChannels) { - /* reset Hann window iterator to beginning (both channels use same window) */ - hannIter = 0; - for ( i = j; i < n; i += nChannels ) - { - fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; - fdInVal = fadeIn[i] * fadeInWin[hannIter]; - /* round combinedVal value (taking care of sign) */ - combinedVal = fdInVal + fdOutVal; - out[i] = combinedVal; - hannIter++; - } + fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; + fdInVal = fadeIn[i] * fadeInWin[hannIter]; + /* round combinedVal value (taking care of sign) */ + combinedVal = fdInVal + fdOutVal; + out[i] = combinedVal; + hannIter++; } + } - return; + return; } void overlapAddEvs( - const float *fadeOut, - const float *fadeIn, - float *out, - uint16_t n, - uint16_t nChannels, - const float *fadeOutWin, - const float *fadeInWin ) + const float *fadeOut, + const float *fadeIn, + float *out, + uint16_t n, + uint16_t nChannels, + const float *fadeOutWin, + const float *fadeInWin) { - float fdOutVal, fdInVal; - int16_t i, j, hannIter; - float combinedVal; - - for ( j = 0; j < nChannels; j++ ) + float fdOutVal, fdInVal; + int16_t i, j, hannIter; + float combinedVal; + + for (j = 0; j < nChannels; j++) + { + /* reset Hann window iterator to beginning (both channels use same window) */ + hannIter = 0; + for (i = j; i < n; i += nChannels) { - /* reset Hann window iterator to beginning (both channels use same window) */ - hannIter = 0; - for ( i = j; i < n; i += nChannels ) - { - fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; - fdInVal = fadeIn[i] * fadeInWin[hannIter]; - /* round combinedVal value (taking care of sign) */ - - combinedVal = floorf( ( fdInVal + fdOutVal ) + 0.5f ); - if ( fdInVal + fdOutVal < 0.0 ) - { - combinedVal = ceilf( ( fdInVal + fdOutVal ) - 0.5f ); - } + fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; + fdInVal = fadeIn[i] * fadeInWin[hannIter]; + /* round combinedVal value (taking care of sign) */ + + combinedVal = floorf((fdInVal + fdOutVal) + 0.5f); + if (fdInVal + fdOutVal < 0.0) + { + combinedVal = ceilf((fdInVal + fdOutVal) - 0.5f); + } + + /* saturate value */ + if (combinedVal > MAX16B_FLT) + { + combinedVal = MAX16B_FLT; + } + else if (combinedVal < MIN16B_FLT) + { + combinedVal = MIN16B_FLT; + } + + out[i] = combinedVal; + + hannIter++; + } + } - /* saturate value */ - if ( combinedVal > MAX16B_FLT ) - { - combinedVal = MAX16B_FLT; - } - else if ( combinedVal < MIN16B_FLT ) - { - combinedVal = MIN16B_FLT; - } + return; +} - out[i] = combinedVal; +#endif - hannIter++; - } - } - return; -} #ifdef IVAS_FLOAT_FIXED void overlapAdd_fx(const Word16 *fadeOut, const Word16 *fadeIn, Word16 *out, diff --git a/lib_dec/jbm_pcmdsp_window.h b/lib_dec/jbm_pcmdsp_window.h index cc090b781535123c5b03bac5832e7eb0e7e46899..4b604b70f842672787312647f915cba767abbd8b 100644 --- a/lib_dec/jbm_pcmdsp_window.h +++ b/lib_dec/jbm_pcmdsp_window.h @@ -61,16 +61,20 @@ void hannWindow( uint16_t n, float *w ); * @param[in] nChannels number of channels * @param[in] fadeOutWin window for fade out * @param[in] fadeInWin window for fade in */ -void overlapAdd_ivas( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); -void overlapAddEvs( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); +#ifndef IVAS_FLOAT_FIXED +void overlapAdd(const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin); +void overlapAddEvs(const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin); +#else void overlapAdd(const Word16 *fadeOut, const Word16 *fadeIn, Word16 *out, - Word16 n, Word16 nChannels, const Word16 *fadeOutWin, const Word16 *fadeInWin, Word16 hannIncrementor); -#ifdef IVAS_FLOAT_FIXED + Word16 n, Word16 nChannels, const Word16 *fadeOutWin, const Word16 *fadeInWin, Word16 hannIncrementor); + void overlapAdd_fx(const Word16 *fadeOut, const Word16 *fadeIn, Word16 *out, Word16 n, Word16 nChannels, const Word16 *fadeOutWin, const Word16 *fadeInWin ); void overlapAdd_fx(const Word16 *fadeOut, const Word16 *fadeIn, Word16 *out, Word16 n, Word16 nChannels, const Word16 *fadeOutWin, const Word16 *fadeInWin ); + +void overlapAddEvs_fx( const Word16 *fadeOut, const Word16 *fadeIn, Word16 *out, UWord16 n, UWord16 nChannels, const Word16 *fadeOutWin, const Word16 *fadeInWin ); #endif /* IVAS_FLOAT_FIXED */ #endif /* JBM_PCMDSP_WINDOW_H */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 1c3f4593ac898285d7cf2f1663eeee47fd66cd45..4b17b616bd9d88ffef9cb6bbaa393c80aa9ec0b0 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2757,17 +2757,17 @@ static ivas_error evs_dec_main( { p_output[ch] = st_ivas->p_output_f[ch]; } -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED Word16 output_16[L_FRAME48k]; -#endif // !EVS_FLOAT +#endif /* run the main EVS decoding routine */ if ( hCoreCoder[0]->codec_mode == MODE1 ) { if ( hCoreCoder[0]->Opt_AMR_WB ) { -#ifdef EVS_FLOAT - if ( ( error = amr_wb_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0] ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + if ( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0] ) ) != IVAS_ERR_OK ) #else if ( ( error = amr_wb_dec_fx(output_16, hCoreCoder[0]) ) != IVAS_ERR_OK ) #endif @@ -2777,8 +2777,8 @@ static ivas_error evs_dec_main( } else { -#ifdef EVS_FLOAT - if ( ( error = evs_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) #else if ( ( error = evs_dec_fx(hCoreCoder[0], output_16, FRAMEMODE_NORMAL) ) != IVAS_ERR_OK ) #endif @@ -2791,8 +2791,8 @@ static ivas_error evs_dec_main( { if ( hCoreCoder[0]->bfi == 0 ) { -#ifdef EVS_FLOAT - if ( ( error = evs_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) #else if ( ( error = evs_dec_fx(hCoreCoder[0], output_16, FRAMEMODE_NORMAL)) != IVAS_ERR_OK ) #endif @@ -2802,8 +2802,8 @@ static ivas_error evs_dec_main( } else if ( hCoreCoder[0]->bfi == 2 ) { -#ifdef EVS_FLOAT - if ( ( error = evs_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) #else if ( ( error = evs_dec_fx(hCoreCoder[0], output_16, FRAMEMODE_FUTURE)) != IVAS_ERR_OK ) #endif @@ -2813,8 +2813,8 @@ static ivas_error evs_dec_main( } else { -#ifdef EVS_FLOAT - if ( ( error = evs_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) #else if ( ( error = evs_dec_fx(hCoreCoder[0], output_16, FRAMEMODE_MISSING)) != IVAS_ERR_OK ) #endif @@ -2832,7 +2832,7 @@ static ivas_error evs_dec_main( v_multc( p_output[0], mixer_rigth, p_output[1], nOutSamples ); v_multc( p_output[0], mixer_left, p_output[0], nOutSamples ); } -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED for (int i = 0; i < nOutSamples; i++) { p_output[0][i] = output_16[i]; diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index b9df10d50115058acfa36d3bab444f73339348a7..92d4479b21c6f7b4d0b74032ddf028d6a1c1c08d 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -35,6 +35,7 @@ #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "prot.h" +#include "ivas_prot_fx.h" #include "prot_fx1.h" #include "prot_fx2.h" #include "jbm_jb4sb.h" @@ -733,7 +734,11 @@ ivas_error IVAS_DEC_FeedFrame_Serial( * In IVAS mode, initialization is done in ivas_dec(). */ IF( EQ_16( hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) { +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_init_decoder_fx( hIvasDec->st_ivas ) ) != IVAS_ERR_OK ) +#else IF( ( error = ivas_init_decoder( hIvasDec->st_ivas ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1358,11 +1363,19 @@ ivas_error IVAS_DEC_GetObjectMetadata( } ELSE { +#ifdef IVAS_FLOAT_FIXED + metadata->azimuth = fixedToFloat(hIsmMeta->azimuth_fx, Q22); + metadata->elevation = fixedToFloat(hIsmMeta->elevation_fx, Q22); + metadata->radius = fixedToFloat(hIsmMeta->radius_fx, Q9); + metadata->yaw = fixedToFloat(hIsmMeta->yaw_fx, Q22); + metadata->pitch = fixedToFloat(hIsmMeta->pitch_fx, Q22); +#else metadata->azimuth = hIsmMeta->azimuth; metadata->elevation = hIsmMeta->elevation; metadata->radius = hIsmMeta->radius; metadata->yaw = hIsmMeta->yaw; metadata->pitch = hIsmMeta->pitch; +#endif metadata->spread = 0.f; metadata->gainFactor = 1.f; metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; @@ -1435,9 +1448,9 @@ ivas_error IVAS_DEC_FeedHeadTrackData( /* Move head-tracking data to the decoder handle */ /* check for Euler angle signaling */ - IF( orientation.w == -3.0f ) + IF( EQ_32( orientation.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) { - Euler2Quat( deg2rad( orientation.x ), deg2rad( orientation.y ), deg2rad( orientation.z ), &orientation ); + Euler2Quat_fx( deg2rad_fx( orientation.x_fx ), deg2rad_fx( orientation.y_fx ), deg2rad_fx( orientation.z_fx ), &orientation ); } #ifdef IVAS_FLOAT_FIXED @@ -1810,11 +1823,19 @@ ivas_error IVAS_DEC_GetDefaultRenderConfig( RENDER_CONFIG_DATA RCin; RENDER_CONFIG_HANDLE hRCin = &RCin; ivas_error error; +#ifdef IVAS_FLOAT_FIXED + IF((error = ivas_render_config_init_from_rom_fx(&hRCin)) != IVAS_ERR_OK) + { + return error; + } +#endif + /*FLOAT CODE*/ IF( ( error = ivas_render_config_init_from_rom( &hRCin ) ) != IVAS_ERR_OK ) { return error; } + /*--------- */ return copyRendererConfigStruct( hRCin, hRCout ); } @@ -2223,13 +2244,14 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { return IVAS_ERR_UNKNOWN; } -#ifndef EVS_FLOAT - if ( GT_16( maxScaling, 20 ) ) + +#ifdef IVAS_FLOAT_FIXED + IF ( GT_32( maxScaling, 20 ) ) { maxScaling = 20; move16(); } -#endif // !EVS_FLOAT +#endif maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000; /* avoid time scaling multiple times in one sound card slot */ @@ -2849,17 +2871,17 @@ static ivas_error evs_dec_main( { p_output[ch] = st_ivas->p_output_f[ch]; } -#ifndef EVS_FLOAT +#ifdef IVAS_FLOAT_FIXED Word16 output_16[L_FRAME48k]; -#endif // !EVS_FLOAT +#endif /* run the main EVS decoding routine */ IF( EQ_16( hCoreCoder[0]->codec_mode, MODE1 ) ) { IF( hCoreCoder[0]->Opt_AMR_WB ) { -#ifdef EVS_FLOAT - IF( ( error = amr_wb_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0] ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + IF( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0] ) ) != IVAS_ERR_OK ) #else IF( ( error = amr_wb_dec_fx( output_16, hCoreCoder[0] ) ) != IVAS_ERR_OK ) #endif @@ -2869,8 +2891,8 @@ static ivas_error evs_dec_main( } ELSE { -#ifdef EVS_FLOAT - IF( ( error = evs_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + IF( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) #else IF( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) #endif @@ -2883,8 +2905,8 @@ static ivas_error evs_dec_main( { IF( EQ_16( hCoreCoder[0]->bfi, 0 ) ) { -#ifdef EVS_FLOAT - IF( ( error = evs_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + IF( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) #else IF( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) #endif @@ -2894,8 +2916,8 @@ static ivas_error evs_dec_main( } ELSE IF( EQ_16( hCoreCoder[0]->bfi, 2 ) ) { -#ifdef EVS_FLOAT - IF( ( error = evs_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + IF( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) #else IF( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) #endif @@ -2905,8 +2927,8 @@ static ivas_error evs_dec_main( } ELSE { -#ifdef EVS_FLOAT - IF( ( error = evs_dec_flt( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) +#ifndef IVAS_FLOAT_FIXED + IF( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], p_output[0], FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) #else IF( ( error = evs_dec_fx( hCoreCoder[0], output_16, FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) #endif @@ -2917,6 +2939,12 @@ static ivas_error evs_dec_main( } st_ivas->BER_detect = hCoreCoder[0]->BER_detect; +#ifdef IVAS_FLOAT_FIXED + FOR( Word16 i = 0; i < nOutSamples; i++ ) + { + p_output[0][i] = output_16[i]; + } +#endif IF( EQ_16( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { mixer_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; @@ -2924,12 +2952,7 @@ static ivas_error evs_dec_main( v_multc( p_output[0], mixer_rigth, p_output[1], nOutSamples ); v_multc( p_output[0], mixer_left, p_output[0], nOutSamples ); } -#ifndef EVS_FLOAT - FOR( Word16 i = 0; i < nOutSamples; i++ ) - { - p_output[0][i] = output_16[i]; - } -#endif + IF( !st_ivas->hDecoderConfig->Opt_tsm ) { ivas_jbm_dec_copy_tc_no_tsm( st_ivas, p_output, nOutSamples ); diff --git a/lib_dec/lsf_dec.c b/lib_dec/lsf_dec.c index 11ed2e25f79172fd3b9b06a47a50b2bbaaa9c643..01ab068f90fb01df72678f16857c9bbef27e114b 100644 --- a/lib_dec/lsf_dec.c +++ b/lib_dec/lsf_dec.c @@ -60,7 +60,7 @@ static void dqlsf_CNG( Decoder_State *st, float *lsf_q ); * * LSF decoder *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void lsf_dec( Decoder_State *st, /* i/o: State structure */ const int16_t tc_subfr, /* i : TC subframe index */ @@ -518,7 +518,7 @@ void lsf_end_dec( #ifdef IVAS_FLOAT_FIXED Word16 tdm_lsfQ_PCh_fx[M]; Word16 pred3_fx[M]; - for (int i = 0; i < M; i++) + for ( i = 0; i < M; i++) { tdm_lsfQ_PCh_fx[i] = (Word16)((tdm_lsfQ_PCh[i]) * 2.56f); pred3_fx[i] = (Word16)((pred3[i]) * 2.56f); @@ -526,7 +526,7 @@ void lsf_end_dec( tdm_SCh_LSF_intra_pred_fx(st->element_brate, tdm_lsfQ_PCh_fx, pred3_fx); - for (int i = 0; i < M; i++) + for (i = 0; i < M; i++) { pred3[i] = (pred3_fx[i]) / 2.56f; } diff --git a/lib_dec/lsf_dec_fx.c b/lib_dec/lsf_dec_fx.c index fff93a55edb23a160000efbbe1787ccf26ff6bb1..9fa9484c0e12603cb3e2235f2eb63a208bb97977 100644 --- a/lib_dec/lsf_dec_fx.c +++ b/lib_dec/lsf_dec_fx.c @@ -284,8 +284,6 @@ void lsf_dec_fx( Copy( lsp_mid, st_fx->lsp_old_fx, M ); lsp2lsf_fx( lsp_mid, st_fx->lsf_old_fx, M, st_fx->sr_core); } -#ifdef EVS_FLOAT -#if 1//def ADD_LRTD IF (EQ_16(tdm_low_rate_mode, 1) && GT_16(coder_type, UNVOICED)) { //PMT("To be verified") @@ -300,8 +298,6 @@ void lsf_dec_fx( int_lsp4_fx(st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, -2); } ELSE -#endif -#endif { /* LSP interpolation and conversion of LSPs to A(z) */ int_lsp4_fx(st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, st_fx->relax_prev_lsf_interp); @@ -878,23 +874,11 @@ void lsf_mid_dec_fx( ratio = tbl_mid_gen_wb_5b_fx; BREAK; } -#ifdef EVS_FLOAT -#if 1//def IVAS_CODE case 4: { ratio = tbl_mid_gen_wb_4b_fx; break; } -#endif -#else -#if IVAS_CODE - case 4: - { - ratio = tbl_mid_gen_wb_4b_fx; - break; - } -#endif -#endif // EVS_FLOAT case 2: { ratio = tbl_mid_gen_wb_2b_fx; diff --git a/lib_dec/nelp_dec.c b/lib_dec/nelp_dec.c index d65de698588b18808a0f7666bac52bb2932e3de6..4f0c346f122851394a4e14e2bcd315e3df87d5b3 100644 --- a/lib_dec/nelp_dec.c +++ b/lib_dec/nelp_dec.c @@ -47,7 +47,7 @@ * * NELP decoder *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void nelp_decoder( Decoder_State *st, /* i/o: decoder static memory */ float *exc_nelp, /* o : adapt. excitation/total exc*/ diff --git a/lib_dec/pitch_extr.c b/lib_dec/pitch_extr.c index 941f4711b205c8a84c75a142ac5f2e0bec613dcf..8f13c5d13ba9ead7300f9077b9de723547bde979 100644 --- a/lib_dec/pitch_extr.c +++ b/lib_dec/pitch_extr.c @@ -44,7 +44,7 @@ #include "basop_util.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------* * Pitch prediction for frame erasure using linear fitting * *-----------------------------------------------------------------*/ diff --git a/lib_dec/post_dec.c b/lib_dec/post_dec.c index 4b8d13eaacb251ad7cf62ecd15040b7d97533349..4d9270dfb1b716f9bbb73f440c169c1201929d5d 100644 --- a/lib_dec/post_dec.c +++ b/lib_dec/post_dec.c @@ -53,7 +53,7 @@ static void bass_pf_1sf_delay( float *syn, const int16_t *T_sf, const float *gai * * Perform post-processing *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void post_decoder_flt( Decoder_State *st, /* i/o: decoder memory state pointer */ float synth_buf[], @@ -340,7 +340,7 @@ static void bass_pf_1sf_delay( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * cldfb_synth_set_bandsToZero_flt() * diff --git a/lib_dec/post_dec_fx.c b/lib_dec/post_dec_fx.c index a6f1a1ca2f2500619f2cfab1f2949854375b39c1..ddc727b09d4bda5e7b1b6efe97ee066663015435 100644 --- a/lib_dec/post_dec_fx.c +++ b/lib_dec/post_dec_fx.c @@ -8,7 +8,7 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "basop_util.h" - +#ifdef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * Function prototypes @@ -85,8 +85,8 @@ void post_decoder( Copy( st->hPFstat->mem_pf_in+L_SYN_MEM-M, synth-M, M ); 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 ( synth, synth2, &st->hPFstat->gain_prec, L_SUBFR ); - blend_subfr2(synth2+L_SUBFR/2, synth+L_SUBFR/2, synth2+L_SUBFR/2); + 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); } } ELSE @@ -122,14 +122,14 @@ void post_decoder( st->hPFstat->on = 1; move16(); tmp_noise = 0; - nb_post_filt( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, GENERIC, st->BER_detect, tmp ); + nb_post_filt_fx( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, GENERIC, st->BER_detect, tmp ); } ELSE { st->hPFstat->on = 0; move16(); tmp_noise = 0; - nb_post_filt( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, AUDIO, st->BER_detect, tmp ); + 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); @@ -148,13 +148,13 @@ void post_decoder( { st->hPFstat->on = 1; move16(); - formant_post_filt( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); + formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); } ELSE { st->hPFstat->on = 0; move16(); - formant_post_filt( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); + formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); } } @@ -247,8 +247,8 @@ void post_decoder_ivas_fx( Word16 L_subfr = 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 ( synth, synth2, &st->hPFstat->gain_prec, L_subfr ); - blend_subfr2(synth2+L_subfr/2, synth+L_subfr/2, synth2+L_subfr/2); + 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); } } ELSE @@ -284,14 +284,14 @@ void post_decoder_ivas_fx( st->hPFstat->on = 1; move16(); tmp_noise = 0; - nb_post_filt( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, GENERIC, st->BER_detect, tmp ); + nb_post_filt_fx( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, GENERIC, st->BER_detect, tmp ); } ELSE { st->hPFstat->on = 0; move16(); tmp_noise = 0; - nb_post_filt( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, AUDIO, st->BER_detect, tmp ); + 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); @@ -310,13 +310,13 @@ void post_decoder_ivas_fx( { st->hPFstat->on = 1; move16(); - formant_post_filt( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); + formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); } ELSE { st->hPFstat->on = 0; move16(); - formant_post_filt( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); + formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); } } @@ -833,3 +833,4 @@ void cldfb_synth_set_bandsToZero( return; } +#endif \ No newline at end of file diff --git a/lib_dec/rst_dec.c b/lib_dec/rst_dec.c index f3b744c7be5b3756f996c27c703f60857b81aa9b..f84802ab10a86f8a53296acc13ad22673ebb486b 100644 --- a/lib_dec/rst_dec.c +++ b/lib_dec/rst_dec.c @@ -47,7 +47,7 @@ * * Reset decoder static variables in case of CNG frame *----------------------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void CNG_reset_dec( Decoder_State *st, /* i/o: decoder state structure */ float *pitch_buf, /* o : floating pitch for each subframe */ diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index ceec307b99261a08a913fa0298b0ba15ac499f1a..105e3349913ba96e7936c64d4a83489cc29b9ece 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -84,7 +84,7 @@ typedef struct Word16 olapBufferAna[FFTLEN]; Word16 olapBufferSynth2[FFTLEN]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msPeriodog_float[NPART_SHAPING]; /* Periodogram */ #endif Word32 msPeriodog[NPART_SHAPING]; /* Periodogram */ @@ -92,55 +92,55 @@ typedef struct Word16 msPeriodog_exp; /* Common exponent for fft and cldfb energies */ Word16 msPeriodog_exp_fft; Word16 msPeriodog_exp_cldfb; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msBminWin_float[NPART_SHAPING]; #endif Word32 msBminWin[NPART_SHAPING]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msBminSubWin_float[NPART_SHAPING]; #endif Word32 msBminSubWin[NPART_SHAPING]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msPsd_float[NPART_SHAPING]; /* Power Spectral Density estimate (i.e., smoothed periodogram) */ #endif Word16 msPsd[NPART_SHAPING]; /* Power Spectral Density estimate (i.e., smoothed periodogram) */ Word32 msPsd_fx[NPART_SHAPING]; /* Power Spectral Density estimate (i.e., smoothed periodogram) */ Word16 msPsd_exp_fft; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msAlpha_float[NPART_SHAPING]; /* Optimal smoothing parameter */ #endif Word32 msAlpha[NPART_SHAPING]; /* Optimal smoothing parameter */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msMinBuf_float[MSNUMSUBFR * NPART_SHAPING]; /* Buffer of minima */ #endif Word32 msMinBuf[MSNUMSUBFR*NPART_SHAPING]; /* Buffer of minima */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msCurrentMinOut_float[NPART_SHAPING]; #endif Word32 msCurrentMinOut[NPART_SHAPING]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msCurrentMin_float[NPART_SHAPING]; #endif Word32 msCurrentMin[NPART_SHAPING]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msCurrentMinSubWindow_float[NPART_SHAPING]; #endif Word32 msCurrentMinSubWindow[NPART_SHAPING]; int16_t msLocalMinFlag[NPART_SHAPING]; int16_t msNewMinFlag[NPART_SHAPING]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msPsdFirstMoment_float[NPART_SHAPING]; #endif Word16 msPsdFirstMoment[NPART_SHAPING]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msPsdSecondMoment_float[NPART_SHAPING]; #endif Word32 msPsdSecondMoment[NPART_SHAPING]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msNoiseFloor_float[NPART_SHAPING]; /* Estimated noise floor */ #endif Word16 msNoiseFloor[NPART_SHAPING]; /* Estimated noise floor */ @@ -149,11 +149,11 @@ typedef struct Word32 msNoiseEst[NPART_SHAPING]; /* Estimated noise level */ Word16 msNoiseEst_exp; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msLogPeriodog_float[NPART_SHAPING]; /* Periodogram */ #endif Word16 msLogPeriodog[NPART_SHAPING]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msLogNoiseEst_float[NPART_SHAPING]; /* Estimated noise level */ #endif Word16 msLogNoiseEst[NPART_SHAPING]; @@ -163,45 +163,47 @@ typedef struct int16_t part_shaping[NPART_SHAPING]; /* Partition upper boundaries (band indices starting from 0) */ int16_t midband_shaping[NPART_SHAPING]; /* Central band of each partition */ - float psize_shaping_float[NPART_SHAPING]; /* Partition sizes */ Word16 psize_shaping[NPART_SHAPING]; /* Partition sizes */ Word16 psize_shaping_norm[NPART_SHAPING]; /* Partition sizes, fractional variable */ Word16 psize_shaping_norm_exp; /* Partition sizes exponent for fractional variable */ - float psize_inv_shaping_float[NPART_SHAPING]; /* Inverse of partition sizes */ Word16 psize_inv_shaping[NPART_SHAPING]; /* Inverse of partition sizes */ - + +#ifndef IVAS_FLOAT_FIXED + float psize_shaping_float[NPART_SHAPING]; /* Partition sizes */ + float psize_inv_shaping_float[NPART_SHAPING]; /* Inverse of partition sizes */ float bandNoiseShape_float[FFTLEN2]; /* CNG spectral shape computed at the decoder */ +#endif Word32 bandNoiseShape[FFTLEN2]; /* CNG spectral shape computed at the decoder */ Word16 bandNoiseShape_exp; /* exponent of bandNoiseShape */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float partNoiseShape_float[NPART]; /* CNG spectral shape computed at the decoder */ #endif Word32 partNoiseShape[NPART]; /* CNG spectral shape computed at the decoder */ Word16 partNoiseShape_exp; /* exponent of partNoiseShape */ +#ifndef IVAS_FLOAT_FIXED float smoothed_psd[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) float msPeriodog_ST[NPART_SHAPING]; /* stereo CNA - short-term periodogram */ #endif Word32 msPeriodog_ST_fx[NPART_SHAPING]; /* stereo CNA - short-term periodogram */ Word16 msPeriodog_ST_exp; /* exponent of stereo CNA - short-term periodogram */ int16_t ms_last_inactive_bwidth; /* stereo CNA - bandwidth from the last inactive frame */ int16_t ms_cnt_bw_up; /* stereo CNA - downward counter of frames since the last NB->WB switch */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ #endif Word16 cna_LR_LT_fx; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ #endif Word16 cna_ILD_LT_fx; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ float cna_cm[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ #endif @@ -210,28 +212,28 @@ typedef struct int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ int16_t cna_band_limits[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ #endif int16_t cna_seed; /* stereo CNA - seed for random CN generator */ int16_t flag_dtx_mode; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lp_speech_float; #endif Word32 lp_speech; /* format: Q9.23 */ Word16 q_lp_speech; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lp_noise_float; #endif Word32 lp_noise; /* format: Q9.23 */ Word16 q_lp_noise; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float msPeriodogBuf_float[MSBUFLEN * NPART_SHAPING]; #endif Word16 msPeriodogBuf[MSBUFLEN*NPART_SHAPING]; @@ -266,44 +268,44 @@ typedef struct int16_t Transient[MAX_POST_LEN]; int16_t TCX_Tonality[DEC_STATE_LEN]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float outx_new_n1; #endif Word16 outx_new_n1_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float nsapp_gain; #endif Word16 nsapp_gain_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float nsapp_gain_n; #endif Word16 nsapp_gain_n_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float data_reci2[L_FRAME_MAX]; #endif Word32 data_reci2_fx[L_FRAME_MAX]; Word16 data_reci2_scale; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float data_noise_float[L_FRAME_MAX]; #endif Word16 data_noise[L_FRAME_MAX]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ener_mean; #endif Word32 ener_mean_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ener; #endif Word32 ener_fx; int16_t zp; Word16 zp_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float recovery_gain_float; #endif Word16 recovery_gain; /*outside waveformadjustment: Q14 - insinde waveformadjustment: Q15*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float step_concealgain; #endif Word16 step_concealgain_fx; @@ -356,24 +358,25 @@ typedef struct Word16 phaseDiff[MAX_NUMBER_OF_IDX]; // Q12 /* This one can be stored with 16 bits in range 0..2*PI */ Word16 phase_currentFramePredicted[MAX_NUMBER_OF_IDX*GROUP_LENGTH]; // Q13 /* This one can be stored with 16 bits in range [-pi;pi] 2Q13, but the code has to be adapted to use moduo(2*PI) after adding */ - +#ifndef IVAS_FLOAT_FIXED Float32 phaseDiff_float[MAX_NUMBER_OF_IDX]; /* This one can be stored with 16 bits in range 0..2*PI */ Float32 phase_currentFramePredicted_float[MAX_NUMBER_OF_IDX * GROUP_LENGTH]; /* This one can be stored with 16 bits in range 0..2*PI, but the code has to be adapted to use moduo(2*PI) after adding */ +#endif } TonalComponentsInfo; -typedef struct -{ - Word16 numIndexes; - Word16 indexOfTonalPeak[MAX_NUMBER_OF_IDX]; - Word16 lowerIndex[MAX_NUMBER_OF_IDX]; - Word16 upperIndex[MAX_NUMBER_OF_IDX]; - - Word16 phaseDiff[MAX_NUMBER_OF_IDX]; // Q12 /* This one can be stored with 16 bits in range 0..2*PI */ - - Word16 phase_currentFramePredicted[MAX_NUMBER_OF_IDX*GROUP_LENGTH]; // Q13 /* This one can be stored with 16 bits in range [-pi;pi] 2Q13, but the code has to be adapted to use moduo(2*PI) after adding */ - -} TonalComponentsInfo_fix; +//typedef struct +//{ +// Word16 numIndexes; +// Word16 indexOfTonalPeak[MAX_NUMBER_OF_IDX]; +// Word16 lowerIndex[MAX_NUMBER_OF_IDX]; +// Word16 upperIndex[MAX_NUMBER_OF_IDX]; +// +// Word16 phaseDiff[MAX_NUMBER_OF_IDX]; // Q12 /* This one can be stored with 16 bits in range 0..2*PI */ +// +// Word16 phase_currentFramePredicted[MAX_NUMBER_OF_IDX*GROUP_LENGTH]; // Q13 /* This one can be stored with 16 bits in range [-pi;pi] 2Q13, but the code has to be adapted to use moduo(2*PI) after adding */ +// +//} TonalComponentsInfo_fix; typedef struct tonalmdctconceal { @@ -384,63 +387,64 @@ typedef struct tonalmdctconceal int16_t nNonZeroSamples; int16_t nScaleFactors; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lastPitchLag_float; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word32 lastPitchLag; blockData lastBlockData; blockData secondLastBlockData; - Float32 scaleFactorsBuffers_float[2][FDNS_NPTS]; /* Contains also global gain. If it can not be stored in 16 bits with global gain included, then store global gain separately. */ Word16 scaleFactorsBuffers[2][FDNS_NPTS]; /* Contains also global gain. */ Word16 scaleFactorsBuffers_exp[2][FDNS_NPTS]; - Float32 spectralDataBuffers_float[2][L_FRAME_MAX]; /* 16 bits is enough, because it is stored before applying scale factors. Take care that power spectrum is also stored here. */ Word16 spectralDataBuffers[2][L_FRAME_MAX]; /* 16 bits is enough, because it is stored before applying scale factors. Take care that power spectrum is also stored here. */ - Float32 timeDataBuffer_float[( 3 * L_FRAME_MAX ) / 2]; Word16 timeDataBuffer[(3 * L_FRAME_MAX) / 2]; /* 16 bits are enough for the TD signal */ - +#ifndef IVAS_FLOAT_FIXED + Float32 scaleFactorsBuffers_float[2][FDNS_NPTS]; /* Contains also global gain. If it can not be stored in 16 bits with global gain included, then store global gain separately. */ + Float32 spectralDataBuffers_float[2][L_FRAME_MAX]; /* 16 bits is enough, because it is stored before applying scale factors. Take care that power spectrum is also stored here. */ + Float32 timeDataBuffer_float[( 3 * L_FRAME_MAX ) / 2]; Float32 *lastPcmOut_float; + Float32 *secondLastPcmOut_float; +#endif Word16 * lastPcmOut; - Float32 *secondLastPcmOut_float; Word16 * secondLastPcmOut; - float *secondLastPowerSpectrum_float; Word16 * secondLastPowerSpectrum; Word16 secondLastPowerSpectrum_exp; - float scaleFactorsBackground_flt[FDNS_NPTS]; - Word16 scaleFactorsBackground[FDNS_NPTS]; + //Word16 scaleFactorsBackground[FDNS_NPTS]; Word32 scaleFactorsBackground_fx[FDNS_NPTS]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED + float *secondLastPowerSpectrum_float; + float scaleFactorsBackground_flt[FDNS_NPTS]; float scf_fadeout_flt; #endif Word16 scf_fadeout; PsychoacousticParameters *psychParams; PsychoacousticParameters psychParamsTCX20; PsychoacousticParameters psychParamsTCX10; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float last_block_nrg_flt; #endif Word32 last_block_nrg; Word16 last_block_nrg_exp; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float curr_noise_nrg_flt; #endif Word32 curr_noise_nrg; Word16 curr_noise_nrg_exp; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float faded_signal_nrg_flt; #endif Word32 faded_signal_nrg; Word16 faded_signal_nrg_exp; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float nFramesLost_float; #endif Word16 nFramesLost; @@ -448,8 +452,9 @@ typedef struct tonalmdctconceal //Memory ovelap issue #endif TonalComponentsInfo *pTCI; +#ifndef IVAS_FLOAT_FIXED TonalComponentsInfo pTCI1; - +#endif } TonalMDCTConceal_INSTANCE, *TonalMDCTConcealPtr; @@ -483,13 +488,13 @@ typedef struct igfdec_private_data_struct IGF_INFO igfInfo; /* envelope reconstruction: */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float igf_sN_float[IGF_MAX_SFB]; /* only with short blocks as static needed */ #endif Word32 igf_sN[IGF_MAX_SFB]; /* Q31 | only with short blocks as static needed */ Word16 igf_sN_e[IGF_MAX_SFB]; /* | exponent for igf_sN */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float igf_pN_float[IGF_MAX_SFB]; /* only with short blocks as static needed */ #endif Word32 igf_pN[IGF_MAX_SFB]; /* Q31 | only with short blocks as static needed */ @@ -503,7 +508,7 @@ typedef struct igfdec_private_data_struct int16_t igf_flatteningTrigger_subframe[IGF_MAX_SUBFRAMES]; /* spectral whitening: */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float *pSpecFlat_float; float pSpecFlatBuf[IGF_START_MX]; #endif @@ -517,7 +522,7 @@ typedef struct igfdec_private_data_struct int16_t prevWhiteningLevel[IGF_MAX_TILES]; /* needed for concealment */ int16_t currWhiteningLevel_subframe[IGF_MAX_SUBFRAMES][IGF_MAX_TILES]; int16_t prevWhiteningLevel_subframe[IGF_MAX_SUBFRAMES][IGF_MAX_TILES]; /* needed for concealment */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float totalNoiseNrg_float; #endif Word32 totalNoiseNrg; @@ -527,7 +532,7 @@ typedef struct igfdec_private_data_struct Word16 headroom_TCX_noise_white; Word16 headroom_TCX_noise; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float totalNoiseNrg_off_float; #endif Word32 totalNoiseNrg_off; @@ -556,7 +561,7 @@ typedef struct igfdec_instance_struct Word16 infoTCXNoise_evs[IGF_START_MX]; int16_t *flag_sparse; int16_t flag_sparseBuf[N_MAX_TCX - IGF_START_MN]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float *virtualSpec_float; // needed in MCT path float virtualSpecBuf[N_MAX_TCX - IGF_START_MN]; #endif @@ -576,7 +581,7 @@ typedef struct igfdec_instance_struct typedef struct tec_dec_structure { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float pGainTemp[CLDFB_NO_COL_MAX]; float loBuffer_flt[CLDFB_NO_COL_MAX + MAX_TEC_SMOOTHING_DEG]; #endif @@ -599,7 +604,7 @@ typedef struct tcx_ltp_dec_structure { /* TCX-LTP */ int16_t tcxltp; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float tcxltp_gain_float; #endif Word16 tcxltp_gain; @@ -625,9 +630,9 @@ typedef struct tcx_ltp_dec_structure int16_t tcxltp_pitch_int_post_prev; int16_t tcxltp_pitch_fr_post_prev; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float tcxltp_gain_post_prev_float; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 tcxltp_gain_post_prev; int16_t tcxltp_filt_idx_prev; @@ -645,10 +650,10 @@ typedef struct tcx_dec_structure int16_t envWeighted; /* are is{p,f}_old[] weighted or not? */ /* tonal PLC */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float tcxltp_second_last_pitch_float; float tcxltp_third_last_pitch_float; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word32 tcxltp_second_last_pitch; Word32 tcxltp_third_last_pitch; @@ -663,43 +668,59 @@ typedef struct tcx_dec_structure int16_t pit_max_TCX; int16_t L_frameTCX; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_excFB[L_FRAME48k]; /* old excitation FB */ #endif Word16 old_excFB_fx[L_FRAME48k]; /* old excitation FB */ int16_t old_synth_len; int16_t old_synth_lenFB; - +#ifndef IVAS_FLOAT_FIXED float old_synth_float[OLD_SYNTH_INTERNAL_DEC]; /* synthesis memory */ +#endif Word16 old_synth[OLD_SYNTH_INTERNAL_DEC]; /* synthesis memory */ - +#ifndef IVAS_FLOAT_FIXED float synth_history[L_PROT48k + L_FRAME_MAX]; /* unified synthesis memory */ +#endif Word16 synth_history_fx[L_PROT48k + L_FRAME_MAX]; /*TCX unified synthesis memory */ Word16 q_synth_history_fx; +#ifndef IVAS_FLOAT_FIXED float *old_synthFB; +#endif Word16* old_synthFB_fx; - +#ifndef IVAS_FLOAT_FIXED float *prev_good_synth; +#endif Word16* prev_good_synth_fx; - +#ifndef IVAS_FLOAT_FIXED float old_syn_Overl_float[L_FRAME32k / 2]; +#endif Word16 old_syn_Overl[L_FRAME32k / 2]; Word32 old_syn_Overl_32[L_FRAME32k / 2]; Word16 Q_old_syn_Overl; +#ifndef IVAS_FLOAT_FIXED float syn_Overl_TDAC_float[L_FRAME32k / 2]; +#endif Word16 syn_Overl_TDAC[L_FRAME32k / 2]; Word16 Q_syn_Overl_TDAC; +#ifndef IVAS_FLOAT_FIXED float syn_Overl_TDACFB_float[L_FRAME_MAX / 2]; +#endif Word16 syn_Overl_TDACFB[L_FRAME_MAX / 2]; Word16 Q_syn_Overl_TDACFB; +#ifndef IVAS_FLOAT_FIXED float syn_Overl_float[L_FRAME32k / 2]; +#endif Word16 syn_Overl[L_FRAME32k / 2]; Word16 Q_syn_Overl; +#ifndef IVAS_FLOAT_FIXED float syn_OverlFB_float[L_FRAME_MAX / 2]; +#endif Word16 syn_OverlFB[L_FRAME_MAX / 2]; Word16 Q_syn_OverlFB; +#ifndef IVAS_FLOAT_FIXED float FBTCXdelayBuf_float[111]; /* 2.3125ms at 48kHz -> 111 samples */ +#endif Word16 FBTCXdelayBuf[111]; /* 2.3125ms at 48kHz -> 111 samples */ Word32 FBTCXdelayBuf_32[111]; /* 2.3125ms at 48kHz -> 111 samples */ @@ -710,18 +731,18 @@ typedef struct tcx_dec_structure /* PLC */ int16_t noise_filling_index[NB_DIV]; /* PLC - last decoded noise filling index */ int16_t tnsActive[NB_DIV]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ltpGainMemory[N_LTP_GAIN_MEMS]; /* for smoothing noiseTransWidth */ #endif Word16 ltpGainMemory_fx[N_LTP_GAIN_MEMS]; /* Q15 */ uint16_t kernel_type[2]; /* transform kernel type in each subframe (MDCT or MDST) */ int16_t prev_widow_left_rect; - float CngLevelBackgroundTrace_bfi; /* PLC - long term gain estimate for background level, used for PLC fade out */ - Word32 CngLevelBackgroundTrace_bfi_fx; /* PLC - long term gain estimate for background level, used for PLC fade out */ - Word16 CngLevelBackgroundTrace_bfi_exp; + //Word32 CngLevelBackgroundTrace_bfi_fx; /* PLC - long term gain estimate for background level, used for PLC fade out */ + //Word16 CngLevelBackgroundTrace_bfi_exp; /* state variables for the minimum statistics used for PLC */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED + float CngLevelBackgroundTrace_bfi; /* PLC - long term gain estimate for background level, used for PLC fade out */ float NoiseLevelMemory_bfi[PLC_MIN_STAT_BUFF_SIZE]; #endif #ifdef IVAS_FLOAT_FIXED @@ -732,7 +753,7 @@ typedef struct tcx_dec_structure Word16 conCngLevelBackgroundTrace; /* Q15 long term gain estimate for background level, used for PLC fade out */ Word16 conCngLevelBackgroundTrace_e; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float LastFrameLevel_bfi; #endif #ifdef IVAS_FLOAT_FIXED @@ -743,7 +764,7 @@ typedef struct tcx_dec_structure Word16 conNoiseLevelIndex; /*Q0*/ Word16 conCurrLevelIndex; /*Q0*/ Word16 conLastFrameLevel, conLastFrameLevel_e;/*Q15*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_gaintcx_bfi_float; float conceal_eof_gain_float; #endif @@ -753,22 +774,22 @@ typedef struct tcx_dec_structure #ifdef IVAS_FLOAT_FIXED //Word32 conceal_eof_gain32; /*have been created for further calculation */ #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float damping_float; #endif Word16 damping; /* 1Q14 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float gainHelper_float; #endif Word16 gainHelper, gainHelper_e; /*can be >1*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float stepCompensate_float; #endif Word16 stepCompensate, stepCompensate_e; int16_t tcxConceal_recalc_exc; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float cummulative_damping_tcx_float; #endif Word16 cummulative_damping_tcx; @@ -789,7 +810,7 @@ typedef struct gsc_dec_structure int16_t cor_strong_limit; /* AC mode (GSC) - Indicator about high spectral correlation per band */ //Word16 cor_strong_limit; /* AC mode (GSC) - Indicator about high spectral correlation per band */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_y_gain[MBANDS_GN16k]; /* AC mode (GSC) - AR mem for low rate gain quantization */ #endif Word16 old_y_gain_fx[MBANDS_GN16k]; /* AC mode (GSC) - AR mem for low rate gain quantization */ @@ -797,17 +818,17 @@ typedef struct gsc_dec_structure int16_t noise_lev; /* AC mode (GSC) - noise level */ //Word16 noise_lev; /* AC mode (GSC) - noise level Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lt_ener_per_band[MBANDS_GN16k]; #endif Word16 lt_ener_per_band_fx[MBANDS_GN16k]; /* Q12 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float Last_frame_ener; /* AC mode (GSC) - last frame energy */ #endif Word32 Last_frame_ener_fx; /* AC mode (GSC) - last frame energy */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float Last_GSC_spectrum[L_FRAME16k]; /* AC mode (GSC) - Last good GSC spectrum */ #endif Word16 Last_GSC_spectrum_fx[L_FRAME16k]; /* AC mode (GSC) - Last good GSC spectrum */ @@ -815,12 +836,12 @@ typedef struct gsc_dec_structure int16_t Last_GSC_pit_band_idx; /* AC mode (GSC) - Last pitch band index */ //Word16 Last_GSC_pit_band_idx; /* AC mode (GSC) - Last pitch band index Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float last_exc_dct_in[L_FRAME16k]; /* AC mode (GSC) - previous excitation */ #endif Word16 last_exc_dct_in_fx[L_FRAME16k]; /* AC mode (GSC) - previous excitation */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float last_ener; /* AC mode (GSC) - previous energy */ #endif Word16 last_ener_fx; /* AC mode (GSC) - previous energy */ @@ -838,12 +859,12 @@ typedef struct gsc_dec_structure typedef struct WI_dec_structure { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_exc2[L_EXC_MEM]; /* FEC - old excitation2 used in fast recovery */ #endif Word16 old_exc2_fx[L_EXC_MEM]; /* FEC - old excitation2 used in fast recovery */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_syn2[L_EXC_MEM]; /* FEC - old syn speech used in fast recovery */ #endif Word16 old_syn2_fx[L_EXC_MEM]; /* FEC - old syn speech used in fast recovery */ @@ -861,7 +882,7 @@ typedef struct WI_dec_structure typedef struct ld_music_postfilt_structure { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float LDm_mem_etot; /* LD music post-filter - total energy memory */ #endif Word16 LDm_mem_etot_fx; /* LD music post-filter - total energy memory */ @@ -875,37 +896,37 @@ typedef struct ld_music_postfilt_structure int16_t LDm_nb_thr_3; //Word16 LDm_nb_thr_3; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float dct_post_old_exc[DCT_L_POST - OFFSET2]; #endif Word16 dct_post_old_exc_fx[DCT_L_POST - OFFSET2]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float LDm_thres[4]; /* LD music post-filter - Classification threshold */ #endif Word16 LDm_thres_fx[4]; /* LD music post-filter - Classification threshold */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float LDm_lt_diff_etot[MAX_LT]; /* LD music post-filter - long-term total energy variation */ #endif Word16 LDm_lt_diff_etot_fx[MAX_LT]; /* LD music post-filter - long-term total energy variation */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float LDm_enh_lp_gbin[VOIC_BINS_HR]; /* LD music post-filter - smoothed suppression gain, per bin FFT */ #endif Word16 LDm_enh_lp_gbin_fx[VOIC_BINS_HR]; /* LD music post-filter - smoothed suppression gain, per bin FFT */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float LDm_enh_lf_EO[VOIC_BINS_HR]; /* LD music post-filter - old per bin E for previous half frame */ #endif Word32 LDm_enh_lf_EO_fx[VOIC_BINS_HR]; /* LD music post-filter - old per bin E for previous half frame */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float LDm_enh_min_ns_gain; /* LD music post-filter - minimum suppression gain */ #endif Word16 LDm_enh_min_ns_gain_fx; /* LD music post-filter - minimum suppression gain */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float LDm_bckr_noise[MBANDS_GN_LD]; /* LD music post-filter - background noise estimation per critical band */ #endif Word32 LDm_bckr_noise_fx[MBANDS_GN_LD]; /* LD music post-filter - background noise estimation per critical band */ @@ -927,17 +948,17 @@ typedef struct ld_music_postfilt_structure typedef struct bass_postfilt_structure { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float pst_old_syn[NBPSF_PIT_MAX]; /* Bass post-filter - old synthesis buffer 1 */ #endif Word16 pst_old_syn_fx[NBPSF_PIT_MAX]; /* Bass post-filter - old synthesis buffer 1 Q_syn2-1*/ Word16 q_pst_old_syn; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float pst_mem_deemp_err; /* Bass post-filter - filter memory of noise LP filter */ #endif Word16 pst_mem_deemp_err_fx; /* Bass post-filter - filter memory of noise LP filter Q_syn2-1*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float pst_lp_ener; /* Bass post-filter - long-term energy */ #endif Word16 pst_lp_ener_fx; /* Bass post-filter - long-term energy Q8*/ @@ -947,11 +968,11 @@ typedef struct bass_postfilt_structure int16_t vibrato_hist[L_TRACK_HIST]; /* Bass post-filter - History of frames declared as vibrato */ //Word16 vibrato_hist[L_TRACK_HIST]; /* Bass post-filter - History of frames declared as vibrato */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float psf_att; /* Bass post-filter - post filter attenuation factor */ #endif Word16 psf_att_fx; /* Bass post-filter - post filter attenuation factor */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_mean_pit[L_TRACK_HIST]; /* Bass post-filter - average pitch memory */ #endif Word16 mem_mean_pit_fx[L_TRACK_HIST]; /* Bass post-filter - average pitch memory */ @@ -969,7 +990,7 @@ typedef struct td_cng_dec_structure { int16_t cng_seed; /* DTX/CNG - seed for white noise random generator */ // Word16 cng_seed; /*CNG and DTX - seed for white noise random generator*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float Enew; /* DTX/CNG - decoded residual energy */ #endif Word32 Enew_fx; /* CNG and DTX - decoded residual energy Q6*/ @@ -994,15 +1015,15 @@ typedef struct td_cng_dec_structure int32_t ho_sid_bw; /* DTX/CNG - SID bandwidth flags */ //Word32 ho_sid_bw; /* CNG and DTX - SID bandwidth flags */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ho_lsp_hist[HO_HIST_SIZE * M]; /* DTX/CNG - old LSP buffer for averaging */ #endif Word16 ho_lsp_hist_fx[HO_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ho_ener_hist[HO_HIST_SIZE]; /* DTX/CNG - energy buffer for averaging */ #endif Word32 ho_ener_hist_fx[HO_HIST_SIZE]; /* CNG and DTX - energy buffer for averaging */ /*Q6 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ho_env_hist[HO_HIST_SIZE * NUM_ENV_CNG]; #endif Word32 ho_env_hist_fx[HO_HIST_SIZE * NUM_ENV_CNG]; @@ -1017,15 +1038,15 @@ typedef struct td_cng_dec_structure int16_t ho_circ_ptr; /* DTX/CNG - pointer for averaging buffers */ //Word16 ho_circ_ptr; /* CNG and DTX - pointer for averaging buffers */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ho_lsp_circ[HO_HIST_SIZE * M]; /* DTX/CNG - old LSP buffer for averaging */ #endif Word16 ho_lsp_circ_fx[HO_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ho_ener_circ[HO_HIST_SIZE]; /* DTX/CNG - energy buffer for averaging */ #endif Word32 ho_ener_circ_fx[HO_HIST_SIZE]; /* CNG and DTX - energy buffer for averaging */ /* Q6 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ho_env_circ[HO_HIST_SIZE * NUM_ENV_CNG]; #endif Word32 ho_env_circ_fx[HO_HIST_SIZE * NUM_ENV_CNG]; @@ -1040,24 +1061,24 @@ typedef struct td_cng_dec_structure int16_t act_cnt2; /* DTX/CNG - counter of active frames for CNG_mode switching */ // Word16 act_cnt2; /* DTX/CNG - counter of active frames for CNG_mode switching */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_env[20]; #endif Word32 old_env_fx[20]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lp_env[20]; #endif Word32 lp_env_fx[20]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float exc_mem[24]; #endif Word16 exc_mem_fx[24]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float exc_mem1[30]; #endif Word16 exc_mem1_fx[30]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float interpol_3_2_cng_dec[INTERP_3_2_MEM_LEN]; /* SWB DTX/CNG parameters */ @@ -1066,17 +1087,17 @@ typedef struct td_cng_dec_structure float shb_lpcCNG[LPC_SHB_ORDER + 1]; #endif Word16 shb_lpcCNG_fx[LPC_SHB_ORDER + 1]; /* Assumed in Q12 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float shb_cng_gain; #endif Word16 shb_cng_gain_fx; /* Assumed in Q8 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float wb_cng_ener; float last_wb_cng_ener; float last_shb_cng_ener; #endif int16_t swb_cng_seed; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lsp_shb_prev_prev[LPC_SHB_ORDER]; float lsp_shb_prev[LPC_SHB_ORDER]; #endif @@ -1097,7 +1118,7 @@ typedef struct td_cng_dec_structure #endif int16_t burst_cnt; //Word16 burst_cnt; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float last_shb_ener; #endif #ifdef IVAS_FLOAT_FIXED @@ -1122,11 +1143,11 @@ typedef struct sc_vbr_dec_structure //Word16 firstTime_voiceddec; /*Q0*/ /* DTFS variables */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float dtfs_dec_a[MAXLAG_WI]; #endif Word16 dtfs_dec_a_fx[MAXLAG_WI]; /*Variable Q format in dtfs_dec_Q*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float dtfs_dec_b[MAXLAG_WI]; #endif Word16 dtfs_dec_b_fx[MAXLAG_WI]; /*Variable Q format in dtfs_dec_Q*/ @@ -1140,27 +1161,27 @@ typedef struct sc_vbr_dec_structure int16_t dtfs_dec_nH_4kHz; //Word16 dtfs_dec_nH_4kHz; /*Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float dtfs_dec_upper_cut_off_freq_of_interest; #endif Word16 dtfs_dec_upper_cut_off_freq_of_interest_fx; /*Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float dtfs_dec_upper_cut_off_freq; #endif Word16 dtfs_dec_upper_cut_off_freq_fx; /*Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ph_offset_D; #endif Word16 ph_offset_D_fx; /* normalized by 2Pi Q15*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lastLgainD; /* previous gain value for the low band */ #endif Word16 lastLgainD_fx; /* previous gain value for the low band Q11*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lastHgainD; /* previous gain value for the high band */ #endif Word16 lastHgainD_fx; /* previous gain value for the high band Q11 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lasterbD[NUM_ERB_WB]; /* previous amplitude spectrum (ERB) */ #endif Word16 lasterbD_fx[NUM_ERB_WB]; /* previous amplitude spectrum (ERB) Q13*/ @@ -1168,24 +1189,24 @@ typedef struct sc_vbr_dec_structure Word16 dtfs_dec_Q; /*Q0*/ /* NELP decoder variables */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float bp1_filt_mem_nb_dec[14]; #endif Word32 bp1_filt_mem_nb_dec_fx[14]; /* qfm currently Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float bp1_filt_mem_wb_dec[8]; #endif Word16 bp1_filt_mem_wb_dec_fx[8]; /* qfm currently Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float shape1_filt_mem_dec[20]; #endif Word16 shape1_filt_mem_dec_fx[10]; /* qfm currently Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float shape2_filt_mem_dec[20]; #endif Word16 shape2_filt_mem_dec_fx[10]; /* qfm currently Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float shape3_filt_mem_dec[20]; #endif Word16 shape3_filt_mem_dec_fx[10]; /* qfm currently Q0*/ @@ -1209,7 +1230,7 @@ typedef struct hq_nbfec_structure int16_t prev_last_core; /* !!! note: the parameter is identical to last_core in IVAS */ //Word16 prev_last_core; /* !!! note: the parameter is identical to last_core in IVAS */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float diff_energy; #endif Word16 diff_energy_fx; @@ -1230,27 +1251,27 @@ typedef struct hq_nbfec_structure int16_t old_Min_ind; //Word16 old_Min_ind; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_auOut_2fr[L_FRAME8k * 2]; #endif Word16 old_auOut_2fr_fx[L_FRAME8k * 2]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_out_pha[2][N_LEAD_NB]; /* FEC for HQ Core, 0-phase matching old_out, 1-overlapping original old_out and phase matching old_out*/ #endif Word16 old_out_pha_fx[2][N_LEAD_NB]; /* FEC for HQ Core, 0-phase matching old_out, 1-overlapping original old_out and phase matching old_out*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float ynrm_values[MAX_SB_NB][MAX_PGF]; #endif Word32 ynrm_values_fx[MAX_SB_NB][MAX_PGF]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float r_p_values[MAX_SB_NB][MAX_ROW]; #endif Word32 r_p_values_fx[MAX_SB_NB][MAX_ROW]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float Norm_gain[SFM_N_NB]; #endif Word16 Norm_gain_fx[SFM_N_NB]; @@ -1262,7 +1283,7 @@ typedef struct hq_nbfec_structure int16_t HQ_FEC_seed; //Word16 HQ_FEC_seed; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float energy_MA_Curr[2]; #endif Word16 energy_MA_Curr_fx[2]; @@ -1273,17 +1294,17 @@ typedef struct hq_nbfec_structure int16_t prev_sign_switch_2[HQ_FEC_SIGN_SFM]; //Word16 prev_sign_switch_2[HQ_FEC_SIGN_SFM]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_coeffs[L_FRAME8k]; /* HQ core - old coefficients (for FEC) */ #endif Word32 old_coeffs_fx[L_FRAME8k]; /* HQ core - old coefficients (for FEC) */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float oldIMDCTout[L_FRAME8k / 2]; #endif Word32 oldIMDCTout_fx[L_FRAME8k / 2]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_oldauOut[L_FRAME8k]; #endif Word16 prev_oldauOut_fx[L_FRAME8k]; @@ -1335,7 +1356,7 @@ typedef struct hq_dec_structure //int16_t no_att_hangover; Word16 no_att_hangover; /* Q0 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float energy_lt; #endif Word32 energy_lt_fx; /* Q13 */ @@ -1343,7 +1364,7 @@ typedef struct hq_dec_structure //int16_t hq_generic_seed; Word16 hq_generic_seed; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_noise_level[2]; #endif Word16 prev_noise_level_fx[2]; /* Q15 */ @@ -1354,7 +1375,7 @@ typedef struct hq_dec_structure //int16_t prev_R; /* the table of bit allocation of last frame */ Word16 prev_R; /* the table of bit allocation of last frame */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_coeff_out[L_HQ_WB_BWE]; /* the highest coefficients of last frame */ #endif int16_t prev_SWB_peak_pos[SPT_SHORTEN_SBNUM]; @@ -1365,17 +1386,18 @@ typedef struct hq_dec_structure //int16_t HqVoicing; Word16 HqVoicing; - +#ifndef IVAS_FLOAT_FIXED float fer_samples[L_FRAME48k]; +#endif Word16 fer_samples_fx[L_FRAME48k]; Word16 Q_fer_samples; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_normq[SFM_N_WB]; /* previous norms */ #endif Word32 prev_normq_fx[SFM_N_WB]; /* Q14 */ /* previous norms */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_env[SFM_N_WB]; /* previous noise envelopes */ #endif Word32 prev_env_fx[SFM_N_WB]; /* previous noise envelopes */ @@ -1383,12 +1405,12 @@ typedef struct hq_dec_structure Word16 prev_env_Q[SFM_N_WB]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float last_ni_gain[BANDS_MAX]; #endif Word32 last_ni_gain_fx[BANDS_MAX]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float last_env[BANDS_MAX]; #endif Word16 last_env_fx[BANDS_MAX]; @@ -1397,32 +1419,32 @@ typedef struct hq_dec_structure Word16 last_max_pos_pulse; /* pre-echo reduction */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float memfilt_lb; #endif Word16 memfilt_lb_fx; /* Q0 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mean_prev_hb; #endif Word32 mean_prev_hb_fx; /* Q0 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float smoothmem; #endif Word16 smoothmem_fx; /* Q15 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mean_prev; #endif Word32 mean_prev_fx; /* Q0 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mean_prev_nc; #endif Word32 mean_prev_nc_fx; /* Q0 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float wmold_hb; #endif Word16 wmold_hb_fx; /* Q15 */ @@ -1438,12 +1460,12 @@ typedef struct hq_dec_structure //int16_t prev_stab_hfe2; Word16 prev_stab_hfe2; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_ni_ratio; #endif Word16 prev_ni_ratio_fx; /* 15 */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_En_sb[NB_SWB_SUBBANDS]; #endif Word16 prev_En_sb_fx[NB_SWB_SUBBANDS]; /* QsEn(4) */ @@ -1456,7 +1478,7 @@ typedef struct hq_dec_structure //int16_t time_offs; Word16 time_offs; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float X_sav[PH_ECU_SPEC_SIZE]; #endif Word16 X_sav_fx[PH_ECU_SPEC_SIZE]; @@ -1469,12 +1491,12 @@ typedef struct hq_dec_structure //int16_t plocs[MAX_PLOCS]; Word16 plocs[MAX_PLOCS]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float plocsi[MAX_PLOCS]; #endif Word32 plocsi_fx[MAX_PLOCS]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float env_stab; #endif Word16 env_stab_fx; @@ -1485,12 +1507,12 @@ typedef struct hq_dec_structure //int16_t mem_env_delta_hqfec; Word16 mem_env_delta_hqfec; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float env_stab_plc; #endif Word16 env_stab_plc_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float env_stab_state_p[NUM_ENV_STAB_PLC_STATES]; #endif Word16 env_stab_state_p_fx[NUM_ENV_STAB_PLC_STATES]; @@ -1498,17 +1520,17 @@ typedef struct hq_dec_structure //int16_t envstabplc_hocnt; Word16 envstabplc_hocnt; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mag_chg_1st[LGW_MAX]; /* i/o: per band magnitude modifier for transients*/ #endif Word16 mag_chg_1st_fx[LGW_MAX]; /* i/o: per band magnitude modifier for transients*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float Xavg[LGW_MAX]; /* Frequency group average gain to fade to */ #endif Word16 Xavg_fx[LGW_MAX]; /* Frequency group average gain to fade to */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float beta_mute; /* Factor for long-term mute */ #endif Word16 beta_mute_fx; /* Factor for long-term mute */ @@ -1522,7 +1544,7 @@ typedef struct hq_dec_structure //int16_t oldHqVoicing; Word16 oldHqVoicing; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float oldgapsynth[L_FRAME48k]; #endif Word16 oldgapsynth_fx[L_FRAME48k]; @@ -1547,7 +1569,7 @@ typedef struct zero_bwe_dec_structure { int16_t seed2; /* HF (6-7kHz) BWE - seed for random signal generator */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_hp400[4]; /* HF (6-7kHz) BWE - hp400 filter memory */ float mem_hf[( L_FIR - 1 )]; /* HF (6-7kHz) BWE - band-pass filter memory */ @@ -1580,49 +1602,49 @@ typedef struct zero_bwe_dec_structure typedef struct td_bwe_dec_structure { /* states for the filters used in generating SHB excitation from WB excitation */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float state_lpc_syn[LPC_SHB_ORDER]; #endif Word16 state_lpc_syn_fx[LPC_SHB_ORDER]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_csfilt[2]; #endif Word32 mem_csfilt_fx[2]; /* states for the filters used in generating SHB signal from SHB excitation*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float state_syn_shbexc[L_SHB_LAHEAD]; + float syn_overlap[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain*/ #endif Word16 state_syn_shbexc_fx[L_SHB_LAHEAD]; - float syn_overlap[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain*/ Word16 syn_overlap_fx[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain*/ Word32 syn_overlap_fx_32[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain*/ /* previous frame parameters for frame error concealment */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lsp_prevfrm[LPC_SHB_ORDER]; #endif Word16 lsp_prevfrm_fx[LPC_SHB_ORDER]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float GainFrame_prevfrm; #endif Word32 GainFrame_prevfrm_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float GainShape_Delay[NUM_SHB_SUBFR / 2]; #endif Word16 GainShape_Delay_fx[NUM_SHB_SUBFR / 2]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float GainAttn; #endif Word16 GainAttn_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_bwe_exc[PIT16k_MAX * 2]; /* old excitation */ #endif Word16 old_bwe_exc_fx[PIT16k_MAX * 2]; /*Q_exc*/ @@ -1630,66 +1652,76 @@ typedef struct td_bwe_dec_structure int16_t bwe_seed[2]; //Word16 bwe_seed[2]; /*Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float bwe_non_lin_prev_scale; #endif Word32 bwe_non_lin_prev_scale_fx; +#ifndef IVAS_FLOAT_FIXED float old_bwe_exc_extended[NL_BUFF_OFFSET]; +#endif Word16 old_bwe_exc_extended_fx[NL_BUFF_OFFSET]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float genSHBsynth_Hilbert_Mem[HILBERT_MEM_SIZE]; #endif Word32 genSHBsynth_Hilbert_Mem_fx[HILBERT_MEM_SIZE]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_genSHBexc_filt_down_shb[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; #endif Word16 mem_genSHBexc_filt_down_shb_fx[2 * ALLPASSSECTIONS_STEEP + 1]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_genSHBexc_filt_down_wb2[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; #endif Word16 mem_genSHBexc_filt_down_wb2_fx[2 * ALLPASSSECTIONS_STEEP + 1]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_genSHBexc_filt_down_wb3[( 2 * ALLPASSSECTIONS_STEEP + 1 )]; #endif Word16 mem_genSHBexc_filt_down_wb3_fx[2 * ALLPASSSECTIONS_STEEP + 1]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float genSHBsynth_state_lsyn_filt_shb_local[2 * ALLPASSSECTIONS_STEEP]; #endif Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[2 * ALLPASSSECTIONS_STEEP]; Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[2 * ALLPASSSECTIONS_STEEP]; +#ifndef IVAS_FLOAT_FIXED float state_lsyn_filt_shb[2 * ALLPASSSECTIONS_STEEP]; +#endif Word16 state_lsyn_filt_shb_fx[2 * ALLPASSSECTIONS_STEEP]; Word32 state_lsyn_filt_shb_fx_32[2 * ALLPASSSECTIONS_STEEP]; +#ifndef IVAS_FLOAT_FIXED float state_lsyn_filt_dwn_shb[2 * ALLPASSSECTIONS_STEEP]; +#endif Word16 state_lsyn_filt_dwn_shb_fx[2 * ALLPASSSECTIONS_STEEP]; Word32 state_lsyn_filt_dwn_shb_fx_32[2 * ALLPASSSECTIONS_STEEP]; +#ifndef IVAS_FLOAT_FIXED float mem_resamp_HB[INTERP_3_1_MEM_LEN]; +#endif Word16 mem_resamp_HB_fx[INTERP_3_1_MEM_LEN]; Word32 mem_resamp_HB_fx_32[INTERP_3_1_MEM_LEN]; +#ifndef IVAS_FLOAT_FIXED float mem_resamp_HB_32k[2 * ALLPASSSECTIONS_STEEP + 1]; +#endif Word16 mem_resamp_HB_32k_fx[2 * ALLPASSSECTIONS_STEEP + 1]; Word32 mem_resamp_HB_32k_fx_32[2 * ALLPASSSECTIONS_STEEP + 1]; Word16 state_32and48k_WB_upsample_fx[2 * ALLPASSSECTIONS_STEEP]; /* !!! this memory in FLP is called mem_resamp_HB */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_pow_exc16kWhtnd; /* power of the LB excitation signal in the previous frame */ #endif //Word16 prev_pow_exc16kWhtnd_fx; /* power of the LB excitation signal in the previous frame */ - Don't use this Word32 prev_pow_exc16kWhtnd_fx32; /* power of the LB excitation signal in the previous frame */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_mix_factor; /* mixing factor in the previous frame */ #endif Word16 prev_mix_factor_fx; /* mixing factor in the previous frame */ @@ -1697,34 +1729,34 @@ typedef struct td_bwe_dec_structure int16_t syn_dm_phase; //Word16 syn_dm_phase; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float fbbwe_hpf_mem[4][4]; #endif Word32 fbbwe_hpf_mem_fx[4][4]; Word16 fbbwe_hpf_mem_fx_Q[4]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_wb_bwe_frame_pow; #endif Word32 prev_wb_bwe_frame_pow_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_swb_bwe_frame_pow; #endif Word32 prev_swb_bwe_frame_pow_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_ener; #endif Word32 prev_ener_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_GainShape; #endif Word16 prev_GainShape_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float fb_state_lpc_syn[LPC_SHB_ORDER]; #endif Word16 fb_state_lpc_syn_fx[LPC_SHB_ORDER]; @@ -1734,75 +1766,75 @@ typedef struct td_bwe_dec_structure //Word16 prev_Q_bwe_exc; //Word16 prev_Q_synth; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float fb_tbe_demph; #endif Word16 fb_tbe_demph_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_fbbwe_ratio; #endif Word16 prev_fbbwe_ratio_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float tbe_demph; #endif Word16 tbe_demph_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float tbe_premph; #endif Word16 tbe_premph_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_stp_swb[LPC_SHB_ORDER]; #endif Word16 mem_stp_swb_fx[LPC_SHB_ORDER]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float *ptr_mem_stp_swb; #endif Word16* ptr_mem_stp_swb_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float gain_prec_swb; #endif Word16 gain_prec_swb_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_zero_swb[LPC_SHB_ORDER]; #endif Word16 mem_zero_swb_fx[LPC_SHB_ORDER]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float swb_lsp_prev_interp[LPC_SHB_ORDER]; #endif Word16 swb_lsp_prev_interp_fx[LPC_SHB_ORDER]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev1_shb_ener_sf, prev2_shb_ener_sf, prev3_shb_ener_sf, prev_res_shb_gshape, prev_mixFactors; #endif Word32 prev1_shb_ener_sf_fx, prev2_shb_ener_sf_fx, prev3_shb_ener_sf_fx; Word16 prev_res_shb_gshape_fx, prev_mixFactors_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float tilt_mem; /* Formant factor adaptation tilt smoothing memory */ #endif Word16 tilt_mem_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_lsf_diff[LPC_SHB_ORDER - 2]; #endif Word16 prev_lsf_diff_fx[LPC_SHB_ORDER - 2]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_tilt_para; #endif Word16 prev_tilt_para_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float cur_sub_Aq[M + 1]; #endif Word16 cur_sub_Aq_fx[M + 1]; @@ -1842,25 +1874,29 @@ typedef struct td_bwe_dec_structure int16_t idxGain; //Word16 idxGain; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_core_synth[L_FRAME16k]; #endif Word16 old_core_synth_fx[L_FRAME16k]; +#ifndef IVAS_FLOAT_FIXED float old_tbe_synth[L_SHB_TRANSITION_LENGTH]; +#endif Word16 old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH]; Word32 old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH]; +#ifndef IVAS_FLOAT_FIXED float int_3_over_2_tbemem_dec[INTERP_3_2_MEM_LEN]; +#endif Word16 int_3_over_2_tbemem_dec_fx[INTERP_3_2_MEM_LEN]; Word32 int_3_over_2_tbemem_dec_fx_32[INTERP_3_2_MEM_LEN]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_hb_synth[L_FRAME48k]; #endif Word16 old_hb_synth_fx[L_FRAME48k]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float tilt_swb_fec; /* FEC - SWB TBE TILT */ #endif Word16 tilt_swb_fec_fx; /* FEC - SWB TBE TILT */ @@ -1878,7 +1914,7 @@ typedef struct fd_bwe_dec_structure { Word16 old_wtda_wb_fx_exp; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_wtda_swb[L_FRAME48k]; #endif Word16 L_old_wtda_swb_fx[L_FRAME48k]; @@ -1886,12 +1922,12 @@ typedef struct fd_bwe_dec_structure Word16 old_wtda_swb_fx_exp; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_syn_12k8_16k[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; #endif Word16 old_syn_12k8_16k_fx[NS2SA(16000, DELAY_FD_BWE_ENC_NS)]; /*Q_syn2-1*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_deemph_old_syn; #endif Word16 mem_deemph_old_syn_fx; @@ -1899,17 +1935,17 @@ typedef struct fd_bwe_dec_structure int16_t prev_mode; //Word16 prev_mode; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_SWB_fenv[SWB_FENV]; #endif //Word16 prev_SWB_fenv_fx[SWB_FENV]; // Don't use this. Use prev_SWB_fenv_fx present in Decoder_State -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_Energy; #endif Word16 prev_Energy_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_Energy_wb; #endif Word32 prev_Energy_wb_fx; @@ -1925,19 +1961,19 @@ typedef struct fd_bwe_dec_structure int16_t prev_frica_flag; //Word16 prev_frica_flag; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_imdct[L_FRAME48k]; #endif Word16 mem_imdct_fx[L_FRAME48k]; Word16 mem_imdct_exp_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_td_energy; #endif Word16 prev_td_energy_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_weight; #endif Word16 prev_weight_fx; @@ -1945,12 +1981,12 @@ typedef struct fd_bwe_dec_structure int16_t prev_flag; //Word16 prev_flag; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float last_wb_bwe_ener; #endif //Word16 last_wb_bwe_ener_fx; // Don't use this. Use last_wb_bwe_ener_fx present in Decoder_State -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_fb_ener_adjust; #endif //Word16 prev_fb_ener_adjust_fx; // Don't use this. Use prev_fb_ener_adjust_fx present in Decoder_State @@ -1974,7 +2010,7 @@ typedef struct hr_swb_bwe_dec_structure int16_t bwe_highrate_seed; Word16 bwe_highrate_seed_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float t_audio_prev[2 * END_FREQ_BWE_FULL_FB / FRAMES_PER_SEC - NUM_NONTRANS_START_FREQ_COEF]; #endif Word16 t_audio_prev_fx[2 * END_FREQ_BWE_FULL_FB / 50 - NUM_NONTRANS_START_FREQ_COEF]; @@ -1984,7 +2020,7 @@ typedef struct hr_swb_bwe_dec_structure int16_t old_is_transient_hr_bwe; Word16 old_is_transient_hr_bwe_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_EnergyLT; #endif Word32 L_mem_EnergyLT_fx; @@ -2204,7 +2240,7 @@ typedef struct Decoder_State Word16 tilt_code_fx; /* tilt of code Q15*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_exc[L_EXC_MEM_DEC]; /* old excitation */ float lsp_old[M]; /* old LSP vector at the end of the frame */ float lsf_old[M]; /* old LSF vector at the end of the frame */ @@ -2245,7 +2281,7 @@ typedef struct Decoder_State int16_t safety_net; //Word16 safety_net; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float stab_fac; /* LSF stability factor */ float stab_fac_smooth; /* low-pass filtered stability factor */ float agc_mem2[2]; /* memory of AGC for saturation control */ @@ -2281,7 +2317,7 @@ typedef struct Decoder_State Word32 gc_threshold_fx; /* Noise enhancer - threshold for gain_code Q16*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float gc_threshold; /* Noise enhancer - threshold for gain_code */ float dispMem[8]; /* Noise enhancer - phase dispersion algorithm memory */ #endif @@ -2309,7 +2345,7 @@ typedef struct Decoder_State Word16 Q_stat_noise; /* Q of Exc_pe */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float min_alpha; /* Stationary noise UV modification - minimum alpha */ float lspold_s[M]; /* Stationary noise UV modification - old LSP vector */ float ge_sm; /* Stationary noise UV modification - smoothed excitation gain */ @@ -2331,7 +2367,7 @@ typedef struct Decoder_State int16_t seed; /* FEC - seed for random generator for excitation */ //Word16 seed_fx; /* FEC - seed for random generator for excitation Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lp_ener_bfi; /* FEC - long-term active-signal average energy */ float lp_ener; /* FEC - low-pass filtered energy */ #endif @@ -2346,13 +2382,13 @@ typedef struct Decoder_State Word32 enr_old_fx; /* FEC - energy of the concealed frame Q0*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lp_gainp; /* FEC - low-pass filtered pitch gain */ float lp_gainc; /* FEC - low-pass filtered code gain */ float enr_old; /* FEC - energy of the concealed frame */ float bfi_pitch; /* FEC - pitch for FEC */ float old_pitch_buf[2 * NB_SUBFR16k + 2]; /* FEC - buffer of old subframe pitch values */ -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 bfi_pitch_fx; /* FEC - pitch for FEC */ int16_t bfi_pitch_frame; /* FEC - frame length when pitch for FEC is saved */ @@ -2375,7 +2411,7 @@ typedef struct Decoder_State int16_t prev_nbLostCmpt; /* FEC - compt for number of consecutive lost frame at the previous frame*/ int16_t mode_lvq; /* FEC - index for LSF mean vector*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_enr_LP_float; /* FEC - LP filter gain */ float lp_ener_FEC_av_float; /* FEC - averaged voiced signal energy */ float lp_ener_FEC_max_float; /* FEC - averaged voiced signal energy */ @@ -2402,9 +2438,9 @@ typedef struct Decoder_State int16_t relax_prev_lsf_interp; //Word16 relax_prev_lsf_interp; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_syn_clas_estim[L_SYN_MEM_CLAS_ESTIM]; /* FEC - memory of the synthesis signal for frame class estimation */ -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 mem_syn_clas_estim_fx[L_SYN_MEM_CLAS_ESTIM]; /* FEC - memory of the synthesis signal for frame class estimation */ int16_t bpf_off; /* Bass post-filter - do not use BPF when this flag is set to 1 */ @@ -2427,7 +2463,7 @@ typedef struct Decoder_State int16_t last_active_bandsToZero_bwdec; int16_t last_flag_filter_NB; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float perc_bwddec_float; float avg_nrg_LT_float; float ng_ener_ST; /* Noise gate - short-term energy */ @@ -2460,12 +2496,12 @@ typedef struct Decoder_State Word16 psf_lp_noise_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_preemp_preQ; /* ACELP@16kHz - prequantizer preemhasis memory */ float psf_lp_noise; /* NB post-filter - long-term noise */ float last_voice_factor; float prev_synth_buffer[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS )]; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 last_voice_factor_fx; /* Q6*/ @@ -2492,9 +2528,9 @@ typedef struct Decoder_State int16_t CNG_mode; /* DTX/CNG - mode for DTX configuration */ //Word16 CNG_mode_fx; /* DTX/CNG - mode for DTX configuration */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lspCNG[M]; /* DTX/CNG - LP filtered ISPs */ -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 lspCNG_fx[M]; /* CNG and DTX - LP filtered ISPs Q15*/ int16_t active_cnt; @@ -2528,7 +2564,7 @@ typedef struct Decoder_State Word16 prev_gain_pit_dec_fx; /*Q14*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float prev_gain_pit_dec; float prev_tilt_code_dec; float tilt_code_dec[NB_SUBFR16k]; @@ -2590,7 +2626,7 @@ typedef struct Decoder_State Word32 previoussynth_fx_32[L_FRAME48k]; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float previoussynth[L_FRAME48k]; /* note: only 60+111 out of 960 samples are needed in IVAS (for ACELP->TCX switching */ float old_synth_sw[NS2SA(48000, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS)]; /* note: buffer used only in EVS mono */ #endif // 0 @@ -2603,7 +2639,7 @@ typedef struct Decoder_State Word16 old_Aq_12_8_fx[M + 1]; /* Q12 old Aq[] for core switching */ Word32 old_Aq_12_8_fx_32[M + 1]; /* Q28 old Aq[] for core switching */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float delay_buf_out[HQ_DELTA_MAX * HQ_DELAY_COMP]; float old_Aq_12_8[M + 1]; /* old Aq[] for core switching */ float old_Es_pred; /* old Es_pred for core switching */ @@ -2624,7 +2660,6 @@ typedef struct Decoder_State int16_t old_bwe_delay; //Word16 old_bwe_delay; /*Q0*/ - float hb_prev_synth_buffer[NS2SA( 48000, DELAY_BWE_TOTAL_NS )]; Word16 hb_prev_synth_buffer_fx[NS2SA(48000, DELAY_BWE_TOTAL_NS)]; /* WB/SWB bandwidth switching */ @@ -2632,7 +2667,8 @@ typedef struct Decoder_State Word16 tilt_swb_fx; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED + float hb_prev_synth_buffer[NS2SA( 48000, DELAY_BWE_TOTAL_NS )]; float tilt_wb; float tilt_swb; float prev_ener_shb; @@ -2666,10 +2702,10 @@ typedef struct Decoder_State int16_t bws_cnt1; // Word16 bws_cnt1; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float attenu1; float t_audio_q[L_FRAME]; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 attenu_fx; int16_t last_inner_frame; @@ -2798,7 +2834,7 @@ typedef struct Decoder_State int16_t seed_tcx_plc; /* seed memory (for random function in TCX PLC) */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lsfold_uw_float[M]; /* old lsf (unweighted) */ float lspold_uw_float[M]; /* old lsp (unweighted) */ float past_gpit_float; /* past gain of pitch (for frame recovery) */ @@ -2833,7 +2869,7 @@ typedef struct Decoder_State int16_t plcBackgroundNoiseUpdated; /* flag: Is background noise estimate updated? */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_syn_unv_back_float[M]; /* filter memory for unvoiced synth */ float last_gain_syn_deemph_float; float last_concealed_gain_syn_deemph_float; @@ -2865,14 +2901,14 @@ typedef struct Decoder_State /*Preemphasis factor*/ Word16 preemph_fac; /*0Q15*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*Preemphasis factor*/ float preemph_fac_float; float gamma_float; /*for AMR-WB like 6.4 to 7 kHz upsampling and noise filling*/ float mem_Aq_float[NB_SUBFR16k * ( M + 1 )]; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 gamma; @@ -2891,14 +2927,14 @@ typedef struct Decoder_State int16_t clas_dec; /* PLC - frame class at the decoder */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float old_fpitch_float; /* PLC - last pitch of previous frame (as transmitted) */ float old_fpitchFB_float; /* PLC - last pitch of previous FB frame (depends on output sr) */ float mem_pitch_gain_float[2 * NB_SUBFR16k + 2]; /* PLC - Pitch gain memory */ float cummulative_damping_float; float cngTDLevel_float; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 mem_pitch_gain[2 * NB_SUBFR16k + 2]; /* Pitch gain memory Q14 */ int16_t plc_use_future_lag; /* PLC - flag indicating if info (pitch lag / pitch gain) about future frame is usable */ @@ -2926,14 +2962,14 @@ typedef struct Decoder_State int16_t numlpc; /* Bandwidth */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float TcxBandwidth_float; #endif Word16 TcxBandwidth; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float voice_fac_float; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 voice_fac; int16_t tcxonly; @@ -2949,18 +2985,19 @@ typedef struct Decoder_State int16_t second_last_core; /* parameters for switching */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float mem_syn_r_float[L_SYN_MEM]; /*LPC synthesis memory needed for rate switching*/ -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word16 mem_syn_r[L_SYN_MEM]; /*LPC synthesis memory needed for rate switching*/ int16_t rate_switching_reset; - float bpf_noise_buf_float[L_FRAME16k]; Word16 bpf_noise_buf[L_FRAME_16k]; Word32 bpf_noise_buf_32[L_FRAME_16k]; - +#ifndef IVAS_FLOAT_FIXED + float bpf_noise_buf_float[L_FRAME16k]; float *p_bpf_noise_buf_float; +#endif Word16 *p_bpf_noise_buf; Word32 *p_bpf_noise_buf_32; @@ -2978,9 +3015,9 @@ typedef struct Decoder_State int16_t flag_cna; int16_t last_flag_cna; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED float lp_noise_float; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED Word32 lp_noise; int16_t seed_acelp; diff --git a/lib_dec/stat_noise_uv_dec.c b/lib_dec/stat_noise_uv_dec.c index ed0faa4b999894d7a5be7d575a4ff162db5f8a7c..ec7381ba2ea650b67481fefe47fff20549d3f59b 100644 --- a/lib_dec/stat_noise_uv_dec.c +++ b/lib_dec/stat_noise_uv_dec.c @@ -38,7 +38,7 @@ #include "options.h" #include "prot.h" #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------* * stat_noise_uv_dec() * diff --git a/lib_dec/swb_bwe_dec.c b/lib_dec/swb_bwe_dec.c index a4bea1d4737e136bf722df7b64818b548cfdd870..84569e12ca1723a5d16a000109ac501dbd564d3c 100644 --- a/lib_dec/swb_bwe_dec.c +++ b/lib_dec/swb_bwe_dec.c @@ -49,7 +49,7 @@ #include "prot_fx1.h" #endif // IVAS_FLOAT_FIXED -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * para_pred_bws() * @@ -531,7 +531,7 @@ static int16_t WB_BWE_gain_deq( return ( mode ); } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * wb_bwe_dec_flt() * @@ -847,7 +847,7 @@ int16_t swb_bwe_gain_deq_flt( * * SWB BWE decoder *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void swb_bwe_dec_flt( Decoder_State *st, /* i/o: decoder state structure */ const float output[], /* i : synthesis @internal Fs */ @@ -1196,11 +1196,11 @@ Word16 swb_bwe_dec_fx32( IF(EQ_16(st_fx->L_frame, L_FRAME16k)) { - 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, 80, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl); + 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, 80, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl, st_fx->element_mode); } ELSE { - 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); + 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); } diff --git a/lib_dec/swb_bwe_dec_fx.c b/lib_dec/swb_bwe_dec_fx.c index 44b2e84ef63da96f48fee0dd8940e151e137712d..f79f1b7fe06a58d3e4cce797b792903dd32255c7 100644 --- a/lib_dec/swb_bwe_dec_fx.c +++ b/lib_dec/swb_bwe_dec_fx.c @@ -1053,13 +1053,13 @@ Word16 swb_bwe_dec_fx( { SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, ysynth_32, 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, 80, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn - ,st_fx->last_extl); + ,st_fx->last_extl, st_fx->element_mode); } ELSE { SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, ysynth_32, 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->last_extl, st_fx->element_mode); } test(); diff --git a/lib_dec/swb_bwe_dec_hr.c b/lib_dec/swb_bwe_dec_hr.c index d4b1847663fb52117501394a5b1db07dbeddc587..5d090e7088ccab3ec7ab946dd07d6e71eed2062c 100644 --- a/lib_dec/swb_bwe_dec_hr.c +++ b/lib_dec/swb_bwe_dec_hr.c @@ -49,7 +49,7 @@ * * HR SWB BWE decoder *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void swb_bwe_dec_hr( Decoder_State *st, /* i/o: decoder state structure */ const float *syn_12k8_16k, /* i : ACELP core synthesis @16kHz */ diff --git a/lib_dec/swb_bwe_dec_lr.c b/lib_dec/swb_bwe_dec_lr.c index f7d7fc0439f49d8538ae27525ecb1063e769b351..320308981c2aa5318794816aa986f61e024f533d 100644 --- a/lib_dec/swb_bwe_dec_lr.c +++ b/lib_dec/swb_bwe_dec_lr.c @@ -84,7 +84,7 @@ static void DecodeSWBGenericParameters( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * DecodeSWBSubbands() * @@ -236,7 +236,7 @@ static void DecodeSWBSubbands( } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * swb_bwe_dec_lr() * diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index d8482b2efc33ca2d6658df56e13f253d26c87a00..c9516a549408e99c737853f045cfcc9e5c20b463 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -65,13 +65,13 @@ static void Dequant_mirror_point( const float lsf_q[], const int16_t m_idx, floa * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ResetSHBbuffer_Dec( TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ const int16_t extl /* i : BWE extension layer */ ) { int16_t i; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) float f; float inc; @@ -104,44 +104,6 @@ void ResetSHBbuffer_Dec( set_f(hBWE_TD->mem_genSHBexc_filt_down_shb, 0.0f, (2 * ALLPASSSECTIONS_STEEP + 1)); set_f(hBWE_TD->mem_genSHBexc_filt_down_wb2, 0.0f, (2 * ALLPASSSECTIONS_STEEP + 1)); set_f(hBWE_TD->mem_genSHBexc_filt_down_wb3, 0.0f, (2 * ALLPASSSECTIONS_STEEP + 1)); -#endif -#ifdef IVAS_FLOAT_FIXED - Word16 f_fx; - Word16 inc_fx; - IF( extl != WB_TBE ) - { - f_fx = 1489; - move16(); /* Q15 */ - inc_fx = 1489; - move16(); /* Q15 */ - } - ELSE - { - f_fx = 5461; - move16();/* Q15 */ - inc_fx = 5461; - move16(); /* Q15 */ - } - - /* states for the filters used in generating SHB excitation from WB excitation*/ - set_val_Word32( hBWE_TD->mem_csfilt_fx, 0, 2 ); - - /* states for the filters used in generating SHB signal from SHB excitation*/ - set_val_Word16( hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD ); - set_val_Word16( hBWE_TD->state_lpc_syn_fx, 0, LPC_SHB_ORDER ); - - IF ( extl == FB_TBE ) - { - set_val_Word16( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER ); - hBWE_TD->fb_tbe_demph_fx = 0; - fb_tbe_reset_synth_fx( hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, &hBWE_TD->prev_fbbwe_ratio_fx ); - } - - /* states for the filters used in generating SHB signal from SHB excitation in wideband*/ - set_val_Word16( hBWE_TD->mem_genSHBexc_filt_down_shb_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); - set_val_Word16( hBWE_TD->mem_genSHBexc_filt_down_wb2_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); - set_val_Word16( hBWE_TD->mem_genSHBexc_filt_down_wb3_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); -#endif set_f( hBWE_TD->state_lsyn_filt_shb, 0, 2 * ALLPASSSECTIONS_STEEP ); set_f( hBWE_TD->state_lsyn_filt_dwn_shb, 0, 2 * ALLPASSSECTIONS_STEEP ); @@ -150,7 +112,6 @@ void ResetSHBbuffer_Dec( /* States for the local synthesis filters */ set_f( hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) /* States for FEC */ if ( extl != WB_TBE ) { @@ -184,57 +145,14 @@ void ResetSHBbuffer_Dec( hBWE_TD->prev_mix_factor = 1.0f; set_f(hBWE_TD->old_core_synth, 0, L_FRAME16k); -#endif -#ifdef IVAS_FLOAT_FIXED - IF( extl != WB_TBE ) - { - FOR( i = 0; i < LPC_SHB_ORDER; i++ ) - { - hBWE_TD->lsp_prevfrm_fx[i] = f_fx; - move16(); /*Q15*/ - f_fx = add( f_fx, inc_fx ); - move16(); - } - } - ELSE - { - FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) - { - hBWE_TD->lsp_prevfrm_fx[i] = f_fx; - move16();/*Q15*/ - f_fx = add( f_fx, inc_fx ); - move16(); - } - FOR( ; ilsp_prevfrm_fx[i] = 0; - move16(); - } - } - - hBWE_TD->GainFrame_prevfrm_fx = 0; - hBWE_TD->GainAttn_fx = 32767; - hBWE_TD->tbe_demph_fx = 0; - hBWE_TD->tbe_premph_fx = 0; - set_val_Word16( hBWE_TD->mem_stp_swb_fx, 0, LPC_SHB_ORDER ); - hBWE_TD->gain_prec_swb_fx = 16384; - set_val_Word16( hBWE_TD->GainShape_Delay_fx, 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*/ - set16_fx( hBWE_TD->old_core_synth_fx, 0, L_FRAME16k ); -#endif set_f( hBWE_TD->old_tbe_synth, 0, L_SHB_TRANSITION_LENGTH ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) hBWE_TD->tilt_swb_fec = 0.0f; -#endif -#ifdef IVAS_FLOAT_FIXED - hBWE_TD->tilt_swb_fec_fx = 0; -#endif return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) + + /*-------------------------------------------------------------------* * wb_tbe_dec() * @@ -560,7 +478,7 @@ void calc_tilt_bwe_fx_loc( Word16 headroom_left_r0 = W_norm(r0_fx); Word16 headroom_left_r1 = W_norm(r1_fx); Word16 r0_q = 0, r1_q = 0; - Word16 r0_bits_occ = 0, r1_bits_occ = 0; + //Word16 r0_bits_occ = 0, r1_bits_occ = 0; IF(headroom_left_r0 < 32) { r0_fx = W_shr(r0_fx, (32 - headroom_left_r0)); @@ -2718,7 +2636,7 @@ void ivas_swb_tbe_dec_fx( return; } #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * swb_tbe_dec() * @@ -3346,7 +3264,7 @@ void swb_tbe_dec( else { /* individual sqrt to avoid infinite (nan) value due to acelp_core_dec changes */ - scale = (float) (sqrt( curr_pow ) /sqrt( prev_pow )); + scale = (float)sqrt(curr_pow / prev_pow); } for ( i = 0; i < L_SHB_LAHEAD; i++ ) @@ -4237,7 +4155,7 @@ static void dequantizeSHBparams( } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * fb_tbe_dec() * @@ -4397,7 +4315,7 @@ void tbe_read_bitstream( } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * GenTransition() * @@ -4520,6 +4438,7 @@ void GenTransition_fixed( return; } #endif +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * GenTransition_WB() * @@ -4577,6 +4496,7 @@ void GenTransition_WB( return; } +#endif #ifdef IVAS_FLOAT_FIXED void GenTransition_WB_fixed( TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ @@ -4631,6 +4551,7 @@ void GenTransition_WB_fixed( } #endif +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * void TBEreset_dec() * @@ -4647,7 +4568,7 @@ void TBEreset_dec( if ( st->last_core != ACELP_CORE ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hBWE_TD->old_bwe_exc, 0.0f, PIT16k_MAX * 2 ); hBWE_TD->bwe_non_lin_prev_scale = 0.f; #endif @@ -4659,14 +4580,14 @@ void TBEreset_dec( } if ( st->bwidth == WB ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED wb_tbe_extras_reset( hBWE_TD->mem_genSHBexc_filt_down_wb2, hBWE_TD->mem_genSHBexc_filt_down_wb3 ); #endif #ifdef IVAS_FLOAT_FIXED wb_tbe_extras_reset_fx( hBWE_TD->mem_genSHBexc_filt_down_wb2_fx, hBWE_TD->mem_genSHBexc_filt_down_wb3_fx ); #endif wb_tbe_extras_reset_synth( hBWE_TD->state_lsyn_filt_shb, hBWE_TD->state_lsyn_filt_dwn_shb, hBWE_TD->mem_resamp_HB ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hBWE_TD->mem_genSHBexc_filt_down_shb, 0, 7 ); set_f( hBWE_TD->state_lpc_syn, 0, 10 ); set_f( hBWE_TD->state_syn_shbexc, 0, L_SHB_LAHEAD / 4 ); @@ -4677,7 +4598,7 @@ void TBEreset_dec( set_val_Word16( hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD / 4 ); #endif set_f( hBWE_TD->syn_overlap, 0, L_SHB_LAHEAD ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hBWE_TD->mem_csfilt, 0, 2 ); #endif #ifdef IVAS_FLOAT_FIXED @@ -4686,7 +4607,7 @@ void TBEreset_dec( } else if ( st->bwidth == SWB || st->bwidth == FB ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED swb_tbe_reset( hBWE_TD->mem_csfilt, hBWE_TD->mem_genSHBexc_filt_down_shb, hBWE_TD->state_lpc_syn, hBWE_TD->syn_overlap, hBWE_TD->state_syn_shbexc, &( hBWE_TD->tbe_demph ), &( hBWE_TD->tbe_premph ), hBWE_TD->mem_stp_swb, &( hBWE_TD->gain_prec_swb ) ); set_f( hBWE_TD->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 ); @@ -4699,7 +4620,7 @@ void TBEreset_dec( set_f( hBWE_TD->int_3_over_2_tbemem_dec, 0.f, INTERP_3_2_MEM_LEN ); set_f( hBWE_TD->mem_resamp_HB_32k, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; hBWE_TD->prev_mix_factor = 1.0f; @@ -4716,11 +4637,11 @@ void TBEreset_dec( { if ( st->hBWE_FD != NULL ) { -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED st->hBWE_FD->prev_fb_ener_adjust = 0.0f; #endif } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED set_f( hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); hBWE_TD->fb_tbe_demph = 0; fb_tbe_reset_synth( hBWE_TD->fbbwe_hpf_mem, &hBWE_TD->prev_fbbwe_ratio ); @@ -4735,13 +4656,13 @@ void TBEreset_dec( return; } - +#endif /*-------------------------------------------------------------------* * td_bwe_dec_init() * * Initialize TD BWE state structure at the decoder *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void td_bwe_dec_init( TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ const int16_t extl, /* i : BWE extension layer */ @@ -4751,45 +4672,23 @@ void td_bwe_dec_init( int16_t i; /* init. SHB buffers */; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) set_f( hBWE_TD->old_bwe_exc, 0.0f, ( PIT16k_MAX * 2 ) ); -#endif -#ifdef IVAS_FLOAT_FIXED - set_val_Word16( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); -#endif hBWE_TD->bwe_seed[0] = 23; /* 1; */ hBWE_TD->bwe_seed[1] = 59; /* 10000; */ set_f( hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) hBWE_TD->bwe_non_lin_prev_scale = 0; - set_f(hBWE_TD->genSHBsynth_Hilbert_Mem, 0.0f, HILBERT_MEM_SIZE); - set_f(hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local, 0.0f, 2 * ALLPASSSECTIONS_STEEP); -#endif -#ifdef IVAS_FLOAT_FIXED - hBWE_TD->bwe_non_lin_prev_scale_fx = 0; - - set32_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, 0, HILBERT_MEM_SIZE ); - set16_fx( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP ); - set32_fx( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP ); -#endif + set_f( hBWE_TD->genSHBsynth_Hilbert_Mem, 0.0f, HILBERT_MEM_SIZE ); + set_f( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local, 0.0f, 2 * ALLPASSSECTIONS_STEEP ); hBWE_TD->syn_dm_phase = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) hBWE_TD->prev_fbbwe_ratio = 1.0f; hBWE_TD->prev_wb_bwe_frame_pow = 0.001f; hBWE_TD->prev_swb_bwe_frame_pow = 0.001f; -#endif -#ifdef IVAS_FLOAT_FIXED - hBWE_TD->prev_fbbwe_ratio_fx = 32767/*1.0f Q15*/; - hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l/*0.001f Q22*/; - hBWE_TD->prev_swb_bwe_frame_pow_fx = 4194l/*0.001f Q22*/; -#endif /* reset SHB buffers */ ResetSHBbuffer_Dec( hBWE_TD, extl ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) if ( output_Fs == 48000 ) { set_f( hBWE_TD->fbbwe_hpf_mem[0], 0, 4 ); @@ -4797,41 +4696,17 @@ void td_bwe_dec_init( set_f( hBWE_TD->fbbwe_hpf_mem[2], 0, 4 ); set_f( hBWE_TD->fbbwe_hpf_mem[3], 0, 4 ); } -#endif -#ifdef IVAS_FLOAT_FIXED - IF(EQ_32(output_Fs, 48000)) - { - set32_fx(hBWE_TD->fbbwe_hpf_mem_fx[0], 0, 4); - set32_fx(hBWE_TD->fbbwe_hpf_mem_fx[1], 0, 4); - set32_fx(hBWE_TD->fbbwe_hpf_mem_fx[2], 0, 4); - set32_fx(hBWE_TD->fbbwe_hpf_mem_fx[3], 0, 4); - set16_fx(hBWE_TD->fbbwe_hpf_mem_fx_Q, 0, 4); - } -#endif set_f( hBWE_TD->mem_resamp_HB, 0, INTERP_3_1_MEM_LEN ); - set32_fx( hBWE_TD->mem_resamp_HB_fx_32, 0, INTERP_3_1_MEM_LEN ); set_f( hBWE_TD->mem_resamp_HB_32k, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); - set32_fx( hBWE_TD->mem_resamp_HB_32k_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) hBWE_TD->tilt_mem = 0.0f; set_f( hBWE_TD->prev_lsf_diff, 0.5f, LPC_SHB_ORDER - 2 ); hBWE_TD->prev_tilt_para = 0.0f; set_f( hBWE_TD->cur_sub_Aq, 0.0f, M + 1 ); -#endif -#ifdef IVAS_FLOAT_FIXED - hBWE_TD->tilt_mem_fx = 0; - 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, M + 1); -#endif - - set_f( hBWE_TD->int_3_over_2_tbemem_dec, 0.0f, INTERP_3_2_MEM_LEN ); /* TD BWE post-processing */ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) hBWE_TD->ptr_mem_stp_swb = hBWE_TD->mem_stp_swb + LPC_SHB_ORDER - 1; set_f( hBWE_TD->mem_zero_swb, 0, LPC_SHB_ORDER ); @@ -4846,40 +4721,15 @@ void td_bwe_dec_init( hBWE_TD->prev_res_shb_gshape = 0.125f; hBWE_TD->prev_mixFactors = 0.5f; hBWE_TD->prev_GainShape = 0.0f; - - set_f(hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER); + set_f( hBWE_TD->fb_state_lpc_syn, 0, LPC_SHB_ORDER ); hBWE_TD->fb_tbe_demph = 0.0f; - set_f(hBWE_TD->old_hb_synth, 0, L_FRAME48k); + + set_f( hBWE_TD->old_hb_synth, 0, L_FRAME48k ); hBWE_TD->GainFrame_prevfrm = 0.0f; hBWE_TD->prev_ener = 0.0f; -#endif -#ifdef IVAS_FLOAT_FIXED - hBWE_TD->ptr_mem_stp_swb_fx = hBWE_TD->mem_stp_swb_fx + LPC_SHB_ORDER - 1; - set16_fx( hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER ); - - FOR(i = 0; i < LPC_SHB_ORDER; i++) - { - hBWE_TD->swb_lsp_prev_interp_fx[i] = swb_lsp_prev_interp_init[i]; - move16(); - } - - hBWE_TD->prev1_shb_ener_sf_fx = 32767; - hBWE_TD->prev2_shb_ener_sf_fx = 32767; - hBWE_TD->prev3_shb_ener_sf_fx = 32767; - hBWE_TD->prev_res_shb_gshape_fx = 8192; - hBWE_TD->prev_mixFactors_fx = 16384; - hBWE_TD->prev_GainShape_fx = 0; - - set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER ); - hBWE_TD->fb_tbe_demph_fx = 0; - set16_fx( hBWE_TD->old_hb_synth_fx, 0, L_FRAME48k ); - - hBWE_TD->GainFrame_prevfrm_fx = 0; - - hBWE_TD->prev_ener_fx = 0; -#endif return; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 70722637e5b22c5636e03cba9513af6c48962794..6f7ef267f915069e5a349ab2f718b076906015e9 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -520,7 +520,8 @@ void ResetSHBbuffer_Dec_fx( Decoder_State* st_fx /* i/o: SHB encoder structure * set16_fx(hBWE_TD->state_32and48k_WB_upsample_fx, 0, 2 * ALLPASSSECTIONS_STEEP ); /* States for the local synthesis filters */ - set16_fx(hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD ); + set16_fx( hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD ); + set32_fx( hBWE_TD->syn_overlap_fx_32, 0, L_SHB_LAHEAD ); /* States for FEC */ @@ -4561,7 +4562,6 @@ void fb_tbe_dec_ivas_fx( Word16 i; Word16 ratio = 0; Word32 fb_exc_energy = 0; - Word32 L_tmp; Word16 fb_synth[L_FRAME48k]; TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st->hBWE_TD; @@ -4951,6 +4951,7 @@ void TBEreset_dec_ivas_fx( set16_fx( hBWE_TD->state_lpc_syn_fx, 0, 10 ); set16_fx( hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD / 4 ); set16_fx( hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD ); + set32_fx( hBWE_TD->syn_overlap_fx_32, 0, L_SHB_LAHEAD ); set32_fx( hBWE_TD->mem_csfilt_fx, 0, 2 ); } ELSE IF( EQ_16( st->bwidth, SWB ) || EQ_16( st->bwidth, FB ) ) @@ -4994,66 +4995,71 @@ void TBEreset_dec_ivas_fx( #ifdef IVAS_FLOAT_FIXED void td_bwe_dec_init_ivas_fx( - Decoder_State* st_fx, /* i/o: SHB decoder structure */ + Decoder_State *st_fx, /* i/o: SHB decoder structure */ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ - const Word32 output_Fs /* i : output sampling rate */ + const Word32 output_Fs /* i : output sampling rate */ ) { - int16_t i; + Word16 i; /* init. SHB buffers */; - InitSWBdecBuffer_ivas_fx(st_fx); + InitSWBdecBuffer_ivas_fx( st_fx ); /* reset SHB buffers */ - ResetSHBbuffer_Dec_fx(st_fx); - IF(EQ_32(output_Fs, 48000)) + ResetSHBbuffer_Dec_fx( st_fx ); + IF( EQ_32( output_Fs, 48000 ) ) { - set32_fx(hBWE_TD->fbbwe_hpf_mem_fx[0], 0, 4); - set32_fx(hBWE_TD->fbbwe_hpf_mem_fx[1], 0, 4); - set32_fx(hBWE_TD->fbbwe_hpf_mem_fx[2], 0, 4); - set32_fx(hBWE_TD->fbbwe_hpf_mem_fx[3], 0, 4); - set16_fx(hBWE_TD->fbbwe_hpf_mem_fx_Q, 0, 4); + set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[0], 0, 4 ); + set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[1], 0, 4 ); + set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[2], 0, 4 ); + set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[3], 0, 4 ); + set16_fx( hBWE_TD->fbbwe_hpf_mem_fx_Q, 0, 4 ); } - set16_fx(hBWE_TD->mem_resamp_HB_fx, 0, INTERP_3_1_MEM_LEN); - set32_fx(hBWE_TD->mem_resamp_HB_32k_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1); - 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); + set16_fx( hBWE_TD->mem_resamp_HB_fx, 0, INTERP_3_1_MEM_LEN ); + set32_fx( hBWE_TD->mem_resamp_HB_fx_32, 0, INTERP_3_1_MEM_LEN ); + 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->tilt_mem_fx = 0; move16(); - set16_fx(hBWE_TD->prev_lsf_diff_fx, 16384, 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, M + 1); - set16_fx(hBWE_TD->int_3_over_2_tbemem_dec_fx, 0, INTERP_3_2_MEM_LEN); - set32_fx(hBWE_TD->int_3_over_2_tbemem_dec_fx_32, 0, INTERP_3_2_MEM_LEN); + set16_fx( hBWE_TD->cur_sub_Aq_fx, 0, M + 1 ); + set16_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx, 0, INTERP_3_2_MEM_LEN ); + set32_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx_32, 0, INTERP_3_2_MEM_LEN ); /* TD BWE post-processing */ hBWE_TD->ptr_mem_stp_swb_fx = hBWE_TD->mem_stp_swb_fx + LPC_SHB_ORDER - 1; - set16_fx(hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER); + set16_fx( hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER ); - FOR(i = 0; i < LPC_SHB_ORDER; i++) + FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { hBWE_TD->swb_lsp_prev_interp_fx[i] = swb_lsp_prev_interp_init[i]; move16(); } - hBWE_TD->prev1_shb_ener_sf_fx = 32767; /* Q15*/ move16(); - hBWE_TD->prev2_shb_ener_sf_fx = 32767; /* Q15*/ move16(); - hBWE_TD->prev3_shb_ener_sf_fx = 32767; /* Q15*/ move16(); - hBWE_TD->prev_res_shb_gshape_fx = 8192; /* 0.125 in Q14*/ move16(); - hBWE_TD->prev_mixFactors_fx = 16384; /* 0.5 in Q15*/ move16(); + hBWE_TD->prev1_shb_ener_sf_fx = 32767; /* Q15*/ + move16(); + hBWE_TD->prev2_shb_ener_sf_fx = 32767; /* Q15*/ + move16(); + hBWE_TD->prev3_shb_ener_sf_fx = 32767; /* Q15*/ + move16(); + hBWE_TD->prev_res_shb_gshape_fx = 8192; /* 0.125 in Q14*/ + move16(); + hBWE_TD->prev_mixFactors_fx = 16384; /* 0.5 in Q15*/ + move16(); hBWE_TD->prev_GainShape_fx = 0; move16(); st_fx->prev_Q_bwe_exc_fb = 51; move16(); - set16_fx(hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER); + set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER ); hBWE_TD->fb_tbe_demph_fx = 0; move16(); - set16_fx(hBWE_TD->old_hb_synth_fx, 0, L_FRAME48k); + set16_fx( hBWE_TD->old_hb_synth_fx, 0, L_FRAME48k ); - hBWE_TD->prev_ener_fx = L_deposit_l(0); + hBWE_TD->prev_ener_fx = L_deposit_l( 0 ); return; } @@ -5084,7 +5090,7 @@ void td_bwe_dec_init_fx( } set16_fx(hBWE_TD->mem_resamp_HB_fx, 0, INTERP_3_1_MEM_LEN); - set32_fx(hBWE_TD->mem_resamp_HB_32k_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1); + 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); diff --git a/lib_dec/tcx_utils_dec.c b/lib_dec/tcx_utils_dec.c index 4d2cda73528aec545ae5ff0f3f517e643f3992ed..8747c6baba46b170e7321da019f250359fc41724 100644 --- a/lib_dec/tcx_utils_dec.c +++ b/lib_dec/tcx_utils_dec.c @@ -47,7 +47,7 @@ * * *--------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void tcx_decoder_memory_update_flt( Decoder_State *st, /* i/o: decoder memory state */ const float *xn_buf, /* i/o: mdct output buffer used also as temporary buffer */ diff --git a/lib_dec/tonalMDCTconcealment.c b/lib_dec/tonalMDCTconcealment.c index 0acc63ef7bf5fc4c11f77e3b53dfe8c00cc08c02..a3b0db6a08d748a6a49815c86569d0c9510b2766 100644 --- a/lib_dec/tonalMDCTconcealment.c +++ b/lib_dec/tonalMDCTconcealment.c @@ -70,11 +70,13 @@ ivas_error TonalMDCTConceal_Init_ivas( assert( ( hTonalMDCTConc->nScaleFactors == nScaleFactors ) || ( hTonalMDCTConc->nSamples != nSamples ) ); /* If nSamples doesn't change then also nScaleFactors must stay the same */ hTonalMDCTConc->tcx_cfg = hTcxCfg; +#ifndef IVAS_FLOAT_FIXED hTonalMDCTConc->lastBlockData.spectralData_float = hTonalMDCTConc->spectralDataBuffers_float[0]; hTonalMDCTConc->secondLastBlockData.spectralData_float = hTonalMDCTConc->spectralDataBuffers_float[1]; hTonalMDCTConc->secondLastPowerSpectrum_float = hTonalMDCTConc->secondLastBlockData.spectralData_float; hTonalMDCTConc->lastBlockData.scaleFactors_float = hTonalMDCTConc->scaleFactorsBuffers_float[0]; hTonalMDCTConc->secondLastBlockData.scaleFactors_float = hTonalMDCTConc->scaleFactorsBuffers_float[1]; +#endif hTonalMDCTConc->lastBlockData.blockIsValid = 0; hTonalMDCTConc->secondLastBlockData.blockIsValid = 0; hTonalMDCTConc->nSamples = 0; @@ -82,11 +84,11 @@ ivas_error TonalMDCTConceal_Init_ivas( hTonalMDCTConc->lastBlockData.blockIsConcealed = 0; hTonalMDCTConc->secondLastBlockData.blockIsConcealed = 0; - hTonalMDCTConc->pTCI = (TonalComponentsInfo *) hTonalMDCTConc->timeDataBuffer_float; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED + hTonalMDCTConc->pTCI = (TonalComponentsInfo *) hTonalMDCTConc->timeDataBuffer_float; hTonalMDCTConc->lastPitchLag_float = 0; -#endif // #if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#endif // #ifndef IVAS_FLOAT_FIXED if ( hTonalMDCTConc->nSamples != nSamples ) { @@ -96,19 +98,20 @@ ivas_error TonalMDCTConceal_Init_ivas( hTonalMDCTConc->nSamples = nSamples; hTonalMDCTConc->nSamplesCore = nSamplesCore; hTonalMDCTConc->nScaleFactors = nScaleFactors; - +#ifdef IVAS_FLOAT_FIXED + set32_fx( hTonalMDCTConc->scaleFactorsBackground_fx, 0, FDNS_NPTS ); +#endif +#ifndef IVAS_FLOAT_FIXED set_zero( hTonalMDCTConc->scaleFactorsBackground_flt, FDNS_NPTS ); -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) hTonalMDCTConc->scf_fadeout_flt = 1.0f; #endif PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k, 64, 1, 1, &hTonalMDCTConc->psychParamsTCX20 ); PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k / 2, 64, 0, 1, &hTonalMDCTConc->psychParamsTCX10 ); hTonalMDCTConc->psychParams = NULL; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hTonalMDCTConc->last_block_nrg_flt = 0.0f; hTonalMDCTConc->curr_noise_nrg_flt = 0.0f; hTonalMDCTConc->faded_signal_nrg_flt = 0.0f; -#endif /* Offset the pointer to the end of buffer, so that pTCI is not destroyed when new time samples are stored in lastPcmOut */ /* just the second half of the second last pcm output is needed */ @@ -118,11 +121,12 @@ ivas_error TonalMDCTConceal_Init_ivas( /* If the second last frame was lost and concealed with tonal PLC, we reuse saved TonalComponentsInfo and don't update pcm buffers */ assert( sizeof( *hTonalMDCTConc->pTCI ) <= ( hTonalMDCTConc->lastPcmOut_float - hTonalMDCTConc->timeDataBuffer_float) * sizeof( hTonalMDCTConc->timeDataBuffer_float[0] ) ); +#endif return IVAS_ERR_OK; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void TonalMDCTConceal_SaveFreqSignal_ivas( TonalMDCTConcealPtr hTonalMDCTConc, const float *mdctSpectrum, @@ -223,7 +227,7 @@ void TonalMDCTConceal_UpdateState_ivas( return; } -#endif + static void FindPhases( const TonalMDCTConcealPtr hTonalMDCTConc, @@ -316,7 +320,7 @@ static void CalcPowerSpec( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) + static void CalcPowerSpecAndDetectTonalComponents( const TonalMDCTConcealPtr hTonalMDCTConc, float secondLastMDST[], @@ -455,7 +459,7 @@ static void CalcMDXT( return; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void TonalMDCTConceal_Detect_ivas( const TonalMDCTConcealPtr hTonalMDCTConc, const float pitchLag, @@ -504,49 +508,7 @@ void TonalMDCTConceal_Detect_ivas( } else { -#ifdef IVAS_FLOAT_FIXED - Word32 powerSpectrum_fx[L_FRAME_MAX], scaleFactors_fx[FDNS_NPTS]; - Word16 q_ps = 31, q_sf = 31; - FOR( Word16 k = 0; k < hTonalMDCTConc->nSamplesCore; k++ ) - { - if ( abs( (Word32) powerSpectrum[k] ) != 0 ) - q_ps = s_min( q_ps, norm_l( (Word32) powerSpectrum[k] ) ); - } - FOR( Word16 k = 0; k < FDNS_NPTS; k++ ) - { - if ( abs( (Word32) hTonalMDCTConc->secondLastBlockData.scaleFactors_float[k] ) != 0 ) - q_sf = s_min( q_sf, norm_l( (Word32) hTonalMDCTConc->secondLastBlockData.scaleFactors_float[k] ) ); - } - q_ps -= 1; - q_sf -= 1; - FOR( Word16 c = 0; c < hTonalMDCTConc->nSamplesCore; c++ ) - { - powerSpectrum_fx[c] = (Word32) ( powerSpectrum[c] * ( 1 << q_ps ) ); - } - FOR( Word16 c = 0; c < FDNS_NPTS; c++ ) - { - scaleFactors_fx[c] = (Word32) ( hTonalMDCTConc->secondLastBlockData.scaleFactors_float[c] * ( 1 << q_sf ) ); - } - - sns_shape_spectrum_fx( powerSpectrum_fx, &q_ps, psychParamsCurrent, scaleFactors_fx, q_sf, hTonalMDCTConc->nSamplesCore ); - - IF ( q_ps + 1 < 31 ) - { - FOR( Word16 c = 0; c < hTonalMDCTConc->nSamplesCore; c++ ) - { - powerSpectrum[c] = ( (float) powerSpectrum_fx[c] / ( 1 << ( q_ps + 1 ) ) ); - } - } - ELSE IF ( q_ps + 1 == 31 ) - { - FOR( Word16 c = 0; c < hTonalMDCTConc->nSamplesCore; c++ ) - { - powerSpectrum[c] = ( (float) powerSpectrum_fx[c] / ONE_IN_Q31 ); - } - } -#else sns_shape_spectrum( powerSpectrum, psychParamsCurrent, hTonalMDCTConc->secondLastBlockData.scaleFactors_float, hTonalMDCTConc->nSamplesCore ); -#endif // IVAS_FLOAT_FIXED nBands = psychParamsCurrent->nBands; } @@ -1070,7 +1032,7 @@ void TonalMDCTConceal_Apply_ivas( return; } #endif - +#ifndef IVAS_FLOAT_FIXED void TonalMDCTConceal_SaveTimeSignal_ivas( TonalMDCTConcealPtr hTonalMDCTConc, float *timeSignal, @@ -1090,7 +1052,7 @@ void TonalMDCTConceal_SaveTimeSignal_ivas( return; } - +#endif #ifdef IVAS_FLOAT_FIXED void TonalMdctConceal_create_concealment_noise_ivas_fx( @@ -1512,7 +1474,7 @@ void TonalMdctConceal_create_concealment_noise_ivas( #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void TonalMdctConceal_whiten_noise_shape_ivas( Decoder_State *st, const int16_t L_frame, diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index 7769fb8b59883492f99862a0c596ac0955c83904..5f29ce870f8db210abe3a398046bea3884ab26af 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -26,7 +26,7 @@ static void CalcMDXT(const TonalMDCTConcealPtr hTonalMDCTConc, const Word16 type, const Word16 * timeSignal, Word32 * mdxtOutput, Word16 * mdxtOutput_e); static void CalcPowerSpec(const Word32 * mdctSpec, const Word16 mdctSpec_exp, const Word32 * mdstSpec, const Word16 mdstSpec_exp, const Word16 nSamples, const Word16 floorPowerSpectrum, Word32 * powerSpec, Word16 * powerSpec_exp); -static void CalcPowerSpecAndDetectTonalComponents(TonalMDCTConcealPtr const hTonalMDCTConc, Word32 secondLastMDST[], Word16 secondLastMDST_exp, Word32 secondLastMDCT[], Word16 secondLastMDCT_exp, Word32 const pitchLag); +static void CalcPowerSpecAndDetectTonalComponents(TonalMDCTConcealPtr const hTonalMDCTConc, Word32 secondLastMDST[], Word16 secondLastMDST_exp, Word32 secondLastMDCT[], Word16 secondLastMDCT_exp, Word32 const pitchLag, Word16 element_mode); static void FindPhases(TonalMDCTConcealPtr const hTonalMDCTConc, Word32 secondLastMDCT[], Word32 secondLastMDST[], Word16 diff_exp); static void FindPhaseDifferences(TonalMDCTConcealPtr const hTonalMDCTConc, Word32 powerSpectrum[]); @@ -178,9 +178,9 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( move16(); hTonalMDCTConc->secondLastBlockData.blockIsConcealed = 0; move16(); - //hTonalMDCTConc->pTCI = (TonalComponentsInfo_fix *) hTonalMDCTConc->timeDataBuffer; + hTonalMDCTConc->pTCI = (TonalComponentsInfo *) hTonalMDCTConc->timeDataBuffer; - hTonalMDCTConc->pTCI = &hTonalMDCTConc->pTCI1; + //hTonalMDCTConc->pTCI = &hTonalMDCTConc->pTCI1; move16(); hTonalMDCTConc->lastPitchLag = L_deposit_l( 0 ); @@ -202,7 +202,7 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( //#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT // PMTE() // To be uncommented when field of fixed type is added for scaleFactorsBackground - set16_fx( hTonalMDCTConc->scaleFactorsBackground, 0, FDNS_NPTS ); + set32_fx( hTonalMDCTConc->scaleFactorsBackground_fx, 0, FDNS_NPTS ); hTonalMDCTConc->scf_fadeout = 16384 /*1.000000 Q14*/; PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k, 64, 1, 1, &hTonalMDCTConc->psychParamsTCX20 ); PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k / 2, 64, 0, 1, &hTonalMDCTConc->psychParamsTCX10 ); @@ -229,13 +229,7 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( hTonalMDCTConc->secondLastPcmOut = &hTonalMDCTConc->timeDataBuffer[sub( ( 3 * L_FRAME_MAX ) / 2, imult1616(3 , shr(s_min( L_FRAME_MAX, nSamples ),1 ) ) )]; hTonalMDCTConc->lastPcmOut = &hTonalMDCTConc->timeDataBuffer[sub( ( 3 * L_FRAME_MAX ) / 2, s_min( L_FRAME_MAX, nSamples ) )]; /* If the second last frame was lost, we reuse saved TonalComponentsInfo and don't update pcm buffers */ -#if 1 - // TO do enable when only fix code is present currently disabled due to float array in structure - //assert( sizeof( *hTonalMDCTConc->pTCI ) <= ( hTonalMDCTConc->lastPcmOut - hTonalMDCTConc->timeDataBuffer ) * sizeof( hTonalMDCTConc->timeDataBuffer[0] ) ); - - /* TODO: remove float code*/ - assert( sizeof( *hTonalMDCTConc->pTCI ) <= ( hTonalMDCTConc->lastPcmOut_float - hTonalMDCTConc->timeDataBuffer_float ) * sizeof( hTonalMDCTConc->timeDataBuffer_float[0] ) ); -#endif + assert( sizeof( *hTonalMDCTConc->pTCI ) <= ( hTonalMDCTConc->lastPcmOut - hTonalMDCTConc->timeDataBuffer ) * sizeof( hTonalMDCTConc->timeDataBuffer[0] ) ); return IVAS_ERR_OK; } @@ -408,17 +402,6 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( IF( LE_16( nNewSamples, L_FRAME_MAX ) ) { /* Shift the buffers */ - -#if 1 // TODO: Remove Float pointer movement - float *temp_flt; - temp_flt = hTonalMDCTConc->secondLastBlockData.spectralData_float; /* Save the pointer */ - hTonalMDCTConc->secondLastBlockData.spectralData_float = hTonalMDCTConc->lastBlockData.spectralData_float; - hTonalMDCTConc->lastBlockData.spectralData_float = temp_flt; - temp_flt = hTonalMDCTConc->secondLastBlockData.scaleFactors_float; - hTonalMDCTConc->secondLastBlockData.scaleFactors_float = hTonalMDCTConc->lastBlockData.scaleFactors_float; - hTonalMDCTConc->lastBlockData.scaleFactors_float = temp_flt; -#endif - temp = hTonalMDCTConc->secondLastBlockData.spectralData; /* Save the pointer */ move16(); hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->lastBlockData.spectralData; @@ -464,14 +447,6 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( ELSE { /* Order the buffers so that even transition frame can fit in if written into the first buffer */ - -#if 1 /* TODO: remove float code */ - hTonalMDCTConc->lastBlockData.spectralData_float = hTonalMDCTConc->spectralDataBuffers_float[0]; - hTonalMDCTConc->secondLastBlockData.spectralData_float = hTonalMDCTConc->spectralDataBuffers_float[1]; - hTonalMDCTConc->lastBlockData.scaleFactors_float = hTonalMDCTConc->scaleFactorsBuffers_float[0]; - hTonalMDCTConc->secondLastBlockData.scaleFactors_float = hTonalMDCTConc->scaleFactorsBuffers_float[1]; -#endif - hTonalMDCTConc->lastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[0]; move16(); hTonalMDCTConc->secondLastBlockData.spectralData = hTonalMDCTConc->spectralDataBuffers[1]; @@ -513,12 +488,6 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( } hTonalMDCTConc->last_block_nrg_exp = 31 - ( ( 15 - mdctSpectrum_exp ) * 2 - 16 ); -#if 1 /* TODO: remove float code */ - FOR( i = 0; i < nNewSamples; i++ ) - { - hTonalMDCTConc->lastBlockData.spectralData_float[i] = me2f( mdctSpectrum[i], mdctSpectrum_exp ); - } -#endif /* Store new data */ s = getScaleFactor32( mdctSpectrum, nNewSamples ); @@ -543,13 +512,6 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( hTonalMDCTConc->lastBlockData.gain_tcx_exp = gain_tcx_exp; Copy( scaleFactors, hTonalMDCTConc->lastBlockData.scaleFactors, hTonalMDCTConc->nScaleFactors ); - -#if 1 /* TODO: remove float code. */ - for ( i = 0; i < hTonalMDCTConc->nScaleFactors; i++ ) - { - hTonalMDCTConc->lastBlockData.scaleFactors_float[i] = me2f_16( scaleFactors[i], hTonalMDCTConc->lastBlockData.scaleFactors_exp[i] ); - } -#endif } return; @@ -752,7 +714,8 @@ static void ivas_CalcPowerSpecAndDetectTonalComponents_fx( Word32 secondLastMDCT[], Word16 secondLastMDCT_exp, Word32 const pitchLag, - const PsychoacousticParameters* psychParamsCurrent + const PsychoacousticParameters* psychParamsCurrent, + Word16 element_mode ) { Word16 nSamples; @@ -814,10 +777,10 @@ static void ivas_CalcPowerSpecAndDetectTonalComponents_fx( // hTonalMDCTConc->nSamplesCore, // floorPowerSpectrum); - ivas_DetectTonalComponents_fx(hTonalMDCTConc->pTCI->indexOfTonalPeak, - hTonalMDCTConc->pTCI->lowerIndex, - hTonalMDCTConc->pTCI->upperIndex, - &hTonalMDCTConc->pTCI->numIndexes, + ivas_DetectTonalComponents_fx((Word16 *)hTonalMDCTConc->pTCI->indexOfTonalPeak, + (Word16 *)hTonalMDCTConc->pTCI->lowerIndex, + (Word16 *)hTonalMDCTConc->pTCI->upperIndex, + (Word16 *)&hTonalMDCTConc->pTCI->numIndexes, hTonalMDCTConc->lastPitchLag, pitchLag, hTonalMDCTConc->lastBlockData.spectralData, @@ -828,7 +791,7 @@ static void ivas_CalcPowerSpecAndDetectTonalComponents_fx( powerSpectrum, nSamples, hTonalMDCTConc->nSamplesCore, - floorPowerSpectrum, psychParamsCurrent); + floorPowerSpectrum, psychParamsCurrent, element_mode); FindPhases(hTonalMDCTConc, secondLastMDCT, secondLastMDST, sub(secondLastMDST_exp,secondLastMDCT_exp)); FindPhaseDifferences(hTonalMDCTConc, powerSpectrum); @@ -867,7 +830,7 @@ static void ivas_CalcPowerSpecAndDetectTonalComponents_fx( } ELSE { - FOR( Word16 i = 0; i < FDNS_NPTS; i++ ) + FOR( i = 0; i < FDNS_NPTS; i++ ) { invScaleFactors_fx[i] = L_shl(invScaleFactors[i], 1 + invScaleFactors_exp[i]); // Q16 } @@ -914,7 +877,8 @@ static void CalcPowerSpecAndDetectTonalComponents( Word16 secondLastMDST_exp, Word32 secondLastMDCT[], Word16 secondLastMDCT_exp, - Word32 const pitchLag + Word32 const pitchLag, + Word16 element_mode #ifdef IVAS_CODE_MDCT_GSHAPE ,const PsychoacousticParameters* psychParamsCurrent #endif @@ -960,10 +924,10 @@ static void CalcPowerSpecAndDetectTonalComponents( set32_fx(powerSpectrum+hTonalMDCTConc->nSamples, 0, sub(hTonalMDCTConc->nSamplesCore, hTonalMDCTConc->nSamples)); } - DetectTonalComponents(hTonalMDCTConc->pTCI->indexOfTonalPeak, - hTonalMDCTConc->pTCI->lowerIndex, - hTonalMDCTConc->pTCI->upperIndex, - &hTonalMDCTConc->pTCI->numIndexes, + DetectTonalComponents((Word16 *)hTonalMDCTConc->pTCI->indexOfTonalPeak, + (Word16 *)hTonalMDCTConc->pTCI->lowerIndex, + (Word16 *)hTonalMDCTConc->pTCI->upperIndex, + (Word16 *)&hTonalMDCTConc->pTCI->numIndexes, hTonalMDCTConc->lastPitchLag, pitchLag, hTonalMDCTConc->lastBlockData.spectralData, @@ -974,7 +938,7 @@ static void CalcPowerSpecAndDetectTonalComponents( powerSpectrum, nSamples, hTonalMDCTConc->nSamplesCore, - floorPowerSpectrum); + floorPowerSpectrum, element_mode); FindPhases(hTonalMDCTConc, secondLastMDCT, secondLastMDST, sub(secondLastMDST_exp,secondLastMDCT_exp)); FindPhaseDifferences(hTonalMDCTConc, powerSpectrum); @@ -1078,7 +1042,8 @@ static void CalcMDXT( void TonalMDCTConceal_Detect( const TonalMDCTConcealPtr hTonalMDCTConc, const Word32 pitchLag, - Word16 * numIndices + Word16 * numIndices, + Word16 element_mode #ifdef IVAS_CODE_MDCT_GSHAPE ,const PsychoacousticParameters* psychParamsCurrent #endif @@ -1147,7 +1112,7 @@ void TonalMDCTConceal_Detect( } secondLastMDCT_exp = sub(secondLastMDCT_exp, s); move16(); - CalcPowerSpecAndDetectTonalComponents(hTonalMDCTConc, secondLastMDST, secondLastMDST_exp, secondLastMDCT, secondLastMDCT_exp, pitchLag); + CalcPowerSpecAndDetectTonalComponents(hTonalMDCTConc, secondLastMDST, secondLastMDST_exp, secondLastMDCT, secondLastMDCT_exp, pitchLag, element_mode); } ELSE { @@ -1181,12 +1146,12 @@ void TonalMDCTConceal_Detect( move32(); } - RefineTonalComponents(hTonalMDCTConc->pTCI->indexOfTonalPeak, - hTonalMDCTConc->pTCI->lowerIndex, - hTonalMDCTConc->pTCI->upperIndex, + RefineTonalComponents((Word16 *)hTonalMDCTConc->pTCI->indexOfTonalPeak, + (Word16 *)hTonalMDCTConc->pTCI->lowerIndex, + (Word16 *)hTonalMDCTConc->pTCI->upperIndex, hTonalMDCTConc->pTCI->phaseDiff, hTonalMDCTConc->pTCI->phase_currentFramePredicted, - &hTonalMDCTConc->pTCI->numIndexes, + (Word16 *)&hTonalMDCTConc->pTCI->numIndexes, hTonalMDCTConc->lastPitchLag, pitchLag, hTonalMDCTConc->lastBlockData.spectralData, @@ -1197,7 +1162,7 @@ void TonalMDCTConceal_Detect( powerSpectrum, nSamples, hTonalMDCTConc->nSamplesCore, - extract_l(Mpy_32_16_1(L_mult0(hTonalMDCTConc->nSamples,hTonalMDCTConc->nSamples),82))); /* floorPowerSpectrum */ + extract_l(Mpy_32_16_1(L_mult0(hTonalMDCTConc->nSamples,hTonalMDCTConc->nSamples),82)), element_mode); /* floorPowerSpectrum */ } } @@ -1220,7 +1185,8 @@ void TonalMDCTConceal_Detect_ivas_fx( const TonalMDCTConcealPtr hTonalMDCTConc, const Word32 pitchLag, Word16 * numIndices, - const PsychoacousticParameters* psychParamsCurrent + const PsychoacousticParameters* psychParamsCurrent, + Word16 element_mode ) { Word32 secondLastMDST[L_FRAME_MAX]; @@ -1288,7 +1254,7 @@ void TonalMDCTConceal_Detect_ivas_fx( secondLastMDCT_exp = sub(secondLastMDCT_exp, s); move16(); //CalcPowerSpecAndDetectTonalComponents(hTonalMDCTConc, secondLastMDST, secondLastMDST_exp, secondLastMDCT, secondLastMDCT_exp, pitchLag); - ivas_CalcPowerSpecAndDetectTonalComponents_fx(hTonalMDCTConc, secondLastMDST, secondLastMDST_exp, secondLastMDCT, secondLastMDCT_exp, pitchLag, psychParamsCurrent); + ivas_CalcPowerSpecAndDetectTonalComponents_fx(hTonalMDCTConc, secondLastMDST, secondLastMDST_exp, secondLastMDCT, secondLastMDCT_exp, pitchLag, psychParamsCurrent, element_mode); } ELSE { @@ -1306,7 +1272,7 @@ void TonalMDCTConceal_Detect_ivas_fx( { //sns_shape_spectrum(powerSpectrum, psychParamsCurrent, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->nSamplesCore); Word16 power_spectrum_q; - FOR(Word16 i = 0; i < FDNS_NPTS; i++) + FOR( i = 0; i < FDNS_NPTS; i++) { sns_int_scf_fx[i] = L_shl(hTonalMDCTConc->secondLastBlockData.scaleFactors[i], 1 + hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i]); // Q16 } @@ -1324,12 +1290,12 @@ void TonalMDCTConceal_Detect_ivas_fx( move32(); } - RefineTonalComponents(hTonalMDCTConc->pTCI->indexOfTonalPeak, - hTonalMDCTConc->pTCI->lowerIndex, - hTonalMDCTConc->pTCI->upperIndex, + RefineTonalComponents((Word16 *)hTonalMDCTConc->pTCI->indexOfTonalPeak, + (Word16 *)hTonalMDCTConc->pTCI->lowerIndex, + (Word16 *)hTonalMDCTConc->pTCI->upperIndex, hTonalMDCTConc->pTCI->phaseDiff, hTonalMDCTConc->pTCI->phase_currentFramePredicted, - &hTonalMDCTConc->pTCI->numIndexes, + (Word16 *)&hTonalMDCTConc->pTCI->numIndexes, hTonalMDCTConc->lastPitchLag, pitchLag, hTonalMDCTConc->lastBlockData.spectralData, @@ -1340,7 +1306,7 @@ void TonalMDCTConceal_Detect_ivas_fx( powerSpectrum, nSamples, hTonalMDCTConc->nSamplesCore, - extract_l(Mpy_32_16_1(L_mult0(hTonalMDCTConc->nSamples,hTonalMDCTConc->nSamples),82))); /* floorPowerSpectrum */ + extract_l(Mpy_32_16_1(L_mult0(hTonalMDCTConc->nSamples,hTonalMDCTConc->nSamples),82)), element_mode); /* floorPowerSpectrum */ } } @@ -2801,8 +2767,6 @@ void TonalMDCTConceal_Apply_ivas_fx( const PsychoacousticParameters *psychParamsCurrent ) { - /* TODO: change pTCI to pTCI in this function. */ - Word16 i, l; Word16 *phaseDiff, *pCurrentPhase; Word32 phaseToAdd; @@ -2812,10 +2776,8 @@ void TonalMDCTConceal_Apply_ivas_fx( Word16 nSamples; Word16 nBands; - /* TODO: remove this later. */ - Word16 *tmp_secondLastPowerSpectrum = (Word16 *)malloc(hTonalMDCTConc->nNonZeroSamples * sizeof(Word16)); - Word16 tmp_secondLastPowerSpectrum_exp; - f2me_buf_16(hTonalMDCTConc->secondLastPowerSpectrum_float, tmp_secondLastPowerSpectrum, &tmp_secondLastPowerSpectrum_exp, hTonalMDCTConc->nNonZeroSamples); + Word16 *tmp_secondLastPowerSpectrum = hTonalMDCTConc->secondLastPowerSpectrum; + Word16 tmp_secondLastPowerSpectrum_exp = hTonalMDCTConc->secondLastPowerSpectrum_exp; Word16 max_nSamples = s_max(hTonalMDCTConc->nNonZeroSamples, hTonalMDCTConc->nSamplesCore); @@ -2835,7 +2797,7 @@ void TonalMDCTConceal_Apply_ivas_fx( nSamples = hTonalMDCTConc->nNonZeroSamples; move16(); assert( hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] < nSamples ); - //mvr2r( hTonalMDCTConc->secondLastPowerSpectrum_float, powerSpectrum_flt, nSamples ); /* Convert from 16 bits to 32 bits */ + FOR (i = 0; i < nSamples; i++) { powerSpectrum[i] = L_deposit_h(tmp_secondLastPowerSpectrum[i]); @@ -2961,9 +2923,6 @@ void TonalMDCTConceal_Apply_ivas_fx( } } - /* TODO: remove this later. */ - free(tmp_secondLastPowerSpectrum); - hTonalMDCTConc->nFramesLost = add(hTonalMDCTConc->nFramesLost, 2); /*Q1*/ move16(); diff --git a/lib_dec/updt_dec.c b/lib_dec/updt_dec.c index 3f37a73144e880505efcc0534f8aae1269066407..fafad2f8571a9b277c282fdd572c1039c7fe3b8c 100644 --- a/lib_dec/updt_dec.c +++ b/lib_dec/updt_dec.c @@ -42,7 +42,7 @@ #include "cnst.h" #include #include "wmc_auto.h" -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * updt_dec() * @@ -319,7 +319,7 @@ void updt_IO_switch_dec( /* AMR-WB IO init */ mvr2r( st->hAmrwb_IO->lt_diff_etot, tmpF, MAX_LT ); - amr_wb_dec_init_flt( st->hAmrwb_IO ); + amr_wb_dec_init( st->hAmrwb_IO ); mvr2r( tmpF, st->hAmrwb_IO->lt_diff_etot, MAX_LT ); hf_synth_amr_wb_reset( st->hAmrwb_IO, st->hBWE_zero ); diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index e24c95e12ad0e7bca2a85f97792b284acdb87687..a9576c88dc76d43683fe2016a753f4ce944f1442 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -345,7 +345,7 @@ void updt_IO_switch_dec_fx( } Copy(st_fx->hAmrwb_IO->lt_diff_etot_fx, tmp_buf, MAX_LT); - amr_wb_dec_init(st_fx->hAmrwb_IO); + amr_wb_dec_init_fx(st_fx->hAmrwb_IO); Copy(tmp_buf, st_fx->hAmrwb_IO->lt_diff_etot_fx, MAX_LT); hf_synth_amr_wb_reset_fx(st_fx->hBWE_zero, st_fx->hAmrwb_IO); diff --git a/lib_dec/voiced_dec.c b/lib_dec/voiced_dec.c index 37d6db9d51518ae21a31a592a9e37646593d29ee..76cf273a568504d6c6abfd1e9c12ae94872e7a4b 100644 --- a/lib_dec/voiced_dec.c +++ b/lib_dec/voiced_dec.c @@ -47,7 +47,7 @@ * * Voiced decoder for SC-VBR *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED ivas_error ppp_voiced_decoder( Decoder_State *st, /* i/o: state structure */ float *out, /* o : residual signal */ @@ -124,7 +124,7 @@ ivas_error ppp_voiced_decoder( { for ( k = 0; k < NB_SUBFR; k++ ) { - /* do the linear pitch interp to drive the nb_post_filt */ + /* do the linear pitch interp to drive the nb_post_filt_fx */ Interpol_delay( interp_delay, &( temp_pl ), &( temp_l ), k, frac_4sf ); pitch[k] = min( MAX_LAG_PIT, max( 19, interp_delay[0] ) ); } @@ -246,7 +246,7 @@ ivas_error ppp_voiced_decoder( * * Initialize SC-VBR decoder *---------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void sc_vbr_dec_init_flt( SC_VBR_DEC_HANDLE hSC_VBR /* i/o: SC-VBR decoder handle */ ) diff --git a/lib_dec/voiced_dec_fx.c b/lib_dec/voiced_dec_fx.c index 607939b6dfe78eea5d81b2a3a23249bf35dfc5cc..c5d761968ab7b66d521c9b11a1cffc862cd9bf1c 100644 --- a/lib_dec/voiced_dec_fx.c +++ b/lib_dec/voiced_dec_fx.c @@ -158,7 +158,7 @@ ivas_error ppp_voiced_decoder_fx( { FOR(k=0; kL_frameTCX = L_frameTCX; hPlcInfo->Pitch = 0; hPlcInfo->T_bfi = 0; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hPlcInfo->outx_new_n1 = 0.0f; hPlcInfo->nsapp_gain = 0.0f; #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hPlcInfo->nsapp_gain_n = 0.0f; hPlcInfo->ener_mean = 59.4260f; #endif -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hPlcInfo->ener = 0.0f; #endif hPlcInfo->zp = L_frameTCX; -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED hPlcInfo->recovery_gain_float = 0.0f; hPlcInfo->step_concealgain = 0.0f; #endif @@ -712,7 +712,7 @@ void concealment_init( { hPlcInfo->Transient[i] = 1; } -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED for ( i = 0; i < L_FRAME_MAX; i++ ) { hPlcInfo->data_reci2[i] = 0; @@ -727,7 +727,7 @@ void concealment_init( * * *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void concealment_decode( const int16_t core, float *invkoef, @@ -762,7 +762,7 @@ void concealment_decode( * * *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void concealment_update( const int16_t bfi, const int16_t core, @@ -820,7 +820,7 @@ void concealment_update( * * *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void concealment_update2( const float *outx_new, @@ -845,7 +845,7 @@ void concealment_update2( * * *-------------------------------------------------------------------*/ -#if (defined EVS_FLOAT) || !(defined IVAS_FLOAT_FIXED) +#ifndef IVAS_FLOAT_FIXED void concealment_signal_tuning( Decoder_State *st, const int16_t bfi, diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 5e1c4597ed9e762ccacd841dc7a58e81bc951f74..5ca49dbbf4b909574cb27fdd472ee82a1573eae9 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -4515,6 +4515,9 @@ static int16_t encode_surround_coherence_hr( int16_t max_val = 0, nbits_max; int16_t no_cv_shift[MASA_MAXIMUM_CODING_SUBBANDS], min_idx; int16_t idx16; +#ifdef NON_BE_FIX_1048_THRESHOLD_COH_BASOP + int32_t int_error_ratio_surr; +#endif coding_subbands = hQMetaData->q_direction[0].cfg.nbands; all_coherence_zero = hQMetaData->all_coherence_zero; @@ -4544,7 +4547,10 @@ static int16_t encode_surround_coherence_hr( { error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf]; } - +#ifdef NON_BE_FIX_1048_THRESHOLD_COH_BASOP + int_error_ratio_surr = (int32_t) ( MASA_SUR_COH_PRECISION * error_ratio_surr ); + error_ratio_surr = (float) ( int_error_ratio_surr * MASA_SUR_COH_THRESHOLD ); +#endif if ( error_ratio_surr <= 0 ) { diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 79482e455e39804fde699a478ccb2917d45d812d..33f28aa24b5b255a301a8f0d0723dd37fc4f02c7 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -375,7 +375,6 @@ ivas_error ivas_spar_md_enc_init_fx( { Word32 pFC[IVAS_MAX_NUM_BANDS]; Word16 table_idx; - Word32 PR_minmax_fx[2]; Word16 num_channels, i, j, k; ivas_sba_get_spar_hoa_md_flag(sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag); diff --git a/lib_enc/voiced_enc.c b/lib_enc/voiced_enc.c index b8ff9df91b1e8c3a0a2f6eefb77c0587ac9f8513..08d1efefbba6698b6f41709f33dc41c5e41946d5 100644 --- a/lib_enc/voiced_enc.c +++ b/lib_enc/voiced_enc.c @@ -638,7 +638,7 @@ ivas_error ppp_voiced_encoder( for ( i = 0; i < NB_SUBFR; i++ ) { - /* do the linear pitch interp to drive the nb_post_filt */ + /* do the linear pitch interp to drive the nb_post_filt_fx */ Interpol_delay( interp_delay, &( temp_pl ), &( temp_l ), i, frac_4sf ); pitch[i] = interp_delay[0]; } diff --git a/lib_enc/voiced_enc_fx.c b/lib_enc/voiced_enc_fx.c index 054356449bbfb86b389bf94623e8e577b495551e..b6b16a1a8c49c29f4d4ce64552d56cd4f89d3ef4 100644 --- a/lib_enc/voiced_enc_fx.c +++ b/lib_enc/voiced_enc_fx.c @@ -306,7 +306,7 @@ ivas_error ppp_voiced_encoder_fx( FOR(i = 0; i < NB_SUBFR; i++) { - /* do the linear pitch_fx interp to drive the nb_post_filt */ + /* do the linear pitch_fx interp to drive the nb_post_filt_fx */ Interpol_delay_fx(interp_delay, temp_pl, temp_l, i, frac_4sf_fx); /* interp_delay in Q4 */ pitch_fx[i] = shl(interp_delay[0],2); move16();/* pitch_fx in Q6 */ diff --git a/lib_rend/ivas_allrad_dec.c b/lib_rend/ivas_allrad_dec.c index 9900e16c65526950fe910b9b268ec2b0ea7e5e6a..e72dcf82e31cb37ef6ac667f9aeb62bb3ecfd3ad 100644 --- a/lib_rend/ivas_allrad_dec.c +++ b/lib_rend/ivas_allrad_dec.c @@ -162,7 +162,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix( } #else #define TEMP_VAL 1963413621 // Q37 (1.f / num_td) -ivas_error ivas_sba_get_hoa_dec_matrix( +ivas_error ivas_sba_get_hoa_dec_matrix_fx( const IVAS_OUTPUT_SETUP hOutSetup, /* i : target output setup */ Word32 **hoa_dec_mtx, /* o : ALLRAD decoder matrix */ const Word16 ambisonics_order /* i : Ambisonics order */ @@ -213,7 +213,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix( ELSE IF( hOutSetup.is_loudspeaker_setup ) { /* init EFIP */ - IF( ( error = efap_init_data( &( hEFAP ), hOutSetup.ls_azimuth, hOutSetup.ls_elevation, num_spk, EFAP_MODE_EFIP ) ) != IVAS_ERR_OK ) + IF( ( error = efap_init_data_fx( &( hEFAP ), hOutSetup.ls_azimuth_fx, hOutSetup.ls_elevation_fx, num_spk, EFAP_MODE_EFIP ) ) != IVAS_ERR_OK ) { return error; } @@ -239,7 +239,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix( } /* t-design to real LS panning gains */ - efap_determine_gains_fixed( hEFAP, G_td_int, t_design_azi[i], t_design_ele[i], EFAP_MODE_EFIP ); // G_td_int Q30 + efap_determine_gains_fx( hEFAP, G_td_int, t_design_azi[i], t_design_ele[i], EFAP_MODE_EFIP ); // G_td_int Q30 p_dec_mtx = *hoa_dec_mtx; FOR( j = 0; j < num_spk; j++ ) diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index fb421900391ce77ecc172f5823b9919559daba3c..6a5c50f8d9182d8ba5653722ae9d264f4b2fce7c 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -2696,169 +2696,160 @@ ivas_error ivas_rend_openCrend( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, HRTFS_CREND_HANDLE hSetOfHRTF, - const int32_t output_Fs ) + const Word32 output_Fs ) { - int16_t i, subframe_length; - int16_t max_total_ir_len; + Word16 i, subframe_length; + Word16 max_total_ir_len; HRTFS_HANDLE hHrtf; CREND_HANDLE hCrend; ivas_error error; error = IVAS_ERR_OK; - if ( ( error = ivas_rend_initCrendWrapper( pCrend ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_rend_initCrendWrapper( pCrend ) ) != IVAS_ERR_OK ) { return error; } - subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; + subframe_length = extract_l(Mult_32_16( output_Fs , 164));/*( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES(i/o:164=(32768/FRAMES_PER_SEC)/MAX_PARAM_SPATIAL_SUBFRAMES*/ - if ( ( *pCrend )->hHrtfCrend == NULL ) + IF ( ( *pCrend )->hHrtfCrend == NULL ) { -#ifdef IVAS_FLOAT_FIXED -#if 1 /*Cleanup changes: float to fixed*/ - IF( hSetOfHRTF ) - { - hSetOfHRTF->hHRTF_brir_combined->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_brir_combined->latency_s, 31 ); - hSetOfHRTF->hHRTF_hrir_foa->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_foa->latency_s, 31 ); - hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_combined->latency_s, 31 ); - hSetOfHRTF->hHRTF_hrir_hoa3->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_hoa3->latency_s, 31 ); - hSetOfHRTF->hHRTF_hrir_hoa2->latency_s_fx = floatToFixed( hSetOfHRTF->hHRTF_hrir_hoa2->latency_s, 31 ); - floatToFixed_arr( hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight, hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight_fx, 15, 16 ); - floatToFixed_arr( hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight, hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight_fx, 15, 16 ); - floatToFixed_arr( hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight, hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight_fx, 15, 16 ); - floatToFixed_arr( hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight, hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight_fx, 15, 16 ); - floatToFixed_arr( hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight, hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight_fx, 15, 16 ); - } IF ( ( error = ivas_rend_initCrend_fx( *pCrend, inConfig, outConfig, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#if 1/*Cleanup changes: float to fixed*/ - ( *pCrend )->hHrtfCrend->gain_lfe = fixedToFloat( ( *pCrend )->hHrtfCrend->gain_lfe_fx, 14 ); - ( *pCrend )->hHrtfCrend->latency_s = fixedToFloat( ( *pCrend )->hHrtfCrend->latency_s_fx, 31 ); - fixedToFloat_arr( ( *pCrend )->hHrtfCrend->inv_diffuse_weight_fx, ( *pCrend )->hHrtfCrend->inv_diffuse_weight, 15, 16 ); -#endif -#endif // 1 -#else - if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } { hCrend = ( *pCrend )->hCrend; hHrtf = ( *pCrend )->hHrtfCrend; - if ( hHrtf != NULL ) + IF ( hHrtf != NULL ) { - max_total_ir_len = hHrtf->max_num_iterations * subframe_length; + max_total_ir_len = imult1616(hHrtf->max_num_iterations , subframe_length); - for ( i = 0; i < hHrtf->max_num_ir; i++ ) + FOR ( i = 0; i < hHrtf->max_num_ir; i++ ) { - if ( ( hCrend->freq_buffer_re[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) +#if 1/*TODO: Floating point memory allocation:To be removed later*/ + IF ( ( hCrend->freq_buffer_re[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } set_zero( hCrend->freq_buffer_re[i], max_total_ir_len ); - if ( ( hCrend->freq_buffer_re_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + IF ( ( hCrend->freq_buffer_im[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - set_val_Word32( hCrend->freq_buffer_re_fx[i], 0, max_total_ir_len ); + set_zero( hCrend->freq_buffer_im[i], max_total_ir_len ); +#endif - if ( ( hCrend->freq_buffer_im[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + IF ( ( hCrend->freq_buffer_re_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - set_zero( hCrend->freq_buffer_im[i], max_total_ir_len ); - if ( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + set_zero_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len ); + IF ( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - set_val_Word32( hCrend->freq_buffer_im_fx[i], 0, max_total_ir_len ); + set_zero_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len ); } - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + FOR ( i = 0; i < BINAURAL_CHANNELS; i++ ) { - if ( ( hCrend->prev_out_buffer[i] = (float *) malloc( sizeof( float ) * subframe_length ) ) == NULL ) +#if 1/*TODO: Floating point memory allocation:To be removed later*/ + IF ( ( hCrend->prev_out_buffer[i] = (float *) malloc( sizeof( float ) * subframe_length ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - if ( ( hCrend->prev_out_buffer_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * subframe_length ) ) == NULL ) + set_zero( hCrend->prev_out_buffer[i], subframe_length ); +#endif + IF ( ( hCrend->prev_out_buffer_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * subframe_length ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - set_zero( hCrend->prev_out_buffer[i], subframe_length ); - set_val_Word32( hCrend->prev_out_buffer_fx[i], 0, subframe_length ); + set_zero_fx( hCrend->prev_out_buffer_fx[i], subframe_length ); } - max_total_ir_len = hHrtf->num_iterations_diffuse[0] * subframe_length; + max_total_ir_len = imult1616((Word16)hHrtf->num_iterations_diffuse[0] , subframe_length); - if ( max_total_ir_len > 0 ) + IF ( GT_16(max_total_ir_len , 0) ) { +#if 1/*TODO: Floating point memory allocation:To be removed later*/ if ( ( hCrend->freq_buffer_re_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } set_zero( hCrend->freq_buffer_re_diffuse, max_total_ir_len ); - if ( ( hCrend->freq_buffer_re_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + if ( ( hCrend->freq_buffer_im_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - set_val_Word32( hCrend->freq_buffer_re_diffuse_fx, 0, max_total_ir_len ); - if ( ( hCrend->freq_buffer_im_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) + set_zero( hCrend->freq_buffer_im_diffuse, max_total_ir_len ); +#endif // + IF ( ( hCrend->freq_buffer_re_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - set_zero( hCrend->freq_buffer_im_diffuse, max_total_ir_len ); - if ( ( hCrend->freq_buffer_im_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + set_zero_fx( hCrend->freq_buffer_re_diffuse_fx,max_total_ir_len ); + IF ( ( hCrend->freq_buffer_im_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - set_val_Word32( hCrend->freq_buffer_im_diffuse_fx, 0, max_total_ir_len ); + set_zero_fx( hCrend->freq_buffer_im_diffuse_fx,max_total_ir_len ); } - else + ELSE { +#if 1/*TODO: Floating point memory allocation:To be removed later*/ hCrend->freq_buffer_re_diffuse = NULL; - hCrend->freq_buffer_re_diffuse_fx = NULL; hCrend->freq_buffer_im_diffuse = NULL; +#endif // + hCrend->freq_buffer_re_diffuse_fx = NULL; hCrend->freq_buffer_im_diffuse_fx = NULL; } - max_total_ir_len = (int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length; - if ( max_total_ir_len > 0 ) + 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 ( ( hCrend->lfe_delay_line = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) +#if 1/*TODO: Floating point memory allocation:To be removed later*/ + IF ( ( hCrend->lfe_delay_line = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } set_zero( hCrend->lfe_delay_line, max_total_ir_len ); +#endif + IF ( ( hCrend->lfe_delay_line_fx = (Word32 *) malloc( sizeof(Word32) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero_fx( hCrend->lfe_delay_line_fx, max_total_ir_len ); } - else + ELSE { +#if 1/*TODO: Floating point memory allocation:To be removed later*/ hCrend->lfe_delay_line = NULL; +#endif + hCrend->lfe_delay_line_fx = NULL; } - if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + IF ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_reverb_open( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend,NULL, hRendCfg, output_Fs ) ) != IVAS_ERR_OK ) { return error; } - if ( hRendCfg->roomAcoustics.use_er == 1 ) + IF ( EQ_16(hRendCfg->roomAcoustics.use_er , 1) ) { /* Allocate memory for reflections */ hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) ); - if ( !hCrend->reflections ) + IF ( !hCrend->reflections ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" ); } - if ( ( error = ivas_er_init_handle( hCrend->reflections ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_er_init_handle( hCrend->reflections ) ) != IVAS_ERR_OK ) { return error; } @@ -2867,55 +2858,35 @@ ivas_error ivas_rend_openCrend( hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; /* Set sample rate and frame size */ -#ifndef IVAS_FLOAT_FIXED - hCrend->reflections->output_Fs = (float) output_Fs; -#else - hCrend->reflections->output_Fs_fx = (Word32) output_Fs; -#endif - hCrend->reflections->max_frame_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ); -#ifdef IVAS_FLOAT_FIXED - hRendCfg->roomAcoustics.dimensions.x_fx = (Word32)(hRendCfg->roomAcoustics.dimensions.x * 4194304); // Q10.22, min value:1, max :999.0 - hRendCfg->roomAcoustics.dimensions.y_fx = (Word32)(hRendCfg->roomAcoustics.dimensions.y * 4194304); // Q10.22 - hRendCfg->roomAcoustics.dimensions.z_fx = (Word32)(hRendCfg->roomAcoustics.dimensions.z * 4194304); // Q10.22 + hCrend->reflections->output_Fs_fx = (Word32) output_Fs; - for ( int ii = 0; ii < 6; ii++ ) - { - hRendCfg->roomAcoustics.AbsCoeff_fx[ii] = (Word32)(hRendCfg->roomAcoustics.AbsCoeff[ii] * 1073741824); // Q2.30 min :0 max 1 - } - - hRendCfg->roomAcoustics.ListenerOrigin.x_fx = (Word32)(hRendCfg->roomAcoustics.ListenerOrigin.x * 4194304); //( 2147483648 >> 2 ); - hRendCfg->roomAcoustics.ListenerOrigin.y_fx = (Word32)(hRendCfg->roomAcoustics.ListenerOrigin.y * ( 4194304 )); - hRendCfg->roomAcoustics.ListenerOrigin.z_fx = (Word32)(hRendCfg->roomAcoustics.ListenerOrigin.z * ( 4194304 )); - - -#endif + hCrend->reflections->max_frame_size = extract_l(Mult_32_16( output_Fs , INV_FRAME_PER_SEC_Q15)); /* Init Shoebox */ ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); /* Init and compute Reflections */ - if ( ( error = ivas_er_init( hCrend->reflections, inConfig ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_er_init( hCrend->reflections, inConfig ) ) != IVAS_ERR_OK ) { return error; } } - else + ELSE { hCrend->reflections = NULL; } } - else + ELSE { hCrend->hReverb = NULL; } - ( *pCrend )->binaural_latency_ns = (int32_t) ( ( *pCrend )->hHrtfCrend->latency_s * 1000000000.f ); + ( *pCrend )->binaural_latency_ns = Mult_32_32( ( *pCrend )->hHrtfCrend->latency_s_fx , (Word32)1000000000 ); } ( *pCrend )->hCrend = hCrend; } - return IVAS_ERR_OK; } @@ -2983,12 +2954,25 @@ void ivas_rend_closeCrend( } } +#ifdef IVAS_FLOAT_FIXED + if ( hCrend->lfe_delay_line_fx != NULL ) + { + free( hCrend->lfe_delay_line_fx ); + hCrend->lfe_delay_line_fx = NULL; + } +#endif if ( hCrend->lfe_delay_line != NULL ) { free( hCrend->lfe_delay_line ); hCrend->lfe_delay_line = NULL; } + if ( hCrend->lfe_delay_line_fx != NULL ) + { + free( hCrend->lfe_delay_line_fx); + hCrend->lfe_delay_line_fx = NULL; + } + if ( hCrend->freq_buffer_re_diffuse != NULL ) { free( hCrend->freq_buffer_re_diffuse ); diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index 631fd5f5546293a2042efd89666db5f011e1f8a4..a7f86d310aa88a4a6e3d002fe6f8371645f944d0 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -49,13 +49,12 @@ * Local function prototypes *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -static void ivas_dirac_param_est_ana( DIRAC_ANA_HANDLE hDirAC, Word32 data_f[][L_FRAME48k], Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const Word16 input_frame ); +static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, Word32 data_f[][L_FRAME48k], Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const Word16 input_frame ); static void ivas_dirac_dmx_fx( Word32 data_in_fx[][L_FRAME48k], const Word16 input_frame, const Word16 nchan_transport ); - #else static void ivas_dirac_param_est_ana( DIRAC_ANA_HANDLE hDirAC, float data_f[][L_FRAME48k], float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const int16_t input_frame ); -#endif static void ivas_dirac_dmx( float data_in_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_transport ); +#endif @@ -65,6 +64,113 @@ static void ivas_dirac_dmx( float data_in_f[][L_FRAME48k], const int16_t input_f * Allocate and initialize DIRAC handle *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_dirac_ana_open_fx( + DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ + Word32 input_Fs /* i : Sampling frequency */ +) +{ + Word16 i, j; + DIRAC_ANA_HANDLE hDirAC; + Word16 numAnalysisChannels; + Word16 maxBin; + ivas_error error; + + error = IVAS_ERR_OK; + + IF( ( hDirAC = (DIRAC_ANA_HANDLE) malloc( sizeof( DIRAC_ANA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DIRAC\n" ) ); + } + + numAnalysisChannels = FOA_CHANNELS; + move16(); + + /* Determine the number of bands */ + hDirAC->nbands = MASA_FREQUENCY_BANDS; + move16(); + + /* Determine band grouping */ + Copy( MASA_band_grouping_24, hDirAC->band_grouping, 24 + 1 ); + + // maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + Word32 n_input_Fs = L_shl( input_Fs, 1 ); + Word32 val = L_add( Mpy_32_16_1( n_input_Fs, 41 /* INV_CLDFB_BANDWIDTH in Q15 */ ), 1 ); + val = L_shr( val, 1 ); + maxBin = extract_l( val ); + FOR( i = 1; i < hDirAC->nbands + 1; i++ ) + { + IF( GE_16( hDirAC->band_grouping[i], maxBin ) ) + { + hDirAC->band_grouping[i] = maxBin; + move16(); + hDirAC->nbands = i; + move16(); + BREAK; + } + } + + /* Determine block grouping */ + Copy( DirAC_block_grouping, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + + /* open/initialize CLDFB */ + hDirAC->num_Cldfb_instances = numAnalysisChannels; + move16(); + FOR( i = 0; i < hDirAC->num_Cldfb_instances; i++ ) + { + IF( ( error = openCldfb_ivas_fx( &( hDirAC->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + IF( ( hDirAC->direction_vector_m_fx[i] = (Word32 **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + IF( ( hDirAC->direction_vector_m_fx[i][j] = (Word32 *) malloc( MASA_FREQUENCY_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set32_fx( hDirAC->direction_vector_m_fx[i][j], 0, MASA_FREQUENCY_BANDS ); + } + } + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + IF( ( hDirAC->buffer_intensity_real_fx[i][j] = (Word32 *) malloc( MASA_FREQUENCY_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + set32_fx( hDirAC->buffer_intensity_real_fx[i][j], 0, MASA_FREQUENCY_BANDS ); + } + } + set32_fx( hDirAC->buffer_energy_fx, 0, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); + + hDirAC->index_buffer_intensity = 0; + move16(); + + IF( ( hDirAC->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + IF( ( hDirAC->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + generate_gridEq_fx( hDirAC->sph_grid16 ); + + ( *hDirACPtr ) = hDirAC; + + return error; +} +#else ivas_error ivas_dirac_ana_open( DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ int32_t input_Fs /* i : Sampling frequency */ @@ -132,24 +238,7 @@ ivas_error ivas_dirac_ana_open( set_zero( hDirAC->direction_vector_m[i][j], MASA_FREQUENCY_BANDS ); } } -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - if ( ( hDirAC->direction_vector_m_fx[i] = (Word32 **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); - } - for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - if ( ( hDirAC->direction_vector_m_fx[i][j] = (Word32 *) malloc( MASA_FREQUENCY_BANDS * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); - } - set_val_Word32( hDirAC->direction_vector_m_fx[i][j], 0, MASA_FREQUENCY_BANDS ); - } - } -#endif for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) @@ -161,20 +250,7 @@ ivas_error ivas_dirac_ana_open( set_zero( hDirAC->buffer_intensity_real[i][j], MASA_FREQUENCY_BANDS ); } } -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) - { - if ( ( hDirAC->buffer_intensity_real_fx[i][j] = (Word32 *) malloc( MASA_FREQUENCY_BANDS * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); - } - set_val_Word32( hDirAC->buffer_intensity_real_fx[i][j], 0, MASA_FREQUENCY_BANDS ); - } - } - set_val_Word32( hDirAC->buffer_energy_fx, 0, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); -#endif + set_zero( hDirAC->buffer_energy, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); hDirAC->index_buffer_intensity = 0; @@ -194,6 +270,7 @@ ivas_error ivas_dirac_ana_open( return error; } +#endif /*--------------------------------------------------------------------------* @@ -202,6 +279,52 @@ ivas_error ivas_dirac_ana_open( * Close DIRAC handle *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_ana_close_fx( + DIRAC_ANA_HANDLE( *hDirAC ) /* i/o: analysis DIRAC handle */ +) +{ + Word16 i, j; + + test(); + IF( hDirAC == NULL || *hDirAC == NULL ) + { + return; + } + + FOR( i = 0; i < ( *hDirAC )->num_Cldfb_instances; i++ ) + { + deleteCldfb_ivas_fx( &( ( *hDirAC )->cldfbAnaEnc[i] ) ); + } + + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hDirAC )->direction_vector_m_fx[i][j] ); + ( *hDirAC )->direction_vector_m_fx[i][j] = NULL; + } + free( ( *hDirAC )->direction_vector_m_fx[i] ); + ( *hDirAC )->direction_vector_m_fx[i] = NULL; + + FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hDirAC )->buffer_intensity_real_fx[i][j] ); + ( *hDirAC )->buffer_intensity_real_fx[i][j] = NULL; + } + } + + free( ( *hDirAC )->hMasaOut ); + ( *hDirAC )->hMasaOut = NULL; + free( ( *hDirAC )->sph_grid16 ); + ( *hDirAC )->sph_grid16 = NULL; + + free( ( *hDirAC ) ); + ( *hDirAC ) = NULL; + + return; +} +#else void ivas_dirac_ana_close( DIRAC_ANA_HANDLE( *hDirAC ) /* i/o: analysis DIRAC handle */ ) @@ -225,27 +348,13 @@ void ivas_dirac_ana_close( free( ( *hDirAC )->direction_vector_m[i][j] ); ( *hDirAC )->direction_vector_m[i][j] = NULL; } -#ifdef IVAS_FLOAT_FIXED - for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - free( ( *hDirAC )->direction_vector_m_fx[i][j] ); - ( *hDirAC )->direction_vector_m_fx[i][j] = NULL; - } -#endif + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { free( ( *hDirAC )->buffer_intensity_real[i][j] ); ( *hDirAC )->buffer_intensity_real[i][j] = NULL; } -#ifdef IVAS_FLOAT_FIXED - for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) - { - free( ( *hDirAC )->buffer_intensity_real_fx[i][j] ); - ( *hDirAC )->buffer_intensity_real_fx[i][j] = NULL; - } - free( ( *hDirAC )->direction_vector_m_fx[i] ); - ( *hDirAC )->direction_vector_m_fx[i] = NULL; -#endif + free( ( *hDirAC )->direction_vector_m[i] ); ( *hDirAC )->direction_vector_m[i] = NULL; } @@ -260,7 +369,8 @@ void ivas_dirac_ana_close( return; } -#ifdef IVAS_FLOAT_FIXED +#endif + /*--------------------------------------------------------------------------* * ivas_dirac_ana() @@ -268,11 +378,12 @@ void ivas_dirac_ana_close( * DIRAC analysis function *--------------------------------------------------------------------------*/ -void ivas_dirac_ana( - DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_ana_fx( + DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ Word32 data_fx[][L_FRAME48k], /* i/o: Input / transport audio signals */ const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport /* i : Number of transport channels */ + const Word16 nchan_transport /* i : Number of transport channels */ ) { Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -281,24 +392,21 @@ void ivas_dirac_ana( Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word16 energyRatio_q, surroundingCoherence_q = 0, spreadCoherence_q = 0; + move16(); + move16(); /* Estimate MASA parameters from the SBA signals */ - ivas_dirac_param_est_ana( hDirAC, data_fx, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); + ivas_dirac_param_est_ana_fx( hDirAC, data_fx, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); energyRatio_q = 30; + move16(); /* Create MASA metadata buffer from the estimated values */ ivas_create_masa_out_meta_fx( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, energyRatio_q, spreadCoherence_q, surroundingCoherence_q ); /* Downmix */ - ivas_dirac_dmx_fx( data_fx, input_frame, nchan_transport );//output Q of data_fx is same as that of input - + ivas_dirac_dmx_fx( data_fx, input_frame, nchan_transport ); // output Q of data_fx is same as that of input + return; } #else -/*--------------------------------------------------------------------------* - * ivas_dirac_ana() - * - * DIRAC analysis function - *--------------------------------------------------------------------------*/ - void ivas_dirac_ana( DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ @@ -324,16 +432,16 @@ void ivas_dirac_ana( return; } - #endif -#ifdef IVAS_FLOAT_FIXED + /*--------------------------------------------------------------------------* * Local functions *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED /* Estimate MASA parameters from the SBA signals */ -static void ivas_dirac_param_est_ana( +static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, Word32 data_fx[][L_FRAME48k], Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], @@ -375,235 +483,276 @@ static void ivas_dirac_param_est_ana( tmp = shr( tmp, negate( add( 1, tmp_e ) ) ); l_ts = tmp; numAnalysisChannels = FOA_CHANNELS; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + /* do processing over all CLDFB time slots */ - FOR ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) { mrange[0] = hDirAC->block_grouping[block_m_idx]; + move16(); mrange[1] = hDirAC->block_grouping[block_m_idx + 1]; + move16(); - FOR ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = 0; + move32(); hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = 0; + move32(); hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = 0; + move32(); } /* Need to initialize renormalization_factors, and variables to be normalized */ - set_val_Word32( renormalization_factor_diff_fx, 0, hDirAC->nbands ); - set_val_Word32( diffuseness_m_fx, 0, hDirAC->nbands ); - set_val_Word32( hDirAC->energy_fx[block_m_idx], 0, MASA_FREQUENCY_BANDS ); - set_val_Word32( hDirAC->energy_fx[block_m_idx], 0, MASA_FREQUENCY_BANDS ); + set32_fx( renormalization_factor_diff_fx, 0, hDirAC->nbands ); + set32_fx( diffuseness_m_fx, 0, hDirAC->nbands ); + set32_fx( hDirAC->energy_fx[block_m_idx], 0, MASA_FREQUENCY_BANDS ); + set32_fx( hDirAC->energy_fx[block_m_idx], 0, MASA_FREQUENCY_BANDS ); - FOR ( ts = mrange[0]; ts < mrange[1]; ts++ ) + FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { - FOR ( i = 0; i < numAnalysisChannels; i++ ) + FOR( i = 0; i < numAnalysisChannels; i++ ) { - io_q = Q7;// Input Q of data_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 ); } scale_fact = getScaleFactor32( (const Word32 *) Foa_RealBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ); - scale_fact = min( getScaleFactor32( (const Word32 *) Foa_ImagBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ), scale_fact ); - FOR ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + scale_fact = s_min( getScaleFactor32( (const Word32 *) Foa_ImagBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ), scale_fact ); + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { - FOR ( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) { - Foa_RealBuffer_fx[i][j] = L_shl( Foa_RealBuffer_fx[i][j], ( scale_fact - Q3 ) ); // Q( scale_fact + Q1 ) - Foa_ImagBuffer_fx[i][j] = L_shl( Foa_ImagBuffer_fx[i][j], ( scale_fact - Q3 ) ); // Q( scale_fact + Q1 ) + Foa_RealBuffer_fx[i][j] = L_shl( Foa_RealBuffer_fx[i][j], sub( scale_fact, Q3 ) ); // Q( scale_fact + Q1 ) + move32(); + Foa_ImagBuffer_fx[i][j] = L_shl( Foa_ImagBuffer_fx[i][j], sub( scale_fact, Q3 ) ); // Q( scale_fact + Q1 ) + move32(); } } /* Compute omni energy for metadata processing */ - FOR ( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) + FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) { brange[0] = hDirAC->band_grouping[band_m_idx]; + move16(); brange[1] = hDirAC->band_grouping[band_m_idx + 1]; - FOR ( j = brange[0]; j < brange[1]; j++ ) + move16(); + FOR( j = brange[0]; j < brange[1]; j++ ) { hDirAC->energy_fx[block_m_idx][band_m_idx] = ( L_add( hDirAC->energy_fx[block_m_idx][band_m_idx], L_add( Mpy_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Mpy_32_32( Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ) ) ) ); // 2*( scale_fact + Q1 )-31 + move32(); } } /* Direction estimation */ computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); // 2 * ( scale_fact + Q1 ) - 31 - exp = ( 2 * ( scale_fact - Q1 ) - 31 ); + exp = sub( shl( sub( scale_fact, Q1 ), 1 ), 31 ); computeDirectionVectors_fx( 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], &exp ); /* Power estimation for diffuseness */ computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); //( 2 * ( scale_fact - Q1 ) - 31 - 1 ); // computeReferencePower_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands ); - exp2 = ( 2 * ( scale_fact ) - 31 ); + exp2 = sub( shl( scale_fact, 1 ), 31 ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ - hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + hDirAC->index_buffer_intensity = add( ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ index = hDirAC->index_buffer_intensity; + move16(); Word16 guard_bits = find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ); scale_fact2 = getScaleFactor32( (const Word32 *) intensity_real_fx, DIRAC_NUM_DIMS * MASA_FREQUENCY_BANDS ); - IF ( guard_bits > scale_fact2 ) + IF( GT_16( guard_bits, scale_fact2 ) ) { - FOR ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { - FOR ( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) { - intensity_real_fx[i][j] = L_shr( intensity_real_fx[i][j], guard_bits - scale_fact2 ); + intensity_real_fx[i][j] = L_shr( intensity_real_fx[i][j], sub( guard_bits, scale_fact2 ) ); + move32(); } } - q_factor_intensity = 2 * ( scale_fact - 1 ) - 31 - ( guard_bits - scale_fact2 ); + q_factor_intensity = sub( sub( shl( sub( scale_fact, 1 ), 1 ), 31 ), sub( guard_bits, scale_fact2 ) ); } ELSE { - FOR ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { - FOR ( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) { - intensity_real_fx[i][j] = L_shl( intensity_real_fx[i][j], scale_fact2 - guard_bits ); + intensity_real_fx[i][j] = L_shl( intensity_real_fx[i][j], sub( scale_fact2, guard_bits ) ); + move32(); } } - q_factor_intensity = 2 * ( scale_fact - 1 ) - 31 + scale_fact2 - guard_bits; + q_factor_intensity = add( sub( shl( sub( scale_fact, 1 ), 1 ), 31 ), sub( scale_fact2, guard_bits ) ); } scale_fact2 = getScaleFactor32( reference_power_fx[ts], MASA_FREQUENCY_BANDS ); - IF ( guard_bits > scale_fact2 ) + IF( GT_16( guard_bits, scale_fact2 ) ) { - FOR ( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) { - reference_power_fx[ts][j] = L_shr( reference_power_fx[ts][j], guard_bits - scale_fact2 ); + reference_power_fx[ts][j] = L_shr( reference_power_fx[ts][j], sub( guard_bits, scale_fact2 ) ); + move32(); } - q_factor_energy = 2 * ( scale_fact ) - 31 - ( guard_bits - scale_fact2 ); + q_factor_energy = sub( sub( shl( scale_fact, 1 ), 31 ), sub( guard_bits, scale_fact2 ) ); } ELSE { - FOR ( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) { - reference_power_fx[ts][j] = L_shl( reference_power_fx[ts][j], scale_fact2 - guard_bits ); + reference_power_fx[ts][j] = L_shl( reference_power_fx[ts][j], sub( scale_fact2, guard_bits ) ); + move32(); } - q_factor_energy = 2 * ( scale_fact ) - 31 + scale_fact2 - guard_bits; + q_factor_energy = add( sub( shl( scale_fact, 1 ), 31 ), sub( scale_fact2, guard_bits ) ); } - IF ( q_factor_intensity_old != 0 ) + IF( NE_16( q_factor_intensity_old, 0 ) ) { - IF ( q_factor_intensity_old < q_factor_intensity ) + IF( LT_16( q_factor_intensity_old, q_factor_intensity ) ) { - FOR ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { - FOR ( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) { - intensity_real_fx[i][j] = L_shr( intensity_real_fx[i][j], q_factor_intensity - q_factor_intensity_old ); + intensity_real_fx[i][j] = L_shr( intensity_real_fx[i][j], sub( q_factor_intensity, q_factor_intensity_old ) ); + move32(); } } q_factor_intensity = q_factor_intensity_old; + move16(); } ELSE { FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { - FOR ( j = 0; j < index - 1; j++ ) + FOR( j = 0; j < index - 1; j++ ) { /* only real part needed */ - FOR ( Word16 k = 0; k < num_freq_bands; k++ ) + FOR( Word16 k = 0; k < num_freq_bands; k++ ) { - hDirAC->buffer_intensity_real_fx[i][j][k] = L_shr( hDirAC->buffer_intensity_real_fx[i][j][k], q_factor_intensity_old - q_factor_intensity ); + hDirAC->buffer_intensity_real_fx[i][j][k] = L_shr( hDirAC->buffer_intensity_real_fx[i][j][k], sub( q_factor_intensity_old, q_factor_intensity ) ); + move32(); } } } } } - IF ( q_factor_energy_old != 0 ) + IF( NE_16( q_factor_energy_old, 0 ) ) { - IF ( q_factor_energy_old < q_factor_energy ) + IF( LT_16( q_factor_energy_old, q_factor_energy ) ) { - FOR ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { - reference_power_fx[ts][j] = L_shr( reference_power_fx[ts][j], q_factor_energy - q_factor_energy_old ); + reference_power_fx[ts][j] = L_shr( reference_power_fx[ts][j], sub( q_factor_energy, q_factor_energy_old ) ); + move32(); } q_factor_energy = q_factor_energy_old; + move16(); } ELSE { - FOR ( i = 0; i < index - 1; i++ ) + FOR( i = 0; i < index - 1; i++ ) { - FOR ( j = 0; j < num_freq_bands; j++ ) + FOR( j = 0; j < num_freq_bands; j++ ) { - FOR ( Word16 k = 0; k < num_freq_bands; k++ ) + 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], q_factor_energy_old - q_factor_energy_old ); + 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 ) ); + move32(); } } } } } - FOR ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { /* only real part needed */ - mvr2r_Word32( intensity_real_fx[i], &( hDirAC->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); + Copy32( intensity_real_fx[i], &( hDirAC->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); } - mvr2r_Word32( 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[( 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; + move16(); q_factor_energy_old = q_factor_energy; - FOR ( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + move16(); + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) { - IF ( diffuseness_vector_exp[j] < 10 ) + IF( LT_16( diffuseness_vector_exp[j], 10 ) ) { diffuseness_vector_fx[j] = 0; + move16(); } } - FOR ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { - norm_tmp_fx = Mpy_32_32( reference_power_fx[ts][band_m_idx], ( L_sub( ONE_IN_Q30, L_shr( diffuseness_vector_fx[band_m_idx], 30 - diffuseness_vector_exp[band_m_idx] ) ) ) ); // q_factor_energy-1 - - hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) - hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) - hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) - - diffuseness_m_fx[band_m_idx] = L_add( diffuseness_m_fx[band_m_idx], Mpy_32_32( reference_power_fx[ts][band_m_idx], L_shr( diffuseness_vector_fx[band_m_idx], 30 - diffuseness_vector_exp[band_m_idx] ) ) ); // Qq_factor_energy-1 - renormalization_factor_diff_fx[band_m_idx] = L_add( renormalization_factor_diff_fx[band_m_idx], reference_power_fx[ts][band_m_idx] ); // Qq_factor_energy + norm_tmp_fx = Mpy_32_32( reference_power_fx[ts][band_m_idx], ( L_sub( ONE_IN_Q30, L_shr( diffuseness_vector_fx[band_m_idx], sub( 30, diffuseness_vector_exp[band_m_idx] ) ) ) ) ); // q_factor_energy-1 + + hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + move32(); + hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + move32(); + hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + move32(); + + diffuseness_m_fx[band_m_idx] = L_add( diffuseness_m_fx[band_m_idx], Mpy_32_32( reference_power_fx[ts][band_m_idx], L_shr( diffuseness_vector_fx[band_m_idx], sub( 30, diffuseness_vector_exp[band_m_idx] ) ) ) ); // Qq_factor_energy-1 + move32(); + renormalization_factor_diff_fx[band_m_idx] = L_add( renormalization_factor_diff_fx[band_m_idx], reference_power_fx[ts][band_m_idx] ); // Qq_factor_energy + move32(); } } - FOR ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { - FOR ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { dir_v[d] = hDirAC->direction_vector_m_fx[d][block_m_idx][band_m_idx]; + move32(); } - dir_q = q_factor_energy + exp - 32; + dir_q = add( q_factor_energy, sub( exp, 32 ) ); ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v, dir_q, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); } /* Determine energy ratios */ - FOR ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { - IF ( renormalization_factor_diff_fx[band_m_idx] > EPSILON_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], &exp_div ); + move32(); } ELSE { diffuseness_m_fx[band_m_idx] = 0; + move32(); } - exp_div = 30 - exp_div; - energyRatio[block_m_idx][band_m_idx] = L_sub( L_shl( 1, 30 ), L_shl( diffuseness_m_fx[band_m_idx], 30 - exp_div ) ); // Q30 + exp_div = sub( 30, exp_div ); + energyRatio[block_m_idx][band_m_idx] = L_sub( L_shl( 1, 30 ), L_shl( diffuseness_m_fx[band_m_idx], sub( 30, exp_div ) ) ); // Q30 + move32(); } - FOR ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { spreadCoherence[block_m_idx][band_m_idx] = 0; + move32(); surroundingCoherence[block_m_idx][band_m_idx] = 0; + move32(); } } return; } #else -/*--------------------------------------------------------------------------* - * Local functions - *--------------------------------------------------------------------------*/ - /* Estimate MASA parameters from the SBA signals */ static void ivas_dirac_param_est_ana( DIRAC_ANA_HANDLE hDirAC, @@ -740,35 +889,36 @@ static void ivas_dirac_param_est_ana( return; } - #endif + + #ifdef IVAS_FLOAT_FIXED /* Compute downmix */ static void ivas_dirac_dmx_fx( - Word32 data_in_f[][L_FRAME48k], + Word32 data_in_fx[][L_FRAME48k], const Word16 input_frame, - const Word16 nchan_transport) + const Word16 nchan_transport ) { Word16 i; - Word32 data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; + Word32 data_out_fx[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; - if ( nchan_transport == 2 ) + IF( EQ_16( nchan_transport, 2 ) ) { - v_add_fx( data_in_f[0], data_in_f[1], data_out_f[0], input_frame ); - v_multc_fixed( data_out_f[0], ONE_IN_Q30, data_out_f[0], input_frame ); // ONE_IN_Q30 = 0.5* ONE_IN_Q31 + v_add_fx( data_in_fx[0], data_in_fx[1], data_out_fx[0], input_frame ); + v_multc_fixed( data_out_fx[0], ONE_IN_Q30, data_out_fx[0], input_frame ); // ONE_IN_Q30 = 0.5* ONE_IN_Q31 - v_sub_fixed( data_in_f[0], data_in_f[1], data_out_f[1], input_frame,0 ); - v_multc_fixed( data_out_f[1], ONE_IN_Q30, data_out_f[1], input_frame ); + v_sub_fixed( data_in_fx[0], data_in_fx[1], data_out_fx[1], input_frame, 0 ); + v_multc_fixed( data_out_fx[1], ONE_IN_Q30, data_out_fx[1], input_frame ); - for ( i = 0; i < nchan_transport; i++ ) + FOR( i = 0; i < nchan_transport; i++ ) { - mvr2r_Word32( data_out_f[i], data_in_f[i], input_frame ); + Copy32( data_out_fx[i], data_in_fx[i], input_frame ); } } /* output Q is same as input Q*/ return; } -#endif +#else /* Compute downmix */ static void ivas_dirac_dmx( float data_in_f[][L_FRAME48k], @@ -794,3 +944,4 @@ static void ivas_dirac_dmx( return; } +#endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 8e633488e9d742bbe4c0a63efc94e69328a85234..9968120a27afb7bc13cb02720b1e614a4e045403 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -51,6 +51,8 @@ #ifdef IVAS_FLOAT_FIXED Word16 slot_fx[4] = {32767, 16384, 10922 ,8192}; #endif + +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED /*------------------------------------------------------------------------- * Local constants *------------------------------------------------------------------------*/ @@ -70,6 +72,14 @@ Word16 slot_fx[4] = {32767, 16384, 10922 ,8192}; #define ADAPT_HTPROTO_ILD_LIM_DB0 1.0f #define ADAPT_HTPROTO_ILD_LIM_DB1 4.0f #define ADAPT_HTPROTO_ROT_LIM_0 0.4f +#ifdef IVAS_FLOAT_FIXED +#define ADAPT_HTPROTO_ROT_LIM_0_FX 429496736 // Q30 +#define TWO_POINT_FIVE_IN_Q13 20480 // Q13 +#define ADAPT_HTPROTO_IIR_FAC_FX 26689 // Q15 +#define LOG_10_BASE_2_Q29 1783446528 // Q29 +#define TAN_30_FX 17157 //Q15 +#define INV_TAN30_FX 28377 //Q14 +#endif #define ADAPT_HTPROTO_ROT_LIM_1 0.8f #define MAX_GAIN_CACHE_SIZE ( ( MASA_MAXIMUM_DIRECTIONS * 3 ) + MAX_NUM_OBJECTS ) /* == different calls to get gains */ @@ -111,11 +121,15 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric static void ivas_dirac_dec_binaural_determine_processing_matrices( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, const int16_t max_band_decorr, float Rmat[3][3], const int16_t subframe, const int16_t isHeadtracked, const int16_t nchanSeparateChannels, const MASA_ISM_DATA_HANDLE hMasaIsmData ); -static void ivas_dirac_dec_binaural_process_output( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t processReverb, const int16_t subframe ); - #ifdef IVAS_FLOAT_FIXED -static void ivas_dirac_dec_binaural_process_output_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], Word32 *output_fx[], Word16 *q_out,Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 max_band_decorr, const Word16 numInChannels, const Word16 processReverb, const Word16 subframe ); +static void ivas_dirac_dec_binaural_process_output_fx(DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], Word32 *output_fx[], Word16 *q_out, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 q_inp, const Word16 max_band_decorr, const Word16 numInChannels, const Word16 processReverb, const Word16 subframe, const Word16 q_mat); + +static void adaptTransportSignalsHeadtracked_fx(COMBINED_ORIENTATION_HANDLE hHeadTrackData, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word16 q_inp, const Word16 nBins, const Word16 nSlots, Word32 Rmat[3][3]); + +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx(COMBINED_ORIENTATION_HANDLE hHeadTrackData, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 nBins, const Word16 nSlots, Word32 Rmat[3][3]); #endif +static void ivas_dirac_dec_binaural_process_output( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t processReverb, const int16_t subframe ); + static void adaptTransportSignalsHeadtracked( COMBINED_ORIENTATION_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); @@ -151,6 +165,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( int16_t j, k, bin; float binCenterFreq, tmpFloat; ivas_error error; + float frequency_axis[CLDFB_NO_CHANNELS_MAX]; hDiracDecBin = st_ivas->hDiracDecBin; if ( hDiracDecBin == NULL ) @@ -176,10 +191,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( { set_zero( hDiracDecBin->processMtxRe[j][k], nBins ); set_zero( hDiracDecBin->processMtxIm[j][k], nBins ); -#ifdef IVAS_FLOAT_FIXED //must be removed// - set_zero(hDiracDecBin->processMtxRePrev[j][k], nBins); - set_zero(hDiracDecBin->processMtxImPrev[j][k], nBins); -#endif } for ( k = 0; k < BINAURAL_CHANNELS; k++ ) @@ -225,7 +236,11 @@ ivas_error ivas_dirac_dec_init_binaural_data( if ( hDiracDecBin->hReverb != NULL && ( ( hDiracDecBin->hReverb->numBins != nBins ) || ( hDiracDecBin->hReverb->blockSize != CLDFB_SLOTS_PER_SUBFRAME ) ) ) { +#ifdef IVAS_FLOAT_FIXED + ivas_binaural_reverb_close_fx( &( hDiracDecBin->hReverb ) ); +#else ivas_binaural_reverb_close( &( hDiracDecBin->hReverb ) ); +#endif } if ( hDiracDecBin->hReverb == NULL ) @@ -267,46 +282,22 @@ ivas_error ivas_dirac_dec_init_binaural_data( if ( !hDiracDecBin->useTdDecorr && !( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) ) { -#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 ); - - 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, - BINAURAL_CHANNELS, - BINAURAL_CHANNELS, - DIRAC_SYNTHESIS_PSD_LS, - frequency_axis, - BINAURAL_CHANNELS, - output_Fs)) != IVAS_ERR_OK) + if ( ( error = ivas_dirac_dec_decorr_open( &( 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, + BINAURAL_CHANNELS, + output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#endif - } -#ifdef IVAS_FLOAT_FIXED - hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); -#else hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); -#endif st_ivas->hDiracDecBin = hDiracDecBin; @@ -328,11 +319,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( n_samples_granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); /* Use the same granularity as tdrend */ } -#ifdef IVAS_FLOAT_FIXED - 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 ) -#else if ( ( error = ivas_jbm_dec_tc_buffer_open( 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 ) -#endif { return error; } @@ -440,7 +427,7 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( if ( hDiracDecBin->hReverb != NULL && ( ( hDiracDecBin->hReverb->numBins != nBins ) || ( hDiracDecBin->hReverb->blockSize != CLDFB_SLOTS_PER_SUBFRAME ) ) ) { - ivas_binaural_reverb_close( &( hDiracDecBin->hReverb ) ); + ivas_binaural_reverb_close_fx( &( hDiracDecBin->hReverb ) ); } if ( hDiracDecBin->hReverb == NULL ) @@ -549,7 +536,11 @@ void ivas_dirac_dec_close_binaural_data( IF ((*hBinaural)->hReverb != NULL) { +#ifdef IVAS_FLOAT_FIXED + ivas_binaural_reverb_close_fx(&((*hBinaural)->hReverb)); +#else ivas_binaural_reverb_close(&((*hBinaural)->hReverb)); +#endif } ivas_td_decorr_dec_close(&((*hBinaural)->hTdDecorr)); @@ -1178,7 +1169,7 @@ static void ivas_dirac_dec_binaural_internal( numInChannels = add(numInChannels, st_ivas->nchan_ism); } - Rmat_fx[0][0] = 32768; // 1 in Q15 + Rmat_fx[0][0] = ONE_IN_Q31; move32(); Rmat_fx[0][1] = 0; move32(); @@ -1187,7 +1178,7 @@ static void ivas_dirac_dec_binaural_internal( Rmat_fx[1][0] = 0; move32(); - Rmat_fx[1][1] = 32768; // 1 in Q15 + Rmat_fx[1][1] = ONE_IN_Q31; move32(); Rmat_fx[1][2] = 0; move32(); @@ -1196,7 +1187,7 @@ static void ivas_dirac_dec_binaural_internal( move32(); Rmat_fx[2][1] = 0; move32(); - Rmat_fx[2][2] = 32768; // 1 in Q15 + Rmat_fx[2][2] = ONE_IN_Q31; move32(); @@ -1247,7 +1238,7 @@ static void ivas_dirac_dec_binaural_internal( move16(); slotInFrame = add(hSpatParamRendCom->slots_rendered, slot); - generate_masking_noise_dirac_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, + generate_masking_noise_dirac_ivas_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], st_ivas->hTcBuffer->tc_fx[nchan_transport], Cldfb_RealBuffer_in_fx[2][slot], Cldfb_ImagBuffer_in_fx[2][slot], @@ -1256,7 +1247,7 @@ static void ivas_dirac_dec_binaural_internal( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag, 11, &q_cldfb[2][slot] ); - generate_masking_noise_dirac_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, + generate_masking_noise_dirac_ivas_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ NULL, Cldfb_RealBuffer_in_fx[1][slot], Cldfb_ImagBuffer_in_fx[1][slot], @@ -1332,17 +1323,18 @@ static void ivas_dirac_dec_binaural_internal( } if (st_ivas->hSpar != NULL) { - floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], Q30, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); - for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) - { - for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) - { - floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], - &st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], - Q30, - st_ivas->hSpar->hMdDec->mix_mat_dim_2); - } - } + //floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], Q30, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); + //st_ivas->hSpar->hMdDec->Q_mixer_mat = 30; + //for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) + //{ + // for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) + // { + // floatToFixed_arrL(&st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], + // &st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], + // Q30, + // st_ivas->hSpar->hMdDec->mix_mat_dim_2); + // } + //} } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1371,17 +1363,18 @@ static void ivas_dirac_dec_binaural_internal( if (st_ivas->hSpar != NULL) { - fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], Q30, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); - for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) - { - for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) - { - fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], - &st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], - Q30, - st_ivas->hSpar->hMdDec->mix_mat_dim_2); - } - } + //fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0], &st_ivas->hSpar->hMdDec->mixer_mat_prev[0][0][0][0], Q30, sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx) / sizeof(st_ivas->hSpar->hMdDec->mixer_mat_prev_fx[0][0][0][0])); + //st_ivas->hSpar->hMdDec->Q_mixer_mat = 30; + //for (int ii = 0; ii < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; ii++) + //{ + // for (int jj = 0; jj < st_ivas->hSpar->hMdDec->mix_mat_dim_0_1; jj++) + // { + // fixedToFloat_arrL(&st_ivas->hSpar->hMdDec->mixer_mat_fx[ii][jj][0], + // &st_ivas->hSpar->hMdDec->mixer_mat[ii][jj][0], + // Q30, + // st_ivas->hSpar->hMdDec->mix_mat_dim_2); + // } + //} } FOR(Word16 cha = 0; cha < 6; cha++) FOR(slot = 0; slot < 4; slot++) @@ -1398,21 +1391,44 @@ static void ivas_dirac_dec_binaural_internal( ivas_omasa_preProcessStereoTransportsForMovedObjects( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, subframe ); } - if ( hCombinedOrientationData ) + IF( hCombinedOrientationData ) { - for ( i = 0; i < 3; i++ ) + FOR( i = 0; i < 3; i++ ) { - for ( j = 0; j < 3; j++ ) + FOR( j = 0; j < 3; j++ ) { - Rmat[i][j] = hCombinedOrientationData->Rmat[hCombinedOrientationData->subframe_idx][i][j]; +#ifdef IVAS_FLOAT_FIXED + Rmat_fx[i][j] = hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx][i][j]; // Q30// +#endif + Rmat[i][j] = hCombinedOrientationData->Rmat[hCombinedOrientationData->subframe_idx][i][j]; } } - if ( nchan_transport == 2 ) + IF( EQ_16( nchan_transport, 2 ) ) { - adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat ); +#ifdef IVAS_FLOAT_FIXED + Word16 q_inp = Q6; + FOR( Word16 cha = 0; cha < 2; cha++ ) + FOR( slot = 0; slot < 4; slot++ ) + FOR( Word16 ind = 0; ind < 60; ind++ ) + { + Cldfb_RealBuffer_in_fx[cha][slot][ind] = float_to_fix( Cldfb_RealBuffer_in[cha][slot][ind], q_inp ); + Cldfb_ImagBuffer_in_fx[cha][slot][ind] = float_to_fix( Cldfb_ImagBuffer_in[cha][slot][ind], q_inp ); + } + adaptTransportSignalsHeadtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); + FOR( Word16 cha = 0; cha < 2; cha++ ) + FOR( slot = 0; slot < 4; slot++ ) + FOR( Word16 ind = 0; ind < 60; ind++ ) + { + Cldfb_RealBuffer_in[cha][slot][ind] = fix_to_float( Cldfb_RealBuffer_in_fx[cha][slot][ind], q_inp ); + Cldfb_ImagBuffer_in[cha][slot][ind] = fix_to_float( Cldfb_ImagBuffer_in_fx[cha][slot][ind], q_inp ); + } +#else + adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat ); ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat ); +#endif } } @@ -1451,6 +1467,33 @@ static void ivas_dirac_dec_binaural_internal( Word32 *output_fx[MAX_OUTPUT_CHANNELS]; Word32 output_fx_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; Word16 q_out; + Word16 q_mat = 15; + Word16 q_inp = Q6; + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + output_fx[ch] = output_fx_buff[ch]; + } + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < BINAURAL_CHANNELS; slot++ ) + { + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxDecRe[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxDecIm[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxDecRePrev[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxDecImPrev[ch][slot], nBins ) ); + } + } + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < numInChannels; slot++ ) + { + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxRe[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxIm[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxRePrev[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxImPrev[ch][slot], nBins ) ); + } + } + q_mat = sub(q_mat, 1) ; //guardbits// FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { output_fx[ch] = output_fx_buff[ch]; @@ -1459,36 +1502,36 @@ static void ivas_dirac_dec_binaural_internal( { FOR( slot = 0; slot < BINAURAL_CHANNELS; slot++ ) { - floatToFixed_arr16( hDiracDecBin->processMtxDecRe[ch][slot], hDiracDecBin->processMtxDecRe_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxDecIm[ch][slot], hDiracDecBin->processMtxDecIm_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxDecRePrev[ch][slot], hDiracDecBin->processMtxDecRePrev_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxDecImPrev[ch][slot], hDiracDecBin->processMtxDecImPrev_fx[ch][slot], Q11, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxDecRe[ch][slot], hDiracDecBin->processMtxDecRe_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxDecIm[ch][slot], hDiracDecBin->processMtxDecIm_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxDecRePrev[ch][slot], hDiracDecBin->processMtxDecRePrev_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxDecImPrev[ch][slot], hDiracDecBin->processMtxDecImPrev_fx[ch][slot], q_mat, nBins ); } } FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - FOR( slot = 0; slot < 4; slot++ ) + FOR( slot = 0; slot < numInChannels; slot++ ) { - floatToFixed_arr16( hDiracDecBin->processMtxRe[ch][slot], hDiracDecBin->processMtxRe_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxIm[ch][slot], hDiracDecBin->processMtxIm_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxRePrev[ch][slot], hDiracDecBin->processMtxRePrev_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxImPrev[ch][slot], hDiracDecBin->processMtxImPrev_fx[ch][slot], Q11, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxRe[ch][slot], hDiracDecBin->processMtxRe_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxIm[ch][slot], hDiracDecBin->processMtxIm_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxRePrev[ch][slot], hDiracDecBin->processMtxRePrev_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxImPrev[ch][slot], hDiracDecBin->processMtxImPrev_fx[ch][slot], q_mat, nBins ); } floatToFixed_arrL( st_ivas->cldfbSynDec[ch]->cldfb_state, st_ivas->cldfbSynDec[ch]->cldfb_state_fx, Q11, st_ivas->cldfbSynDec[ch]->p_filter_length ); st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; } FOR( Word16 cha = 0; cha < 6; cha++ ) FOR( slot = 0; slot < 4; slot++ ) - FOR( Word16 ind = 0; ind < 60; ind++ ) + FOR( Word16 ind = 0; ind < 60; ind++ ) { - Cldfb_RealBuffer_in_fx[cha][slot][ind] = float_to_fix( Cldfb_RealBuffer_in[cha][slot][ind], Q6 ); - Cldfb_ImagBuffer_in_fx[cha][slot][ind] = float_to_fix( Cldfb_ImagBuffer_in[cha][slot][ind], Q6 ); + Cldfb_RealBuffer_in_fx[cha][slot][ind] = float_to_fix( Cldfb_RealBuffer_in[cha][slot][ind], q_inp); + Cldfb_ImagBuffer_in_fx[cha][slot][ind] = float_to_fix( Cldfb_ImagBuffer_in[cha][slot][ind], q_inp); } - ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, max_band_decorr, numInChannels, config_data.processReverb, subframe ); + ivas_dirac_dec_binaural_process_output_fx(hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - fixedToFloat_arrL32( output_fx[ch], output_f[ch], q_out, imult1616(nBins , hSpatParamRendCom->subframe_nbslots[subframe]) ); + fixedToFloat_arrL32( output_fx[ch], output_f[ch], q_out, imult1616( nBins, hSpatParamRendCom->subframe_nbslots[subframe] ) ); fixedToFloat_arrL32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_state, st_ivas->cldfbSynDec[ch]->Q_cldfb_state, st_ivas->cldfbSynDec[ch]->p_filter_length ); } #else @@ -2329,10 +2372,12 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word16 *q_out, Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const Word16 q_input, const Word16 max_band_decorr, const Word16 numInChannels, const Word16 processReverb, - const Word16 subframe ) + const Word16 subframe, + const Word16 q_mat) { Word16 slot, bin, chA, chB; Word16 nBins; @@ -2377,12 +2422,14 @@ static void ivas_dirac_dec_binaural_process_output_fx( q_inp_mix = s_min( q_inp[i][j], q_inp_mix ); } } + + q_inp_mix = sub( q_inp_mix, 3 ); // gaurded bits// - Word16 cldfb_state_shift = sub(add(q_inp_mix, Q1), cldfbSynDec[0]->Q_cldfb_state); - IF(GT_16(cldfb_state_shift, shift)) + 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; - cldfb_state_shift = shift; + q_inp_mix = q_inp_mix + shift - cldfb_state_shift; + cldfb_state_shift = shift; } FOR( Word16 i = 0; i < 6; i++ ) @@ -2394,20 +2441,20 @@ static void ivas_dirac_dec_binaural_process_output_fx( scale_sig32(inIm_fx[i][j], nBins, q_inp_mix); IF( processReverb && ( i < 2 ) ) { - scale_sig32(reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub(q_inp_mix, 4)); - scale_sig32(reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub(q_inp_mix, 4)); + 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 ) ); } } } // scaling cldfb states to q_result-1// - scale_sig32(cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length, cldfb_state_shift); - scale_sig32(cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length, cldfb_state_shift); + scale_sig32( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length, cldfb_state_shift ); + scale_sig32( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length, cldfb_state_shift ); - q_inp_mix = add(q_inp_mix, Q6); + q_inp_mix = add( q_inp_mix, q_input ); interpVal_fx = 0; - Word16 q_result = sub( q_inp_mix, 4 ); // setting it prior// + 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 ); @@ -2641,6 +2688,245 @@ static void ivas_dirac_dec_binaural_process_output( } #endif +#ifdef IVAS_FLOAT_FIXED +static void adaptTransportSignalsHeadtracked_fx( + COMBINED_ORIENTATION_HANDLE hHeadTrackData, + Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word16 q_inp, + const Word16 nBins, + const Word16 nSlots, + Word32 Rmat[3][3] ) +{ + Word16 slot, ch, bin, louderCh; + Word32 mono_factor_ILD, mono_factor; + Word32 y_val, mono_factor_rotation, ene_proc, ene_target, ILD; + Word16 max_band; + Word32 eqVal; + Word16 band_idx, bin_lo, bin_hi, norm, shift = 31; + Word16 q_chEneIIR = 0, q_procChEneIIR = 0; + Word32 temp_div; + Word16 e_div; + + FOR( Word16 i = 0; i < 6; i++ ) + { + FOR( Word16 j = 0; j < nSlots; j++ ) + { + norm = s_min( L_norm_arr( inRe_fx[i][j], nBins ), L_norm_arr( inIm_fx[i][j], nBins ) ); + shift = s_min( norm, shift ); + } + } + + /* Determine head-orientation-based mono factor. + Rmat[1][1] entry informs how close the ears are aligned according to transport signals. */ + + y_val = L_sub( ONE_IN_Q30, L_abs( Rmat[1][1] ) ); // Q30 + mono_factor_rotation = Mpy_32_16_1( L_sub( y_val, ADAPT_HTPROTO_ROT_LIM_0_FX ), TWO_POINT_FIVE_IN_Q13 ); // Q28 + mono_factor_rotation = L_max( 0, L_min( ONE_IN_Q28, mono_factor_rotation ) ); + + IF( EQ_32( mono_factor_rotation, ONE_IN_Q28 ) ) + { + mono_factor_rotation = ONE_IN_Q31; + } + ELSE + { + mono_factor_rotation = L_shl( mono_factor_rotation, 3 ); // Q31 + } + + /* 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; + WHILE( max_band < MASA_FREQUENCY_BANDS && MASA_band_grouping_24[max_band] < nBins ) + { + max_band = add( max_band, 1 ); + } + + shift = sub( shift, 5 ); + // 5 is gaurded bits needed// + Word32 re, img, temp; + Word16 q_temp = 2 * ( q_inp + shift ) - 31; + FOR( band_idx = 0; band_idx < max_band; band_idx++ ) + { + Word32 ch_nrg[2]; /* storage for input signal channel energies */ + bin_lo = MASA_band_grouping_24[band_idx]; + bin_hi = s_min( MASA_band_grouping_24[band_idx + 1], (Word16) nBins ); + + FOR( ch = 0; ch < 2; ch++ ) + { + ch_nrg[ch] = 0; + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + re = L_shl( inRe_fx[ch][slot][bin], shift ); + 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 + } + } + hHeadTrackData->chEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->chEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); + temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); + IF( LT_16( hHeadTrackData->q_chEneIIR, q_temp ) ) + { + hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_chEneIIR ) ), hHeadTrackData->chEneIIR_fx[ch][band_idx] ); + } + ELSE + { + hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->chEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_chEneIIR, q_temp ) ), temp ); + } + + hHeadTrackData->chEneIIR[ch][band_idx] = fixedToFloat_32( hHeadTrackData->chEneIIR_fx[ch][band_idx], s_min( hHeadTrackData->q_chEneIIR, q_temp ) ); + } + q_chEneIIR = s_min( hHeadTrackData->q_chEneIIR, q_temp ); + /* Determine ILD */ + + IF( EQ_32( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ) ) ) + { + ILD = 0; + } + 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 + 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 + } + IF( GT_32( hHeadTrackData->chEneIIR_fx[1][band_idx], hHeadTrackData->chEneIIR_fx[0][band_idx] ) ) + { + louderCh = 1; + } + ELSE + { + louderCh = 0; + } + + /* Determine ILD-based mono factor */ + mono_factor_ILD = Mpy_32_16_1( L_sub( ILD, ONE_IN_Q21 ), 10911 ); // Q23 + + 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; + 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 + + /* Mix original audio and sum signal according to determined mono factor */ + FOR( ch = 0; ch < 2; ch++ ) + { + IF( NE_16( ch, louderCh ) ) + { + Word32 band_nrg = 0; + + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + /* 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] ) ) ); + 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 ); + + hHeadTrackData->procChEneIIR[ch][band_idx] = fixedToFloat_32( hHeadTrackData->procChEneIIR_fx[ch][band_idx], hHeadTrackData->q_procChEneIIR ); + + if ( ( ch == 0 && band_idx == 1 ) || ( ch == 1 && band_idx == 0 ) ) + ch = ch; + + temp = Mpy_32_16_1( band_nrg, sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); + IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) ) + { + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_procChEneIIR ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); + } + ELSE + { + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp ); + } + } + 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 ); + + temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); + IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) ) + { + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_procChEneIIR ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); + } + ELSE + { + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp ); + } + } + + hHeadTrackData->procChEneIIR[ch][band_idx] = fixedToFloat_32( hHeadTrackData->procChEneIIR_fx[ch][band_idx], s_min( hHeadTrackData->q_procChEneIIR, q_temp ) ); + } + + q_procChEneIIR = s_min( hHeadTrackData->q_procChEneIIR, q_temp ); + + /* Equalize */ + ene_target = L_add( hHeadTrackData->chEneIIR_fx[0][band_idx], hHeadTrackData->chEneIIR_fx[1][band_idx] ); // q_chEneIIR// + + 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 ); + + 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 + ELSE + { + eqVal = L_shl( eqVal, sub( e_div, 3 ) ); // Q28 + } + + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( ch = 0; ch < 2; ch++ ) + { + FOR( bin = bin_lo; bin < bin_hi; bin++ ) + { + if ( ( ch == 0 && slot == 0 ) ) + { + if ( bin == 1 ) + bin = bin; + } + + Word16 temp_shift = s_min( norm_l( inRe_fx[ch][slot][bin] ), norm_l( inIm_fx[ch][slot][bin] ) ); + re = L_shl( inRe_fx[ch][slot][bin], temp_shift ); + img = L_shl( inIm_fx[ch][slot][bin], temp_shift ); + + re = L_shr( Mpy_32_32( re, eqVal ), sub( temp_shift, 3 ) ); + 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 + } + } + } + } + + + hHeadTrackData->q_chEneIIR = q_chEneIIR; + hHeadTrackData->q_procChEneIIR = q_procChEneIIR; + return; +} + +#else static void adaptTransportSignalsHeadtracked( COMBINED_ORIENTATION_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], @@ -2755,6 +3041,153 @@ static void adaptTransportSignalsHeadtracked( return; } +#endif + +#ifdef IVAS_FLOAT_FIXED +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( + COMBINED_ORIENTATION_HANDLE hHeadTrackData, + Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const Word16 nBins, + const Word16 nSlots, + Word32 Rmat_fx[3][3] ) +{ + Word16 slot, bin, ch; + Word32 tmpVal; + Word16 norm, e_div, shift = 31; + 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 ) ) + { + 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 ) ) ) ) + { + hHeadTrackData->lrSwitchedNext = 1; + } + IF( EQ_16( (Word16) hHeadTrackData->lrSwitchedCurrent, 1 ) && ( GT_32( Rmat_fx[1][1], thresholdDotProduct ) ) ) + { + hHeadTrackData->lrSwitchedNext = 0; + } + } + + FOR( Word16 i = 0; i < 2; i++ ) + { + FOR( Word16 j = 0; j < nSlots; j++ ) + { + norm = s_min( L_norm_arr( inRe_fx[i][j], nBins ), L_norm_arr( inIm_fx[i][j], nBins ) ); + shift = s_min( norm, shift ); + } + } + + shift = sub( shift, 3 ); // guard bits// + /* When currently in interpolation */ + IF( NE_16( (Word16) hHeadTrackData->lrSwitchedNext, (Word16) hHeadTrackData->lrSwitchedCurrent ) ) + { + FOR( slot = 0; slot < nSlots; slot++ ) + { + Word32 switchOrderFactor, origOrderFactor; + Word16 e_switchOrderFactor, e_origOrderFactor; + + hHeadTrackData->lrSwitchInterpVal_fx = L_add( hHeadTrackData->lrSwitchInterpVal_fx, 2684354 ); /* Corresponds to 0.5 seconds interpolation time */ // Q14 + + IF( GT_32( hHeadTrackData->lrSwitchInterpVal_fx, 1072668096 ) ) + { + /* Stop interpolation, reset values */ + hHeadTrackData->lrSwitchInterpVal_fx = 0; + hHeadTrackData->lrSwitchedCurrent = hHeadTrackData->lrSwitchedNext; + } + + /* Gains for determining portion of switched channel order and original channel order */ + tmpVal = Mpy_32_16_1( hHeadTrackData->lrSwitchInterpVal_fx, (Word16) hHeadTrackData->lrSwitchedNext ); // Q15 + tmpVal = L_add( tmpVal, Mpy_32_16_1( L_sub( ONE_IN_Q30, hHeadTrackData->lrSwitchInterpVal_fx ), (Word16) hHeadTrackData->lrSwitchedCurrent ) ); // Q15 + + e_switchOrderFactor = 0; + e_origOrderFactor = 0; + IF( EQ_32( tmpVal, 32768 ) ) + tmpVal = ONE_IN_Q31; + ELSE + tmpVal = L_shl( tmpVal, 16 ); // Q31 + switchOrderFactor = Sqrt32( tmpVal, &e_switchOrderFactor ); + switchOrderFactor = L_shl( switchOrderFactor, e_switchOrderFactor ); // Q31 + origOrderFactor = Sqrt32( L_sub( ONE_IN_Q31, tmpVal ), &e_origOrderFactor ); // Q31 + origOrderFactor = L_shl( origOrderFactor, e_origOrderFactor ); + FOR( bin = 0; bin < nBins; bin++ ) + { + /* determine original order (1) signals and switched order (2) signals */ + Word32 re1[BINAURAL_CHANNELS], re2[BINAURAL_CHANNELS], im1[BINAURAL_CHANNELS], im2[BINAURAL_CHANNELS]; + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + re1[ch] = Mpy_32_32( inRe_fx[ch][slot][bin], origOrderFactor ); // q_inp + 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 + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + Word32 eneRef, ene, eq; + + re1[ch] = L_shl( re1[ch], shift ); // q_inp+shift// + 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// + + /* Interpolate / mix original and switched order signals */ + Re = L_add( re1[ch], re2[ch] ); // q_inp+shift// + Im = L_add( im1[ch], im2[ch] ); // q_inp+shift// + + /* Equalize interpolated signals to preserve energy per bin */ + + eneRef = L_add( ( L_add( Mpy_32_32( re1[ch], re1[ch] ), Mpy_32_32( re2[ch], re2[ch] ) ) ), ( L_add( Mpy_32_32( im1[ch], im1[ch] ), Mpy_32_32( im2[ch], im2[ch] ) ) ) ); // 2*(q_inp+shift) -31// + ene = L_add( Mpy_32_32( Re, Re ), Mpy_32_32( Im, Im ) ); // 2*(q_inp+shift) -31// + + temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( eneRef, L_max( 1, ene ), &e_div ) ); + + eq = Sqrt32( temp_div, &e_div ); + + Word16 comp_flag = BASOP_Util_Cmp_Mant32Exp( 1073741824, 3, eq, e_div ); + IF( EQ_16( comp_flag, -1 ) ) + eq = 1073741824; // 4inQ28 + ELSE + { + eq = L_shl( eq, sub( e_div, 3 ) ); // Q28 + } + + Re = L_shr( Mpy_32_32( Re, eq ), sub( shift, 3 ) ); // q_inp + Im = L_shr( Mpy_32_32( Im, eq ), sub( shift, 3 ) ); // q_inp + + inRe_fx[ch][slot][bin] = Re; + inIm_fx[ch][slot][bin] = Im; + } + } + } + } + ELSE + { + /* If not in interpolation, but in switched prototype situation, then switch left and right channels */ + IF( hHeadTrackData->lrSwitchedCurrent == 1 ) + { + FOR( slot = 0; slot < nSlots; slot++ ) + { + FOR( bin = 0; bin < nBins; bin++ ) + { + tmpVal = inRe_fx[0][slot][bin]; + inRe_fx[0][slot][bin] = inRe_fx[1][slot][bin]; + inRe_fx[1][slot][bin] = tmpVal; + tmpVal = inIm_fx[0][slot][bin]; + inIm_fx[0][slot][bin] = inIm_fx[1][slot][bin]; + inIm_fx[1][slot][bin] = tmpVal; + } + } + } + } + + return; +} + +#endif static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( COMBINED_ORIENTATION_HANDLE hHeadTrackData, @@ -3029,7 +3462,220 @@ static void matrixTransp2Mul( return; } +#ifdef IVAS_FLOAT_FIXED +static void chol2x2_fx( + const Word32 E1, + const Word32 E2, + Word16 q_E, + const Word32 Cre, + const Word32 Cim, + Word16 q_C, + Word32 outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word32 outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS], + Word16 *q_out ) +{ + Word16 chA, chB; + Word32 sqrtVal_fx, temp; + Word16 exp, q_re1, q_re2, q_re3, q_im, q_tmp; + Word32 e1, e2, c_re, c_im; + Word16 q_e, q_c; + + exp = sub( get_min_scalefactor( E1, E2 ), 1 ); + e1 = L_shl( E1, exp ); + e2 = L_shl( E2, exp ); + q_e = add( q_E, exp ); + exp = sub( get_min_scalefactor( Cre, Cim ), 1 ); + c_re = L_shl( Cre, exp ); + c_im = L_shl( Cim, exp ); + q_c = add( q_C, exp ); + + + FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + outRe[chA][chB] = 0; + move32(); + outIm[chA][chB] = 0; + move32(); + } + } + + IF( GT_32( e1, e2 ) ) /* Perform Cholesky decomposition according to louder channel first */ + { + exp = sub( 31, q_e ); + outRe[0][0] = Sqrt32( e1, &exp ); + move32(); + q_re1 = sub( 31, exp ); + + // 4611686 = 1e-12 in Q62 + IF( EQ_32( outRe[0][0], 0 ) ) + { + outRe[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); + move32(); + q_re2 = add( sub( 31, exp ), sub( q_c, 62 ) ); + + outIm[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_im, 4611686, &exp ); + move32(); + q_im = add( sub( 31, exp ), sub( q_c, 62 ) ); + } + ELSE + { + outRe[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_re, outRe[0][0], &exp ); + move32(); + q_re2 = add( sub( 31, exp ), sub( q_c, q_re1 ) ); + + outIm[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_im, outRe[0][0], &exp ); + move32(); + q_im = add( sub( 31, exp ), sub( q_c, q_re1 ) ); + } + IF( EQ_32( outRe[1][0], 0 ) ) + { + q_re2 = Q31; + move16(); + } + IF( EQ_32( outIm[1][0], 0 ) ) + { + q_im = Q31; + move16(); + } + + temp = Madd_32_32( Mpy_32_32( c_re, c_re ), c_im, c_im ); + q_tmp = sub( add( q_c, q_c ), 31 ); + + // 4611686 = Q62 + IF( EQ_32( e1, 0 ) ) + { + temp = BASOP_Util_Divide3232_Scale_cadence( temp, 4611686, &exp ); + q_tmp = add( sub( 31, exp ), sub( q_tmp, 62 ) ); + } + ELSE + { + 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 ) ) + { + q_tmp = Q31; + move16(); + } + + IF( LT_16( q_e, q_tmp ) ) + { + sqrtVal_fx = L_sub( e2, L_shr( temp, sub( q_tmp, q_e ) ) ); + q_tmp = q_e; + move16(); + } + ELSE + { + sqrtVal_fx = L_sub( L_shr( e2, sub( q_e, q_tmp ) ), temp ); + } + + exp = sub( 31, q_tmp ); + outRe[1][1] = Sqrt32( L_max( 0, sqrtVal_fx ), &exp ); + move32(); + q_re3 = sub( 31, exp ); + + *q_out = s_min( s_min( q_re1, q_re2 ), s_min( q_re3, q_im ) ); + outRe[0][0] = L_shr( outRe[0][0], sub( q_re1, *q_out ) ); + move32(); + outRe[1][0] = L_shr( outRe[1][0], sub( q_re2, *q_out ) ); + move32(); + outIm[1][0] = L_shr( outIm[1][0], sub( q_im, *q_out ) ); + move32(); + outRe[1][1] = L_shr( outRe[1][1], sub( q_re3, *q_out ) ); + move32(); + } + ELSE + { + exp = sub( 31, q_e ); + outRe[1][1] = Sqrt32( e2, &exp ); + move32(); + q_re1 = sub( 31, exp ); + + // 4611686 = Q62 + IF( EQ_32( outRe[1][1], 0 ) ) + { + outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); + move32(); + q_re2 = add( sub( 31, exp ), sub( q_c, 62 ) ); + + outIm[0][1] = BASOP_Util_Divide3232_Scale_cadence( -c_im, 4611686, &exp ); + move32(); + q_im = add( sub( 31, exp ), sub( q_c, 62 ) ); + } + ELSE + { + outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, outRe[1][1], &exp ); + move32(); + q_re2 = add( sub( 31, exp ), sub( q_c, q_re1 ) ); + + outIm[0][1] = BASOP_Util_Divide3232_Scale_cadence( -c_im, outRe[1][1], &exp ); + move32(); + q_im = add( sub( 31, exp ), sub( q_c, q_re1 ) ); + } + IF( EQ_32( outRe[0][1], 0 ) ) + { + q_re2 = Q31; + move16(); + } + IF( EQ_32( outIm[0][1], 0 ) ) + { + q_im = Q31; + move16(); + } + + temp = Madd_32_32( Mpy_32_32( c_re, c_re ), c_im, c_im ); + q_tmp = sub( add( q_c, q_c ), 31 ); + + // 4611686 = 1e-12 in Q62 + IF( EQ_32( e2, 0 ) ) + { + temp = BASOP_Util_Divide3232_Scale_cadence( temp, 4611686, &exp ); + q_tmp = add( sub( 31, exp ), sub( q_tmp, 62 ) ); + } + ELSE + { + 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 ) ) + { + q_tmp = Q31; + move16(); + } + + IF( LT_16( q_e, q_tmp ) ) + { + sqrtVal_fx = L_sub( e1, L_shr( temp, sub( q_tmp, q_e ) ) ); + q_tmp = q_e; + move16(); + } + ELSE + { + sqrtVal_fx = L_sub( L_shr( e1, sub( q_e, q_tmp ) ), temp ); + } + + exp = sub( 31, q_tmp ); + outRe[0][0] = Sqrt32( L_max( 0, sqrtVal_fx ), &exp ); + move32(); + q_re3 = sub( 31, exp ); + + *q_out = s_min( s_min( q_re1, q_re2 ), s_min( q_re3, q_im ) ); + 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 ) ); + move32(); + outIm[0][1] = L_shr( outIm[0][1], sub( q_im, *q_out ) ); + move32(); + outRe[0][0] = L_shr( outRe[0][0], sub( q_re3, *q_out ) ); + move32(); + } + + return; +} +#else static void chol2x2( const float E1, const float E2, @@ -3069,7 +3715,7 @@ static void chol2x2( return; } - +#endif static void formulate2x2MixingMatrix( float Ein1, @@ -3107,7 +3753,12 @@ static void formulate2x2MixingMatrix( float Ghat[BINAURAL_CHANNELS]; float GhatQ[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; float Pre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], Pim[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; - +#ifdef IVAS_FLOAT_FIXED + Word32 E_out1, E_out2, Cout_re, Cout_im; + Word32 KyRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], KyIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 q_eout, q_cout, q_ky = 0; + Word16 exp1 = 0, exp2 = 0; +#endif /* Normalize energy values */ maxEne = Ein1; maxEne = max( maxEne, Ein2 ); @@ -3124,8 +3775,29 @@ static void formulate2x2MixingMatrix( CoutIm *= maxEneDiv; /* Cholesky decomposition of target / output covariance matrix */ +#ifdef IVAS_FLOAT_FIXED + /////////////// to be removed //////////////////////////// + f2me( Eout1, &E_out1, &exp1 ); + f2me( Eout2, &E_out2, &exp2 ); + q_eout = sub( 31, s_max( exp1, exp2 ) ); + E_out1 = L_shr( E_out1, sub( sub( 31, exp1 ), q_eout ) ); + E_out2 = L_shr( E_out2, sub( sub( 31, exp2 ), q_eout ) ); + f2me( CoutRe, &Cout_re, &exp1 ); + f2me( CoutIm, &Cout_im, &exp2 ); + q_cout = sub( 31, s_max( exp1, exp2 ) ); + Cout_re = L_shr( Cout_re, sub( sub( 31, exp1 ), q_cout ) ); + Cout_im = L_shr( Cout_im, sub( sub( 31, exp2 ), q_cout ) ); + ///////////////////////////////////////////////////////// + + chol2x2_fx( E_out1, E_out2, q_eout, Cout_re, Cout_im, q_cout, KyRe_fx, KyIm_fx, &q_ky ); + + ///////////////// to be removed ///////////////////////// + fixedToFloat_arrL32( KyRe_fx[0], KyRe[0], q_ky, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); + fixedToFloat_arrL32( KyIm_fx[0], KyIm[0], q_ky, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); + ///////////////////////////////////////////////////////// +#else chol2x2( Eout1, Eout2, CoutRe, CoutIm, KyRe, KyIm ); - +#endif /* Eigendecomposition of input covariance matrix */ eig2x2( Ein1, Ein2, CinRe, CinIm, Uxre, Uxim, Sx ); @@ -4074,6 +4746,14 @@ static void ivas_masa_ext_rend_parambin_internal( int16_t i, j; int16_t nchan_transport; +#ifdef IVAS_FLOAT_FIXED + Word32 *output_fx[MAX_OUTPUT_CHANNELS]; + Word32 output_fx_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + Word32 Cldfb_RealBuffer_in_fx[6][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer_in_fx[6][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + Word32 Rmat_fx[3][3]; +#endif + hDiracDecBin = hMasaExtRend->hDiracDecBin; assert( hDiracDecBin ); hSpatParamRendCom = hMasaExtRend->hSpatParamRendCom; @@ -4094,7 +4774,28 @@ static void ivas_masa_ext_rend_parambin_internal( /* The input channel number at this processing function (not nchan_transport) */ numInChannels = BINAURAL_CHANNELS; +#ifdef IVAS_FLOAT_FIXED + Rmat_fx[0][0] = ONE_IN_Q31; + move32(); + Rmat_fx[0][1] = 0; + move32(); + Rmat_fx[0][2] = 0; + move32(); + + Rmat_fx[1][0] = 0; + move32(); + Rmat_fx[1][1] = ONE_IN_Q31; + move32(); + Rmat_fx[1][2] = 0; + move32(); + Rmat_fx[2][0] = 0; + move32(); + Rmat_fx[2][1] = 0; + move32(); + Rmat_fx[2][2] = ONE_IN_Q31; + move32(); +#endif Rmat[0][0] = 1.0f; Rmat[0][1] = 0.0f; Rmat[0][2] = 0.0f; @@ -4139,15 +4840,39 @@ static void ivas_masa_ext_rend_parambin_internal( { for ( j = 0; j < 3; j++ ) { +#ifdef IVAS_FLOAT_FIXED + Rmat_fx[i][j] = hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx][i][j]; // Q30// +#endif Rmat[i][j] = hCombinedOrientationData->Rmat[hCombinedOrientationData->subframe_idx][i][j]; } } - if ( nchan_transport == 2 ) + IF(EQ_16(nchan_transport, 2)) { - adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat ); +#ifdef IVAS_FLOAT_FIXED + Word16 q_inp = Q6; + FOR(Word16 cha = 0; cha < 2; cha++) + FOR(slot = 0; slot < 4; slot++) + FOR(Word16 ind = 0; ind < 60; ind++) + { + Cldfb_RealBuffer_in_fx[cha][slot][ind] = float_to_fix(Cldfb_RealBuffer_in[cha][slot][ind], q_inp); + Cldfb_ImagBuffer_in_fx[cha][slot][ind] = float_to_fix(Cldfb_ImagBuffer_in[cha][slot][ind], q_inp); + } + adaptTransportSignalsHeadtracked_fx(hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx); + + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx(hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx); + FOR(Word16 cha = 0; cha < 2; cha++) + FOR(slot = 0; slot < 4; slot++) + FOR(Word16 ind = 0; ind < 60; ind++) + { + Cldfb_RealBuffer_in[cha][slot][ind] = fix_to_float(Cldfb_RealBuffer_in_fx[cha][slot][ind], q_inp); + Cldfb_ImagBuffer_in[cha][slot][ind] = fix_to_float(Cldfb_ImagBuffer_in_fx[cha][slot][ind], q_inp); + } +#else + adaptTransportSignalsHeadtracked(hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat); - ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat ); + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked(hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat); +#endif } } @@ -4168,11 +4893,33 @@ static void ivas_masa_ext_rend_parambin_internal( //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef IVAS_FLOAT_FIXED - Word32 *output_fx[MAX_OUTPUT_CHANNELS]; - Word32 output_fx_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - Word32 Cldfb_RealBuffer_in_fx[6][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_in_fx[6][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; Word16 q_out; + Word16 q_mat = 15; + Word16 q_inp = Q6; + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + output_fx[ch] = output_fx_buff[ch]; + } + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < BINAURAL_CHANNELS; slot++ ) + { + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxDecRe[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxDecIm[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxDecRePrev[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxDecImPrev[ch][slot], nBins ) ); + } + } + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + FOR( slot = 0; slot < numInChannels; slot++ ) + { + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxRe[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxIm[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxRePrev[ch][slot], nBins ) ); + q_mat = s_min( q_mat, Q_factor_arr( hDiracDecBin->processMtxImPrev[ch][slot], nBins ) ); + } + } FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { output_fx[ch] = output_fx_buff[ch]; @@ -4181,32 +4928,32 @@ static void ivas_masa_ext_rend_parambin_internal( { FOR( slot = 0; slot < BINAURAL_CHANNELS; slot++ ) { - floatToFixed_arr16( hDiracDecBin->processMtxDecRe[ch][slot], hDiracDecBin->processMtxDecRe_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxDecIm[ch][slot], hDiracDecBin->processMtxDecIm_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxDecRePrev[ch][slot], hDiracDecBin->processMtxDecRePrev_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxDecImPrev[ch][slot], hDiracDecBin->processMtxDecImPrev_fx[ch][slot], Q11, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxDecRe[ch][slot], hDiracDecBin->processMtxDecRe_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxDecIm[ch][slot], hDiracDecBin->processMtxDecIm_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxDecRePrev[ch][slot], hDiracDecBin->processMtxDecRePrev_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxDecImPrev[ch][slot], hDiracDecBin->processMtxDecImPrev_fx[ch][slot], q_mat, nBins ); } } FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - FOR( slot = 0; slot < 4; slot++ ) + FOR( slot = 0; slot < numInChannels; slot++ ) { - floatToFixed_arr16( hDiracDecBin->processMtxRe[ch][slot], hDiracDecBin->processMtxRe_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxIm[ch][slot], hDiracDecBin->processMtxIm_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxRePrev[ch][slot], hDiracDecBin->processMtxRePrev_fx[ch][slot], Q11, nBins ); - floatToFixed_arr16( hDiracDecBin->processMtxImPrev[ch][slot], hDiracDecBin->processMtxImPrev_fx[ch][slot], Q11, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxRe[ch][slot], hDiracDecBin->processMtxRe_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxIm[ch][slot], hDiracDecBin->processMtxIm_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxRePrev[ch][slot], hDiracDecBin->processMtxRePrev_fx[ch][slot], q_mat, nBins ); + floatToFixed_arr16( hDiracDecBin->processMtxImPrev[ch][slot], hDiracDecBin->processMtxImPrev_fx[ch][slot], q_mat, nBins ); } floatToFixed_arrL( hMasaExtRend->cldfbSynRend[ch]->cldfb_state, hMasaExtRend->cldfbSynRend[ch]->cldfb_state_fx, Q11, hMasaExtRend->cldfbSynRend[ch]->p_filter_length ); hMasaExtRend->cldfbSynRend[ch]->Q_cldfb_state = Q11; } FOR( Word16 cha = 0; cha < 6; cha++ ) FOR( slot = 0; slot < 4; slot++ ) - FOR( Word16 ind = 0; ind < 60; ind++ ) + FOR( Word16 ind = 0; ind < 60; ind++ ) { Cldfb_RealBuffer_in_fx[cha][slot][ind] = float_to_fix( Cldfb_RealBuffer_in[cha][slot][ind], Q6 ); Cldfb_ImagBuffer_in_fx[cha][slot][ind] = float_to_fix( Cldfb_ImagBuffer_in[cha][slot][ind], Q6 ); } - ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, hMasaExtRend->cldfbSynRend, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, max_band_decorr, numInChannels, config_data.processReverb, subframe ); + 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); 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 f50aeb074d4669f785020193be9f561eb06bfeae..ce125f9a11e5ff5e4f56b89d165b9c48faafd08e 100644 --- a/lib_rend/ivas_dirac_decorr_dec.c +++ b/lib_rend/ivas_dirac_decorr_dec.c @@ -594,6 +594,7 @@ ivas_error ivas_dirac_dec_decorr_open_fx( { 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->q_decorr_buffer = Q31; diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 2cbe69b21f2994b0940abe4b47fb41fda967e210..43a0cb5e8ace7f558626b95a5242cd1cf3e30f95 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -521,7 +521,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( return IVAS_ERR_OK; } -#endif +#else ivas_error ivas_dirac_dec_output_synthesis_open( SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ @@ -783,7 +783,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( return IVAS_ERR_OK; } - +#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_output_synthesis_init() * @@ -1303,7 +1303,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( h_dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); h_dirac_output_synthesis_state->onset_filter = onset; - /*-----------------------------------------------------------------* * processing *-----------------------------------------------------------------*/ @@ -1592,8 +1591,482 @@ void ivas_dirac_dec_output_synthesis_process_slot( return; } +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_dec_output_synthesis_process_slot_fx( + const Word32 *reference_power, /* i : Estimated power */ + const Word16 q_reference_power, /* i : Estimated power */ + const Word32 *onset, /* i : onset filter */ + const Word16 *azimuth, + const Word16 *elevation, + const Word32 *diffuseness, + Word16 q_diffuseness, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const Word16 sh_rot_max_order, + const Word32 *p_Rmat, /* i : rotation matrix */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const Word16 nchan_transport, /* i : number of transport channels*/ + const Word16 md_idx, + const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const Word16 dec_param_estim ) +{ + Word16 num_freq_bands, num_channels_dir; + Word16 num_freq_bands_diff, num_channels_diff; + Word16 ch_idx; + Word32 aux_buf[CLDFB_NO_CHANNELS_MAX]; + Word16 diff_start_band; + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; + DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; + Word16 q_onset; + + + h_dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + h_dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + + h_dirac_output_synthesis_state->onset_filter_fx = onset; + + /*-----------------------------------------------------------------* + * processing + *-----------------------------------------------------------------*/ + + /* collect some often used parameters */ + num_freq_bands = hSpatParamRendCom->num_freq_bands; + num_channels_dir = hDirACRend->num_outputs_dir; + num_channels_diff = hDirACRend->num_outputs_diff; + num_freq_bands_diff = h_dirac_output_synthesis_params->max_band_decorr; + + IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_LS )) + { + num_channels_dir = hOutSetup.nchan_out_woLFE; move16(); + } + + IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD) && hodirac_flag ) + { + ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, + hDirACRend, + hVBAPdata, + NULL, + NULL, + azimuth, + elevation, + md_idx, + NULL, + 0, + 2, + p_Rmat, + hodirac_flag ); + { + + 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)); + h_dirac_output_synthesis_state->direct_responses_square_q = 31; + } + 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 ) + { + 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; + } + } + + IF ( EQ_16(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_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, + num_freq_bands ); + Copy32( aux_buf, + 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_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], + num_freq_bands ); + Copy32( aux_buf, + &h_dirac_output_synthesis_state->diffuse_power_factor_fx[hSpatParamRendCom->num_freq_bands], + num_freq_bands ); + + h_dirac_output_synthesis_state->diffuse_power_factor_q = 30; + h_dirac_output_synthesis_state->direct_power_factor_q = 30; + + } + ELSE + { + ivas_dirac_dec_compute_gain_factors_fx( num_freq_bands, + hSpatParamRendCom->diffuseness_vector_fx[md_idx], + h_dirac_output_synthesis_state->direct_power_factor_fx, + h_dirac_output_synthesis_state->diffuse_power_factor_fx, + h_dirac_output_synthesis_state->direct_power_factor_q, + h_dirac_output_synthesis_state->diffuse_power_factor_q); + } + } + ELSE IF ( EQ_16(dec_param_estim, TRUE )) + { + /* compute direct responses */ + ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, + hDirACRend, + hVBAPdata, + NULL, + NULL, + azimuth, + elevation, + md_idx, + NULL, + 0, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); + + { + 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)); + h_dirac_output_synthesis_state->direct_responses_square_q = 31; + } + 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 ) + { + 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; + } + + IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD )) + { + ivas_dirac_dec_compute_gain_factors_fx( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_state->direct_power_factor_fx, + h_dirac_output_synthesis_state->diffuse_power_factor_fx, + &h_dirac_output_synthesis_state->direct_power_factor_q, + &h_dirac_output_synthesis_state->diffuse_power_factor_q + ); + h_dirac_output_synthesis_state->direct_power_factor_q = sub(31, h_dirac_output_synthesis_state->direct_power_factor_q); + h_dirac_output_synthesis_state->diffuse_power_factor_q = sub(31, h_dirac_output_synthesis_state->diffuse_power_factor_q); + + v_multc_fixed( h_dirac_output_synthesis_state->direct_power_factor_fx, + ONE_IN_Q29, + h_dirac_output_synthesis_state->direct_power_factor_fx, + num_freq_bands ); + v_multc_fixed( h_dirac_output_synthesis_state->diffuse_power_factor_fx, + ONE_IN_Q29, + h_dirac_output_synthesis_state->diffuse_power_factor_fx, + num_freq_bands ); + + /*Direct gain*/ + + 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++) + { + Q_temp_cy_cross_dir_smooth_fx[kk] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); + } + + FOR ( ch_idx = 0; ch_idx < s_min( 4, nchan_transport ); ch_idx++ ) + { + Word16 k, temp = 0; + IF ( NE_16(ch_idx, 0 )) + { + Word32 a, b, c; + Word16 b_exp, sqr_exp, q_diff_aab, q_diff_c; + Word32 mpy_a_a_b, mpy_diff_c, mpy_diff_aab; + Word32 sqr_inp, sqr; + + /*Directonal sound gain nrg compensation*/ + 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)) + { + b = 0; + b_exp = 0; + } + 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); + } + 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*/ + + mpy_a_a_b = Mpy_32_32(a, Mpy_32_16_1(a, b)); //Q = (h_dirac_output_synthesis_state->q_direct_responses + (31 - b_exp) - 31) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + 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_c = sub(q_diffuseness, 2); + + IF(NE_32(mpy_diff_c, 0) && NE_32(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)) + { + sqr_inp = mpy_diff_aab; + sqr_exp = sub(31, q_diff_aab); + } + ELSE + { + sqr_inp = mpy_diff_c; + 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(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))); + Q_temp_cy_cross_dir_smooth_fx[L_add(i_mult(ch_idx, num_freq_bands), k)] = sub(31, sqr_exp); + } + 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; + } + 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); + } + 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); + Q_temp_cy_cross_dir_smooth_fx[L_add(i_mult(ch_idx, num_freq_bands), k)] = sub(31 , sqr_exp); + } + } + 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)) + { + b = 0; + b_exp = 0; + } + ELSE + { + IF(EQ_32(reference_power[k + ( ch_idx + 1 ) * num_freq_bands], 0)) + { + b = MAXVAL_WORD16; + b_exp = 40; + } + ELSE + { + b = BASOP_Util_Divide3232_Scale(reference_power[k + num_freq_bands], reference_power[k + ( 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*/ + mpy_a_a_b = Mpy_32_32(a, Mpy_32_16_1(a, b)); //Q = (h_dirac_output_synthesis_state->q_direct_responses + (31 - b_exp) - 31) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + 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_c = sub(q_diffuseness, 2); + + IF(NE_32(mpy_diff_c, 0) && NE_32(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)) + { + sqr_inp = mpy_diff_aab; + sqr_exp = sub(31, q_diff_aab); + } + ELSE + { + sqr_inp = mpy_diff_c; + 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(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))); + Q_temp_cy_cross_dir_smooth_fx[L_add(i_mult(ch_idx, num_freq_bands), k)] = sub(31, sqr_exp); + } + 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; + } + 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); + } + 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); + Q_temp_cy_cross_dir_smooth_fx[L_add(i_mult(ch_idx, num_freq_bands), k)] = sub(31 , sqr_exp); + } + } + } + ELSE + { + Word32 sqr_inp, mpy_diff, sqr; + Word16 sqr_exp; + /*Diffuseness modellling nrg compensation*/ + FOR ( k = 0; k < num_freq_bands_diff; k++ ) + { + mpy_diff = Mpy_32_32(diffuseness[k] ,L_sub(h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29));//Q = q_diff - 1 + sqr_inp = L_add(L_shl(1, sub(q_diffuseness, 1)) , mpy_diff); + 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(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))); + Q_temp_cy_cross_dir_smooth_fx[L_add(i_mult(ch_idx, num_freq_bands), k)] = sub(31, sqr_exp); + } + 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; + } + 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); + } + 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); + Q_temp_cy_cross_dir_smooth_fx[L_add(i_mult(ch_idx, num_freq_bands), k)] = sub(31 , sqr_exp); + } + } + FOR ( ; k < num_freq_bands; k++ ) + { + mpy_diff = Mpy_32_32(diffuseness[k] ,L_sub(h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29));//Q = q_diff - 1 + sqr_inp = L_add(L_shl(1, sub(q_diffuseness, 1)) , mpy_diff); + 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(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))); + Q_temp_cy_cross_dir_smooth_fx[L_add(i_mult(ch_idx, num_freq_bands), k)] = sub(31, sqr_exp); + } + 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; + } + 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); + } + 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); + Q_temp_cy_cross_dir_smooth_fx[L_add(i_mult(ch_idx, num_freq_bands), k)] = sub(31 , sqr_exp); + } + } + } + } + Word16 temp = MAX_16; + FOR(Word16 kk = 0 ; kk < num_freq_bands * num_channels_dir; 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++) + { + 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])); + } + 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++) + { + 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)); + } + h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp_q; + } + FOR ( ch_idx = s_min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) + { + v_mult_fixed( h_dirac_output_synthesis_state->direct_power_factor_fx, + &h_dirac_output_synthesis_state->direct_responses_fx[i_mult(ch_idx, num_freq_bands)], + aux_buf, + num_freq_bands ); + + IF(NE_16(temp_q, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth)) + { + Scale_sig32(aux_buf, num_freq_bands, sub(h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, temp_q)); + } + + 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], + num_freq_bands, 0); // Todo:Hdrm + } + + /*Diffuse gain*/ + FOR ( ch_idx = s_min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc_fixed( h_dirac_output_synthesis_state->diffuse_power_factor_fx, + hDirACRend->diffuse_response_function_fx[ch_idx], + aux_buf, + 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], + num_freq_bands_diff, 0); // Todo:Hdrm + } + + return; + } + ELSE + { + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors_fx( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor_fx, + h_dirac_output_synthesis_state->diffuse_power_factor_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; + h_dirac_output_synthesis_state->direct_power_factor_q = 31; + } + } + + diff_start_band = 0; move16(); + IF ( h_dirac_output_synthesis_params->use_onset_filters ) + { + computeTargetPSDs_diffuse_with_onsets_fx( num_channels_dir, + num_freq_bands, h_dirac_output_synthesis_params->max_band_decorr, + hDirACRend->proto_index_diff, + h_dirac_output_synthesis_state->diffuse_power_factor_fx, + reference_power, + &q_reference_power, + h_dirac_output_synthesis_state->diffuse_responses_square_fx, + onset, + h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, + &h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ); + + diff_start_band = h_dirac_output_synthesis_params->max_band_decorr; move16(); + } + + /* process other PSDs only slot wise for 4 transport channels */ + IF ( EQ_16(dec_param_estim, TRUE )) + { + computeTargetPSDs_direct_fx( num_channels_dir, num_freq_bands, h_dirac_output_synthesis_state->direct_power_factor_fx, reference_power, &q_reference_power, h_dirac_output_synthesis_state->direct_responses_fx, h_dirac_output_synthesis_state->direct_responses_square_fx, h_dirac_output_synthesis_state->cy_auto_dir_smooth_fx, &h_dirac_output_synthesis_state->q_cy_auto_dir_smooth, h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, &h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ); + + computeTargetPSDs_diffuse_fx( num_channels_dir, num_freq_bands, diff_start_band, h_dirac_output_synthesis_state->diffuse_power_factor_fx, reference_power, &q_reference_power, h_dirac_output_synthesis_state->diffuse_responses_square_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, &h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ); + } + + return; +} +#endif #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx() @@ -2023,10 +2496,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( // ((p_gains_dir_q - 1, p_proto_dir_q - 1) >> 1) -> (p_gains_dir_q + p_proto_dir_q - 32) output_real[l * num_channels_dir + ch_idx] = L_add( - Mpy_32_32( gs1, ( L_add( Mpy_32_32( (Word32) ( 1.772454e+00f * ONE_IN_Q30 ), ( *p_proto ) ), - Mpy_32_32( (Word32) ( 1.023327e+00f * ONE_IN_Q30 ), ( *p_proto2 ) ) ) ) ), /* s1 */ - Mpy_32_32( gs2, ( L_sub( Mpy_32_32( (Word32) ( 1.772454e+00f * ONE_IN_Q30 ), ( *p_proto ) ), - Mpy_32_32( (Word32) ( 1.023327e+00f * ONE_IN_Q30 ), ( *p_proto2 ) ) ) ) ) ); /* s2 */ + 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 */ move32(); p_proto++; p_proto2++; @@ -2034,10 +2507,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( // ((p_gains_dir_q - 1, p_proto_dir_q - 1) >> 1) -> (p_gains_dir_q + p_proto_dir_q - 32) output_imag[l * num_channels_dir + ch_idx] = L_add( - Mpy_32_32( gs1, ( L_add( Mpy_32_32( (Word32) ( 1.772454e+00f * ONE_IN_Q30 ), ( *p_proto ) ), - Mpy_32_32( (Word32) ( 1.023327e+00f * ONE_IN_Q30 ), ( *p_proto2 ) ) ) ) ), - Mpy_32_32( gs2, ( L_sub( Mpy_32_32( (Word32) ( 1.772454e+00f * ONE_IN_Q30 ), ( *p_proto ) ), - Mpy_32_32( (Word32) ( 1.023327e+00f * ONE_IN_Q30 ), ( *p_proto2 ) ) ) ) ) ); + 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 ) ) ) ) ) ); move32(); p_proto++; p_proto2++; @@ -3202,7 +3675,14 @@ static void ivas_dirac_dec_get_response_split_order_fx( tmp = BASOP_util_atan2( dv_r_1, dv_r_0, 0 ); // Q13 index_azimuth = shr( mult( tmp, _180_OVER_PI_Q9 ), 7 ); // Q0; - tmp = idiv1616( add( index_azimuth, 180 ), 360 ); + IF(EQ_16(index_azimuth, -180)) + { + tmp = 0; move16(); + } + ELSE + { + tmp = idiv1616( add( index_azimuth, 180 ), 360 ); + } index_azimuth = sub( add( index_azimuth, 180 ), i_mult( tmp, 360 ) ); // index_azimuth = (index_azimuth + 180) % 360 temp = L_add( Mpy_32_32( dv_r_0, dv_r_0 ), Mpy_32_32( dv_r_1, dv_r_1 ) ); // Q21 @@ -4826,7 +5306,7 @@ static void computeTargetPSDs_direct_fx( return; } -#endif +#else static void computeTargetPSDs_direct( @@ -4862,7 +5342,7 @@ static void computeTargetPSDs_direct( return; } - +#endif #ifdef IVAS_FLOAT_FIXED static void computeTargetPSDs_direct_subframe_fx( @@ -4966,7 +5446,7 @@ static void computeTargetPSDs_diffuse_fx( return; } -#endif +#else static void computeTargetPSDs_diffuse( @@ -4997,7 +5477,7 @@ static void computeTargetPSDs_diffuse( return; } - +#endif #ifdef IVAS_FLOAT_FIXED static void computeTargetPSDs_diffuse_subframe_fx( @@ -5103,7 +5583,7 @@ static void computeTargetPSDs_diffuse_with_onsets_fx( return; } -#endif +#else static void computeTargetPSDs_diffuse_with_onsets( @@ -5145,7 +5625,7 @@ 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) { @@ -5202,7 +5682,7 @@ static void computeAlphaSynthesis_fx(Word16 *alpha_synthesis_fx, const Word16 av return; } -#endif +#else static void computeAlphaSynthesis( float *alpha_synthesis, @@ -5245,7 +5725,7 @@ static void computeAlphaSynthesis( return; } - +#endif #ifdef IVAS_FLOAT_FIXED static void spreadCoherencePanningHoa_fx( const Word16 azimuth, diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c index 11033bef8369cb41c30e8ff82712b74910365ae5..85ef5378c280a0b0e8e73027ffa5ddfcfb5870d0 100644 --- a/lib_rend/ivas_dirac_rend.c +++ b/lib_rend/ivas_dirac_rend.c @@ -46,6 +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() * @@ -815,6 +816,13 @@ void ivas_dirac_rend_close_fx( free(hDirACRend->hoa_encoder); hDirACRend->hoa_encoder = NULL; } +#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) @@ -832,28 +840,50 @@ void ivas_dirac_rend_close_fx( /* States */ /* free prototype signal buffers */ +#if 1 /* TODO: remove float code */ IF (hDirACRend->proto_frame_f != NULL) { free(hDirACRend->proto_frame_f); hDirACRend->proto_frame_f = NULL; } +#endif + IF (hDirACRend->proto_frame_f_fx != NULL) + { + free(hDirACRend->proto_frame_f_fx); + hDirACRend->proto_frame_f_fx = NULL; + } + FOR (i = 0; i < DIRAC_NUM_DIMS; i++) { FOR (j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++) { +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED IF (hDirACRend->buffer_intensity_real[i][j] != NULL) { free(hDirACRend->buffer_intensity_real[i][j]); hDirACRend->buffer_intensity_real[i][j] = NULL; } +#endif + IF (hDirACRend->buffer_intensity_real_fx[i][j] != NULL) + { + free(hDirACRend->buffer_intensity_real_fx[i][j]); + hDirACRend->buffer_intensity_real_fx[i][j] = NULL; + } } } +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED IF (hDirACRend->buffer_energy != NULL) { free(hDirACRend->buffer_energy); hDirACRend->buffer_energy = NULL; } +#endif + IF (hDirACRend->buffer_energy_fx != NULL) + { + free(hDirACRend->buffer_energy_fx); + hDirACRend->buffer_energy_fx = NULL; + } IF (hDirACRend->masa_stereo_type_detect != NULL) { @@ -921,6 +951,13 @@ void ivas_dirac_rend_close( free( hDirACRend->hoa_encoder ); hDirACRend->hoa_encoder = NULL; } +#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 ) @@ -1448,10 +1485,14 @@ ivas_error ivas_dirac_alloc_mem( hDirAC_mem->proto_power_diff_smooth = NULL; hDirAC_mem->direct_responses_square = NULL; #ifdef IVAS_FLOAT_FIXED - hDirAC_mem->direct_responses_square_fx = NULL; hDirAC_mem->proto_power_smooth_fx = NULL; + hDirAC_mem->proto_power_diff_smooth_fx = NULL; + hDirAC_mem->direct_responses_square_fx = NULL; #endif hDirAC_mem->frame_dec_f = NULL; +#ifdef IVAS_FLOAT_FIXED + hDirAC_mem->frame_dec_f_fx = NULL; +#endif if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { if ( ( hDirAC_mem->cy_auto_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) @@ -1478,6 +1519,15 @@ ivas_error ivas_dirac_alloc_mem( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero( hDirAC_mem->proto_power_diff_smooth, size ); +#ifdef IVAS_FLOAT_FIXED + 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" ) ); + } + set32_fx( hDirAC_mem->proto_power_diff_smooth_fx, 0, size ); + hDirAC_mem->proto_power_diff_smooth_len = size; + hDirAC_mem->proto_power_diff_smooth_q = 31; +#endif if ( ( hDirAC_mem->direct_responses_square = (float *) malloc( sizeof( float ) * size ) ) == NULL ) { @@ -1498,12 +1548,22 @@ ivas_error ivas_dirac_alloc_mem( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } +#ifdef IVAS_FLOAT_FIXED + 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" ) ); + } + hDirAC_mem->frame_dec_f_len = 2 * num_outputs_diff * num_freq_bands; +#endif } } 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; #ifdef IVAS_FLOAT_FIXED + 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; + hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len = hDirAC_mem->proto_power_diff_smooth_len; 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(); @@ -1514,6 +1574,8 @@ ivas_error ivas_dirac_alloc_mem( 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; + set_s( hDirACRend->q_buffer_energy, Q31, CLDFB_NO_CHANNELS_MAX ); + set_s( hDirACRend->q_buffer_intensity_real, Q31, CLDFB_NO_CHANNELS_MAX ); #endif /* Target and smoothed nrg factors/gains */ @@ -1565,7 +1627,7 @@ ivas_error ivas_dirac_alloc_mem( #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 = 0; + hDirACRend->h_output_synthesis_psd_state.q_cy_cross_dir_smooth = 31; move16(); hDirACRend->h_output_synthesis_psd_state.q_cy_auto_diff_smooth = 0; move16(); @@ -1627,6 +1689,7 @@ ivas_error ivas_dirac_alloc_mem( { 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 } else @@ -1640,6 +1703,7 @@ ivas_error ivas_dirac_alloc_mem( { 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 } } @@ -1649,6 +1713,8 @@ ivas_error ivas_dirac_alloc_mem( #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; + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q = hDirAC_mem->proto_diffuse_buffer_f_q; #endif /* Gains/power factors*/ hDirAC_mem->direct_power_factor = NULL; @@ -1785,10 +1851,16 @@ void ivas_dirac_free_mem_fx( { free( hDirAC_mem->proto_power_smooth_fx ); } +#if 1 /* todo: remove float */ IF (hDirAC_mem->proto_power_diff_smooth != NULL) { free(hDirAC_mem->proto_power_diff_smooth); } +#endif + IF (hDirAC_mem->proto_power_diff_smooth_fx != NULL) + { + free(hDirAC_mem->proto_power_diff_smooth_fx); + } IF (hDirAC_mem->direct_responses_square != NULL) { free(hDirAC_mem->direct_responses_square); @@ -1797,10 +1869,16 @@ void ivas_dirac_free_mem_fx( { free(hDirAC_mem->direct_responses_square_fx); } + IF (hDirAC_mem->frame_dec_f_fx != NULL) + { + free(hDirAC_mem->frame_dec_f_fx); + } +#if 1 /* 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 != NULL) { free(hDirAC_mem->cy_cross_dir_smooth); @@ -1817,10 +1895,16 @@ void ivas_dirac_free_mem_fx( { free( hDirAC_mem->cy_auto_diff_smooth_fx ); } +#ifdef 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) + { + free(hDirAC_mem->direct_responses_fx); + } IF (hDirAC_mem->proto_direct_buffer_f != NULL) { free(hDirAC_mem->proto_direct_buffer_f); @@ -1829,10 +1913,12 @@ void ivas_dirac_free_mem_fx( { free( hDirAC_mem->proto_direct_buffer_f_fx ); } +#if 1 /* TODO: remove float free */ IF (hDirAC_mem->proto_diffuse_buffer_f != NULL) { free(hDirAC_mem->proto_diffuse_buffer_f); } +#endif IF( hDirAC_mem->proto_diffuse_buffer_f_fx != NULL ) { free( hDirAC_mem->proto_diffuse_buffer_f_fx ); @@ -1885,12 +1971,6 @@ void ivas_dirac_free_mem( { free( hDirAC_mem->proto_power_smooth ); } -#ifdef IVAS_FLOAT_FIXED - if ( hDirAC_mem->proto_power_smooth_fx != NULL ) - { - free( hDirAC_mem->proto_power_smooth_fx ); - } -#endif if ( hDirAC_mem->proto_power_diff_smooth != NULL ) { free( hDirAC_mem->proto_power_diff_smooth ); @@ -1919,20 +1999,6 @@ void ivas_dirac_free_mem( { free( hDirAC_mem->proto_direct_buffer_f ); } -#ifdef IVAS_FLOAT_FIXED - if ( hDirAC_mem->proto_direct_buffer_f_fx != NULL ) - { - free( hDirAC_mem->proto_direct_buffer_f_fx ); - } - if ( hDirAC_mem->proto_diffuse_buffer_f_fx != NULL ) - { - free( hDirAC_mem->proto_diffuse_buffer_f_fx ); - } - if (hDirAC_mem->direct_responses_fx != NULL) - { - free(hDirAC_mem->direct_responses_fx); - } -#endif if ( hDirAC_mem->proto_diffuse_buffer_f != NULL ) { free( hDirAC_mem->proto_diffuse_buffer_f ); @@ -1953,16 +2019,6 @@ void ivas_dirac_free_mem( { free( hDirAC_mem->onset_filter ); } -#ifdef IVAS_FLOAT_FIXED - if ( hDirAC_mem->reference_power_fx != NULL ) - { - free( hDirAC_mem->reference_power_fx ); - } - if ( hDirAC_mem->onset_filter_fx != NULL ) - { - free( hDirAC_mem->onset_filter_fx ); - } -#endif return; } @@ -4180,6 +4236,127 @@ void protoSignalComputation4( * Compute diffuse prototype buffer and smooth power, only for decorrelated bands *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_dec_compute_diffuse_proto_fx( + DIRAC_REND_HANDLE hDirACRend, + const Word16 num_freq_bands, + const Word16 slot_idx /* i : slot index */ +) +{ + Word16 k, l; + Word16 num_freq_bands_diff; + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; + DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; + Word16 m; + + Word32 *proto_frame_dec_f_fx; + Word32 *p_diff_buffer_fx, *p_diff_buffer_1_fx; + Word32 *p_proto_diff_fx, *p_power_smooth_fx; + Word32 *p_hoa_enc_fx; + + proto_frame_dec_f_fx = hDirACRend->proto_frame_dec_f_fx; + h_dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); + h_dirac_output_synthesis_state = &( hDirACRend->h_output_synthesis_psd_state ); + + num_freq_bands_diff = h_dirac_output_synthesis_params->max_band_decorr; + move16(); + + IF( num_freq_bands_diff == 0 ) + { + return; + } + + p_diff_buffer_fx = h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx + imult1616( shl( imult1616( slot_idx, num_freq_bands_diff ), 1 ), hDirACRend->hOutSetup.nchan_out_woLFE ); + p_diff_buffer_1_fx = p_diff_buffer_fx + 1; + p_power_smooth_fx = h_dirac_output_synthesis_state->proto_power_diff_smooth_fx; + + Word16 diffuse_start = slot_idx * 2 * num_freq_bands_diff * hDirACRend->hOutSetup.nchan_out_woLFE; + Word16 diff_e, smooth_e, proto_e, max_e; + Word32 diff_square, diff_square_1, diff_square_sum; + Word16 diff_square_e; + Word16 old_diff_e; + diff_e = sub( 31, h_dirac_output_synthesis_state->proto_diffuse_buffer_f_q ); + old_diff_e = diff_e; + 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 ) + { + diff_square_e = add( shl( proto_e, 1 ), 1 ); + max_e = add( s_max( diff_square_e, smooth_e ), 1 ); + Scale_sig32( p_power_smooth_fx, h_dirac_output_synthesis_state->proto_power_diff_smooth_len, sub( smooth_e, max_e ) ); + FOR( k = 0; k < hDirACRend->hOutSetup.nchan_out_woLFE; k++ ) + { + p_proto_diff_fx = proto_frame_dec_f_fx + shl( imult1616( k, num_freq_bands ), 1 ); + FOR( l = 0; l < num_freq_bands_diff; l++ ) + { + *p_diff_buffer_fx = *( p_proto_diff_fx++ ); + *p_diff_buffer_1_fx = *( p_proto_diff_fx++ ); + + 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_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 ); + + p_power_smooth_fx++; + p_diff_buffer_fx += 2; + p_diff_buffer_1_fx += 2; + } + } + diff_e = proto_e; + } + ELSE + { + /*DIRAC_SYNTHESIS_PSD_SHD: Virtual LS->HOA encoding*/ + Word16 gb = find_guarded_bits_fx( hDirACRend->num_outputs_diff ); + diff_square_e = add( shl( add( 2, add( proto_e, gb ) ), 1 ), 1 ); + max_e = add( s_max( diff_square_e, smooth_e ), 1 ); + Scale_sig32( p_power_smooth_fx, h_dirac_output_synthesis_state->proto_power_diff_smooth_len, sub( smooth_e, max_e ) ); + FOR( k = 0; k < hDirACRend->hOutSetup.nchan_out_woLFE; k++ ) + { + FOR( l = 0; l < num_freq_bands_diff; l++ ) + { + p_hoa_enc_fx = hDirACRend->hoa_encoder_fx + k; + p_proto_diff_fx = proto_frame_dec_f_fx + shl( l, 1 ); + + *p_diff_buffer_fx = 0; + *p_diff_buffer_1_fx = 0; + + /*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 ) ); + *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 ) ); + p_hoa_enc_fx += hDirACRend->hOutSetup.nchan_out_woLFE; + p_proto_diff_fx += shl( num_freq_bands, 1 ); + } + + 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 ); + *p_power_smooth_fx = L_add( *p_power_smooth_fx, diff_square_sum ); + + p_power_smooth_fx++; + + p_diff_buffer_fx += 2; + p_diff_buffer_1_fx += 2; + } + } + diff_e = add( add( 2, proto_e ), gb ); + } + h_dirac_output_synthesis_state->proto_power_diff_smooth_q = sub( 31, max_e ); + + 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 ) ); + 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 ) ); + h_dirac_output_synthesis_state->proto_diffuse_buffer_f_q = sub( 31, new_diff_e ); + + return; +} +#endif void ivas_dirac_dec_compute_diffuse_proto( DIRAC_REND_HANDLE hDirACRend, const int16_t num_freq_bands, @@ -4257,6 +4434,107 @@ void ivas_dirac_dec_compute_diffuse_proto( } +#ifdef IVAS_FLOAT_FIXED +/*------------------------------------------------------------------------- + * computeDirectionAngles_fx() + * + *------------------------------------------------------------------------*/ + +void computeDirectionAngles_fx( + Word32 *intensity_real_x_fx, + Word32 *intensity_real_y_fx, + Word32 *intensity_real_z_fx, + Word16 q_intensity_real, + const Word16 num_frequency_bands, + Word16 *azimuth, + Word16 *elevation ) +{ + Word16 k; + Word32 intensityNorm; + Word32 x, y, z, radius; + Word32 temp; + Word16 res, q_intensityNorm, exp, q_temp; + Word16 q_x, q_y, q_z, exp1, exp2, exp3, q_tmp1, q_tmp2; + Word32 x_re, y_re, z_re, tmp1, tmp2; + + exp = 0; + move16(); + + FOR( k = 0; k < num_frequency_bands; ++k ) + { + exp1 = norm_l( intensity_real_x_fx[k] ); + exp2 = norm_l( intensity_real_y_fx[k] ); + exp3 = norm_l( intensity_real_z_fx[k] ); + x_re = L_shl( intensity_real_x_fx[k], exp1 ); + y_re = L_shl( intensity_real_y_fx[k], exp2 ); + z_re = L_shl( intensity_real_z_fx[k], exp3 ); + + tmp1 = Mpy_32_32( x_re, x_re ); + q_tmp1 = sub( add( add( q_intensity_real, exp1 ), add( q_intensity_real, exp1 ) ), 31 ); + tmp2 = Mpy_32_32( y_re, y_re ); + q_tmp2 = sub( add( add( q_intensity_real, exp2 ), add( q_intensity_real, exp2 ) ), 31 ); + + temp = BASOP_Util_Add_Mant32Exp( tmp1, sub( 31, q_tmp1 ), tmp2, sub( 31, q_tmp2 ), &exp ); + + tmp2 = Mpy_32_32( z_re, z_re ); + q_tmp2 = sub( add( add( q_intensity_real, exp3 ), add( q_intensity_real, exp3 ) ), 31 ); + + intensityNorm = BASOP_Util_Add_Mant32Exp( temp, exp, tmp2, sub( 31, q_tmp2 ), &exp ); + q_intensityNorm = sub( 31, exp ); + + IF( LE_32( intensityNorm, EPSILON_FX ) ) + { + intensityNorm = ONE_IN_Q30; + move32(); + x = ONE_IN_Q30; + move32(); + q_x = Q30; + move16(); + y = 0; + move32(); + q_y = Q30; + move16(); + z = 0; + move32(); + q_z = Q30; + move16(); + } + ELSE + { + temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, intensityNorm, &exp ); + exp = sub( exp, sub( Q30, q_intensityNorm ) ); + temp = Sqrt32( temp, &exp ); + q_temp = sub( 31, exp ); + + x = Mpy_32_32( x_re, temp ); + q_x = sub( add( add( q_intensity_real, exp1 ), q_temp ), 31 ); + y = Mpy_32_32( y_re, temp ); + q_y = sub( add( add( q_intensity_real, exp2 ), q_temp ), 31 ); + z = Mpy_32_32( z_re, temp ); + q_z = sub( add( add( q_intensity_real, exp3 ), q_temp ), 31 ); + } + + tmp1 = Mpy_32_32( x, x ); + q_tmp1 = sub( add( q_x, q_x ), 31 ); + + tmp2 = Mpy_32_32( y, y ); + q_tmp2 = sub( add( q_y, q_y ), 31 ); + + 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; + 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; + move16(); + } + + return; +} +#else /*------------------------------------------------------------------------- * computeDirectionAngles() * @@ -4304,7 +4582,7 @@ void computeDirectionAngles( return; } - +#endif /*------------------------------------------------------------------------- * ivas_masa_init_stereotype_detection() @@ -4654,6 +4932,68 @@ void ivas_masa_stereotype_detection( } +#ifdef IVAS_FLOAT_FIXED +/*------------------------------------------------------------------------- + * computeIntensityVector_dec() + * + * + *------------------------------------------------------------------------*/ + +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], + Word16 q_cldfb, + const Word16 num_frequency_bands, + Word32 *intensity_real_x_fx, + Word32 *intensity_real_y_fx, + Word32 *intensity_real_z_fx, + Word16 *q_intensity_real ) +{ + /* + * W = a + ib; Y = c + id + * real(W*Y') = ac + bd + */ + Word16 i; + Word32 re1, re2, im1, im2; + Word16 min_q_shift; + + min_q_shift = Q31; + /* calculate the max possible shift for the buffers Cldfb_RealBuffer_fx and Cldfb_ImagBuffer_fx*/ + FOR( i = 0; i < 4; i++ ) + { + min_q_shift = s_min( min_q_shift, s_min( L_norm_arr( Cldfb_RealBuffer_fx[i][0], num_frequency_bands ), L_norm_arr( Cldfb_ImagBuffer_fx[i][0], num_frequency_bands ) ) ); + } + + min_q_shift = sub( min_q_shift, 1 ); // guard bits + + FOR( i = 0; i < num_frequency_bands; ++i ) + { + re1 = L_shl( Cldfb_RealBuffer_fx[0][0][i], min_q_shift ); + im1 = L_shl( Cldfb_ImagBuffer_fx[0][0][i], min_q_shift ); + re2 = L_shl( Cldfb_RealBuffer_fx[3][0][i], min_q_shift ); + im2 = L_shl( Cldfb_ImagBuffer_fx[3][0][i], min_q_shift ); + + intensity_real_x_fx[i] = Madd_32_32( Mpy_32_32( re2, re1 ), im2, im1 ); + move32(); + + re2 = L_shl( Cldfb_RealBuffer_fx[1][0][i], min_q_shift ); + im2 = L_shl( Cldfb_ImagBuffer_fx[1][0][i], min_q_shift ); + + intensity_real_y_fx[i] = Madd_32_32( Mpy_32_32( re2, re1 ), im2, im1 ); + move32(); + + re2 = L_shl( Cldfb_RealBuffer_fx[2][0][i], min_q_shift ); + im2 = L_shl( Cldfb_ImagBuffer_fx[2][0][i], min_q_shift ); + + intensity_real_z_fx[i] = Madd_32_32( Mpy_32_32( re2, re1 ), im2, im1 ); + move32(); + } + + *q_intensity_real = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); + + return; +} +#else /*------------------------------------------------------------------------- * computeIntensityVector_dec() * @@ -4686,7 +5026,7 @@ void computeIntensityVector_dec( return; } - +#endif #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- @@ -5338,7 +5678,35 @@ static void ivas_masa_ext_dirac_render_sf( if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) { /* Compute diffuse prototypes */ +#ifdef IVAS_FLOAT_FIXED_u + /* Float to fixed */ + if (hDirACRend->h_output_synthesis_psd_params.max_band_decorr != 0) + { + f2me_buf(hDirACRend->proto_frame_dec_f, hDirACRend->proto_frame_dec_f_fx, &hDirACRend->proto_frame_dec_f_q, hDirACRend->proto_frame_dec_f_len); + hDirACRend->proto_frame_dec_f_q = 31 - hDirACRend->proto_frame_dec_f_q; + DIRAC_OUTPUT_SYNTHESIS_STATE *state = &(hDirACRend->h_output_synthesis_psd_state); + f2me_buf(state->proto_power_diff_smooth, state->proto_power_diff_smooth_fx, &state->proto_power_diff_smooth_q, state->proto_power_diff_smooth_len); + state->proto_power_diff_smooth_q = 31 - state->proto_power_diff_smooth_q; + f2me_buf(state->proto_diffuse_buffer_f, state->proto_diffuse_buffer_f_fx, &state->proto_diffuse_buffer_f_q, state->proto_diffuse_buffer_f_len); + state->proto_diffuse_buffer_f_q = 31 - state->proto_diffuse_buffer_f_q; + } + ivas_dirac_dec_compute_diffuse_proto_fx( hDirACRend, hSpatParamRendCom->num_freq_bands, slot_idx ); + /* Fixed to float */ + if (hDirACRend->h_output_synthesis_psd_params.max_band_decorr != 0) + { + DIRAC_OUTPUT_SYNTHESIS_STATE *state = &(hDirACRend->h_output_synthesis_psd_state); + me2f_buf(state->proto_power_diff_smooth_fx, + 31 - state->proto_power_diff_smooth_q, + state->proto_power_diff_smooth, + state->proto_power_diff_smooth_len); + me2f_buf(state->proto_diffuse_buffer_f_fx, + 31 - state->proto_diffuse_buffer_f_q, + state->proto_diffuse_buffer_f, + state->proto_diffuse_buffer_f_len); + } +#else ivas_dirac_dec_compute_diffuse_proto( hDirACRend, hSpatParamRendCom->num_freq_bands, slot_idx ); +#endif } ivas_dirac_dec_output_synthesis_process_slot( reference_power, @@ -5447,7 +5815,410 @@ static void ivas_masa_ext_dirac_render_sf( return; } +#ifdef IVAS_FLOAT_FIXED +static void ivas_masa_ext_dirac_render_sf_fx( + MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: IVAS decoder structure */ + Word32 *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +) +{ + int16_t i, ch, idx_in, idx_lfe; + DIRAC_REND_HANDLE hDirACRend; + Word32 dirEne; + Word32 surCohEner; + Word16 surCohRatio[CLDFB_NO_CHANNELS_MAX]; + Word16 surCohRatio_exp; + Word16 subframe_idx; + Word16 slot_idx, index_slot; + Word16 slot_idx_start, slot_idx_start_cldfb_synth, md_idx; + Word16 nchan_transport, q_cldfb; + Word16 masa_band_mapping[MASA_FREQUENCY_BANDS + 1]; + + /* CLDFB: last output channels reserved to LFT for CICPx */ + Word32 Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + Word32 Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + + /* local copies of azi, ele, diffuseness */ + Word16 azimuth[CLDFB_NO_CHANNELS_MAX]; + Word16 elevation[CLDFB_NO_CHANNELS_MAX]; + Word32 diffuseness_vector[CLDFB_NO_CHANNELS_MAX]; + + DIRAC_DEC_STACK_MEM DirAC_mem; + Word32 *reference_power, *reference_power_smooth; + Word16 q_reference_power; + Word32 *onset_filter, *onset_filter_subframe, *p_onset_filter = NULL; + uint16_t coherence_flag; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + push_wmops( "ivas_masa_ext_dirac_render_sf" ); + + /* Initialize aux buffers */ + hDirACRend = hMasaExtRend->hDirACRend; + hSpatParamRendCom = hMasaExtRend->hSpatParamRendCom; + nchan_transport = hMasaExtRend->nchan_input; + move16(); + DirAC_mem = hDirACRend->stack_mem; + + reference_power = DirAC_mem.reference_power_fx; move32(); + reference_power_smooth = ( DirAC_mem.reference_power_fx == NULL ) ? NULL : DirAC_mem.reference_power_fx + hSpatParamRendCom->num_freq_bands; + onset_filter = DirAC_mem.onset_filter_fx; + onset_filter_subframe = ( 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(); + /* Construct default MASA band mapping */ + FOR ( i = 0; i < MASA_FREQUENCY_BANDS + 1; i++ ) + { + masa_band_mapping[i] = i; move16(); + } + + /* Subframe loop */ + slot_idx_start = hSpatParamRendCom->slots_rendered; move16(); + slot_idx_start_cldfb_synth = 0; move16(); + + subframe_idx = hSpatParamRendCom->subframes_rendered; move16(); + md_idx = hSpatParamRendCom->render_to_md_map[subframe_idx]; move16(); + + /* copy parameters into local buffers*/ + Copy( hSpatParamRendCom->azimuth[hSpatParamRendCom->render_to_md_map[subframe_idx]], azimuth, hSpatParamRendCom->num_freq_bands ); + Copy( hSpatParamRendCom->elevation[hSpatParamRendCom->render_to_md_map[subframe_idx]], elevation, hSpatParamRendCom->num_freq_bands ); + Copy32( hSpatParamRendCom->diffuseness_vector_fx[hSpatParamRendCom->render_to_md_map[subframe_idx]], diffuseness_vector, hSpatParamRendCom->num_freq_bands ); + + IF ( NE_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD )) + { + set32_fx( reference_power_smooth, 0, hSpatParamRendCom->num_freq_bands ); + } + ELSE + { + set32_fx( onset_filter_subframe, 0, hSpatParamRendCom->num_freq_bands ); + } + + /* compute response */ + IF ( NE_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD )) + { + ivas_dirac_dec_compute_power_factors_fx( hSpatParamRendCom->num_freq_bands, + diffuseness_vector, + hDirACRend->h_output_synthesis_psd_params.max_band_decorr, + hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx, + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx ); + + IF ( coherence_flag ) + { + FOR ( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + dirEne = hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i]; move32(); + surCohEner = Mpy_32_16_1(hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx[i], hSpatParamRendCom->surroundingCoherence_fx[md_idx][i]); //Q.31 + 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); + 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); + + surCohRatio[i] = BASOP_Util_Divide3232_Scale( surCohEner, L_add( L_add(1, dirEne), surCohEner ), &surCohRatio_exp); + } + } + ELSE + { + set16_fx( surCohRatio, 0, hSpatParamRendCom->num_freq_bands ); + } + } + ELSE + { + ivas_dirac_dec_compute_gain_factors_fx( hSpatParamRendCom->num_freq_bands, + hSpatParamRendCom->diffuseness_vector_fx[md_idx], + hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx, + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx, + &hDirACRend->h_output_synthesis_psd_state.direct_power_factor_q, + &hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_q + ); + + IF ( coherence_flag ) + { + FOR ( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + surCohRatio[i] = hSpatParamRendCom->surroundingCoherence_fx[md_idx][i]; move16(); + } + } + ELSE + { + set16_fx( surCohRatio, 0, hSpatParamRendCom->num_freq_bands ); + } + } + + ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, + hDirACRend, + hMasaExtRend->hVBAPdata, + masa_band_mapping, + NULL, + azimuth, + elevation, + md_idx, + surCohRatio, + surCohRatio_exp, + 0, + NULL, + 0 ); + + + FOR ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = add(slot_idx_start, slot_idx); + md_idx = hSpatParamRendCom->render_to_md_map[subframe_idx]; move16(); + + /* CLDFB Analysis*/ + FOR ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts_fx( &( output_f[ch][hSpatParamRendCom->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hSpatParamRendCom->num_freq_bands, + hMasaExtRend->cldfbAnaRend[ch], q_cldfb); + } + + + IF ( EQ_16(nchan_transport, 1 )) + { + /* Need to set second CLDFB channel to zero as further processing assumes CNA content in it */ + set16_fx( Cldfb_RealBuffer[1][0], 0, hSpatParamRendCom->num_freq_bands ); + set16_fx( Cldfb_ImagBuffer[1][0], 0, hSpatParamRendCom->num_freq_bands ); + } + + /*-----------------------------------------------------------------* + * prototype signal computation + *-----------------------------------------------------------------*/ + + IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD )) + { + protoSignalComputation_shd_fx( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q, + reference_power, q_reference_power, slot_idx, nchan_transport, + hDirACRend->num_outputs_diff, + hSpatParamRendCom->num_freq_bands, + 0, q_cldfb); + } + ELSE IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO )) + { + protoSignalComputation2_fx( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_q, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, + reference_power, q_reference_power, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + 0, slot_idx, hSpatParamRendCom->num_freq_bands, hDirACRend->masa_stereo_type_detect, q_cldfb); + } + ELSE + { + SWITCH ( nchan_transport ) + { + case 2: + protoSignalComputation2_fx( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->proto_frame_f_fx, + hDirACRend->proto_frame_f_q, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, + reference_power, + q_reference_power, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + hDirACRend->hOutSetup.is_loudspeaker_setup, + slot_idx, + hSpatParamRendCom->num_freq_bands, + hDirACRend->masa_stereo_type_detect, q_cldfb); + BREAK; + case 1: + protoSignalComputation1_fx( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirACRend->proto_frame_f_fx, + hDirACRend->proto_frame_f_q, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, + reference_power, + q_reference_power, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, + slot_idx, + hDirACRend->num_protos_diff, + hSpatParamRendCom->num_freq_bands, q_cldfb); + BREAK; + default: + return; + } + } + + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ + + IF ( EQ_16(hDirACRend->proto_signal_decorr_on, 1 )) + { + /* decorrelate prototype frame */ + IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD )) + { + ivas_dirac_dec_decorr_process_fx( hSpatParamRendCom->num_freq_bands, + hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->synthesisConf, + nchan_transport, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx + i_mult(i_mult(slot_idx, hSpatParamRendCom->num_freq_bands), shl( hDirACRend->num_outputs_diff, 1)), + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q, + hDirACRend->num_protos_diff, + hDirACRend->proto_index_diff, + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx + add (i_mult(i_mult(slot_idx, hSpatParamRendCom->num_freq_bands), shl(hDirACRend->num_outputs_diff, 1)) , shl(i_mult(hSpatParamRendCom->num_freq_bands, s_min( 4, nchan_transport )), 1)), + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q, + onset_filter, + hDirACRend->h_freq_domain_decorr_ap_params, + hDirACRend->h_freq_domain_decorr_ap_state ); + + v_multc_fixed( onset_filter, ONE_IN_Q28, onset_filter, hSpatParamRendCom->num_freq_bands ); /*0.25 in Q31 = Q28*/ + v_add_fixed( onset_filter, onset_filter_subframe, onset_filter_subframe, hSpatParamRendCom->num_freq_bands, 1); + p_onset_filter = onset_filter_subframe; + } + ELSE + { + ivas_dirac_dec_decorr_process_fx( hSpatParamRendCom->num_freq_bands, + hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->synthesisConf, + nchan_transport, + hDirACRend->proto_frame_f_fx, + hDirACRend->proto_frame_f_q, + hDirACRend->num_protos_diff, + hDirACRend->proto_index_diff, + DirAC_mem.frame_dec_f_fx, + DirAC_mem.frame_dec_f_q, + onset_filter, + hDirACRend->h_freq_domain_decorr_ap_params, + hDirACRend->h_freq_domain_decorr_ap_state ); + + hDirACRend->proto_frame_dec_f_fx = DirAC_mem.frame_dec_f_fx; + p_onset_filter = onset_filter; + } + } + ELSE + { + IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD )) + { + set32_fx( onset_filter_subframe, MAX_32, hSpatParamRendCom->num_freq_bands ); + p_onset_filter = onset_filter_subframe; + } + ELSE + { + /* no frequency domain decorrelation: use prototype frame */ + hDirACRend->proto_frame_dec_f_fx = hDirACRend->proto_frame_f_fx; + p_onset_filter = NULL; + } + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + test(); + IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_LS) || EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD )) + { + /* Compute diffuse prototypes */ + ivas_dirac_dec_compute_diffuse_proto_fx( hDirACRend, hSpatParamRendCom->num_freq_bands, slot_idx ); + } + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector_fx[md_idx], + hSpatParamRendCom, + hDirACRend, + 0, + 0, + hMasaExtRend->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + 0, + 0 ); + + IF ( NE_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD )) + { + v_add_fixed( reference_power, reference_power_smooth, reference_power_smooth, hSpatParamRendCom->num_freq_bands, 1); + } + } + + ivas_dirac_dec_output_synthesis_get_interpolator_fx( &hDirACRend->h_output_synthesis_psd_params, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + + IF ( EQ_16(hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD )) + { + ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hSpatParamRendCom, + hDirACRend, + nchan_transport, + hSpatParamRendCom->subframe_nbslots[subframe_idx], + p_onset_filter, + diffuseness_vector, + 0, + 0, + &hDirACRend->h_output_synthesis_psd_state.q_cy_cross_dir_smooth_prev, + &hDirACRend->h_output_synthesis_psd_state.q_cy_auto_diff_smooth_prev + ); + } + ELSE + { + ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hSpatParamRendCom, + hDirACRend, + hSpatParamRendCom->subframe_nbslots[subframe_idx], + diffuseness_vector, + reference_power_smooth, + 1.0f, + 0 ); + } + + /*-----------------------------------------------------------------* + * CLDFB synthesis (and binaural rendering) + *-----------------------------------------------------------------*/ + + index_slot = slot_idx_start_cldfb_synth; move16(); + + { + Word32 *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 outchannels; + + idx_in = 0; move16(); + idx_lfe = 0; move16(); + + outchannels = add(hDirACRend->hOutSetup.nchan_out_woLFE, hDirACRend->hOutSetup.num_lfe); + + /* 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 )) ) + { + /* No LFE for MASA rendering */ + set32_fx( &( output_f[ch][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 ) )) + { + idx_lfe++; + } + } + ELSE + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + FOR ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis_ivas_fx( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], hMasaExtRend->cldfbSynRend[idx_in] ); + idx_in++; + } + } + } + hSpatParamRendCom->slots_rendered = add(hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->slots_rendered); + hSpatParamRendCom->subframes_rendered++; + + pop_wmops(); + + return; +} +#endif void ivas_masa_ext_dirac_render( MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ float *output_f[], /* i/o: input/output signals in time domain */ @@ -5484,3 +6255,41 @@ void ivas_masa_ext_dirac_render( return; } +#ifdef IVAS_FLOAT_FIXED +void ivas_masa_ext_dirac_render_fx( + MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ + Word32 *output_f[], /* i/o: input/output signals in time domain */ + const Word16 num_subframes /* i : number of subframes to render */ +) +{ + Word16 subframe_idx; + Word32 *output_f_local[MAX_OUTPUT_CHANNELS]; + Word16 n, n_samples_sf; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + hSpatParamRendCom = hMasaExtRend->hSpatParamRendCom; + + n_samples_sf = i_mult(JBM_CLDFB_SLOTS_IN_SUBFRAME, hSpatParamRendCom->slot_size); + + FOR ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + output_f_local[n] = output_f[n]; + } + + hSpatParamRendCom->subframes_rendered = hSpatParamRendCom->dirac_read_idx; + + FOR ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + { + hSpatParamRendCom->slots_rendered = 0; + ivas_masa_ext_dirac_render_sf_fx( hMasaExtRend, output_f_local ); + FOR ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + output_f_local[n] += n_samples_sf; + } + + hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + } + + return; +} +#endif \ No newline at end of file diff --git a/lib_rend/ivas_efap.c b/lib_rend/ivas_efap.c index 03d3403b034c5a62eb231121acef15a65c5255ee..be1678638a5488be97e7e937216394006e0ac591 100644 --- a/lib_rend/ivas_efap.c +++ b/lib_rend/ivas_efap.c @@ -68,23 +68,26 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -static ivas_error poly_init( EFAP *efap, const int16_t efip_flag ); #ifndef IVAS_FLOAT_FIXED +static ivas_error poly_init(EFAP *efap, const int16_t efip_flag); static ivas_error sphere_triangulation( const int16_t numSpk, EFAP_VERTEX_DATA *vtxData, EFAP_POLYSET_DATA *polyData, float ***dmTranspose, int16_t *numTot, const int16_t efip_flag ); static void initial_polyeder( EFAP_VERTEX_DATA *vtxData, EFAP_LS_TRIANGLE *triArray, int16_t *numTri, int16_t *vtxInHull ); static void add_ghost_speakers( EFAP_VERTEX *vertexArray, int16_t *numVtx, const int16_t efip_flag ); static void add_vertex_to_convex_hull( const EFAP_VERTEX_DATA *vtxData, const int16_t vtxIdx, int16_t *vtxInHull, EFAP_LS_TRIANGLE *triArray, int16_t *szTri ); +static void sort_vertices(const EFAP_VERTEX *vertexArray, const int16_t *numVtx, int16_t *order); +static void visible_edges(const EFAP_LS_TRIANGLE *triArray, const int16_t *visible, const int16_t numSurface, int16_t *numEdges, int16_t *edges); #else -static ivas_error sphere_triangulation( const int16_t numSpk, EFAP_VERTEX_DATA *vtxData, EFAP_POLYSET_DATA *polyData, Word32 ***dmTranspose, int16_t *numTot, const int16_t efip_flag ); -static void initial_polyeder_fixed( EFAP_VERTEX_DATA *vtxData, EFAP_LS_TRIANGLE *triArray, Word16 *numTri, Word16 *vtxInHull ); -static void add_ghost_speakers_fixed( EFAP_VERTEX *vertexArray, Word16 *numVtx, const Word16 efip_flag ); -static void add_vertex_to_convex_hull_fixed( const EFAP_VERTEX_DATA *vtxData, const Word16 vtxIdx, Word16 *vtxInHull, EFAP_LS_TRIANGLE *triArray, Word16 *szTri ); +static ivas_error poly_init_fx(EFAP *efap, const Word16 efip_flag); +static ivas_error sphere_triangulation_fx( const Word16 numSpk, EFAP_VERTEX_DATA *vtxData, EFAP_POLYSET_DATA *polyData, Word32 ***dmTranspose, Word16 *numTot, const Word16 efip_flag ); +static void initial_polyeder_fx( EFAP_VERTEX_DATA *vtxData, EFAP_LS_TRIANGLE *triArray, Word16 *numTri, Word16 *vtxInHull ); +static void add_ghost_speakers_fx( EFAP_VERTEX *vertexArray, Word16 *numVtx, const Word16 efip_flag ); +static void add_vertex_to_convex_hull_fx( const EFAP_VERTEX_DATA *vtxData, const Word16 vtxIdx, Word16 *vtxInHull, EFAP_LS_TRIANGLE *triArray, Word16 *szTri ); +static void sort_vertices_fx(const EFAP_VERTEX *vertexArray, const Word16 *numVtx, Word16 *order); +static void visible_edges_fx(const EFAP_LS_TRIANGLE *triArray, const Word16 *visible, const Word16 numSurface, Word16 *numEdges, Word16 *edges); #endif -static void sort_vertices( const EFAP_VERTEX *vertexArray, const int16_t *numVtx, int16_t *order ); -static void visible_edges( const EFAP_LS_TRIANGLE *triArray, const Word16 *visible, const Word16 numSurface, Word16 *numEdges, Word16 *edges ); #ifndef IVAS_FLOAT_FIXED static void flip_plane( const EFAP_VERTEX *vtxArray, int16_t *surface, const float centroid[3] ); @@ -94,12 +97,12 @@ static void efap_panning( const float azi, const float ele, const EFAP_POLYSET_D static void get_poly_gains( const float azi, const float ele, const float aziPoly[EFAP_MAX_CHAN_NUM], const float elePoly[EFAP_MAX_CHAN_NUM], const int16_t numChan, float *buffer ); static float get_tri_gain( const float A[2], const float B[2], const float C[2], const float P_minus_A[2] ); #else -static void flip_plane_fixed( const EFAP_VERTEX *vtxArray, Word16 *surface, const Word32 centroid[3] ); -static void remap_ghosts_fixed( EFAP_VERTEX *vtxArray, EFAP_LS_TRIANGLE *triArray, Word16 numSpk, Word16 *numVertex, Word16 numTri, Word32 **downmixMatrix ); -static void vertex_init_fixed( const Word32 *aziSpk, const Word32 *eleSpk, EFAP_VERTEX_DATA *efapVtxData ); -static void efap_panning_fixed( const Word32 azi, const Word32 ele, const EFAP_POLYSET_DATA *polyData, Word32 *bufferL ); -static void get_poly_gains_fixed( const Word32 azi, const Word32 ele, const Word32 aziPoly[EFAP_MAX_CHAN_NUM], const Word32 elePoly[EFAP_MAX_CHAN_NUM], const Word16 numChan, Word32 *buffer ); -static Word32 get_tri_gain_fixed( const Word32 A[2], const Word32 B[2], const Word32 C[2], const Word32 P_minus_A[2] ); +static void flip_plane_fx( const EFAP_VERTEX *vtxArray, Word16 *surface, const Word32 centroid[3] ); +static void remap_ghosts_fx( EFAP_VERTEX *vtxArray, EFAP_LS_TRIANGLE *triArray, Word16 numSpk, Word16 *numVertex, Word16 numTri, Word32 **downmixMatrix ); +static void vertex_init_fx( const Word32 *aziSpk, const Word32 *eleSpk, EFAP_VERTEX_DATA *efapVtxData ); +static void efap_panning_fx( const Word32 azi, const Word32 ele, const EFAP_POLYSET_DATA *polyData, Word32 *bufferL ); +static void get_poly_gains_fx( const Word32 azi, const Word32 ele, const Word32 aziPoly[EFAP_MAX_CHAN_NUM], const Word32 elePoly[EFAP_MAX_CHAN_NUM], const Word16 numChan, Word32 *buffer ); +static Word32 get_tri_gain_fx( const Word32 A[2], const Word32 B[2], const Word32 C[2], const Word32 P_minus_A[2] ); #endif /*-----------------------------------------------------------------------* @@ -108,37 +111,43 @@ static Word32 get_tri_gain_fixed( const Word32 A[2], const Word32 B[2], const Wo #ifndef IVAS_FLOAT_FIXED static void add_vertex( EFAP_VERTEX *vtxArray, const float azi, const float ele, const int16_t pos, const EFAP_VTX_DMX_TYPE ); +static void efap_sort_s(int16_t *x, int16_t *idx, const int16_t len); #else -static void add_vertex_fixed( EFAP_VERTEX *vtxArray, const Word32 azi, const Word32 ele, const Word16 pos, const EFAP_VTX_DMX_TYPE ); +static void add_vertex_fx( EFAP_VERTEX *vtxArray, const Word32 azi, const Word32 ele, const Word16 pos, const EFAP_VTX_DMX_TYPE ); +static void efap_sort_s_fx(Word16 *x, Word16 *idx, const Word16 len); #endif -static void efap_sort_s( int16_t *x, int16_t *idx, const int16_t len ); #ifndef IVAS_FLOAT_FIXED static float vertex_distance( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE tri, const int16_t vtxIdx ); static float point_plane_distance( const float P1[3], const float P2[3], const float P3[3], const float X[3] ); static float point_poly_distance( const EFAP_POLYSET poly, const float X[3] ); static void efap_crossp( const float *v1, const float *v2, float *v ); +static int16_t find_int_in_tri(const EFAP_LS_TRIANGLE *tri, const int16_t n, const int16_t r, int16_t *pos); +static void remove_vertex(EFAP_VERTEX *vtxArray, const int16_t idx, const int16_t L); +static int16_t get_neighbours(const EFAP_LS_TRIANGLE *triArray, const int16_t vtxIdx, const int16_t numTri, int16_t *neighbours); #else -static Word32 vertex_distance_fixed( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE tri, const Word16 vtxIdx ); -static Word32 point_plane_distance_fixed( const Word32 P1[3], const Word32 P2[3], const Word32 P3[3], const Word32 X[3] ); -static Word32 point_poly_distance_fixed( const EFAP_POLYSET poly, const Word32 X[3] ); -static void efap_crossp_fixed( const Word32 *v1, const Word32 *v2, Word32 *v ); +static Word32 vertex_distance_fx( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE tri, const Word16 vtxIdx ); +static Word32 point_plane_distance_fx( const Word32 P1[3], const Word32 P2[3], const Word32 P3[3], const Word32 X[3] ); +static Word32 point_poly_distance_fx( const EFAP_POLYSET poly, const Word32 X[3] ); +static void efap_crossp_fx( const Word32 *v1, const Word32 *v2, Word32 *v ); +static Word16 find_int_in_tri_fx(const EFAP_LS_TRIANGLE *tri, const Word16 n, const Word16 r, Word16 *pos); +static void remove_vertex_fx(EFAP_VERTEX *vtxArray, const Word16 idx, const Word16 L); +static Word16 get_neighbours_fx(const EFAP_LS_TRIANGLE *triArray, const Word16 vtxIdx, const Word16 numTri, Word16 *neighbours); #endif -static int16_t find_int_in_tri( const EFAP_LS_TRIANGLE *tri, const int16_t n, const int16_t r, int16_t *pos ); -static void remove_vertex( EFAP_VERTEX *vtxArray, const int16_t idx, const int16_t L ); -static int16_t get_neighbours( const EFAP_LS_TRIANGLE *triArray, const int16_t vtxIdx, const int16_t numTri, int16_t *neighbours ); #ifndef IVAS_FLOAT_FIXED static void matrix_times_row( float mat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF], const float *vec, const int16_t L, float *out ); +static void tri_to_poly(const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE *triArray, const int16_t numVtx, const int16_t numTri, int16_t sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM], int16_t *outLengthPS, int16_t outLengthSorted[EFAP_MAX_POLY_SET]); +static int16_t compare_poly(int16_t *old, int16_t lenOld, int16_t *new, int16_t lenNew); #else -static void matrix_times_row_fixed( Word32 mat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF], const Word32 *vec, const Word16 L, Word32 *out ); +static void matrix_times_row_fx( Word32 mat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF], const Word32 *vec, const Word16 L, Word32 *out ); +static void tri_to_poly_fx(const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE *triArray, const Word16 numVtx, const Word16 numTri, Word16 sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM], Word16 *outLengthPS, Word16 outLengthSorted[EFAP_MAX_POLY_SET]); +static Word16 compare_poly_fx(Word16 *old, Word16 lenOld, Word16 *new, Word16 lenNew); #endif -static void tri_to_poly( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE *triArray, const int16_t numVtx, const int16_t numTri, int16_t sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM], int16_t *outLengthPS, int16_t outLengthSorted[EFAP_MAX_POLY_SET] ); -static int16_t compare_poly( int16_t *old, int16_t lenOld, int16_t *new, int16_t lenNew ); #ifndef IVAS_FLOAT_FIXED static void sort_channels_vertex( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE *triArray, int16_t channels[EFAP_MAX_CHAN_NUM], const int16_t lengthChannels, int16_t idxTri ); @@ -148,34 +157,33 @@ static int16_t in_poly( const float P[2], const EFAP_POLYSET poly ); 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_fixed( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE *triArray, Word16 channels[EFAP_MAX_CHAN_NUM], const Word16 lengthChannels, Word16 idxTri ); +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 Word16 get_poly_num_fixed( const Word32 P[2], const EFAP_POLYSET_DATA *polyData ); -static Word16 in_poly_fixed( const Word32 P[2], const EFAP_POLYSET poly ); -static Word16 in_tri_fixed( Word32 A[2], Word32 B[2], Word32 C[2], Word32 P_minus_A[2] ); -static void sph2cart_fixed( const Word32 azi, const Word32 ele, Word32 *pos ); +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] ); +static void sph2cart_fx( const Word32 azi, const Word32 ele, Word32 *pos ); #endif /*-----------------------------------------------------------------------* * Global function definitions *-----------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* - * efap_init_data() + * efap_init_data_fx() * * Wrap the internal functions to initialize the EFAP data structure *-------------------------------------------------------------------------*/ -ivas_error efap_init_data( +ivas_error efap_init_data_fx( EFAP_HANDLE *hEFAPdata, /* i/o: handle for EFAP data structure that will be initialized */ - const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ - const float *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ - const int16_t num_speaker_nodes, /* i : number of speaker nodes in the set */ - const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ + 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 */ ) { -#ifndef IVAS_FLOAT_FIXED /* Handle instance declaration */ EFAP *efap; ivas_error error; @@ -183,7 +191,7 @@ ivas_error efap_init_data( error = IVAS_ERR_OK; /* Basic init checks */ - if ( !speaker_node_azi_deg || !speaker_node_ele_deg ) + IF( !speaker_node_azi_deg || !speaker_node_ele_deg ) { hEFAPdata = NULL; return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "EFAP requires arrays of speaker azimuths and elevations" ); @@ -194,29 +202,29 @@ ivas_error efap_init_data( *-----------------------------------------------------------------*/ /* Memory Allocations for efap */ - if ( ( efap = (EFAP *) malloc( sizeof( EFAP ) ) ) == NULL ) + IF( ( efap = (EFAP *) malloc( sizeof( EFAP ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP handle\n" ) ); } /* Memory Allocation and update for aziSpk & eleSpk arrays*/ - if ( ( efap->aziSpk = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + IF( ( efap->aziSpk = (Word32 *) malloc( num_speaker_nodes * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP speaker azimuths\n" ) ); } - if ( ( efap->eleSpk = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + IF( ( efap->eleSpk = (Word32 *) malloc( num_speaker_nodes * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP speaker elevations\n" ) ); } /* Memory Allocation for vertexArray */ - if ( ( efap->vtxData.vertexArray = (EFAP_VERTEX *) malloc( ( num_speaker_nodes + EFAP_MAX_GHOST_LS ) * sizeof( EFAP_VERTEX ) ) ) == NULL ) + IF( ( efap->vtxData.vertexArray = (EFAP_VERTEX *) malloc( ( num_speaker_nodes + EFAP_MAX_GHOST_LS ) * sizeof( EFAP_VERTEX ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP Vertex Array\n" ) ); } /* Memory allocation for the tmp buffer short */ - if ( ( efap->bufferShort = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) + IF( ( efap->bufferShort_fx = (Word32 *) malloc( num_speaker_nodes * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferS\n" ) ); } @@ -231,50 +239,39 @@ ivas_error efap_init_data( efap->vtxData.numVtx = num_speaker_nodes; /* Loudspeaker configuration */ - mvr2r( speaker_node_azi_deg, efap->aziSpk, num_speaker_nodes ); - mvr2r( speaker_node_ele_deg, efap->eleSpk, num_speaker_nodes ); + mvl2l( speaker_node_azi_deg, efap->aziSpk, num_speaker_nodes ); + mvl2l( speaker_node_ele_deg, efap->eleSpk, num_speaker_nodes ); /* Initialization of the vertex */ - vertex_init( efap->aziSpk, efap->eleSpk, &efap->vtxData ); + vertex_init_fx( efap->aziSpk, efap->eleSpk, &efap->vtxData ); /* Initialization of polygons and ghost LS */ - if ( ( error = poly_init( efap, efap_mode ) ) != IVAS_ERR_OK ) + IF( ( error = poly_init_fx( efap, efap_mode ) ) != IVAS_ERR_OK ) { return error; } /* Memory allocation for the tmp buffer long */ - if ( ( efap->bufferLong = (float *) malloc( efap->vtxData.numVtx * sizeof( float ) ) ) == NULL ) + IF( ( efap->bufferLong_fx = (Word32 *) malloc( efap->vtxData.numVtx * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferL\n" ) ); } *hEFAPdata = efap; return error; -#else - /* Following conversion should be removed once all inputs are converted to Word32 azi and ele angles */ - Word32 azi_inp[MAX_OUTPUT_CHANNELS], ele_inp[MAX_OUTPUT_CHANNELS]; - FOR( int spk_idx = 0; spk_idx < num_speaker_nodes; spk_idx++ ) - { - azi_inp[spk_idx] = (Word32) ( speaker_node_azi_deg[spk_idx] * Q22_1 ); - ele_inp[spk_idx] = (Word32) ( speaker_node_ele_deg[spk_idx] * Q22_1 ); - } - return efap_init_data_fixed( hEFAPdata, azi_inp, ele_inp, num_speaker_nodes, efap_mode ); -#endif } -#ifdef IVAS_FLOAT_FIXED -/*-------------------------------------------------------------------------* - * efap_init_data_fixed() - * - * Wrap the internal functions to initialize the EFAP data structure - *-------------------------------------------------------------------------*/ - -ivas_error efap_init_data_fixed( +#else + /*-------------------------------------------------------------------------* + * efap_init_data() + * + * Wrap the internal functions to initialize the EFAP data structure + *-------------------------------------------------------------------------*/ +ivas_error efap_init_data( 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 */ + const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ + const float *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes in the set */ + const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ ) { /* Handle instance declaration */ @@ -284,7 +281,7 @@ ivas_error efap_init_data_fixed( error = IVAS_ERR_OK; /* Basic init checks */ - IF( !speaker_node_azi_deg || !speaker_node_ele_deg ) + if ( !speaker_node_azi_deg || !speaker_node_ele_deg ) { hEFAPdata = NULL; return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "EFAP requires arrays of speaker azimuths and elevations" ); @@ -295,29 +292,29 @@ ivas_error efap_init_data_fixed( *-----------------------------------------------------------------*/ /* Memory Allocations for efap */ - IF( ( efap = (EFAP *) malloc( sizeof( EFAP ) ) ) == NULL ) + if ( ( efap = (EFAP *) malloc( sizeof( EFAP ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP handle\n" ) ); } /* Memory Allocation and update for aziSpk & eleSpk arrays*/ - IF( ( efap->aziSpk = (Word32 *) malloc( num_speaker_nodes * sizeof( Word32 ) ) ) == NULL ) + if ( ( efap->aziSpk = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP speaker azimuths\n" ) ); } - IF( ( efap->eleSpk = (Word32 *) malloc( num_speaker_nodes * sizeof( Word32 ) ) ) == NULL ) + if ( ( efap->eleSpk = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP speaker elevations\n" ) ); } /* Memory Allocation for vertexArray */ - IF( ( efap->vtxData.vertexArray = (EFAP_VERTEX *) malloc( ( num_speaker_nodes + EFAP_MAX_GHOST_LS ) * sizeof( EFAP_VERTEX ) ) ) == NULL ) + if ( ( efap->vtxData.vertexArray = (EFAP_VERTEX *) malloc( ( num_speaker_nodes + EFAP_MAX_GHOST_LS ) * sizeof( EFAP_VERTEX ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP Vertex Array\n" ) ); } /* Memory allocation for the tmp buffer short */ - IF( ( efap->bufferShort_fx = (Word32 *) malloc( num_speaker_nodes * sizeof( Word32 ) ) ) == NULL ) + if ( ( efap->bufferShort = (float *) malloc( num_speaker_nodes * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferS\n" ) ); } @@ -332,20 +329,20 @@ ivas_error efap_init_data_fixed( efap->vtxData.numVtx = num_speaker_nodes; /* Loudspeaker configuration */ - mvl2l( speaker_node_azi_deg, efap->aziSpk, num_speaker_nodes ); - mvl2l( speaker_node_ele_deg, efap->eleSpk, num_speaker_nodes ); + mvr2r( speaker_node_azi_deg, efap->aziSpk, num_speaker_nodes ); + mvr2r( speaker_node_ele_deg, efap->eleSpk, num_speaker_nodes ); /* Initialization of the vertex */ - vertex_init_fixed( efap->aziSpk, efap->eleSpk, &efap->vtxData ); + vertex_init( efap->aziSpk, efap->eleSpk, &efap->vtxData ); /* Initialization of polygons and ghost LS */ - IF( ( error = poly_init( efap, efap_mode ) ) != IVAS_ERR_OK ) + if ( ( error = poly_init( efap, efap_mode ) ) != IVAS_ERR_OK ) { return error; } /* Memory allocation for the tmp buffer long */ - IF( ( efap->bufferLong_fx = (Word32 *) malloc( efap->vtxData.numVtx * sizeof( Word32 ) ) ) == NULL ) + if ( ( efap->bufferLong = (float *) malloc( efap->vtxData.numVtx * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP bufferL\n" ) ); } @@ -355,102 +352,16 @@ ivas_error efap_init_data_fixed( } #endif -/*-------------------------------------------------------------------------* - * efap_determine_gains() - * - * Obtain amplitude panning gains for all speaker nodes based on the - * given direction - *-------------------------------------------------------------------------*/ - -void efap_determine_gains( - EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - float *gains, /* o : gain vector for speaker nodes for given direction */ - const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ - const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ - const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ -) -{ -#ifndef IVAS_FLOAT_FIXED - int16_t i, j; - float azi_wrap, ele_wrap; - float normBuffer; - - /* Resetting bufferShort and bufferLong */ - set_zero( hEFAPdata->bufferShort, hEFAPdata->numSpk ); - set_zero( hEFAPdata->bufferLong, hEFAPdata->vtxData.numVtx ); - - /* Wrap angles to correct range */ - panning_wrap_angles( azi_deg, ele_deg, &azi_wrap, &ele_wrap ); - - /* Panning */ - efap_panning( azi_wrap, ele_wrap, &hEFAPdata->polyData, hEFAPdata->bufferLong ); - - if ( efap_mode == EFAP_MODE_EFAP ) - { - normBuffer = 0.f; - for ( j = 0; j < hEFAPdata->numSpk; ++j ) - { - hEFAPdata->bufferShort[j] = 0.f; - /* Multiplying by the downmixMatrix */ - for ( i = 0; i < hEFAPdata->vtxData.numVtx; ++i ) - { - hEFAPdata->bufferShort[j] += hEFAPdata->bufferLong[i] * hEFAPdata->dmTranspose[i][j]; - } - normBuffer = normBuffer + hEFAPdata->bufferShort[j] * hEFAPdata->bufferShort[j]; - } - normBuffer = inv_sqrt( normBuffer ); - - for ( j = 0; j < hEFAPdata->numSpk; ++j ) - { - hEFAPdata->bufferShort[j] *= normBuffer; - } - } - else - { - normBuffer = 0.f; - for ( j = 0; j < hEFAPdata->numSpk; ++j ) - { - hEFAPdata->bufferShort[j] = 0.f; - /* Multiplying by the downmixMatrix */ - for ( i = 0; i < hEFAPdata->vtxData.numVtx; ++i ) - { - hEFAPdata->bufferShort[j] += hEFAPdata->bufferLong[i] * hEFAPdata->dmTranspose[i][j]; - } - normBuffer = normBuffer + hEFAPdata->bufferShort[j]; - } - normBuffer = 1.f / normBuffer; - - for ( j = 0; j < hEFAPdata->numSpk; ++j ) - { - hEFAPdata->bufferShort[j] = sqrtf( hEFAPdata->bufferShort[j] * normBuffer ); - } - } - - /* Copy gains to output */ - mvr2r( hEFAPdata->bufferShort, gains, hEFAPdata->numSpk ); - - return; -#else - /* block to be removed once efap_determine_gains_fixed() is integrated into all calling places */ - const Word32 azi_fx = (Word32) ( azi_deg * Q22_1 ); - const Word32 ele_fx = (Word32) ( ele_deg * Q22_1 ); - Word32 gains_fx[MAX_OUTPUT_CHANNELS]; - efap_determine_gains_fixed( hEFAPdata, gains_fx, azi_fx, ele_fx, efap_mode ); - FOR( Word32 i = 0; i < hEFAPdata->numSpk; i++ ) - { - gains[i] = ( (float) gains_fx[i] ) / L_shl( 1, Q30 ); - } -#endif -} #ifdef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------------* - * efap_determine_gains_fixed() + * efap_determine_gains_fx() * * Obtain amplitude panning gains for all speaker nodes based on the * given direction *-------------------------------------------------------------------------*/ -void efap_determine_gains_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, @@ -473,9 +384,9 @@ void efap_determine_gains_fixed( panning_wrap_angles_fixed( azi_deg, ele_deg, &azi_wrap_int, &ele_wrap_int ); /* Panning */ - efap_panning_fixed( azi_wrap_int, ele_wrap_int, &hEFAPdata->polyData, hEFAPdata->bufferLong_fx ); + efap_panning_fx( azi_wrap_int, ele_wrap_int, &hEFAPdata->polyData, hEFAPdata->bufferLong_fx ); - IF( efap_mode == EFAP_MODE_EFAP ) + IF( EQ_16( efap_mode, EFAP_MODE_EFAP ) ) { normBuffer = 0; FOR( j = 0; j < hEFAPdata->numSpk; ++j ) @@ -517,7 +428,7 @@ void efap_determine_gains_fixed( { Word16 exp_temp = 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], exp_temp - 1 ); // Q30 + hEFAPdata->bufferShort_fx[j] = L_shl( hEFAPdata->bufferShort_fx[j], sub( exp_temp, 1 ) ); // Q30 } } @@ -526,6 +437,82 @@ void efap_determine_gains_fixed( return; } +#else + +/*-------------------------------------------------------------------------* + * efap_determine_gains() + * + * Obtain amplitude panning gains for all speaker nodes based on the + * given direction + *-------------------------------------------------------------------------*/ +void efap_determine_gains( + EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + float *gains, /* o : gain vector for speaker nodes for given direction */ + const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ +) +{ + int16_t i, j; + float azi_wrap, ele_wrap; + float normBuffer; + + /* Resetting bufferShort and bufferLong */ + set_zero( hEFAPdata->bufferShort, hEFAPdata->numSpk ); + set_zero( hEFAPdata->bufferLong, hEFAPdata->vtxData.numVtx ); + + /* Wrap angles to correct range */ + panning_wrap_angles( azi_deg, ele_deg, &azi_wrap, &ele_wrap ); + + /* Panning */ + efap_panning( azi_wrap, ele_wrap, &hEFAPdata->polyData, hEFAPdata->bufferLong ); + + if ( efap_mode == EFAP_MODE_EFAP ) + { + normBuffer = 0.f; + for ( j = 0; j < hEFAPdata->numSpk; ++j ) + { + hEFAPdata->bufferShort[j] = 0.f; + /* Multiplying by the downmixMatrix */ + for ( i = 0; i < hEFAPdata->vtxData.numVtx; ++i ) + { + hEFAPdata->bufferShort[j] += hEFAPdata->bufferLong[i] * hEFAPdata->dmTranspose[i][j]; + } + normBuffer = normBuffer + hEFAPdata->bufferShort[j] * hEFAPdata->bufferShort[j]; + } + normBuffer = inv_sqrt( normBuffer ); + + for ( j = 0; j < hEFAPdata->numSpk; ++j ) + { + hEFAPdata->bufferShort[j] *= normBuffer; + } + } + else + { + normBuffer = 0.f; + for ( j = 0; j < hEFAPdata->numSpk; ++j ) + { + hEFAPdata->bufferShort[j] = 0.f; + /* Multiplying by the downmixMatrix */ + for ( i = 0; i < hEFAPdata->vtxData.numVtx; ++i ) + { + hEFAPdata->bufferShort[j] += hEFAPdata->bufferLong[i] * hEFAPdata->dmTranspose[i][j]; + } + normBuffer = normBuffer + hEFAPdata->bufferShort[j]; + } + normBuffer = 1.f / normBuffer; + + for ( j = 0; j < hEFAPdata->numSpk; ++j ) + { + hEFAPdata->bufferShort[j] = sqrtf( hEFAPdata->bufferShort[j] * normBuffer ); + } + } + + /* Copy gains to output */ + mvr2r( hEFAPdata->bufferShort, gains, hEFAPdata->numSpk ); + + return; +} #endif /*-------------------------------------------------------------------------* * efap_free_data() @@ -643,21 +630,17 @@ void efap_free_data( * Main function for the Efap initialization whose purpose is to initialize * the different polygons and to add the ghost speakers *-------------------------------------------------------------------------*/ - -static ivas_error poly_init( +#ifdef IVAS_FLOAT_FIXED +static ivas_error poly_init_fx( EFAP *efap, /* i/o: A pointer to a handle to efap instance */ - const int16_t efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ + const Word16 efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ ) { int16_t n, m, j; int16_t finalLength, lengthTri2PolyPS; int16_t lengthTri2PolySorted[EFAP_MAX_POLY_SET]; int16_t sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM]; -#ifndef IVAS_FLOAT_FIXED - float tmpMax, tmpMin; -#else Word32 tmpMax, tmpMin; -#endif ivas_error error; error = IVAS_ERR_OK; @@ -671,11 +654,7 @@ static ivas_error poly_init( } /* Computing the different ghost vertex, the downmix matrix and the triangle array */ -#ifndef IVAS_FLOAT_FIXED - IF( ( error = sphere_triangulation( efap->numSpk, &efap->vtxData, &efap->polyData, &efap->dmTranspose, &efap->numTot, efip_flag ) ) != IVAS_ERR_OK ) -#else - IF( ( error = sphere_triangulation( efap->numSpk, &efap->vtxData, &efap->polyData, &efap->dmTranspose_fx, &efap->numTot, efip_flag ) ) != IVAS_ERR_OK ) -#endif + IF( ( error = sphere_triangulation_fx( efap->numSpk, &efap->vtxData, &efap->polyData, &efap->dmTranspose_fx, &efap->numTot, efip_flag ) ) != IVAS_ERR_OK ) { return error; } @@ -683,20 +662,15 @@ static ivas_error poly_init( /* set isNaN for ghost loudspeakers */ FOR( n = 0; n < efap->vtxData.numVtx; ++n ) { -#ifndef IVAS_FLOAT_FIXED - IF( efap->vtxData.vertexArray[n].ele > 90.0 - 1e-6 || - efap->vtxData.vertexArray[n].ele < 1e-6 - 90.0 ) -#else 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 ) ) ) -#endif { efap->vtxData.vertexArray[n].isNaN = 1; } } /* Converting the triangle to polygon structure */ - tri_to_poly( efap->vtxData.vertexArray, efap->polyData.triArray, efap->vtxData.numVtx, efap->polyData.numTri, sortedChan, &lengthTri2PolyPS, lengthTri2PolySorted ); + tri_to_poly_fx( efap->vtxData.vertexArray, efap->polyData.triArray, efap->vtxData.numVtx, efap->polyData.numTri, sortedChan, &lengthTri2PolyPS, lengthTri2PolySorted ); /* Completing the polyData Structure */ finalLength = -1; @@ -717,32 +691,115 @@ static ivas_error poly_init( efap->polyData.polysetArray[m].numChan = lengthTri2PolySorted[n]; /* In case tmpMax - tmpMin > 180, wrap polygon azimuth */ -#ifndef IVAS_FLOAT_FIXED + maximum_l( efap->polyData.polysetArray[m].polyAzi, lengthTri2PolySorted[n], &tmpMax ); + minimum_l( efap->polyData.polysetArray[m].polyAzi, lengthTri2PolySorted[n], &tmpMin ); + + IF( GT_32( L_sub( tmpMax, tmpMin ), Q22_180_DEG ) /*180 in Q22*/ ) + { + FOR( j = 0; j < lengthTri2PolySorted[n]; ++j ) + { + 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 ); + + /* 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[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]; + } + finalLength = add( finalLength, 2 ); + } + finalLength = add( finalLength, 1 ); + } + finalLength = add( finalLength, 1 ); + + /* Updating the number of polygons */ + efap->polyData.numPoly = finalLength; + + + return error; +} +#else +static ivas_error poly_init( + EFAP *efap, /* i/o: A pointer to a handle to efap instance */ + const int16_t efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ +) +{ + int16_t n, m, j; + int16_t finalLength, lengthTri2PolyPS; + int16_t lengthTri2PolySorted[EFAP_MAX_POLY_SET]; + int16_t sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM]; + float tmpMax, tmpMin; + ivas_error error; + + error = IVAS_ERR_OK; + + /* Safety Check */ + assert( efap != NULL && "EFAP: efap == NULL" ); + + for ( n = 0; n < EFAP_MAX_POLY_SET; n++ ) + { + set_s( sortedChan[n], 0, EFAP_MAX_CHAN_NUM ); + } + + /* Computing the different ghost vertex, the downmix matrix and the triangle array */ + if ( ( error = sphere_triangulation( efap->numSpk, &efap->vtxData, &efap->polyData, &efap->dmTranspose, &efap->numTot, efip_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* set isNaN for ghost loudspeakers */ + for ( n = 0; n < efap->vtxData.numVtx; ++n ) + { + if ( efap->vtxData.vertexArray[n].ele > 90.0 - 1e-6 || + efap->vtxData.vertexArray[n].ele < 1e-6 - 90.0 ) + { + efap->vtxData.vertexArray[n].isNaN = 1; + } + } + + /* Converting the triangle to polygon structure */ + tri_to_poly( efap->vtxData.vertexArray, efap->polyData.triArray, efap->vtxData.numVtx, efap->polyData.numTri, sortedChan, &lengthTri2PolyPS, lengthTri2PolySorted ); + + /* Completing the polyData Structure */ + finalLength = -1; + + for ( n = 0; n < lengthTri2PolyPS; ++n ) + { + m = finalLength + 1; + + /* Complete the fields of the polygon */ + for ( j = 0; j < lengthTri2PolySorted[n]; ++j ) + { + efap->polyData.polysetArray[m].chan[j] = sortedChan[n][j]; + efap->polyData.polysetArray[m].polyAzi[j] = efap->vtxData.vertexArray[sortedChan[n][j]].azi; + efap->polyData.polysetArray[m].polyEle[j] = efap->vtxData.vertexArray[sortedChan[n][j]].ele; + efap->polyData.polysetArray[m].isNaN[j] = efap->vtxData.vertexArray[sortedChan[n][j]].isNaN; + } + + efap->polyData.polysetArray[m].numChan = lengthTri2PolySorted[n]; + + /* In case tmpMax - tmpMin > 180, wrap polygon azimuth */ maximum( efap->polyData.polysetArray[m].polyAzi, lengthTri2PolySorted[n], &tmpMax ); minimum( efap->polyData.polysetArray[m].polyAzi, lengthTri2PolySorted[n], &tmpMin ); -#else - maximum_l( efap->polyData.polysetArray[m].polyAzi, lengthTri2PolySorted[n], &tmpMax ); - minimum_l( efap->polyData.polysetArray[m].polyAzi, lengthTri2PolySorted[n], &tmpMin ); -#endif -#ifndef IVAS_FLOAT_FIXED if ( ( tmpMax - tmpMin ) > 180 ) -#else - IF( GT_32( L_sub( tmpMax, tmpMin ), Q22_180_DEG ) /*180 in Q22*/ ) -#endif { - FOR( j = 0; j < lengthTri2PolySorted[n]; ++j ) + for ( j = 0; j < lengthTri2PolySorted[n]; ++j ) { assert( ( m + 2 < EFAP_MAX_POLY_SET ) && "EFAP: maximum polygons exceeded!" ); /* add two new polygons with azimuths wrapped to differing bounds */ -#ifndef IVAS_FLOAT_FIXED efap->polyData.polysetArray[m + 1].polyAzi[j] = efap_fmodf( efap->polyData.polysetArray[m].polyAzi[j], 360 ); efap->polyData.polysetArray[m + 2].polyAzi[j] = efap->polyData.polysetArray[m + 1].polyAzi[j] - 360; -#else - 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 ); -#endif /* Copy the rest of the fields */ efap->polyData.polysetArray[m + 1].chan[j] = efap->polyData.polysetArray[m].chan[j]; @@ -767,24 +824,20 @@ static ivas_error poly_init( return error; } - +#endif /*-------------------------------------------------------------------------* * sphere_triangulation() * * *-------------------------------------------------------------------------*/ - -static ivas_error sphere_triangulation( - const int16_t numSpk, /* i : Number of speakers */ +#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 */ -#ifndef IVAS_FLOAT_FIXED - float ***dmTranspose, /* o : Transpose of the downmix matrix */ -#else Word32 ***dmTranspose_fx, /* o : Transpose of the downmix matrix */ -#endif - int16_t *numTot, /* o : Number of speakers (real + ghost) */ + 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) */ ) { @@ -795,11 +848,7 @@ static ivas_error sphere_triangulation( set_s( vtxInHull, 0, EFAP_MAX_SIZE_TMP_BUFF ); /* Add Imaginary Speakers */ -#ifndef IVAS_FLOAT_FIXED - add_ghost_speakers( vtxData->vertexArray, &vtxData->numVtx, efip_flag ); -#else - add_ghost_speakers_fixed( vtxData->vertexArray, &vtxData->numVtx, efip_flag ); -#endif + 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 ) @@ -807,33 +856,21 @@ static ivas_error sphere_triangulation( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP Vertex Order\n" ) ); } - sort_vertices( vtxData->vertexArray, &vtxData->numVtx, vtxData->vtxOrder ); + sort_vertices_fx( vtxData->vertexArray, &vtxData->numVtx, vtxData->vtxOrder ); /* Computing the initial Polyeder */ -#ifndef IVAS_FLOAT_FIXED - initial_polyeder( vtxData, polyData->triArray, &polyData->numTri, &vtxInHull[0] ); -#else - initial_polyeder_fixed( vtxData, polyData->triArray, &polyData->numTri, &vtxInHull[0] ); -#endif + initial_polyeder_fx( vtxData, polyData->triArray, &polyData->numTri, &vtxInHull[0] ); /* Add the vertex to the convex hull */ FOR( i = 0; i < vtxData->numVtx; ++i ) { -#ifndef IVAS_FLOAT_FIXED - add_vertex_to_convex_hull( vtxData, vtxData->vtxOrder[i], &vtxInHull[0], polyData->triArray, &polyData->numTri ); -#else - add_vertex_to_convex_hull_fixed( vtxData, vtxData->vtxOrder[i], &vtxInHull[0], polyData->triArray, &polyData->numTri ); -#endif + add_vertex_to_convex_hull_fx( vtxData, vtxData->vtxOrder[i], &vtxInHull[0], polyData->triArray, &polyData->numTri ); } assert( polyData->numTri != 0 && "EFAP: failed to construct convex hull!" ); /* Allocate the DM matrix transpose */ -#ifndef IVAS_FLOAT_FIXED - IF( ( p_dmTranspose = malloc( vtxData->numVtx * sizeof( float * ) ) ) == NULL ) -#else IF( ( p_dmTranspose = malloc( vtxData->numVtx * sizeof( Word32 * ) ) ) == NULL ) -#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "EFAP: can not allocate memory for dmTranspose\n" ) ); } @@ -843,30 +880,80 @@ static ivas_error sphere_triangulation( FOR( i = 0; i < vtxData->numVtx; i++ ) { -#ifndef IVAS_FLOAT_FIXED - IF( ( p_dmTranspose[i] = malloc( numSpk * sizeof( float ) ) ) == NULL ) -#else IF( ( p_dmTranspose[i] = malloc( numSpk * sizeof( Word32 ) ) ) == NULL ) -#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "EFAP: can not allocate memory for dmTranspose\n" ) ); } } -#ifndef IVAS_FLOAT_FIXED - *dmTranspose = (float **) p_dmTranspose; -#else *dmTranspose_fx = (Word32 **) p_dmTranspose; -#endif /* Remap Ghosts */ -#ifndef IVAS_FLOAT_FIXED - remap_ghosts( vtxData->vertexArray, polyData->triArray, numSpk, &vtxData->numVtx, polyData->numTri, *dmTranspose ); + remap_ghosts_fx( vtxData->vertexArray, polyData->triArray, numSpk, &vtxData->numVtx, polyData->numTri, *dmTranspose_fx ); + + return IVAS_ERR_OK; +} #else - remap_ghosts_fixed( vtxData->vertexArray, polyData->triArray, numSpk, &vtxData->numVtx, polyData->numTri, *dmTranspose_fx ); -#endif +static ivas_error sphere_triangulation( + const int16_t numSpk, /* i : Number of speakers */ + EFAP_VERTEX_DATA *vtxData, /* i/o: Vertex data structure */ + EFAP_POLYSET_DATA *polyData, /* o : Polygon data structure */ + float ***dmTranspose, /* o : Transpose of the downmix matrix */ + int16_t *numTot, /* o : Number of speakers (real + ghost) */ + const int16_t efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ +) +{ + int16_t i; + void **p_dmTranspose; + int16_t vtxInHull[EFAP_MAX_SIZE_TMP_BUFF]; + + set_s( vtxInHull, 0, EFAP_MAX_SIZE_TMP_BUFF ); + + /* Add Imaginary Speakers */ + add_ghost_speakers( 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 ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP Vertex Order\n" ) ); + } + + sort_vertices( vtxData->vertexArray, &vtxData->numVtx, vtxData->vtxOrder ); + + /* Computing the initial Polyeder */ + initial_polyeder( vtxData, polyData->triArray, &polyData->numTri, &vtxInHull[0] ); + + /* Add the vertex to the convex hull */ + for ( i = 0; i < vtxData->numVtx; ++i ) + { + add_vertex_to_convex_hull( vtxData, vtxData->vtxOrder[i], &vtxInHull[0], polyData->triArray, &polyData->numTri ); + } + + assert( polyData->numTri != 0 && "EFAP: failed to construct convex hull!" ); + + /* Allocate the DM matrix transpose */ + if ( ( p_dmTranspose = malloc( vtxData->numVtx * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "EFAP: can not allocate memory for dmTranspose\n" ) ); + } + + /* Store the value of numVtx to be used for freeing later (numVtx will change after remap_ghosts() ) */ + *numTot = vtxData->numVtx; + + for ( i = 0; i < vtxData->numVtx; i++ ) + { + if ( ( p_dmTranspose[i] = malloc( numSpk * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "EFAP: can not allocate memory for dmTranspose\n" ) ); + } + } + *dmTranspose = (float **) p_dmTranspose; + + /* Remap Ghosts */ + remap_ghosts( vtxData->vertexArray, polyData->triArray, numSpk, &vtxData->numVtx, polyData->numTri, *dmTranspose ); return IVAS_ERR_OK; } +#endif #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* @@ -1001,7 +1088,7 @@ static void initial_polyeder( * *-------------------------------------------------------------------------*/ -static void initial_polyeder_fixed( +static void initial_polyeder_fx( EFAP_VERTEX_DATA *vtxData, /* i : Vertex data structure */ EFAP_LS_TRIANGLE *triArray, /* o : Triangle array structure */ Word16 *numTri, /* o : Size of triangle array */ @@ -1050,7 +1137,7 @@ static void initial_polyeder_fixed( WHILE( LT_16( tetrahedron[2], numVtx ) ) { v_sub_fixed( vtxData->vertexArray[tetrahedron[2]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp2, 3, 1 ); - efap_crossp_fixed( tmp1, tmp2, tmpCross ); // tmpCross Q29 + efap_crossp_fx( tmp1, tmp2, tmpCross ); // tmpCross Q29 FOR( i = 0; i < 3; i++ ) { tmp = L_add( tmp, Mpy_32_32( tmpCross[i], tmpCross[i] ) ); // tmp Q27 @@ -1059,7 +1146,7 @@ static void initial_polyeder_fixed( { break; } - tetrahedron[2]++; + tetrahedron[2] = add( tetrahedron[2], 1 ); } assert( tetrahedron[2] < numVtx && "EFAP: convex hull construction failed, vertices are colinear!" ); @@ -1073,7 +1160,7 @@ static void initial_polyeder_fixed( { break; } - tetrahedron[3]++; + tetrahedron[3] = add( tetrahedron[3], 1 ); } assert( tetrahedron[3] < numVtx && "EFAP: convex hull construction failed, vertices are coplanar!" ); @@ -1095,25 +1182,25 @@ static void initial_polyeder_fixed( tmpSurface[0] = tetrahedron[0]; tmpSurface[1] = tetrahedron[1]; tmpSurface[2] = tetrahedron[2]; - flip_plane_fixed( vtxData->vertexArray, tmpSurface, centroid ); + flip_plane_fx( vtxData->vertexArray, tmpSurface, centroid ); mvs2s( tmpSurface, triArray[0].LS, 3 ); tmpSurface[0] = tetrahedron[0]; tmpSurface[1] = tetrahedron[1]; tmpSurface[2] = tetrahedron[3]; - flip_plane_fixed( vtxData->vertexArray, tmpSurface, centroid ); + flip_plane_fx( vtxData->vertexArray, tmpSurface, centroid ); mvs2s( tmpSurface, triArray[1].LS, 3 ); tmpSurface[0] = tetrahedron[0]; tmpSurface[1] = tetrahedron[2]; tmpSurface[2] = tetrahedron[3]; - flip_plane_fixed( vtxData->vertexArray, tmpSurface, centroid ); + flip_plane_fx( vtxData->vertexArray, tmpSurface, centroid ); mvs2s( tmpSurface, triArray[2].LS, 3 ); tmpSurface[0] = tetrahedron[1]; tmpSurface[1] = tetrahedron[2]; tmpSurface[2] = tetrahedron[3]; - flip_plane_fixed( vtxData->vertexArray, tmpSurface, centroid ); + flip_plane_fx( vtxData->vertexArray, tmpSurface, centroid ); mvs2s( tmpSurface, triArray[3].LS, 3 ); /* set numTri */ @@ -1288,12 +1375,12 @@ static void add_ghost_speakers( } #else /*-------------------------------------------------------------------------* - * add_ghost_speakers_fixed() + * add_ghost_speakers_fx() * * *-------------------------------------------------------------------------*/ -static void add_ghost_speakers_fixed( +static void add_ghost_speakers_fx( EFAP_VERTEX *vertexArray, /* i/o: Vertex array */ Word16 *numVtx, /* i/o: Size of vertex array */ const Word16 efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ @@ -1342,7 +1429,7 @@ static void add_ghost_speakers_fixed( vtxDmxType = EFAP_DMX_AMPLITUDE; } } - add_vertex_fixed( vertexArray, 0, Q22_90_DEG, numVertex + a, vtxDmxType ); + add_vertex_fx( vertexArray, 0, Q22_90_DEG, numVertex + a, vtxDmxType ); ++lengthVertGhst; ++a; } @@ -1363,7 +1450,7 @@ static void add_ghost_speakers_fixed( } } - add_vertex_fixed( vertexArray, 0, -Q22_90_DEG, numVertex + a, vtxDmxType ); + add_vertex_fx( vertexArray, 0, -Q22_90_DEG, numVertex + a, vtxDmxType ); ++lengthVertGhst; ++a; @@ -1384,16 +1471,16 @@ static void add_ghost_speakers_fixed( lengthHorGhst = 0; IF( EQ_16( k, 0 ) ) /* no speakers found: add a triangle of ghost speakers */ { - add_vertex_fixed( vertexArray, 0, 0, numVertex + a, EFAP_DMX_INTENSITY ); - add_vertex_fixed( vertexArray, Q22_120_DEG, 0, numVertex + a + 1, EFAP_DMX_INTENSITY ); - add_vertex_fixed( vertexArray, Q22_240_DEG, 0, numVertex + a + 2, EFAP_DMX_INTENSITY ); + add_vertex_fx( vertexArray, 0, 0, numVertex + a, EFAP_DMX_INTENSITY ); + add_vertex_fx( vertexArray, Q22_120_DEG, 0, numVertex + a + 1, EFAP_DMX_INTENSITY ); + add_vertex_fx( vertexArray, Q22_240_DEG, 0, numVertex + a + 2, EFAP_DMX_INTENSITY ); a += 3; lengthHorGhst += 3; } ELSE IF( EQ_16( k, 1 ) ) /* only one speaker found: add two ghost speakers to complete a triangle */ { - add_vertex_fixed( vertexArray, L_add( tmpAzi[0], Q22_120_DEG ), 0, numVertex + a, EFAP_DMX_INTENSITY ); - add_vertex_fixed( vertexArray, L_add( tmpAzi[0], Q22_240_DEG ), 0, numVertex + a + 1, EFAP_DMX_INTENSITY ); + add_vertex_fx( vertexArray, L_add( tmpAzi[0], Q22_120_DEG ), 0, numVertex + a, EFAP_DMX_INTENSITY ); + add_vertex_fx( vertexArray, L_add( tmpAzi[0], Q22_240_DEG ), 0, numVertex + a + 1, EFAP_DMX_INTENSITY ); a += 2; lengthHorGhst += 2; } @@ -1434,7 +1521,7 @@ static void add_ghost_speakers_fixed( { newAzi = L_add( tmpAzi[i], L_shl( ( j + 1 ) * newDiff, Q22 ) ); - add_vertex_fixed( vertexArray, newAzi, 0, numVertex + a, EFAP_DMX_INTENSITY ); + add_vertex_fx( vertexArray, newAzi, 0, numVertex + a, EFAP_DMX_INTENSITY ); ++a; IF( GT_16( j, 0 ) ) @@ -1445,7 +1532,7 @@ static void add_ghost_speakers_fixed( } } } - *numVtx = numVertex + lengthHorGhst + lengthVertGhst; + *numVtx = add( add( numVertex, lengthHorGhst ), lengthVertGhst ); return; } @@ -1457,6 +1544,28 @@ static void add_ghost_speakers_fixed( * *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void sort_vertices_fx( + const EFAP_VERTEX *vertexArray, /* i : Vertex array */ + const Word16 *numVtx, /* i : Size of vertex array */ + Word16 *order /* o : Original index positions */ +) +{ + Word16 tmpIdx[EFAP_MAX_SIZE_TMP_BUFF]; + Word16 i; + + /* Initializing tmpIdx */ + FOR( i = 0; i < *numVtx; ++i ) + { + tmpIdx[i] = vertexArray[i].idx; + } + + /* Sorting indexes */ + efap_sort_s_fx( tmpIdx, order, *numVtx ); + + return; +} +#else static void sort_vertices( const EFAP_VERTEX *vertexArray, /* i : Vertex array */ const int16_t *numVtx, /* i : Size of vertex array */ @@ -1467,7 +1576,7 @@ static void sort_vertices( int16_t i; /* Initializing tmpIdx */ - FOR( i = 0; i < *numVtx; ++i ) + for ( i = 0; i < *numVtx; ++i ) { tmpIdx[i] = vertexArray[i].idx; } @@ -1477,7 +1586,7 @@ static void sort_vertices( return; } - +#endif #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * add_vertex_to_convex_hull() @@ -1575,12 +1684,12 @@ static void add_vertex_to_convex_hull( } #else /*-------------------------------------------------------------------------* - * add_vertex_to_convex_hull_fixed() + * add_vertex_to_convex_hull_fx() * * *-------------------------------------------------------------------------*/ -static void add_vertex_to_convex_hull_fixed( +static void add_vertex_to_convex_hull_fx( const EFAP_VERTEX_DATA *vtxData, /* i : Vertex data structure */ const Word16 vtxIdx, /* i : Vertex to be added to the hull */ Word16 *vtxInHull, /* i/o: Array indicating whether the vertex is part of the hull */ @@ -1612,7 +1721,7 @@ static void add_vertex_to_convex_hull_fixed( { IF( vtxInHull[i] ) { - numHullVtx++; + numHullVtx = L_add( numHullVtx, 1 ); centroid[0] = L_add( centroid[0], L_shr( vtxData->vertexArray[i].pos[0], Q4 ) ); centroid[1] = L_add( centroid[1], L_shr( vtxData->vertexArray[i].pos[1], Q4 ) ); centroid[2] = L_add( centroid[2], L_shr( vtxData->vertexArray[i].pos[2], Q4 ) ); @@ -1634,7 +1743,7 @@ static void add_vertex_to_convex_hull_fixed( FOR( i = 0; i < *szTri; ++i ) { - tmpDist = vertex_distance_fixed( vtxData->vertexArray, triArray[i], vtxIdx ); // Q28 + tmpDist = vertex_distance_fx( vtxData->vertexArray, triArray[i], vtxIdx ); // Q28 IF( GT_32( tmpDist, threshold ) ) { visible[k] = i; @@ -1647,7 +1756,7 @@ static void add_vertex_to_convex_hull_fixed( } } - visible_edges( triArray, visible, k, numEdges, edges ); + visible_edges_fx( triArray, visible, k, numEdges, edges ); FOR( i = 0; i < numEdges[0]; i += 2 ) { @@ -1655,7 +1764,7 @@ static void add_vertex_to_convex_hull_fixed( surface[1] = edges[i + 1]; surface[2] = vtxIdx; - flip_plane_fixed( vtxData->vertexArray, surface, centroid ); + flip_plane_fx( vtxData->vertexArray, surface, centroid ); mvs2s( surface, triArrayNew[l].LS, 3 ); ++l; @@ -1679,8 +1788,8 @@ static void add_vertex_to_convex_hull_fixed( * * *-------------------------------------------------------------------------*/ - -static void visible_edges( +#ifdef IVAS_FLOAT_FIXED +static void visible_edges_fx( const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ const Word16 *visible, /* i : Visible surface flag */ const Word16 numSurface, /* i : Number of surfaces */ @@ -1688,17 +1797,13 @@ static void visible_edges( Word16 *edges /* i/o: Array of edges */ ) { - int16_t maxVertex; - int16_t i, j, k; - int16_t a, b; - int16_t tmpSurface[4]; - int16_t counter[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; - int16_t counterTranspose[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; -#ifndef IVAS_FLOAT_FIXED - float tmpMax[EFAP_MAX_SIZE_TMP_BUFF]; -#else + Word16 maxVertex; + Word16 i, j, k; + Word16 a, b; + Word16 tmpSurface[4]; + Word16 counter[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; + Word16 counterTranspose[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; Word16 tmpMax[EFAP_MAX_SIZE_TMP_BUFF]; -#endif /* Set counter and counterTranspose to 0 */ FOR( i = 0; i < EFAP_MAX_SIZE_TMP_BUFF; i++ ) @@ -1710,28 +1815,16 @@ static void visible_edges( /* Finding the max vertex */ FOR( i = 0; i < numSurface; ++i ) { -#ifndef IVAS_FLOAT_FIXED - tmpMax[i] = (float) triArray[visible[i]].LS[0]; -#else tmpMax[i] = triArray[visible[i]].LS[0]; -#endif FOR( j = 1; j < 3; ++j ) { IF( tmpMax[i] < triArray[visible[i]].LS[j] ) { -#ifndef IVAS_FLOAT_FIXED - tmpMax[i] = (float) triArray[visible[i]].LS[j]; -#else tmpMax[i] = triArray[visible[i]].LS[j]; -#endif } } } -#ifndef IVAS_FLOAT_FIXED - maxVertex = (int16_t) tmpMax[maximum( tmpMax, numSurface, NULL )]; -#else maxVertex = tmpMax[maximum_s( tmpMax, numSurface, NULL )]; -#endif FOR( i = 0; i < numSurface; ++i ) { tmpSurface[0] = triArray[visible[i]].LS[0]; @@ -1743,7 +1836,7 @@ static void visible_edges( { a = tmpSurface[j]; b = tmpSurface[j + 1]; - counter[a][b] = counter[a][b] + 1; + counter[a][b] = add(counter[a][b], 1); counterTranspose[b][a] = counter[a][b]; } } @@ -1752,7 +1845,7 @@ static void visible_edges( { FOR( j = 0; j < maxVertex + 1; ++j ) { - counter[i][j] = counterTranspose[i][j] + counterTranspose[j][i]; + counter[i][j] = add(counterTranspose[i][j], counterTranspose[j][i]); } } @@ -1777,7 +1870,90 @@ static void visible_edges( return; } +#else +static void visible_edges( + const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ + const int16_t *visible, /* i : Visible surface flag */ + const int16_t numSurface, /* i : Number of surfaces */ + int16_t *numEdges, /* i/o: Number of edges */ + int16_t *edges /* i/o: Array of edges */ +) +{ + int16_t maxVertex; + int16_t i, j, k; + int16_t a, b; + int16_t tmpSurface[4]; + int16_t counter[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; + int16_t counterTranspose[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; + float tmpMax[EFAP_MAX_SIZE_TMP_BUFF]; + + /* Set counter and counterTranspose to 0 */ + for ( i = 0; i < EFAP_MAX_SIZE_TMP_BUFF; i++ ) + { + set_s( counter[i], 0, EFAP_MAX_SIZE_TMP_BUFF ); + set_s( counterTranspose[i], 0, EFAP_MAX_SIZE_TMP_BUFF ); + } + + /* Finding the max vertex */ + for ( i = 0; i < numSurface; ++i ) + { + tmpMax[i] = (float) triArray[visible[i]].LS[0]; + for ( j = 1; j < 3; ++j ) + { + if ( tmpMax[i] < triArray[visible[i]].LS[j] ) + { + tmpMax[i] = (float) triArray[visible[i]].LS[j]; + } + } + } + maxVertex = (int16_t) tmpMax[maximum( tmpMax, numSurface, NULL )]; + + for ( i = 0; i < numSurface; ++i ) + { + tmpSurface[0] = triArray[visible[i]].LS[0]; + tmpSurface[1] = triArray[visible[i]].LS[1]; + tmpSurface[2] = triArray[visible[i]].LS[2]; + tmpSurface[3] = triArray[visible[i]].LS[0]; + + for ( j = 0; j < 3; ++j ) + { + a = tmpSurface[j]; + b = tmpSurface[j + 1]; + counter[a][b] = counter[a][b] + 1; + counterTranspose[b][a] = counter[a][b]; + } + } + + for ( i = 0; i < maxVertex + 1; ++i ) + { + for ( j = 0; j < maxVertex + 1; ++j ) + { + counter[i][j] = counterTranspose[i][j] + counterTranspose[j][i]; + } + } + + /* Finding the edges */ + k = 0; + + for ( a = 0; a < maxVertex; ++a ) + { + for ( b = a + 1; b < maxVertex + 1; ++b ) + { + if ( counter[a][b] == 1 ) + { + edges[k] = a; + edges[k + 1] = b; + k += 2; + } + } + } + + /* Outputs */ + *numEdges = k; + return; +} +#endif #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * flip_plane() @@ -1816,16 +1992,16 @@ static void flip_plane( * \ *-------------------------------------------------------------------------*/ -static void flip_plane_fixed( +static void flip_plane_fx( const EFAP_VERTEX *vtxArray, /* i : Vertex array */ Word16 *surface, /* i/o: Surface/vertices to be flipped */ const Word32 centroid[3] /* i : Centroid of convex hull from which to orient the planes outward */ ) { - int16_t tmp; + Word16 tmp; Word32 dist; - dist = point_plane_distance_fixed( + dist = point_plane_distance_fx( vtxArray[surface[0]].pos, vtxArray[surface[1]].pos, vtxArray[surface[2]].pos, @@ -1995,12 +2171,12 @@ static void remap_ghosts( } #else /*-------------------------------------------------------------------------* - * remap_ghosts_fixed() + * remap_ghosts_fx() * * *-------------------------------------------------------------------------*/ -static void remap_ghosts_fixed( +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 */ @@ -2032,9 +2208,9 @@ static void remap_ghosts_fixed( FOR( g = numVtx - 1; g > numSpk - 1; --g ) { /* find(triangle_mat == ghost, 1, 'first') */ - IF( EQ_16( find_int_in_tri( triArray, g, numTri, posFound ), 0 ) ) + IF( EQ_16(find_int_in_tri_fx( triArray, g, numTri, posFound ), 0 ) ) { - remove_vertex( vtxArray, g, numVtx ); + remove_vertex_fx( vtxArray, g, numVtx ); --numVtx; FOR( i = 0; i < numTri; ++i ) { @@ -2042,7 +2218,7 @@ static void remap_ghosts_fixed( { IF( GT_16( triArray[i].LS[j], g ) ) { - triArray[i].LS[j] = g - 1; + triArray[i].LS[j] = sub( g, 1 ); } } } @@ -2054,7 +2230,7 @@ static void remap_ghosts_fixed( } /* Final number of LS (real + ghosts) */ - numTot = numSpk + numGhst; + numTot = add(numSpk, numGhst); /* Initializing tmpMat as the identity matrix */ FOR( i = 0; i < numTot; ++i ) @@ -2069,7 +2245,7 @@ static void remap_ghosts_fixed( /* Generate initial sound energy distribution matrix */ FOR( i = numSpk; i < numTot; ++i ) { - tmpL = get_neighbours( triArray, i, numTri, neighbours ); + tmpL = get_neighbours_fx( triArray, i, numTri, neighbours ); /* Initializing the column to 0 */ FOR( j = 0; j < numTot; ++j ) @@ -2100,14 +2276,14 @@ static void remap_ghosts_fixed( { mvl2l( tmpNewMat[i], tmpVec, numTot ); - tmpDist = sum_l( &tmpVec[numSpk], numTot - numSpk ); + tmpDist = sum_l( &tmpVec[numSpk], sub( numTot, numSpk ) ); WHILE( GT_32( tmpDist, thresh ) ) { - matrix_times_row_fixed( tmpMat, tmpVec, numTot, tmpVec2 ); + matrix_times_row_fx( tmpMat, tmpVec, numTot, tmpVec2 ); mvl2l( tmpVec2, tmpVec, numTot ); set_l( tmpVec2, 0, numTot ); - tmpDist = sum_l( &tmpVec[numSpk], numTot - numSpk ); + tmpDist = sum_l( &tmpVec[numSpk], sub( numTot, numSpk ) ); } mvl2l( tmpVec, tmpNewMat[i], numTot ); } @@ -2136,10 +2312,10 @@ static void remap_ghosts_fixed( { case EFAP_DMX_NONE: downmixMatrixTranspose[j][i] = 0; - break; + BREAK; case EFAP_DMX_AMPLITUDE: downmixMatrixTranspose[j][i] = tmpNewMat[j][i]; - break; + BREAK; case EFAP_DMX_INTENSITY: default: IF( EQ_32( tmpNewMat[j][i], 0 ) || EQ_32( tmpNewMat[j][i], 0x7fffffff ) ) @@ -2153,7 +2329,7 @@ static void remap_ghosts_fixed( tmp_sqrt = L_shl( tmp_sqrt, exp ); downmixMatrixTranspose[j][i] = tmp_sqrt; } - break; + BREAK; } } } @@ -2190,12 +2366,12 @@ static void vertex_init( } #else /*-------------------------------------------------------------------------* - * vertex_init_fixed() + * vertex_init_fx() * * Initialize the vertex structures *-------------------------------------------------------------------------*/ -static void vertex_init_fixed( +static void vertex_init_fx( const Word32 *aziSpk, /* i : Azimuths of the LS setup */ const Word32 *eleSpk, /* i : Elevations of the LS setup */ EFAP_VERTEX_DATA *efapVtxData /* i/o: Vertex data structure that will be updated */ @@ -2206,7 +2382,7 @@ static void vertex_init_fixed( /* Main Processing */ FOR( i = 0; i < efapVtxData->numVtx; i++ ) { - add_vertex_fixed( efapVtxData->vertexArray, aziSpk[i], eleSpk[i], i, EFAP_DMX_INTENSITY ); + add_vertex_fx( efapVtxData->vertexArray, aziSpk[i], eleSpk[i], i, EFAP_DMX_INTENSITY ); } return; @@ -2280,12 +2456,12 @@ static void efap_panning( } #else /*-------------------------------------------------------------------------* - * efap_panning_fixed() + * efap_panning_fx() * * Compute the gain without applying the downmix Matrix and the norm of the array *-------------------------------------------------------------------------*/ -static void efap_panning_fixed( +static void efap_panning_fx( const Word32 azi, /* i : Value of the azimuth */ const Word32 ele, /* i : Value of the elevation */ const EFAP_POLYSET_DATA *polyData, /* i : Polygon data */ @@ -2306,7 +2482,7 @@ static void efap_panning_fixed( P[1] = ele; /* Finding in which polygon the point is */ - polyIdx = get_poly_num_fixed( P, polyData ); + polyIdx = get_poly_num_fx( P, polyData ); assert( polyIdx != -1 && "EFAP: polygon not found!" ); @@ -2327,7 +2503,7 @@ static void efap_panning_fixed( } /* Computing the gain for the polygon */ - get_poly_gains_fixed( P[0], P[1], aziPoly, elePoly, numChan, tmpBuff ); + get_poly_gains_fx( P[0], P[1], aziPoly, elePoly, numChan, tmpBuff ); /* Computing the norm of the tmp buffer */ normTmpBuff = dotp_fixed( tmpBuff, tmpBuff, numChan ); @@ -2401,12 +2577,12 @@ static void get_poly_gains( } #else /*-------------------------------------------------------------------------* - * get_poly_gains_fixed() + * get_poly_gains_fx() * * Compute the gain for a precise polygon *-------------------------------------------------------------------------*/ -static void get_poly_gains_fixed( +static void get_poly_gains_fx( const Word32 azi, /* i : Value of the azimuth */ const Word32 ele, /* i : Value of the elevation */ const Word32 aziPoly[EFAP_MAX_CHAN_NUM], /* i : Azimuths of the considered polygons */ @@ -2443,9 +2619,9 @@ static void get_poly_gains_fixed( C[0] = aziPoly[idx2 - 1]; C[1] = elePoly[idx2 - 1]; - IF( in_tri_fixed( A, B, C, P_minus_A ) ) + IF( in_tri_fx( A, B, C, P_minus_A ) ) { - buffer[i - 1] = L_shl_sat( get_tri_gain_fixed( A, B, C, P_minus_A ), Q12 ); + buffer[i - 1] = L_shl_sat( get_tri_gain_fx( A, B, C, P_minus_A ), Q12 ); break; } } @@ -2496,12 +2672,12 @@ static float get_tri_gain( } #else /*-------------------------------------------------------------------------* - * get_tri_gain_fixed() + * get_tri_gain_fx() * * Compute the value of the gain for a given triangle *-------------------------------------------------------------------------*/ -static Word32 get_tri_gain_fixed( +static Word32 get_tri_gain_fx( const Word32 A[2], /* i : Coordinate of one apex of the triangle */ const Word32 B[2], /* i : Coordinate of one apex of the triangle */ const Word32 C[2], /* i : Coordinate of one apex of the triangle */ @@ -2593,12 +2769,12 @@ static void add_vertex( } #else /*-------------------------------------------------------------------------* - * add_vertex_fixed() + * add_vertex_fx() * * Add a vertex to the vertex array *-------------------------------------------------------------------------*/ -static void add_vertex_fixed( +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 */ @@ -2613,14 +2789,14 @@ static void add_vertex_fixed( /* Updating the vertex array */ - tmp = efap_lmodl( Q22_180_DEG - azi, Q22_360_DEG ); + tmp = efap_lmodl( 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 ); /* Converting spherical coordinates to cartesians, assuming radius = 1 */ - sph2cart_fixed( vtxArray[pos].azi, vtxArray[pos].ele, &vtxArray[pos].pos[0] ); + sph2cart_fx( vtxArray[pos].azi, vtxArray[pos].ele, &vtxArray[pos].pos[0] ); /* Computing the index defined by idx = idxAziTmp + 181 * idxEleTmp */ @@ -2634,7 +2810,7 @@ static void add_vertex_fixed( idxEleTmp = L_sub( Q22_90_DEG, idxEleTmp ); /* Final Idx */ - vtxArray[pos].idx = (Word16) idxAziTmp + 181 * (Word16) ( idxEleTmp >> Q22 ); + vtxArray[pos].idx = add( (Word16) idxAziTmp, i_mult( 181, (Word16) L_shr( idxEleTmp, Q22 ) ) ); /* Setting the nan flag to 0 */ vtxArray[pos].isNaN = 0; @@ -2653,6 +2829,37 @@ static void add_vertex_fixed( * (modified version of sort() to return an index array) *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void efap_sort_s_fx( + Word16 *x, /* i/o: Vector to be sorted */ + Word16 *idx, /* o : Original index positions */ + const Word16 len /* i : vector length */ +) +{ + Word16 i, j; + Word16 tempr, tempi; + + FOR( i = 0; i < len; i++ ) + { + idx[i] = i; + } + + FOR( i = len - 2; i >= 0; i-- ) + { + tempr = x[i]; + tempi = idx[i]; + FOR( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) + { + x[j - 1] = x[j]; + idx[j - 1] = idx[j]; + } + x[j - 1] = tempr; + idx[j - 1] = tempi; + } + + return; +} +#else static void efap_sort_s( int16_t *x, /* i/o: Vector to be sorted */ int16_t *idx, /* o : Original index positions */ @@ -2662,16 +2869,16 @@ static void efap_sort_s( int16_t i, j; int16_t tempr, tempi; - FOR( i = 0; i < len; i++ ) + for ( i = 0; i < len; i++ ) { idx[i] = i; } - FOR( i = len - 2; i >= 0; i-- ) + for ( i = len - 2; i >= 0; i-- ) { tempr = x[i]; tempi = idx[i]; - FOR( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) + for ( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) { x[j - 1] = x[j]; idx[j - 1] = idx[j]; @@ -2682,7 +2889,7 @@ static void efap_sort_s( return; } - +#endif #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * vertex_distance() @@ -2718,7 +2925,7 @@ static float vertex_distance( * Compute the signed distance between a vertex and a hull surface *-------------------------------------------------------------------------*/ -static Word32 vertex_distance_fixed( +static Word32 vertex_distance_fx( const EFAP_VERTEX *vtxArray, /* i : The considered vertex */ const EFAP_LS_TRIANGLE tri, /* i : The considered triangle */ const Word16 vtxIdx /* i : Index of the considered vertex */ @@ -2737,7 +2944,7 @@ static Word32 vertex_distance_fixed( P[i] = vtxArray[vtxIdx].pos[i]; } - return point_plane_distance_fixed( A, B, C, P ); + return point_plane_distance_fx( A, B, C, P ); } #endif @@ -2762,23 +2969,23 @@ static float point_poly_distance( } #else /*-------------------------------------------------------------------------* - * point_poly_distance_fixed() + * point_poly_distance_fx() * * Compute the signed distance between a point and polygon *-------------------------------------------------------------------------*/ -static Word32 point_poly_distance_fixed( +static Word32 point_poly_distance_fx( const EFAP_POLYSET poly, /* i : The polygon which forms a plane */ const Word32 X[3] /* i : Cartesian coordinates of the point of interest */ ) { Word32 P1[3], P2[3], P3[3]; - sph2cart_fixed( poly.polyAzi[0], poly.polyEle[0], &P1[0] ); - sph2cart_fixed( poly.polyAzi[1], poly.polyEle[1], &P2[0] ); - sph2cart_fixed( poly.polyAzi[2], poly.polyEle[2], &P3[0] ); + sph2cart_fx( poly.polyAzi[0], poly.polyEle[0], &P1[0] ); + sph2cart_fx( poly.polyAzi[1], poly.polyEle[1], &P2[0] ); + sph2cart_fx( poly.polyAzi[2], poly.polyEle[2], &P3[0] ); - return point_plane_distance_fixed( P1, P2, P3, X ); + return point_plane_distance_fx( P1, P2, P3, X ); } #endif @@ -2828,12 +3035,12 @@ static float point_plane_distance( } #else /*-------------------------------------------------------------------------* - * point_plane_distance_fixed() + * point_plane_distance_fx() * * Compute the signed distance between a point and a given plane *-------------------------------------------------------------------------*/ -static Word32 point_plane_distance_fixed( // returns output in Q28 +static Word32 point_plane_distance_fx( // returns output in Q28 const Word32 P1[3], /* i : First point of the triangle that defines the planes */ const Word32 P2[3], /* i : Second point of the triangle */ const Word32 P3[3], /* i : Third point of the triangle */ @@ -2859,7 +3066,7 @@ static Word32 point_plane_distance_fixed( // returns output in Q28 v_sub_fixed( P1, P3, tmpCross2, 3, 1 ); /* resultCross = cross(P1-P2,P1-P3) */ - efap_crossp_fixed( tmpCross1, tmpCross2, resultCross ); // Q29 + efap_crossp_fx( tmpCross1, tmpCross2, resultCross ); // Q29 /* Dot Product */ tmpNorm = dotp_fixed( resultCross, resultCross, 3 ); // Q27 @@ -2893,12 +3100,12 @@ static void efap_crossp( } #else /*-------------------------------------------------------------------------* - * efap_crossp_fixed() + * efap_crossp_fx() * * Compute the cross product between column vectors of float of size 3x1 *-------------------------------------------------------------------------*/ -static void efap_crossp_fixed( +static void efap_crossp_fx( const Word32 *v1, /* i : First float vector */ const Word32 *v2, /* i : Second float vector */ Word32 *v /* o : Output vector */ @@ -2917,7 +3124,33 @@ static void efap_crossp_fixed( * * 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 */ + const Word16 n, /* i : The integer to find */ + const Word16 r, /* i : Number of rows */ + Word16 *pos /* o : Position of the integer */ +) +{ + Word16 i, j; + + /* Find the first element equal to n */ + FOR( i = 0; i < r; ++i ) + { + FOR( j = 0; j < 3; ++j ) + { + IF( EQ_16( tri[i].LS[j], n ) ) + { + pos[0] = i; + pos[1] = j; + return 1; + } + } + } + return 0; +} +#else static int16_t find_int_in_tri( const EFAP_LS_TRIANGLE *tri, /* i : Triangle array */ const int16_t n, /* i : The integer to find */ @@ -2928,11 +3161,11 @@ static int16_t find_int_in_tri( int16_t i, j; /* Find the first element equal to n */ - FOR( i = 0; i < r; ++i ) + for ( i = 0; i < r; ++i ) { - FOR( j = 0; j < 3; ++j ) + for ( j = 0; j < 3; ++j ) { - IF( EQ_16( tri[i].LS[j], n ) ) + if ( tri[i].LS[j] == n ) { pos[0] = i; pos[1] = j; @@ -2943,6 +3176,7 @@ static int16_t find_int_in_tri( return 0; } +#endif /*-------------------------------------------------------------------------* @@ -2950,7 +3184,29 @@ 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 */ + const Word16 idx, /* i : Index of the vertex to remove */ + const Word16 L /* i : Length of the Vertex array */ +) +{ + Word16 i; + + assert( idx < L && "EFAP: index out of bounds" ); + + /* Shift all vertex of one position, so vtxArray[i] will be vtxArray[i+1] and so on */ + FOR( i = idx; i < L - 1; ++i ) + { + add_vertex_fx( vtxArray, vtxArray[i + 1].azi, vtxArray[i + 1].ele, i, EFAP_DMX_INTENSITY ); + } + + /* The last vertex is set to 0 */ + add_vertex_fx( vtxArray, 0, 0, sub( L, 1 ), EFAP_DMX_INTENSITY ); + return; +} +#else static void remove_vertex( EFAP_VERTEX *vtxArray, /* i : Vertex array */ const int16_t idx, /* i : Index of the vertex to remove */ @@ -2962,32 +3218,86 @@ static void remove_vertex( assert( idx < L && "EFAP: index out of bounds" ); /* Shift all vertex of one position, so vtxArray[i] will be vtxArray[i+1] and so on */ - FOR( i = idx; i < L - 1; ++i ) + for ( i = idx; i < L - 1; ++i ) { -#ifndef IVAS_FLOAT_FIXED add_vertex( vtxArray, vtxArray[i + 1].azi, vtxArray[i + 1].ele, i, EFAP_DMX_INTENSITY ); -#else - add_vertex_fixed( vtxArray, vtxArray[i + 1].azi, vtxArray[i + 1].ele, i, EFAP_DMX_INTENSITY ); -#endif } /* The last vertex is set to 0 */ -#ifndef IVAS_FLOAT_FIXED add_vertex( vtxArray, 0, 0, L - 1, EFAP_DMX_INTENSITY ); -#else - add_vertex_fixed( vtxArray, 0, 0, L - 1, EFAP_DMX_INTENSITY ); -#endif return; } - +#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 */ + const Word16 vtxIdx, /* i : Index of the vertex */ + const Word16 numTri, /* i : Number of Triangles */ + Word16 *neighbours /* o : Output vector */ +) +{ + Word16 i, j, k; + Word16 tmpPos[2]; + Word16 tmpNeighbours[EFAP_MAX_SIZE_TMP_BUFF]; + Word16 dummy[EFAP_MAX_SIZE_TMP_BUFF]; + EFAP_LS_TRIANGLE tmpTriArray[EFAP_MAX_POLY_SET]; + + /* Processing */ + FOR( i = 0; i < numTri; ++i ) + { + mvs2s( triArray[i].LS, tmpTriArray[i].LS, 3 ); + } + + k = 0; + WHILE( 1 ) + { + IF( EQ_16(find_int_in_tri_fx( tmpTriArray, vtxIdx, numTri, tmpPos ), 0 ) ) + { + BREAK; + } + ELSE + { + tmpNeighbours[k] = tmpTriArray[tmpPos[0]].LS[0]; + tmpNeighbours[k + 1] = tmpTriArray[tmpPos[0]].LS[1]; + tmpNeighbours[k + 2] = tmpTriArray[tmpPos[0]].LS[2]; + k += 3; + tmpTriArray[tmpPos[0]].LS[tmpPos[1]] = -1; + } + + IF( GT_16( k, i_mult( 3, numTri ) ) ) + { + BREAK; + } + } + + /* Sorting the neighbours vector */ + efap_sort_s_fx( tmpNeighbours, dummy, k ); + + /* Creating the output vector, by eliminating redundancies and also deleting the indice == vtxIdx*/ + neighbours[0] = tmpNeighbours[0]; + j = 1; + FOR( i = 1; i < k; ++i ) + { + IF( NE_16( tmpNeighbours[i], tmpNeighbours[i - 1] ) && + NE_16( tmpNeighbours[i], vtxIdx ) ) + { + neighbours[j] = tmpNeighbours[i]; + ++j; + } + } + + /* Output, length of neighbours */ + return j; +} +#else static int16_t get_neighbours( const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ const int16_t vtxIdx, /* i : Index of the vertex */ @@ -3002,19 +3312,19 @@ static int16_t get_neighbours( EFAP_LS_TRIANGLE tmpTriArray[EFAP_MAX_POLY_SET]; /* Processing */ - FOR( i = 0; i < numTri; ++i ) + for ( i = 0; i < numTri; ++i ) { mvs2s( triArray[i].LS, tmpTriArray[i].LS, 3 ); } k = 0; - WHILE( 1 ) + while ( 1 ) { - IF( EQ_16( find_int_in_tri( tmpTriArray, vtxIdx, numTri, tmpPos ), 0 ) ) + if ( find_int_in_tri( tmpTriArray, vtxIdx, numTri, tmpPos ) == 0 ) { break; } - ELSE + else { tmpNeighbours[k] = tmpTriArray[tmpPos[0]].LS[0]; tmpNeighbours[k + 1] = tmpTriArray[tmpPos[0]].LS[1]; @@ -3023,7 +3333,7 @@ static int16_t get_neighbours( tmpTriArray[tmpPos[0]].LS[tmpPos[1]] = -1; } - IF( GT_16( k, 3 * numTri ) ) + if ( k > 3 * numTri ) { break; } @@ -3036,10 +3346,10 @@ static int16_t get_neighbours( neighbours[0] = tmpNeighbours[0]; j = 1; - FOR( i = 1; i < k; ++i ) + for ( i = 1; i < k; ++i ) { - IF( NE_16( tmpNeighbours[i], tmpNeighbours[i - 1] ) && - NE_16( tmpNeighbours[i], vtxIdx ) ) + if ( ( tmpNeighbours[i] != tmpNeighbours[i - 1] ) && + ( tmpNeighbours[i] != vtxIdx ) ) { neighbours[j] = tmpNeighbours[i]; ++j; @@ -3049,6 +3359,7 @@ static int16_t get_neighbours( /* Output, length of neighbours */ return j; } +#endif #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* @@ -3078,12 +3389,12 @@ static void matrix_times_row( } #else /*-------------------------------------------------------------------------* - * matrix_times_row_fixed() + * matrix_times_row_fx() * * Computes the product of a matrix and a row vector *-------------------------------------------------------------------------*/ -static void matrix_times_row_fixed( +static void matrix_times_row_fx( Word32 mat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF], /* i : The input matrix */ const Word32 *vec, /* i : The input row vector */ const Word16 L, /* i : Row length */ @@ -3109,7 +3420,98 @@ static void matrix_times_row_fixed( * * 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 */ + const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ + const Word16 numVtx, /* i : Number of vertices */ + const Word16 numTri, /* i : Number of triangles */ + Word16 sortedChan[EFAP_MAX_POLY_SET][EFAP_MAX_CHAN_NUM], /* o : The matrix that will contain the sorted channels */ + Word16 *outLengthPS, /* o : The length of the sorted channels */ + Word16 outLengthSorted[EFAP_MAX_POLY_SET] /* o : The number of channels for each poly (i.e. outLengthSorted[i] = length(sortedChan[i]) */ +) +{ + Word16 i, j; + Word16 lenPoly; + Word16 lenPolySet; + Word16 found; + Word16 replaceIdx; + + Word16 poly[EFAP_MAX_CHAN_NUM]; + + Word16 sortedLengths[EFAP_MAX_POLY_SET]; + Word16 sortedTri[EFAP_MAX_POLY_SET]; + + Word32 dist; + lenPolySet = 0; + /* Sorting the polygons */ + FOR( i = 0; i < numTri; ++i ) + { + /* search for coplanar vertices and add them to the polygon */ + lenPoly = 0; + FOR( j = 0; j < numVtx; ++j ) + { + dist = L_abs( point_plane_distance_fx( + vtxArray[triArray[i].LS[0]].pos, + vtxArray[triArray[i].LS[1]].pos, + vtxArray[triArray[i].LS[2]].pos, + vtxArray[j].pos ) ); // Q28 + + IF( LT_32( dist, 268435 ) /* 1e-3f in Q28 */ ) + { + assert( lenPoly < EFAP_MAX_CHAN_NUM && "EFAP: exceeded max polygon vertices!" ); + poly[lenPoly] = j; + ++lenPoly; + } + } + + /* search existing polygons to determine whether the new one already exists/is a subset or is a superset */ + found = 0; + replaceIdx = -1; + FOR( j = 0; j < lenPolySet; ++j ) + { + found = compare_poly_fx( sortedChan[j], sortedLengths[j], poly, lenPoly ); + + IF( GT_16( found, 0 ) ) + { + BREAK; + } + ELSE IF( LT_16( found, 0 ) ) + { + replaceIdx = j; + } + } + + IF( EQ_16( found, 0 ) ) + { + /* append new poly */ + mvs2s( poly, sortedChan[lenPolySet], lenPoly ); + sortedTri[lenPolySet] = i; + sortedLengths[lenPolySet] = lenPoly; + ++lenPolySet; + } + ELSE IF( EQ_16( found, -1 ) ) + { + /* replace with superset */ + mvs2s( poly, sortedChan[replaceIdx], lenPoly ); + sortedTri[replaceIdx] = i; + sortedLengths[replaceIdx] = lenPoly; + } + } + + /* Sorting the vertex */ + FOR( i = 0; i < lenPolySet; ++i ) + { + sort_channels_vertex_fx( vtxArray, triArray, sortedChan[i], sortedLengths[i], sortedTri[i] ); + } + + /* Output */ + *outLengthPS = lenPolySet; + mvs2s( sortedLengths, outLengthSorted, EFAP_MAX_POLY_SET ); + return; +} +#else static void tri_to_poly( const EFAP_VERTEX *vtxArray, /* i : Vertex array */ const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ @@ -3131,39 +3533,23 @@ static void tri_to_poly( int16_t sortedLengths[EFAP_MAX_POLY_SET]; int16_t sortedTri[EFAP_MAX_POLY_SET]; -#ifndef IVAS_FLOAT_FIXED float dist; -#else - Word32 dist; -#endif lenPolySet = 0; /* Sorting the polygons */ - FOR( i = 0; i < numTri; ++i ) + for ( i = 0; i < numTri; ++i ) { /* search for coplanar vertices and add them to the polygon */ lenPoly = 0; - FOR( j = 0; j < numVtx; ++j ) + for ( j = 0; j < numVtx; ++j ) { -#ifndef IVAS_FLOAT_FIXED dist = fabsf( point_plane_distance( vtxArray[triArray[i].LS[0]].pos, vtxArray[triArray[i].LS[1]].pos, vtxArray[triArray[i].LS[2]].pos, vtxArray[j].pos ) ); -#else - dist = L_abs( point_plane_distance_fixed( - vtxArray[triArray[i].LS[0]].pos, - vtxArray[triArray[i].LS[1]].pos, - vtxArray[triArray[i].LS[2]].pos, - vtxArray[j].pos ) ); // Q28 -#endif -#ifndef IVAS_FLOAT_FIXED - IF( dist < 1e-3f ) -#else - IF( LT_32( dist, 268435 ) /* 1e-3f in Q28 */ ) -#endif + if ( dist < 1e-3f ) { assert( lenPoly < EFAP_MAX_CHAN_NUM && "EFAP: exceeded max polygon vertices!" ); poly[lenPoly] = j; @@ -3174,21 +3560,21 @@ static void tri_to_poly( /* search existing polygons to determine whether the new one already exists/is a subset or is a superset */ found = 0; replaceIdx = -1; - FOR( j = 0; j < lenPolySet; ++j ) + for ( j = 0; j < lenPolySet; ++j ) { found = compare_poly( 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; } } - IF( EQ_16( found, 0 ) ) + if ( found == 0 ) { /* append new poly */ mvs2s( poly, sortedChan[lenPolySet], lenPoly ); @@ -3196,7 +3582,7 @@ static void tri_to_poly( sortedLengths[lenPolySet] = lenPoly; ++lenPolySet; } - ELSE IF( EQ_16( found, -1 ) ) + else if ( found == -1 ) { /* replace with superset */ mvs2s( poly, sortedChan[replaceIdx], lenPoly ); @@ -3206,28 +3592,66 @@ static void tri_to_poly( } /* Sorting the vertex */ - FOR( i = 0; i < lenPolySet; ++i ) + for ( i = 0; i < lenPolySet; ++i ) { -#ifndef IVAS_FLOAT_FIXED sort_channels_vertex( vtxArray, triArray, sortedChan[i], sortedLengths[i], sortedTri[i] ); -#else - sort_channels_vertex_fixed( vtxArray, triArray, sortedChan[i], sortedLengths[i], sortedTri[i] ); -#endif } /* Output */ *outLengthPS = lenPolySet; mvs2s( sortedLengths, outLengthSorted, EFAP_MAX_POLY_SET ); + return; } - +#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 */ + Word16 lenOld, /* i : Length of existing polygon */ + Word16 *new, /* i : New polygon */ + Word16 lenNew /* i : Length of new polygon */ +) +{ + Word16 i, j; + Word16 count; + + count = 0; + + FOR( i = 0; i < lenOld; ++i ) + { + FOR( j = count; j < lenNew; ++j ) + { + IF( EQ_16( old[i], new[j] ) ) + { + count = add( count, 1 ); + BREAK; + } + } + } + IF( EQ_16( count, lenOld ) && LT_16( lenOld, lenNew ) ) + { + /* new polygon is a superset */ + return -1; + } + ELSE IF( EQ_16( count, lenNew ) && GE_16( lenOld, lenNew ) ) + { + /* found as subset or identical */ + return 1; + } + ELSE + { + /* not found */ + return 0; + } +} +#else static int16_t compare_poly( int16_t *old, /* i : Existing polygon */ int16_t lenOld, /* i : Length of existing polygon */ @@ -3240,11 +3664,11 @@ static int16_t compare_poly( count = 0; - FOR( i = 0; i < lenOld; ++i ) + for ( i = 0; i < lenOld; ++i ) { - FOR( j = count; j < lenNew; ++j ) + for ( j = count; j < lenNew; ++j ) { - IF( old[i] == new[j] ) + if ( old[i] == new[j] ) { ++count; break; @@ -3252,22 +3676,23 @@ static int16_t compare_poly( } } - IF( count == lenOld && lenOld < lenNew ) + if ( count == lenOld && lenOld < lenNew ) { /* new polygon is a superset */ return -1; } - ELSE IF( count == lenNew && lenOld >= lenNew ) + else if ( count == lenNew && lenOld >= lenNew ) { /* found as subset or identical */ return 1; } - ELSE + else { /* not found */ return 0; } } +#endif #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* @@ -3367,7 +3792,7 @@ static void sort_channels_vertex( * Sort the channels of a polygon set according to the vertex azimuth *-------------------------------------------------------------------------*/ -static void sort_channels_vertex_fixed( +static void sort_channels_vertex_fx( const EFAP_VERTEX *vtxArray, /* i : Vertex array */ const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ Word16 channels[EFAP_MAX_CHAN_NUM], /* o : Channels array to be modified */ @@ -3414,7 +3839,7 @@ static void sort_channels_vertex_fixed( FOR( i = 0; i < 3; i++ ) { - tmpV2[i] = L_shl( tmpV2[i], Q2 + ( 2 * exp1 ) ); + tmpV2[i] = L_shl( tmpV2[i], add( Q2, shl( exp1, 1 ) ) ); } v_sub_fixed( tmpV1, tmpV2, tmpV3, 3, 0 ); // tmpV3 Q30 @@ -3443,7 +3868,7 @@ static void sort_channels_vertex_fixed( 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, exp2 - exp1 ), Q16 ); // azi 2Q29 + azi[i] = L_shl( (Word32) BASOP_util_atan2( y, x, sub( exp2, exp1 ) ), Q16 ); // azi 2Q29 } /* Sorting the azi vec */ @@ -3563,7 +3988,7 @@ static int16_t get_poly_num( * Returns the index of the polygon in which the coordinate is *-------------------------------------------------------------------------*/ -static Word16 get_poly_num_fixed( +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 */ ) @@ -3578,15 +4003,15 @@ static Word16 get_poly_num_fixed( num_poly = 0; - sph2cart_fixed( P[0], P[1], &pos[0] ); + sph2cart_fx( P[0], P[1], &pos[0] ); /* Filter the polygon list with a fast 2d check */ FOR( i = 0; i < polyData->numPoly; ++i ) { - IF( in_poly_fixed( P, polyData->polysetArray[i] ) ) + IF( in_poly_fx( P, polyData->polysetArray[i] ) ) { /* select only polygons which are visible from the point */ - dist_tmp = point_poly_distance_fixed( polyData->polysetArray[i], pos ); + dist_tmp = point_poly_distance_fx( polyData->polysetArray[i], pos ); IF( EQ_32( dist_tmp, 0 ) ) { return i; @@ -3692,12 +4117,12 @@ static int16_t in_poly( } #else /*-------------------------------------------------------------------------* - * in_poly_fixed() + * in_poly_fx() * * Determines if a given point is within a polygon or not *-------------------------------------------------------------------------*/ -static Word16 in_poly_fixed( /* Angles are in Q22 */ +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 */ ) @@ -3730,7 +4155,7 @@ static Word16 in_poly_fixed( /* Angles are in Q22 */ v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) */ - FOR( n = 1; n < numVertices - 1; ++n ) + FOR( n = 1; n < sub( numVertices, 1 ); ++n ) { IF( poly.isNaN[n] ) { @@ -3752,7 +4177,7 @@ static Word16 in_poly_fixed( /* Angles are in Q22 */ } C[1] = poly.polyEle[n + 1]; - IF( in_tri_fixed( A, B, C, P_minus_A ) ) + IF( in_tri_fx( A, B, C, P_minus_A ) ) { return 1; } @@ -3822,12 +4247,12 @@ static int16_t in_tri( } #else /*-------------------------------------------------------------------------* - * in_tri_fixed() + * in_tri_fx() * * Determines if a given point is within a triangle or not *-------------------------------------------------------------------------*/ -static Word16 in_tri_fixed( +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 */ Word32 C[2], /* i : Coordinate of one apex of the triangle */ @@ -3859,7 +4284,7 @@ static Word16 in_tri_fixed( return 0; } - invFactor_w64 = ( ( (Word64) 0x7FFFFFFFFFFFFFFF ) / ( (Word64) invFactor ) ) >> Q19; // Q31 + invFactor_w64 = W_shr( ( (Word64) 0x7FFFFFFFFFFFFFFF ) / ( (Word64) invFactor ), Q19 ); // Q31 invFactor = (Word32) invFactor_w64; Word16 invFactor_exp = norm_l( invFactor ); @@ -3950,12 +4375,12 @@ static void sph2cart( } #else /*-------------------------------------------------------------------------* - * sph2cart_fixed() + * sph2cart_fx() * * Converts a vertex position to cartesian coordinates *-------------------------------------------------------------------------*/ -static void sph2cart_fixed( +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) */ diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c index 6e85d16f51dff84e6721663ff3557d9a6857bc22..2b861928420ed54b10e678651055ae9778f4ae9b 100644 --- a/lib_rend/ivas_hrtf.c +++ b/lib_rend/ivas_hrtf.c @@ -44,6 +44,20 @@ * Allocate HRTF binary handle *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_HRTF_binary_open_fx( + TDREND_HRFILT_FiltSet_t **hHrtfTD ) +{ + /* Allocate HR filter set for headphones configuration */ + *hHrtfTD = (TDREND_HRFILT_FiltSet_t *) malloc( sizeof( TDREND_HRFILT_FiltSet_t ) ); + IF( *hHrtfTD == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary!" ); + } + + return IVAS_ERR_OK; +} +#else ivas_error ivas_HRTF_binary_open( TDREND_HRFILT_FiltSet_t **hHrtfTD ) { @@ -56,6 +70,7 @@ ivas_error ivas_HRTF_binary_open( return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -64,6 +79,22 @@ ivas_error ivas_HRTF_binary_open( * Close HRTF binary handle *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_HRTF_binary_close_fx( + TDREND_HRFILT_FiltSet_t **hHrtfTD ) +{ + test(); + IF( hHrtfTD == NULL || *hHrtfTD == NULL ) + { + return; + } + + free( *hHrtfTD ); + *hHrtfTD = NULL; + + return; +} +#else void ivas_HRTF_binary_close( TDREND_HRFILT_FiltSet_t **hHrtfTD ) { @@ -77,6 +108,7 @@ void ivas_HRTF_binary_close( return; } +#endif /*-----------------------------------------------------------------------* @@ -85,6 +117,26 @@ void ivas_HRTF_binary_close( * Allocate HRTF binary handle *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_HRTF_CRend_binary_open_fx( + HRTFS_CREND **hSetOfHRTF ) +{ + /* Allocate HR filter set for headphones configuration */ + *hSetOfHRTF = (HRTFS_CREND *) malloc( sizeof( HRTFS_CREND ) ); + IF( *hSetOfHRTF == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for set of HRTF binary!" ); + } + + ( *hSetOfHRTF )->hHRTF_hrir_combined = NULL; + ( *hSetOfHRTF )->hHRTF_hrir_hoa3 = NULL; + ( *hSetOfHRTF )->hHRTF_hrir_hoa2 = NULL; + ( *hSetOfHRTF )->hHRTF_hrir_foa = NULL; + ( *hSetOfHRTF )->hHRTF_brir_combined = NULL; + + return IVAS_ERR_OK; +} +#else ivas_error ivas_HRTF_CRend_binary_open( HRTFS_CREND **hSetOfHRTF ) { @@ -103,6 +155,7 @@ ivas_error ivas_HRTF_CRend_binary_open( return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -111,6 +164,22 @@ ivas_error ivas_HRTF_CRend_binary_open( * Close HRTF CRend binary handle *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_HRTF_CRend_binary_close_fx( + HRTFS_CREND **hSetOfHRTF ) +{ + test(); + IF( hSetOfHRTF == NULL || *hSetOfHRTF == NULL ) + { + return; + } + + free( *hSetOfHRTF ); + *hSetOfHRTF = NULL; + + return; +} +#else void ivas_HRTF_CRend_binary_close( HRTFS_CREND **hSetOfHRTF ) { @@ -124,6 +193,7 @@ void ivas_HRTF_CRend_binary_close( return; } +#endif /*-----------------------------------------------------------------------* @@ -153,6 +223,22 @@ ivas_error ivas_HRTF_fastconv_binary_open( * Close HRTF binary handle for FASTCONV renderer *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_HRTF_fastconv_binary_close_fx( + HRTFS_FASTCONV **hHrtfFastConv ) +{ + test(); + IF( hHrtfFastConv == NULL || *hHrtfFastConv == NULL ) + { + return; + } + + free( *hHrtfFastConv ); + *hHrtfFastConv = NULL; + + return; +} +#else void ivas_HRTF_fastconv_binary_close( HRTFS_FASTCONV **hHrtfFastConv ) { @@ -166,6 +252,7 @@ void ivas_HRTF_fastconv_binary_close( return; } +#endif /*-----------------------------------------------------------------------* @@ -174,6 +261,19 @@ void ivas_HRTF_fastconv_binary_close( * Allocate HRTF binary handle for parametric binauralizer *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_HRTF_parambin_binary_open_fx( + HRTFS_PARAMBIN **hHrtfParambin ) +{ + *hHrtfParambin = (HRTFS_PARAMBIN *) malloc( sizeof( HRTFS_PARAMBIN ) ); + IF( *hHrtfParambin == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for parametric binauralizer HRTF tables!" ); + } + + return IVAS_ERR_OK; +} +#else ivas_error ivas_HRTF_parambin_binary_open( HRTFS_PARAMBIN **hHrtfParambin ) { @@ -185,6 +285,7 @@ ivas_error ivas_HRTF_parambin_binary_open( return IVAS_ERR_OK; } +#endif /*-----------------------------------------------------------------------* @@ -193,6 +294,22 @@ ivas_error ivas_HRTF_parambin_binary_open( * Close HRTF binary handle for parametric binauralizer *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_HRTF_parambin_binary_close_fx( + HRTFS_PARAMBIN **hHrtfParambin ) +{ + test(); + IF( hHrtfParambin == NULL || *hHrtfParambin == NULL ) + { + return; + } + + free( *hHrtfParambin ); + *hHrtfParambin = NULL; + + return; +} +#else void ivas_HRTF_parambin_binary_close( HRTFS_PARAMBIN **hHrtfParambin ) { @@ -206,3 +323,4 @@ void ivas_HRTF_parambin_binary_close( return; } +#endif diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 553b60a05e03de02002838eefaf3d8d7cf74ea6f..9ee54f3292448ef8a8913f6006bc181a211825c9 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -807,148 +807,146 @@ ivas_error ivas_td_binaural_renderer_unwrap( * Render one 5 ms subframe from the mixer *---------------------------------------------------------------------*/ -ivas_error TDREND_GetMix( +#ifdef IVAS_FLOAT_FIXED +ivas_error TDREND_GetMix_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ - const int16_t ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ + Word32 *output[], /* i/o: ISM object synth / rendered output in 0,1 */ + const Word16 subframe_length, /* i/o: subframe length */ + const Word16 subframe_idx, /* i : Subframe index to 5 ms subframe */ + const Word16 ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ ) { - int16_t i; + Word16 i; TDREND_SRC_t *Src_p; TDREND_SRC_SPATIAL_t *SrcSpatial_p; TDREND_SRC_REND_t *SrcRend_p; ivas_error error; - float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ - float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - int16_t intp_count; - int16_t subframe_update_flag; + Word32 output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ + Word32 hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + Word32 hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + Word16 intp_count; + Word16 subframe_update_flag; + Word16 hrf_left_delta_e = 0, hrf_right_delta_e = 0; - subframe_update_flag = subframe_idx == ism_md_subframe_update; + subframe_update_flag = (Word16)EQ_16( subframe_idx, ism_md_subframe_update ); error = IVAS_ERR_OK; /* Clear the output buffer to accumulate rendered sources */ - set_f( output_buf[0], 0.0f, subframe_length ); - set_f( output_buf[1], 0.0f, subframe_length ); - + set32_fx( output_buf[0], 0, subframe_length ); + set32_fx( output_buf[1], 0, subframe_length ); /* Clear interpolation buffers and counter */ - set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set32_fx( hrf_left_delta, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set32_fx( hrf_right_delta, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + intp_count = 0; + move16(); /* Create the mix */ /* Loop through the source list and render each source */ - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + FOR( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { Src_p = hBinRendererTd->Sources[i]; SrcSpatial_p = Src_p->SrcSpatial_p; SrcRend_p = Src_p->SrcRend_p; /* Update rendering params if needed */ - if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) + test(); test(); + IF ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) { - TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, - Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_update_flag ); + 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, + hrf_left_delta, &hrf_left_delta_e, hrf_right_delta, &hrf_right_delta_e, + &intp_count, &Src_p->filterlength, &Src_p->itd, + &Src_p->Gain_fx, + Src_p, subframe_update_flag ); } /* Render source if needed */ - if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + IF ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) { - error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); + 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 ); } } + /* Populate output variable */ - mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ - mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ + Copy32( output_buf[0], output[0] + imult1616(subframe_idx, subframe_length), subframe_length ); /* Left */ + Copy32( output_buf[1], output[1] + imult1616(subframe_idx, subframe_length), subframe_length ); /* Right */ /* Clear the PoseUpdated and Source position update flags */ - TDREND_Clear_Update_flags( hBinRendererTd ); + TDREND_Clear_Update_flags_fx( hBinRendererTd ); return error; } - - -#ifdef IVAS_FLOAT_FIXED -ivas_error TDREND_GetMix_fx( +#else +ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - Word32 *output[], /* i/o: ISM object synth / rendered output in 0,1 */ - const Word16 subframe_length, /* i/o: subframe length */ - const Word16 subframe_idx, /* i : Subframe index to 5 ms subframe */ - const Word16 ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ + const int16_t ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ ) { - Word16 i; + int16_t i; TDREND_SRC_t *Src_p; TDREND_SRC_SPATIAL_t *SrcSpatial_p; TDREND_SRC_REND_t *SrcRend_p; ivas_error error; - Word32 output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ - Word32 hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - Word32 hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; - Word16 intp_count; - Word16 subframe_update_flag; - Word16 hrf_left_delta_e = 0, hrf_right_delta_e = 0; + float output_buf[2][L_SPATIAL_SUBFR_48k]; /* Temp buffer for left/right rendered signal */ + float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; + int16_t intp_count; + int16_t subframe_update_flag; - subframe_update_flag = (Word16)EQ_16( subframe_idx, ism_md_subframe_update ); + subframe_update_flag = subframe_idx == ism_md_subframe_update; error = IVAS_ERR_OK; /* Clear the output buffer to accumulate rendered sources */ - set32_fx( output_buf[0], 0, subframe_length ); - set32_fx( output_buf[1], 0, subframe_length ); - /* Clear interpolation buffers and counter */ - set32_fx( hrf_left_delta, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - set32_fx( hrf_right_delta, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set_f( output_buf[0], 0.0f, subframe_length ); + set_f( output_buf[1], 0.0f, subframe_length ); + /* Clear interpolation buffers and counter */ + set_f( hrf_left_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + set_f( hrf_right_delta, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); intp_count = 0; - move16(); /* Create the mix */ /* Loop through the source list and render each source */ - FOR( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { Src_p = hBinRendererTd->Sources[i]; SrcSpatial_p = Src_p->SrcSpatial_p; SrcRend_p = Src_p->SrcRend_p; /* Update rendering params if needed */ - test(); test(); - IF ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) + if ( ( 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, - hrf_left_delta, &hrf_left_delta_e, hrf_right_delta, &hrf_right_delta_e, - &intp_count, &Src_p->filterlength, &Src_p->itd, - &Src_p->Gain_fx, - Src_p, subframe_update_flag ); + TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_update_flag ); } /* Render source if needed */ - IF ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( 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 ); + error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); } } - /* Populate output variable */ - Copy32( output_buf[0], output[0] + imult1616(subframe_idx, subframe_length), subframe_length ); /* Left */ - Copy32( output_buf[1], output[1] + imult1616(subframe_idx, subframe_length), subframe_length ); /* Right */ + mvr2r( output_buf[0], output[0] + subframe_idx * subframe_length, subframe_length ); /* Left */ + mvr2r( output_buf[1], output[1] + subframe_idx * subframe_length, subframe_length ); /* Right */ /* Clear the PoseUpdated and Source position update flags */ - TDREND_Clear_Update_flags_fx( hBinRendererTd ); + TDREND_Clear_Update_flags( hBinRendererTd ); return error; } #endif - /*---------------------------------------------------------------------* * TDREND_Clear_Update_flags() * diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index 856a74a3b8070052d925ebe4777d924a5307bacb..b1272616cb242717af14fbc9f809897f81aa72a8 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -46,14 +46,14 @@ * Local function prototypes *---------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void getPeriodicBSplineSampVec( float *BfVec, int16_t *AzIdx, const int16_t NumBFs, const float t, int16_t *num_az_idx, const float knot_interval, const float azimKSeq_0, const int16_t azimSegSamples, const float *azimBsShape, const int16_t subSampFactor ); static void getStandardBSplineSampVec( float *BfVec, int16_t *NzIdx, int16_t *num_idx, const int16_t NumBFs, const float t, const float *KSeq, const int16_t SegSamples, const int16_t *BsLen, const int16_t *BsStart, const float *BsShape ); static void GenerateFilter( const float elev, float azim, ModelParams_t *model, ModelEval_t *modelEval ); static void GenerateITD( const float elev, float azim, ModelParamsITD_t *model, ModelEval_t *modelEval ); static void SkipSmallest_ValueIndex( int16_t *use_inds, const ValueIndex_t *VI, const int16_t N, const int16_t n_smallest ); - -#ifdef IVAS_FLOAT_FIXED -static Word32 round_fixed(Word32 n, Word16 q); +#else +static Word32 round_fixed( Word32 n, Word16 q ); static void getPeriodicBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *AzIdx, const Word16 NumBFs, const Word32 t_fx, Word16 *num_az_idx, const Word32 knot_interval_fx, const Word32 azimKSeq_0_fx, const Word16 azimSegSamples, const Word32 *azimBsShape_fx, const Word16 subSampFactor ); static void getStandardBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *NzIdx, Word16 *num_idx, const Word16 NumBFs, const Word32 t_fx, const Word32 *KSeq_fx, const Word16 SegSamples, const Word16 *BsLen, const Word16 *BsStart, const Word32 *BsShape_fx ); static void GenerateFilter_fx( const Word32 elev, Word32 azim, ModelParams_t *model, ModelEval_t *modelEval ); @@ -67,6 +67,7 @@ static void SkipSmallest_ValueIndex_fx( Word16 *use_inds, const ValueIndex_t *VI * Renders each object using the HR filters --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error TDREND_REND_RenderSourceHRFilt( TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ const float *hrf_left_delta, /* i : Left filter interpolation delta */ @@ -91,21 +92,20 @@ ivas_error TDREND_REND_RenderSourceHRFilt( return IVAS_ERR_OK; } - -#ifdef IVAS_FLOAT_FIXED +#else ivas_error TDREND_REND_RenderSourceHRFilt_fx( - TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ - Word32 *hrf_left_delta_fx, /* i/o: Left filter interpolation delta */ - Word16 *hrf_left_delta_e, /* i/o: Left filter interpolation delta exp */ - Word32 *hrf_right_delta_fx, /* i/o: Right filter interpolation delta */ - Word16 *hrf_right_delta_e, /* i/o: Right filter interpolation delta exp */ - const Word16 intp_count, /* i : Interpolation count */ - Word32 output_buf_fx[][L_SPATIAL_SUBFR_48k], /* o : Output buffer */ - const Word16 subframe_length /* i : Subframe length in use */ + TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ + Word32 *hrf_left_delta_fx, /* i/o: Left filter interpolation delta */ + Word16 *hrf_left_delta_e, /* i/o: Left filter interpolation delta exp */ + Word32 *hrf_right_delta_fx, /* i/o: Right filter interpolation delta */ + Word16 *hrf_right_delta_e, /* i/o: Right filter interpolation delta exp */ + const Word16 intp_count, /* i : Interpolation count */ + Word32 output_buf_fx[][L_SPATIAL_SUBFR_48k], /* o : Output buffer */ + const Word16 subframe_length /* i : Subframe length in use */ ) { - Word32 LeftOutputFrame_fx[L_SPATIAL_SUBFR_48k]; // will have same Q as Src_p->InputFrame_p_fx - Word32 RightOutputFrame_fx[L_SPATIAL_SUBFR_48k]; // will have same Q as Src_p->InputFrame_p_fx + Word32 LeftOutputFrame_fx[L_SPATIAL_SUBFR_48k]; // will have same Q as Src_p->InputFrame_p_fx + Word32 RightOutputFrame_fx[L_SPATIAL_SUBFR_48k]; // will have same Q as Src_p->InputFrame_p_fx Word16 left_filter_e; Word16 right_filter_e; @@ -131,18 +131,19 @@ ivas_error TDREND_REND_RenderSourceHRFilt_fx( TDREND_firfilt_fx( LeftOutputFrame_fx, Src_p->hrf_left_prev_fx, left_filter_e, hrf_left_delta_fx, intp_count, Src_p->mem_hrf_left_fx, subframe_length, Src_p->filterlength, Src_p->Gain_fx, Src_p->prevGain_fx ); TDREND_firfilt_fx( RightOutputFrame_fx, Src_p->hrf_right_prev_fx, right_filter_e, hrf_right_delta_fx, intp_count, Src_p->mem_hrf_right_fx, subframe_length, Src_p->filterlength, Src_p->Gain_fx, Src_p->prevGain_fx ); - + Src_p->prevGain_fx = Src_p->Gain_fx; move16(); /* Copy to accumulative output frame */ - v_add_32( LeftOutputFrame_fx, output_buf_fx[0], output_buf_fx[0], subframe_length ); // Same Q as Src_p->InputFrame_p_fx - v_add_32( RightOutputFrame_fx, output_buf_fx[1], output_buf_fx[1], subframe_length ); // Same Q as Src_p->InputFrame_p_fx + v_add_32( LeftOutputFrame_fx, output_buf_fx[0], output_buf_fx[0], subframe_length ); // Same Q as Src_p->InputFrame_p_fx + v_add_32( RightOutputFrame_fx, output_buf_fx[1], output_buf_fx[1], subframe_length ); // Same Q as Src_p->InputFrame_p_fx return IVAS_ERR_OK; } #endif + /*-------------------------------------------------------------------* * GetFilterFromAngle() * @@ -150,6 +151,7 @@ ivas_error TDREND_REND_RenderSourceHRFilt_fx( * This version uses the HR filter model. --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void GetFilterFromAngle( TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* i/o: HR filter set structure */ const float Elev, /* i : Elevation, degrees */ @@ -179,8 +181,7 @@ void GetFilterFromAngle( return; } - -#ifdef IVAS_FLOAT_FIXED +#else void GetFilterFromAngle_fx( TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* i/o: HR filter set structure */ const Word32 Elev_fx, /* i : Elevation, degrees Q22 */ @@ -203,7 +204,7 @@ void GetFilterFromAngle_fx( move16(); /* 4. Evaluate the ITD */ - IF ( HrFiltSet_p->ModelParams.UseItdModel ) + IF( HrFiltSet_p->ModelParams.UseItdModel ) { GenerateITD_fx( Elev_fx, Azim_fx, &HrFiltSet_p->ModelParamsITD, &HrFiltSet_p->ModelEval ); *itd = extract_l( HrFiltSet_p->ModelEval.itdMod_fx ); @@ -218,9 +219,9 @@ void GetFilterFromAngle_fx( } #endif -static Word32 round_fixed( /* o : Output value Q0 */ - Word32 num, /* i : Input value */ - Word16 q /* i : Input q-factor */ +static Word32 round_fixed( /* o : Output value Q0 */ + Word32 num, /* i : Input value */ + Word16 q /* i : Input q-factor */ ) { Word32 half = L_shl( 1, ( q - 1 ) ); @@ -252,6 +253,7 @@ static Word32 round_fixed( /* o : Output value Q0 */ * Generate an HR filter using the B Spline model. --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void GenerateFilter( const float elev, /* i : Elevation angle, degrees */ float azim, /* i : Azimuth angle, degrees */ @@ -365,7 +367,7 @@ static void GenerateFilter( return; } -#ifdef IVAS_FLOAT_FIXED +#else static void GenerateFilter_fx( const Word32 elev, /* i : Elevation angle, degrees Q22 */ Word32 azim, /* i : Azimuth angle, degrees Q22 */ @@ -439,7 +441,6 @@ 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 - modelEval->BM[qp + i] = fix_to_float( modelEval->BM_fx[qp + i], Q30 ); BM_idx[qp + i] = model->azim_start_idx[EvIdx[p]] + AzIdx[p][i]; } qp = add( qp, num_az_idx[p] ); @@ -543,15 +544,16 @@ static void GenerateFilter_fx( return; } - #endif + /*-------------------------------------------------------------------* * GenerateITD() * * Generates an ITD value from the B Spline model. --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void GenerateITD( const float elev, /* i : Elevation angle, degrees */ float azim, /* i : Azimuth angle, degrees */ @@ -664,8 +666,7 @@ static void GenerateITD( return; } - -#ifdef IVAS_FLOAT_FIXED +#else static void GenerateITD_fx( const Word32 elev_fx, /* i : Elevation angle, degrees Q22 */ Word32 azim_fx, /* i : Azimuth angle, degrees Q22 */ @@ -826,6 +827,7 @@ static void GenerateITD_fx( * Obtain a periodic sampled B Spline basis vector. --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void getPeriodicBSplineSampVec( float *BfVec, /* i/o: values for non-zero basis functions */ int16_t *AzIdx, /* i/o: indices of non-zero basis functions */ @@ -865,8 +867,7 @@ static void getPeriodicBSplineSampVec( return; } - -#ifdef IVAS_FLOAT_FIXED +#else static void getPeriodicBSplineSampVec_fx( Word32 *BfVec_fx, /* o : values for non-zero basis functions Q30 */ Word16 *AzIdx, /* o : indices of non-zero basis functions */ @@ -884,7 +885,7 @@ static void getPeriodicBSplineSampVec_fx( Word32 tmp32; Word16 tmp_e1, tmp_e2; Word16 SegSamples; - + SegSamples = 0; move16(); IF( azimSegSamples != 0 ) @@ -893,19 +894,19 @@ static void getPeriodicBSplineSampVec_fx( } /* index of closest sample point */ - IF(knot_interval_fx == 0) + IF( knot_interval_fx == 0 ) { d0 = 0; move16(); } ELSE { - tmp32 = L_deposit_h(BASOP_Util_Divide3216_Scale(knot_interval_fx, SegSamples, &tmp_e1)); - tmp_e1 = add(tmp_e1, sub(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) - d0 = extract_l(round_fixed(tmp32, Q22)); + tmp32 = L_deposit_h( BASOP_Util_Divide3216_Scale( knot_interval_fx, SegSamples, &tmp_e1 ) ); + tmp_e1 = add( tmp_e1, sub( 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) + d0 = extract_l( round_fixed( tmp32, Q22 ) ); } /* find segment */ @@ -921,14 +922,14 @@ 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 */ + *num_az_idx = sub( *num_az_idx, 1 ); /* on the knot points, the last basis function is zero */ } FOR( i = 0; i < *num_az_idx; i++ ) { d = d0 - ( 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]; + d = sub( d0, imult1616( sub( add( i, nI ), 1 ), SegSamples ) ); + BfVec_fx[i] = azimBsShape_fx[abs_s( d ) * subSampFactor]; AzIdx[i] = add( nI, i ) % NumBFs; } @@ -942,6 +943,7 @@ static void getPeriodicBSplineSampVec_fx( * Obtain a sampled B Spline basis vector. --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void getStandardBSplineSampVec( float *BfVec, /* i/o: values for non-zero basis functions */ int16_t *NzIdx, /* i/o: indices of non-zero basis functions */ @@ -993,8 +995,7 @@ static void getStandardBSplineSampVec( return; } - -#ifdef IVAS_FLOAT_FIXED +#else static void getStandardBSplineSampVec_fx( Word32 *BfVec_fx, /* o : values for non-zero basis functions Q30 */ Word16 *NzIdx, /* o : indices of non-zero basis functions */ @@ -1077,16 +1078,16 @@ void HRTF_model_precalc( { Word16 sec_length; Word16 i; - sec_length = mult(model->K,10923); /*10923 == 2 ^ 15 / 3*/ - FOR ( i = 0; i < HRTF_MODEL_N_SECTIONS; i++ ) + sec_length = mult( model->K, 10923 ); /*10923 == 2 ^ 15 / 3*/ + FOR( i = 0; i < HRTF_MODEL_N_SECTIONS; i++ ) { - model->iSecFirst[i] = imult1616(i , sec_length); + model->iSecFirst[i] = imult1616( i, sec_length ); } - FOR ( i = 0; i < HRTF_MODEL_N_SECTIONS - 1; i++ ) + FOR( i = 0; i < HRTF_MODEL_N_SECTIONS - 1; i++ ) { - model->iSecLast[i] = sub(imult1616(add( i , 1 ) , sec_length) , 1); + model->iSecLast[i] = sub( imult1616( add( i, 1 ), sec_length ), 1 ); } - model->iSecLast[HRTF_MODEL_N_SECTIONS - 1] = sub(model->K , 1); /* Final section is longer if (K % nSec) > 0 */ + model->iSecLast[HRTF_MODEL_N_SECTIONS - 1] = sub( model->K, 1 ); /* Final section is longer if (K % nSec) > 0 */ maximum_fx( model->azimDim3, model->elevDim3, &model->azimDim3Max ); return; } @@ -1133,19 +1134,6 @@ void BSplineModelEvalDealloc_fx( IF ( model->modelROM ) { -#if 1 //To be removed later :Floating point memory release - free( (void *) model->azimBsShape ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ - FOR ( i = 0; i < model->elevDim3; i++ ) - { - free( model->azimKSeq[i] ); - } - free( model->azimKSeq ); - IF ( modelEval != NULL ) - { - free( modelEval->hrfModL ); - free( modelEval->hrfModR ); - } -#endif free( (void *) model->azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ FOR ( i = 0; i < model->elevDim3; i++ ) { @@ -1178,18 +1166,12 @@ void BSplineModelEvalDealloc( free( model->azimKSeq[i] ); } free( model->azimKSeq ); -#ifdef IVAS_FLOAT_FIXED - free( (void *) model->azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ - FOR( i = 0; i < model->elevDim3; i++ ) - { - free( model->azimKSeq_fx[i] ); - } - free( model->azimKSeq_fx ); -#endif if ( modelEval != NULL ) { +#ifndef IVAS_FLOAT_FIXED free( modelEval->hrfModL ); free( modelEval->hrfModR ); +#endif } } @@ -1204,6 +1186,7 @@ void BSplineModelEvalDealloc( * unordered (i.e. skip the n_smallest values, return the remainder). --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void SkipSmallest_ValueIndex( int16_t *use_inds, /* i/o: List of indices to use */ const ValueIndex_t *VI, /* i : List of value-index items */ @@ -1275,11 +1258,10 @@ static void SkipSmallest_ValueIndex( return; } - -#ifdef IVAS_FLOAT_FIXED +#else static void SkipSmallest_ValueIndex_fx( Word16 *use_inds, /* i/o: List of indices to use */ - const ValueIndex_t *VI, /* i : List of value-index items */ + const ValueIndex_t *VI, /* i : List of value-index items */ const Word16 N, /* i : Length of list */ const Word16 n_smallest /* i : Number of items to skip */ ) @@ -1294,7 +1276,7 @@ static void SkipSmallest_ValueIndex_fx( move32(); candidate_max_i = 0; move16(); - FOR ( j = 0; j < n_smallest; j++ ) + FOR( j = 0; j < n_smallest; j++ ) { skip_inds[j] = j; move16(); @@ -1310,9 +1292,9 @@ static void SkipSmallest_ValueIndex_fx( /* Look in the remainder of the list for smaller values */ FOR( i = n_smallest; i < N; i++ ) { - FOR ( j = 0; j < n_smallest; j++ ) + FOR( j = 0; j < n_smallest; j++ ) { - IF ( LT_32( VI[i].val_fx, VI[skip_inds[j]].val_fx ) ) + IF( LT_32( VI[i].val_fx, VI[skip_inds[j]].val_fx ) ) { /* Found a smaller value, so it goes into the list, replacing candidate_max. */ skip_inds[candidate_max_i] = i; @@ -1320,9 +1302,9 @@ static void SkipSmallest_ValueIndex_fx( candidate_max = VI[i].val_fx; move32(); /* Update candidate_max */ - FOR ( k = 0; k < n_smallest; k++ ) + FOR( k = 0; k < n_smallest; k++ ) { - IF ( GT_32( VI[skip_inds[k]].val_fx, candidate_max ) ) + IF( GT_32( VI[skip_inds[k]].val_fx, candidate_max ) ) { candidate_max = VI[skip_inds[k]].val_fx; move32(); @@ -1355,7 +1337,7 @@ static void SkipSmallest_ValueIndex_fx( { use_inds[k] = j; move16(); - k = add(k, 1); + k = add( k, 1 ); } } diff --git a/lib_rend/ivas_objectRenderer_mix.c b/lib_rend/ivas_objectRenderer_mix.c index c0750a26a3809815cd51c4dbed770a9a0949f452..cfb3ec5dd7e484a6d8e8e7f069f283076629e9c2 100644 --- a/lib_rend/ivas_objectRenderer_mix.c +++ b/lib_rend/ivas_objectRenderer_mix.c @@ -43,6 +43,8 @@ #include "prot_fx2.h" #endif // IVAS_FLOAT_FIXED +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED + /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ @@ -211,6 +213,9 @@ void TDREND_MIX_Dealloc_fx( { IF ( EQ_16(hBinRendererTd->HrFiltSet_p->FilterMethod , TDREND_HRFILT_Method_BSplineModel) ) { +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED + BSplineModelEvalDealloc( &hBinRendererTd->HrFiltSet_p->ModelParams, &hBinRendererTd->HrFiltSet_p->ModelEval ); +#endif BSplineModelEvalDealloc_fx( &hBinRendererTd->HrFiltSet_p->ModelParams, &hBinRendererTd->HrFiltSet_p->ModelEval ); } ELSE @@ -432,10 +437,17 @@ ivas_error TDREND_MIX_Init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } - if ( ( error = DefaultBSplineModel( hBinRendererTd->HrFiltSet_p, output_Fs ) ) != IVAS_ERR_OK ) +#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 @@ -631,59 +643,41 @@ ivas_error TDREND_MIX_AddSrc( #ifdef IVAS_FLOAT_FIXED static ivas_error BSplineModelEvalAlloc_fx( - ModelParams_t *model, /* i : Model parameters */ - ModelEval_t *modelEval /* i/o: Model evaluation structure */ -) -{ - IF((modelEval->hrfModL_fx = (Word32 *)malloc(model->K * sizeof(Word32))) == NULL) - { - return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n")); - } - - IF((modelEval->hrfModR_fx = (Word32 *)malloc(model->K * sizeof(Word32))) == NULL) - { - return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n")); - } - /*To be removed later: floating pointer memory allocation*/ - IF((modelEval->hrfModL = (float *)malloc(model->K * sizeof(float))) == NULL) - { - return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n")); - } - IF((modelEval->hrfModR = (float *)malloc(model->K * sizeof(float))) == NULL) - { - return (IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n")); - } - /*---------------------------------------------ends-here*/ - return IVAS_ERR_OK; -} -#endif -static ivas_error BSplineModelEvalAlloc( ModelParams_t *model, /* i : Model parameters */ ModelEval_t *modelEval /* i/o: Model evaluation structure */ ) { - if ( ( modelEval->hrfModL = (float *) malloc( model->K * sizeof( float ) ) ) == NULL ) + IF( ( modelEval->hrfModL_fx = (Word32 *) malloc( model->K * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } - if ( ( modelEval->hrfModR = (float *) malloc( model->K * sizeof( float ) ) ) == NULL ) + IF( ( modelEval->hrfModR_fx = (Word32 *) malloc( model->K * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - IF ( ( modelEval->hrfModL_fx = (Word32 *) malloc( model->K * sizeof(Word32) ) ) == NULL ) + + return IVAS_ERR_OK; +} +#else +static ivas_error BSplineModelEvalAlloc( + ModelParams_t *model, /* i : Model parameters */ + ModelEval_t *modelEval /* i/o: Model evaluation structure */ +) +{ + if ( ( modelEval->hrfModL = (float *) malloc( model->K * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } - IF ( ( modelEval->hrfModR_fx = (Word32 *) malloc( model->K * sizeof(Word32) ) ) == NULL ) + + if ( ( modelEval->hrfModR = (float *) malloc( model->K * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } -#endif // DEBUG return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -1043,7 +1037,7 @@ static ivas_error DefaultBSplineModel_fx( return IVAS_ERR_OK; } -#endif +#else static ivas_error DefaultBSplineModel( TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* o : Loaded HR filter set */ const int32_t output_Fs /* i : Output sampling rate */ @@ -1107,26 +1101,13 @@ static ivas_error DefaultBSplineModel( /* float parameters */ model->elevKSeq = (const float *) defaultHRIR_rom_elevKSeq; model->elevBsShape = (const float *) defaultHRIR_rom_elevBsShape; -#ifdef IVAS_FLOAT_FIXED - model->elevKSeq_fx = defaultHRIR_rom_elevKSeq_fx; - model->elevBsShape_fx = defaultHRIR_rom_elevBsShape_fx; -#endif 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" ) ); } -#ifdef IVAS_FLOAT_FIXED - 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" ) ); - } -#endif // IVAS_FLOAT_FIXED model->azimBsShape[0] = (const float *) defaultHRIR_rom_azimBsShape; -#ifdef IVAS_FLOAT_FIXED - model->azimBsShape_fx[0] = defaultHRIR_rom_azimBsShape_fx; -#endif 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" ) ); @@ -1139,30 +1120,10 @@ static ivas_error DefaultBSplineModel( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - IF ( ( model->azimKSeq_fx = (Word32 **) malloc( 18 * sizeof(Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); - } - IF ( ( model->azimKSeq_fx[0] = (Word32 *) malloc( 2 * sizeof(Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); - } - IF ( ( model->azimKSeq_fx[model->elevDim3 - 1] = (Word32 *) malloc( 2 * sizeof(Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); - } -#endif // IVAS_FLOAT_FIXED 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; -#ifdef IVAS_FLOAT_FIXED - model->azimKSeq_fx[0][0] = 0; - model->azimKSeq_fx[model->elevDim3 - 1][0] = 0; - model->azimKSeq_fx[0][1] = 360<azimKSeq_fx[model->elevDim3 - 1][1] = 360<elevDim3 - 1; i++ ) { @@ -1170,22 +1131,10 @@ static ivas_error DefaultBSplineModel( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - 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" ) ); - } -#endif for ( j = 0; j < model->azimDim2[i]; j++ ) { model->azimKSeq[i][j] = (float) defaultHRIR_rom_azimSegSamples[0] * j; } -#ifdef IVAS_FLOAT_FIXED - FOR ( j = 0; j < model->azimDim2[i]; j++ ) - { - model->azimKSeq_fx[i][j] = L_shl(L_mult0(defaultHRIR_rom_azimSegSamples[0], j), Q22); - } -#endif } switch ( output_Fs ) @@ -1195,27 +1144,10 @@ static ivas_error DefaultBSplineModel( model->AlphaR = (const float *) defaultHRIR_rom_AlphaR48; model->EL = (const float *) defaultHRIR_rom_EL48; model->ER = (const float *) defaultHRIR_rom_ER48; -#ifdef IVAS_FLOAT_FIXED - model->AlphaL_fx = (const Word32 *)defaultHRIR_rom_AlphaL48_fx; - model->AlphaL_e = 1; - move16(); - model->AlphaR_fx = (const Word32 *)defaultHRIR_rom_AlphaR48_fx; - model->AlphaR_e = 1; - move16(); - model->EL_fx = (const Word32 *)defaultHRIR_rom_EL48_fx; - model->EL_e = 3; - move16(); - model->ER_fx = (const Word32 *)defaultHRIR_rom_ER48_fx; - model->ER_e = 3; - move16(); -#endif model->K = 128; if ( HrFiltSet_p->ModelParams.UseItdModel ) { modelITD->resamp_factor = 1.0f; -#ifdef IVAS_FLOAT_FIXED - modelITD->resamp_factor_fx = ONE_IN_Q14; -#endif } break; case 32000: @@ -1223,27 +1155,10 @@ static ivas_error DefaultBSplineModel( model->AlphaR = (const float *) defaultHRIR_rom_AlphaR32; model->EL = (const float *) defaultHRIR_rom_EL32; model->ER = (const float *) defaultHRIR_rom_ER32; -#ifdef IVAS_FLOAT_FIXED - model->AlphaL_fx = (const Word32 *)defaultHRIR_rom_AlphaL32_fx; - model->AlphaL_e = 1; - move16(); - model->AlphaR_fx = (const Word32 *)defaultHRIR_rom_AlphaR32_fx; - model->AlphaR_e = 1; - move16(); - model->EL_fx = (const Word32 *)defaultHRIR_rom_EL32_fx; - model->EL_e = 3; - move16(); - model->ER_fx = (const Word32 *)defaultHRIR_rom_ER32_fx; - model->ER_e = 3; - move16(); -#endif model->K = 86; if ( HrFiltSet_p->ModelParams.UseItdModel ) { modelITD->resamp_factor = RESAMPLE_FACTOR_32_48; -#ifdef IVAS_FLOAT_FIXED - modelITD->resamp_factor_fx = RESAMPLE_FACTOR_32_48_FX; -#endif } break; case 16000: @@ -1251,27 +1166,10 @@ static ivas_error DefaultBSplineModel( model->AlphaR = (const float *) defaultHRIR_rom_AlphaR16; model->EL = (const float *) defaultHRIR_rom_EL16; model->ER = (const float *) defaultHRIR_rom_ER16; -#ifdef IVAS_FLOAT_FIXED - model->AlphaL_fx = (const Word32 *)defaultHRIR_rom_AlphaL16_fx; - model->AlphaL_e = 1; - move16(); - model->AlphaR_fx = (const Word32 *)defaultHRIR_rom_AlphaR16_fx; - model->AlphaR_e = 1; - move16(); - model->EL_fx = (const Word32 *)defaultHRIR_rom_EL16_fx; - model->EL_e = 3; - move16(); - model->ER_fx = (const Word32 *)defaultHRIR_rom_ER16_fx; - model->ER_e = 3; - move16(); -#endif model->K = 43; if ( HrFiltSet_p->ModelParams.UseItdModel ) { modelITD->resamp_factor = RESAMPLE_FACTOR_16_48; -#ifdef IVAS_FLOAT_FIXED - modelITD->resamp_factor_fx = RESAMPLE_FACTOR_16_48_FX; -#endif } break; default: @@ -1294,9 +1192,6 @@ static ivas_error DefaultBSplineModel( modelITD->elevBsStart[3] = 21; modelITD->elevKSeq = defaultHRIR_rom_ITD_elevKSeq; -#ifdef IVAS_FLOAT_FIXED - modelITD->elevKSeq_fx = defaultHRIR_rom_ITD_elevKSeq_fx; -#endif modelITD->azimBsLen[0] = 11; modelITD->azimBsLen[1] = 21; @@ -1310,19 +1205,9 @@ static ivas_error DefaultBSplineModel( modelITD->azimSegSamples = 10; modelITD->azimKSeq = defaultHRIR_rom_ITD_azimKSeq; -#ifdef IVAS_FLOAT_FIXED - modelITD->azimKSeq_fx = defaultHRIR_rom_ITD_azimKSeq_fx; -#endif modelITD->W = (const float *) defaultHRIR_rom_ITD_W; modelITD->azimBsShape = (const float *) defaultHRIR_rom_ITD_azimBsShape; modelITD->elevBsShape = (const float *) defaultHRIR_rom_ITD_elevBsShape; -#ifdef IVAS_FLOAT_FIXED - modelITD->W_fx = (const Word32 *)defaultHRIR_rom_ITD_W_fx;//Q25 - modelITD->W_e = 6; - move16(); - modelITD->azimBsShape_fx = defaultHRIR_rom_ITD_azimBsShape_fx; - modelITD->elevBsShape_fx = defaultHRIR_rom_ITD_elevBsShape_fx; -#endif HRTF_model_precalc( model ); @@ -1337,3 +1222,4 @@ static ivas_error DefaultBSplineModel( return IVAS_ERR_OK; } +#endif diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 130a1faa622e351adbcf7122c8065a4a11462eea..39347f1bfb3c0637da38108ac956be3a02063620 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -399,6 +399,7 @@ static void TDREND_SRC_REND_Init( * Update the HR filter due to spatial change. --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ @@ -522,8 +523,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( return; } - -#ifdef IVAS_FLOAT_FIXED +#else void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ @@ -562,17 +562,18 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( *filterlength = s_min( HrFiltSet_p->FiltLength, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - IF ( SrcSpatial_p->PosType == TDREND_POSTYPE_ABSOLUTE ) + IF( 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. move16(); - ListRelDist = TDREND_SPATIAL_VecNorm_fx( ListRelPos, ListRelPos_e, &ListRelDist_e); + ListRelDist = TDREND_SPATIAL_VecNorm_fx( ListRelPos, ListRelPos_e, &ListRelDist_e ); /* 2. Evaluate the Elevation and Azimuth angles */ - test(); test(); + test(); + test(); IF( ( ListRelPos[0] == 0 ) && ( ListRelPos[1] == 0 ) && ( ListRelPos[2] == 0 ) ) { Elev = 0; @@ -603,7 +604,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( /* Directional gain */ *SrcRend_p->DirGain_p_fx = ONE_IN_Q14; move16(); - IF ( SrcSpatial_p->DirAttenEnabled ) + IF( SrcSpatial_p->DirAttenEnabled ) { *SrcRend_p->DirGain_p_fx = TDREND_SRC_SPATIAL_GetDirGain_fx( &SrcSpatial_p->DirAtten, SrcSpatial_p->Front_p_fx, ListRelPosAbs, 6 ); } @@ -611,128 +612,126 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( /* Distance gain */ *SrcRend_p->DistGain_p_fx = ONE_IN_Q14; move16(); - IF ( hBinRendererTd->UseCommonDistAttenModel ) + IF( hBinRendererTd->UseCommonDistAttenModel ) { - IF ( hBinRendererTd->DistAttenEnabled ) + IF( hBinRendererTd->DistAttenEnabled ) { SrcSpatial_p->DistAtten.DistAttenModel = hBinRendererTd->DistAttenModel; *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); } } - 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 ){ + *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); + } +} - /* 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 ) ); +/* 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 ) ); - /* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP */ +/* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP */ - elev_delta = L_sub( Elev, Src_p->elev_prev_fx ); - azim_delta = L_sub( Azim, Src_p->azim_prev_fx ); +elev_delta = L_sub( Elev, Src_p->elev_prev_fx ); +azim_delta = L_sub( Azim, Src_p->azim_prev_fx ); - Src_p->elev_prev_fx = Elev; - move32(); - Src_p->azim_prev_fx = Azim; - move32(); +Src_p->elev_prev_fx = Elev; +move32(); +Src_p->azim_prev_fx = Azim; +move32(); - /* 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(); - } +/* 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(); +} - test(); - IF ( ( *intp_count > 0 ) && subframe_update_flag ) +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++ ) { - /* 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 ) ); - hrf_left_prev[i] = L_shr( hrf_left_prev[i], sub( tmp_e, *hrf_left_prev_e ) ); - } - *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(); + 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 ) ); + } + *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 ); + 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++ ) - { - 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 ) ); - } - *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 + tmp_e = s_max( *hrf_right_prev_e, hrf_right_e ); + FOR( Word16 i = 0; i < *filterlength; i++ ) { - /* 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[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 ) ); } + *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(); - return; + 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; } #endif @@ -847,7 +846,7 @@ static void TDREND_SRC_SPATIAL_Init_fx( 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_Q14; + SrcSpatial_p->DistAtten.RollOffFactor_fx = ONE_IN_Q30; move16(); return; @@ -898,15 +897,16 @@ static void TDREND_SRC_SPATIAL_Init( /* 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; -#ifdef IVAS_FLOAT_FIXED +#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_Q14; + SrcSpatial_p->DistAtten.RollOffFactor_fx = ONE_IN_Q30; move16(); #endif @@ -1098,6 +1098,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( /* o : Directional Gain Output --------------------------------------------------------------------*/ /*! r: Gain value */ +#ifndef IVAS_FLOAT_FIXED static float TDREND_SRC_SPATIAL_GetDistGain( const TDREND_DistAtten_t *DistAtten_p, /* i : Distance attenuation parameters */ const float Dist /* i : Distance value */ @@ -1132,8 +1133,7 @@ static float TDREND_SRC_SPATIAL_GetDistGain( return DistGain; } - -#ifdef IVAS_FLOAT_FIXED +#else static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( /* o : Distance gain Q14 */ const TDREND_DistAtten_t *DistAtten_p, /* i : Distance attenuation parameters */ const Word32 Dist_fx, /* i : Distance value */ @@ -1161,7 +1161,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( /* o : Distance gain { case TDREND_DIST_ATTEN_MODEL_INV_DIST: tmp32 = BASOP_Util_Add_Mant32Exp( Dist2_fx, Dist2_e, L_negate( DistAtten_p->RefDist_fx ), 1, &tmp_e ); // exp: tmp_e - tmp32 = Mpy_32_32( tmp32, DistAtten_p->RefDist_fx ); // exp: 1 + tmp_e + tmp32 = Mpy_32_32( tmp32, DistAtten_p->RollOffFactor_fx ); // exp: 1 + tmp_e tmp32 = BASOP_Util_Add_Mant32Exp( DistAtten_p->RefDist_fx, 1, tmp32, add( 1, tmp_e ), &tmp_e ); // exp: tmp_e DistGain_fx = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, tmp32, &DistGain_e ); DistGain_e = add( DistGain_e, sub( 1, tmp_e ) ); @@ -1185,7 +1185,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( /* o : Distance gain move16(); } tmp32 = BASOP_Util_Add_Mant32Exp( Dist2_fx, Dist2_e, L_negate( DistAtten_p->RefDist_fx ), 1, &tmp_e ); // exp: tmp_e - tmp32 = Mpy_32_32( tmp32, DistAtten_p->RefDist_fx ); // exp: 1 + tmp_e + tmp32 = Mpy_32_32( tmp32, DistAtten_p->RollOffFactor_fx ); // exp: 1 + tmp_e tmp32 = BASOP_Util_Add_Mant32Exp( DistAtten_p->RefDist_fx, 1, tmp32, add( 1, tmp_e ), &tmp_e ); // exp: tmp_e DistGain_fx = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, tmp32, &DistGain_e ); DistGain_e = add( DistGain_e, sub( 1, tmp_e ) ); @@ -1193,7 +1193,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( /* o : Distance gain BREAK; } - DistGain_fx = shr( DistGain_fx, 1 - DistGain_e ); // Reducing it to Q14 + DistGain_fx = shr( DistGain_fx, 1 - DistGain_e ); // Reducing it to Q14 return DistGain_fx; } diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index 0f8aa96338c3665999efe8db864dc043628b3108..21873782ff0d3aad067c4a8177c17f295348d2ce 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -49,6 +49,10 @@ *------------------------------------------------------------------------------------------*/ #define OTR_UPDATE_RATE (float) FRAMES_PER_SEC /* rate of the Process() calls [Hz]; 1x per IVAS frame */ +#ifdef NONBE_FIX_738_QUATERNION_SLERP_PRECISION +#define COS_ONE_TENTH_DEGREE ( 0.999998476913288f ) +#endif +#define COS_ONE_TENTH_DEGREE_FX 2147480320 //Q31 /*------------------------------------------------------------------------------------------* @@ -298,21 +302,21 @@ static void QuaternionDivision_fx( IVAS_QUATERNION *const r, Word16 den_e ) { - float den = me2f( d, den_e ); - IVAS_QUATERNION q_flt; - Word16 e_temp; - q_flt.w = me2f( q.w_fx, 31 - q.w_qfact ); - q_flt.x = me2f( q.x_fx, 31 - q.x_qfact ); - q_flt.y = me2f( q.y_fx, 31 - q.y_qfact ); - q_flt.z = me2f( q.z_fx, 31 - q.z_qfact ); - f2me( ( q_flt.w / den ), &r->w_fx, &e_temp ); - r->w_qfact = 31 - e_temp; - f2me( ( q_flt.x / den ), &r->x_fx, &e_temp ); - r->x_qfact = 31 - e_temp; - f2me( ( q_flt.y / den ), &r->y_fx, &e_temp ); - r->y_qfact = 31 - e_temp; - f2me( ( q_flt.z / den ), &r->z_fx, &e_temp ); - r->z_qfact = 31 - e_temp; + Word16 scale_e, result_e = 0; + r->w_fx = L_deposit_h(BASOP_Util_Divide3232_Scale((q.w_fx), d, &scale_e)); + result_e = scale_e + ((31 - q.w_qfact) - den_e); // e+e1-e2// + r->w_qfact = 31 - result_e; + r->x_fx = L_deposit_h(BASOP_Util_Divide3232_Scale((q.x_fx), d, &scale_e)); + result_e = scale_e + ((31 - q.x_qfact) - den_e); + r->x_qfact = 31 - result_e; + r->y_fx = L_deposit_h(BASOP_Util_Divide3232_Scale((q.y_fx), d, &scale_e)); + result_e = scale_e + ((31 - q.y_qfact) - den_e); + r->y_qfact = 31 - result_e; + r->z_fx = L_deposit_h(BASOP_Util_Divide3232_Scale((q.z_fx), d, &scale_e)); + result_e = scale_e + ((31 - q.z_qfact) - den_e); + r->z_qfact = 31 - result_e; + + } #endif @@ -355,85 +359,156 @@ static void QuaternionNormalize_fx( * Computes a spherical linear interpolation between two quaternions *------------------------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void QuaternionSlerp( const IVAS_QUATERNION q1, const IVAS_QUATERNION q2, const float t, IVAS_QUATERNION *const r ) { - float angle, denom, s, s2; +#ifdef NONBE_FIX_738_QUATERNION_SLERP_PRECISION + IVAS_QUATERNION r1, r2; + float phi, sinPhi, cosPhi, s1, s2; - s = QuaternionDotProduct( q1, q2 ); + QuaternionNormalize( q1, &r1 ); + QuaternionNormalize( q2, &r2 ); + + cosPhi = QuaternionDotProduct( r1, r2 ); - if ( fabsf( s ) >= 1.0f ) + if ( cosPhi < 0 ) { + cosPhi = -cosPhi; + r2.w = -r2.w; + r2.x = -r2.x; + r2.y = -r2.y; + r2.z = -r2.z; + } - *r = q2; - return; + /* Angle less than one degree, use linear interpolation */ + if ( cosPhi >= COS_ONE_TENTH_DEGREE ) + { + r->w = r1.w + t * ( r2.w - r1.w ); + r->x = r1.x + t * ( r2.x - r1.x ); + r->y = r1.y + t * ( r2.y - r1.y ); + r->z = r1.z + t * ( r2.z - r1.z ); } + else + { + phi = acosf( cosPhi ); + sinPhi = sinf( phi ); + + s1 = sinf( ( 1 - t ) * phi ); + s2 = sinf( t * phi ); - angle = acosf( s ); - denom = sinf( angle ); + r->w = ( s1 * r1.w + s2 * r2.w ) / sinPhi; + r->x = ( s1 * r1.x + s2 * r2.x ) / sinPhi; + r->y = ( s1 * r1.y + s2 * r2.y ) / sinPhi; + r->z = ( s1 * r1.z + s2 * r2.z ) / sinPhi; + } +#else + float angle, denom, s, s2; - s = sinf( ( 1 - t ) * angle ); - s2 = sinf( t * angle ); - r->x = ( q1.x * s + q2.x * s2 ) / denom; + s = QuaternionDotProduct( q1, q2 ); r->y = ( q1.y * s + q2.y * s2 ) / denom; r->z = ( q1.z * s + q2.z * s2 ) / denom; r->w = ( q1.w * s + q2.w * s2 ) / denom; +#endif QuaternionNormalize( *r, r ); return; } -#ifdef IVAS_FLOAT_FIXED +#else void QuaternionSlerp_fx( const IVAS_QUATERNION q1_fx, const IVAS_QUATERNION q2_fx, const Word32 t_fx, IVAS_QUATERNION *const r_fx ) { - float angle, denom, s, s2; - float t = me2f( t_fx, 1 ); - IVAS_QUATERNION q1, q2; + IVAS_QUATERNION r1, r2; + Word32 sinPhi, cosPhi, temp_32; + Word16 q_min, sin_e, phi, s1, s2, temp_16, e_div; + + QuaternionNormalize_fx( q1_fx, &r1 ); + QuaternionNormalize_fx( q2_fx, &r2 ); + Word16 q_dot = 0; - Word32 s_fx = QuaternionDotProduct_fx( q1_fx, q2_fx, &q_dot ); - s = me2f( s_fx, 31 - q_dot ); + cosPhi = QuaternionDotProduct_fx( r1, r2, &q_dot ); + + q_min = s_min( s_min( r1.w_qfact, r1.x_qfact ), s_min( r1.y_qfact, r1.z_qfact ) ); + q_min = s_min( q_min, s_min( s_min( r1.w_qfact, r1.x_qfact ), s_min( r1.y_qfact, r1.z_qfact ) ) ); + r1.w_fx = L_shr( r1.w_fx, sub( r1.w_qfact, q_min ) ); + r1.x_fx = L_shr( r1.x_fx, sub( r1.x_qfact, q_min ) ); + r1.y_fx = L_shr( r1.y_fx, sub( r1.y_qfact, q_min ) ); + r1.z_fx = L_shr( r1.z_fx, sub( r1.z_qfact, q_min ) ); + r2.w_fx = L_shr( r2.w_fx, sub( r2.w_qfact, q_min ) ); + r2.x_fx = L_shr( r2.x_fx, sub( r2.x_qfact, q_min ) ); + r2.y_fx = L_shr( r2.y_fx, sub( r2.y_qfact, q_min ) ); + r2.z_fx = L_shr( r2.z_fx, sub( r2.z_qfact, q_min ) ); + r1.w_qfact = r1.x_qfact = r1.y_qfact = r1.z_qfact = r2.w_qfact = r2.x_qfact = r2.y_qfact = r2.z_qfact = q_min; + + IF( LT_32( cosPhi, 0 ) ) + { + cosPhi = L_negate( cosPhi ); + r2.w_fx = L_negate( r2.w_fx ); + r2.x_fx = L_negate( r2.x_fx ); + r2.y_fx = L_negate( r2.y_fx ); + r2.z_fx = L_negate( r2.z_fx ); + } - if ( fabsf( s ) >= 1.0f ) + /* Angle less than one degree, use linear interpolation */ + IF( GE_32( cosPhi, L_shr( COS_ONE_TENTH_DEGREE_FX, sub( 31, q_dot ) ) ) ) { - *r_fx = q2_fx; - return; + 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 + 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 + 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 + 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 + + r2.w_qfact = r2.x_qfact = r2.y_qfact = r2.z_qfact = sub( q_min, 1 ); } + 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 ); + sinPhi = Sqrt32( temp_32, &sin_e ); - angle = acosf( s ); - denom = sinf( angle ); - - s = sinf( ( 1 - t ) * angle ); - s2 = sinf( t * angle ); - q1.w = me2f( q1_fx.w_fx, 31 - q1_fx.w_qfact ); - q1.x = me2f( q1_fx.x_fx, 31 - q1_fx.x_qfact ); - q1.y = me2f( q1_fx.y_fx, 31 - q1_fx.y_qfact ); - q1.z = me2f( q1_fx.z_fx, 31 - q1_fx.z_qfact ); - q2.w = me2f( q2_fx.w_fx, 31 - q2_fx.w_qfact ); - q2.x = me2f( q2_fx.x_fx, 31 - q2_fx.x_qfact ); - q2.y = me2f( q2_fx.y_fx, 31 - q2_fx.y_qfact ); - q2.z = me2f( q2_fx.z_fx, 31 - q2_fx.z_qfact ); - r_fx->x = ( q1.x * s + q2.x * s2 ) / denom; - r_fx->y = ( q1.y * s + q2.y * s2 ) / denom; - r_fx->z = ( q1.z * s + q2.z * s2 ) / denom; - r_fx->w = ( q1.w * s + q2.w * s2 ) / denom; - - r_fx->w_fx = float_to_fix(r_fx->w, Q29 ); - r_fx->x_fx = float_to_fix(r_fx->x, Q29 ); - r_fx->y_fx = float_to_fix(r_fx->y, Q29 ); - r_fx->z_fx = float_to_fix(r_fx->z, Q29 ); - r_fx->w_qfact = r_fx->x_qfact = r_fx->y_qfact = r_fx->z_qfact = Q29; - QuaternionNormalize_fx( *r_fx, r_fx ); + phi = BASOP_util_atan2( sinPhi, cosPhi, sub( sin_e, sub( 31, q_dot ) ) ); // Q13 + temp_32 = L_shl(Mpy_32_16_1( L_sub( ONE_IN_Q30, t_fx ), phi ),1); // Q29 + + temp_16 = extract_h( temp_32 ); // Q13 + s1 = getSineWord16R2( mult( temp_16, 20860 ) ); // Q15 + + temp_32 = L_shl(Mpy_32_16_1( t_fx, phi ),1); // Q29 + temp_16 = extract_h( temp_32 ); // Q13 + s2 = getSineWord16R2( mult( temp_16, 20860 ) ); // Q15 + + temp_32 = L_add( Mpy_32_16_1( r1.w_fx, s1 ), Mpy_32_16_1( r2.w_fx, s2 ) ); // q_min + r_fx->w_fx = L_deposit_h(BASOP_Util_Divide3232_Scale( temp_32, sinPhi, &e_div )); + e_div = e_div + ( 31 - q_min - sin_e ); + r_fx->w_qfact = 31 - e_div; + + temp_32 = L_add( Mpy_32_16_1( r1.x_fx, s1 ), Mpy_32_16_1( r2.x_fx, s2 ) ); // q_min + r_fx->x_fx = L_deposit_h(BASOP_Util_Divide3232_Scale( temp_32, sinPhi, &e_div )); + e_div = e_div + ( 31 - q_min - sin_e ); + r_fx->x_qfact = 31 - e_div; + + temp_32 = L_add( Mpy_32_16_1( r1.y_fx, s1 ), Mpy_32_16_1( r2.y_fx, s2 ) ); // q_min + r_fx->y_fx = L_deposit_h(BASOP_Util_Divide3232_Scale( temp_32, sinPhi, &e_div )); + e_div = e_div + ( 31 - q_min - sin_e ); + r_fx->y_qfact = 31 - e_div; + + temp_32 = L_add( Mpy_32_16_1( r1.z_fx, s1 ), Mpy_32_16_1( r2.z_fx, s2 ) ); // q_min + r_fx->z_fx = L_deposit_h(BASOP_Util_Divide3232_Scale( temp_32, sinPhi, &e_div )); + e_div = e_div + ( 31 - q_min - sin_e ); + r_fx->z_qfact = 31 - e_div; + } + + QuaternionNormalize_fx(*r_fx, r_fx); return; + } #endif @@ -906,6 +981,7 @@ static void VectorRotationToQuaternion_fx( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_Init( ivas_orient_trk_state_t *pOTR ) /* i/o : orientation tracker handle */ { @@ -937,8 +1013,7 @@ ivas_error ivas_orient_trk_Init( return IVAS_ERR_OK; } - -#ifdef IVAS_FLOAT_FIXED +#else ivas_error ivas_orient_trk_Init_fx( ivas_orient_trk_state_t *pOTR ) /* i/o : orientation tracker handle */ { @@ -957,8 +1032,11 @@ ivas_error ivas_orient_trk_Init_fx( /* configuration parameters */ pOTR->centerAdaptationRate_fx = C_ADP_RATE_Q31; + move32(); pOTR->offCenterAdaptationRate_fx = OFF_C_ADP_RATE_Q31; + move32(); pOTR->adaptationAngle_fx = PI_OVER_4_Q29; /* Excursion angle relative to center at which maximum adaptation rate shall be applied */ + move32(); /* initial adaptivity filter coefficient, will be auto-adapted */ // pOTR->alpha = sinf( PI2 * pOTR->offCenterAdaptationRate / OTR_UPDATE_RATE ); /* start adaptation at off-center rate = fastest rate */ @@ -987,6 +1065,7 @@ ivas_error ivas_orient_trk_Init_fx( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ @@ -1001,14 +1080,13 @@ ivas_error ivas_orient_trk_SetTrackingType( return IVAS_ERR_OK; } - -#ifdef IVAS_FLOAT_FIXED +#else ivas_error ivas_orient_trk_SetTrackingType_fx( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ ) { - IF ( pOTR == NULL ) + IF( pOTR == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } @@ -1037,16 +1115,15 @@ ivas_error ivas_orient_trk_SetReferenceRotation_fx( } /* check for Euler angle signaling */ - // This part is not covered in code coverage for test streams// - /* if ( refRot.w == -3.0f ) - { - Euler2Quat( deg2rad( refRot.x ), deg2rad( refRot.y ), deg2rad( refRot.z ), &pOTR->refRot ); - }*/ + IF( EQ_32( refRot.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) + { + Euler2Quat_fx( deg2rad_fx( refRot.x_fx ), deg2rad_fx( refRot.y_fx ), deg2rad_fx( refRot.z_fx ), &pOTR->refRot ); + } pOTR->refRot = refRot; return IVAS_ERR_OK; } -#endif +#else ivas_error ivas_orient_trk_SetReferenceRotation( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ @@ -1070,7 +1147,7 @@ ivas_error ivas_orient_trk_SetReferenceRotation( return IVAS_ERR_OK; } - +#endif /*-------------------------------------------------------------------* * ivas_orient_trk_GetMainOrientation() @@ -1142,6 +1219,7 @@ ivas_error ivas_orient_trk_GetMainOrientation_fx( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_GetTrackedRotation( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION *pRotation /* i/o: processed rotation */ @@ -1156,14 +1234,14 @@ ivas_error ivas_orient_trk_GetTrackedRotation( return IVAS_ERR_OK; } - -#ifdef IVAS_FLOAT_FIXED +#else ivas_error ivas_orient_trk_GetTrackedRotation_fx( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION *pRotation /* i/o: processed rotation */ ) { - IF ( pOTR == NULL || pRotation == NULL ) + test(); + IF( pOTR == NULL || pRotation == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } @@ -1299,6 +1377,7 @@ ivas_error ivas_orient_trk_SetReferenceVector_fx( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_Process( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION absRot, /* i : absolute head rotation */ @@ -1388,8 +1467,7 @@ ivas_error ivas_orient_trk_Process( return result; } - -#ifdef IVAS_FLOAT_FIXED +#else ivas_error ivas_orient_trk_Process_fx( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION absRot, /* i : absolute head rotation */ @@ -1442,7 +1520,7 @@ ivas_error ivas_orient_trk_Process_fx( Word16 scale_e; Word32 div; - div = L_deposit_h( BASOP_Util_Divide3232_Scale( PI2_C_ADP_RATE_Q31, updateRate_fx, &scale_e ) ); + div = L_deposit_h( BASOP_Util_Divide3232_Scale( pOTR->centerAdaptationRate_fx, updateRate_fx, &scale_e ) ); scale_e = scale_e - 8; // e+e1-e2// // here div value is less so we can use sandwitch rule of sine// @@ -1463,7 +1541,7 @@ ivas_error ivas_orient_trk_Process_fx( QuaternionProduct_fx( pOTR->trkRot, absRot, &pOTR->trkRot ); angle_fx = QuaternionAngle_fx( absRot, pOTR->trkRot ); // Q29 Word16 result_e = 0; - Word16 temp_result = BASOP_Util_Divide3232_Scale( angle_fx, PI_OVER_4_Q29, &result_e ); + Word16 temp_result = BASOP_Util_Divide3232_Scale( angle_fx, pOTR->adaptationAngle_fx, &result_e ); relativeOrientationRate_fx = L_deposit_h( temp_result ); Word32 one_fx; Word16 temp = result_e; @@ -1474,8 +1552,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(pOTR1_fx->offCenterAdaptationRate_fx, pOTR1_fx->centerAdaptationRate_fx); - rateRange_fx = L_sub( OFF_C_ADP_RATE_Q31, C_ADP_RATE_Q31 ); // repalce this with above line once calling functions are converted// + rateRange_fx = L_sub( pOTR->offCenterAdaptationRate_fx, pOTR->centerAdaptationRate_fx ); /* 'if' assumed to perform comparison to 0 */ IF( GT_32( 0, rateRange_fx ) ) { @@ -1495,7 +1572,7 @@ ivas_error ivas_orient_trk_Process_fx( temp_diff = 31 - q_cutoff_prod; cutoff_prod = L_shl( cutoff_prod, temp_diff ); /* Compute adaptivity cutoff frequency: interpolate between minimum (center) and maximum (off-center) values */ - cutoffFrequency_fx = L_add( C_ADP_RATE_Q31, cutoff_prod ); + cutoffFrequency_fx = L_add( pOTR->centerAdaptationRate_fx, cutoff_prod ); cutoff_prod = Mpy_32_32( cutoffFrequency_fx, PI2_C_Q28 ); q_cutoff_prod = 31 + 28 - 31; temp_result = BASOP_Util_Divide3232_Scale( cutoff_prod, updateRate_fx, &result_e ); diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index b5caa3539b431cc089ac3b6aa8552ecb502b91da..ec03c0ead90e9de4c6eaf689c6e06bec02bb9823 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -212,41 +212,43 @@ void ivas_td_decorr_APD_iir_filter_fx( * Amplitude Panning EFAP prototypes *----------------------------------------------------------------------------------*/ -ivas_error efap_init_data( - EFAP_HANDLE *hEFAPdata, /* i/o: handle for EFAP data structure that will be initialized */ - const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ - const float *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ - const int16_t num_speaker_nodes, /* i : number of speaker nodes in the set */ - const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ -); #ifdef IVAS_FLOAT_FIXED -ivas_error efap_init_data_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 */ ); +#else +ivas_error efap_init_data( + EFAP_HANDLE *hEFAPdata, /* i/o: handle for EFAP data structure that will be initialized */ + const float *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ + const float *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ + const int16_t num_speaker_nodes, /* i : number of speaker nodes in the set */ + const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ +); #endif void efap_free_data( EFAP_HANDLE *hEFAPdata /* i/o: EFAP handle to be freed */ ); -void efap_determine_gains( - EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - float *gains, /* o : gain vector for speaker nodes for given direction */ - const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ - const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ - const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ -); #ifdef IVAS_FLOAT_FIXED -void efap_determine_gains_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 */ ); +#else +void efap_determine_gains( + EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + float *gains, /* o : gain vector for speaker nodes for given direction */ + const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ + const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ + const int16_t efap_mode /* i : indicates whether EFAP or EFIP is used */ +); #endif /*----------------------------------------------------------------------------------* * Amplitude Panning VBAP prototypes @@ -319,7 +321,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix( const Word16 ambisonics_order /* i : Ambisonics order */ ); #else -ivas_error ivas_sba_get_hoa_dec_matrix( +ivas_error ivas_sba_get_hoa_dec_matrix_fx( const IVAS_OUTPUT_SETUP hOutSetup, /* i : target output setup */ Word32 **hoa_dec_mtx, /* o : ALLRAD decoder matrix */ const Word16 ambisonics_order /* i : Ambisonics order */ @@ -422,6 +424,18 @@ void initDiffuseResponses_fx( ); #endif +#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], + Word16 q_cldfb, + const Word16 num_frequency_bands, + Word32 *intensity_real_x_fx, + Word32 *intensity_real_y_fx, + Word32 *intensity_real_z_fx, + Word16 *q_intensity_real +); +#else 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], @@ -430,6 +444,7 @@ void computeIntensityVector_dec( float *intensity_real_y, float *intensity_real_z ); +#endif #ifdef IVAS_FLOAT_FIXED void protoSignalComputation_shd_fx( Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -569,7 +584,25 @@ void ivas_dirac_dec_compute_diffuse_proto( const int16_t num_freq_bands, const int16_t slot_idx ); +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_dec_compute_diffuse_proto_fx( + DIRAC_REND_HANDLE hDirACRend, + const Word16 num_freq_bands, + const Word16 slot_idx /* i : slot index */ +); +#endif +#ifdef IVAS_FLOAT_FIXED +void computeDirectionAngles_fx( + Word32 *intensity_real_x_fx, + Word32 *intensity_real_y_fx, + Word32 *intensity_real_z_fx, + Word16 q_intensity_real, + const Word16 num_frequency_bands, + Word16 *azimuth, + Word16 *elevation +); +#else void computeDirectionAngles( float *intensity_real_x, float *intensity_real_y, @@ -578,6 +611,7 @@ void computeDirectionAngles( int16_t *azimuth, int16_t *elevation ); +#endif void ivas_masa_init_stereotype_detection( MASA_STEREO_TYPE_DETECT *stereo_type_detect @@ -780,7 +814,26 @@ void ivas_dirac_dec_output_synthesis_close_fx( void ivas_dirac_dec_output_synthesis_close( DIRAC_REND_HANDLE hDirACRend /* i/o: DirAC handle */ ); - +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_dec_output_synthesis_process_slot_fx( + const Word32 *reference_power, /* i : Estimated power */ + const Word16 q_reference_power, /* i : Estimated power */ + const Word32 *onset, /* i : onset filter */ + const Word16 *azimuth, + const Word16 *elevation, + const Word32 *diffuseness, + Word16 q_diffuseness, + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ + DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ + const Word16 sh_rot_max_order, + const Word32 *p_Rmat, /* i : rotation matrix */ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const Word16 nchan_transport, /* i : number of transport channels*/ + const Word16 md_idx, + const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + const Word16 dec_param_estim); +#endif void ivas_dirac_dec_output_synthesis_process_slot( const float *reference_power, /* i : Estimated power */ const float *onset, /* i : onset filter */ @@ -995,10 +1048,25 @@ void ivas_masa_ext_dirac_render( const int16_t num_subframes /* i : number of subframes to render */ ); +void ivas_masa_ext_dirac_render_fx( + MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ + Word32 *output_f[], /* i/o: input/output signals in time domain */ + const Word16 num_subframes /* i : number of subframes to render */ +); + /*----------------------------------------------------------------------------------* * HRTF *----------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_HRTF_binary_open_fx( + TDREND_HRFILT_FiltSet_t **hHrtfTD /* i/o: TD renderer HRTF handle */ +); + +void ivas_HRTF_binary_close_fx( + TDREND_HRFILT_FiltSet_t **hHrtfTD /* i/o: TD renderer HRTF handle */ +); +#else ivas_error ivas_HRTF_binary_open( TDREND_HRFILT_FiltSet_t **hHrtfTD /* i/o: TD renderer HRTF handle */ ); @@ -1006,11 +1074,33 @@ ivas_error ivas_HRTF_binary_open( void ivas_HRTF_binary_close( TDREND_HRFILT_FiltSet_t **hHrtfTD /* i/o: TD renderer HRTF handle */ ); +#endif ivas_error ivas_HRTF_fastconv_binary_open( HRTFS_FASTCONV **hHrtfFastConv /* i/o: FASTCONV HRTF structure */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_HRTF_fastconv_binary_close_fx( + HRTFS_FASTCONV **hHrtfFastConv /* i/o: FASTCONV HRTF structure */ +); + +ivas_error ivas_HRTF_parambin_binary_open_fx( + HRTFS_PARAMBIN **hHrtfParambin /* i/o: Parametric binauralizer HRTF structure */ +); + +void ivas_HRTF_parambin_binary_close_fx( + HRTFS_PARAMBIN **hHrtfParambin /* i/o: Parametric binauralizer HRTF structure */ +); + +ivas_error ivas_HRTF_CRend_binary_open_fx( + HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ +); + +void ivas_HRTF_CRend_binary_close_fx( + HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ +); +#else void ivas_HRTF_fastconv_binary_close( HRTFS_FASTCONV **hHrtfFastConv /* i/o: FASTCONV HRTF structure */ ); @@ -1030,6 +1120,7 @@ ivas_error ivas_HRTF_CRend_binary_open( void ivas_HRTF_CRend_binary_close( HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ ); +#endif /*----------------------------------------------------------------------------------* @@ -1165,6 +1256,7 @@ void BSplineModelEvalDealloc( /* ----- Object renderer - hrfilt ----- */ +#ifndef IVAS_FLOAT_FIXED void GetFilterFromAngle( TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* i/o: HR filter set structure */ const float Elev, /* i : Elevation, degrees */ @@ -1174,8 +1266,7 @@ void GetFilterFromAngle( float *RightFilter, /* o : Right HR filter */ int16_t *itd /* o : ITD value */ ); - -#ifdef IVAS_FLOAT_FIXED +#else void GetFilterFromAngle_fx( TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* i/o: HR filter set structure */ const Word32 Elev_fx, /* i : Elevation, degrees Q22 */ @@ -1193,14 +1284,6 @@ void HRTF_model_precalc( ModelParams_t *model /* i/o: HRTF Model parameters */ ); -ivas_error TDREND_REND_RenderSourceHRFilt( - TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ - const float *hrf_left_delta, /* i : Left filter interpolation delta */ - const float *hrf_right_delta, /* i : Right filter interpolation delta */ - const int16_t intp_count, /* i : Interpolation count */ - float output_buf[][L_SPATIAL_SUBFR_48k], /* o : Output buffer */ - const int16_t subframe_length /* i : Subframe length in use */ -); #ifdef IVAS_FLOAT_FIXED ivas_error TDREND_REND_RenderSourceHRFilt_fx( TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ @@ -1212,6 +1295,15 @@ ivas_error TDREND_REND_RenderSourceHRFilt_fx( Word32 output_buf_fx[][L_SPATIAL_SUBFR_48k], /* o : Output buffer */ const Word16 subframe_length /* i : Subframe length in use */ ); +#else +ivas_error TDREND_REND_RenderSourceHRFilt( + TDREND_SRC_t *Src_p, /* i/o: The source to be rendered */ + const float *hrf_left_delta, /* i : Left filter interpolation delta */ + const float *hrf_right_delta, /* i : Right filter interpolation delta */ + const int16_t intp_count, /* i : Interpolation count */ + float output_buf[][L_SPATIAL_SUBFR_48k], /* o : Output buffer */ + const int16_t subframe_length /* i : Subframe length in use */ +); #endif /* ----- Object renderer - sources ----- */ @@ -1267,6 +1359,7 @@ ivas_error TDREND_MIX_SRC_SetPlayState( ); #endif // IVAS_FLOAT_FIXED +#ifndef IVAS_FLOAT_FIXED void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ @@ -1282,7 +1375,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( TDREND_SRC_t *Src_p, const int16_t subframe_update_flag /* i : Flag to determine update subframe idx */ ); -#ifdef IVAS_FLOAT_FIXED +#else void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ @@ -1501,7 +1594,7 @@ ivas_error ivas_rend_openCrend( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, HRTFS_CREND_HANDLE hSetOfHRTF, - const int32_t output_Fs + const Word32 output_Fs ); void ivas_rend_closeCrend( @@ -1599,6 +1692,11 @@ ivas_error ivas_binaural_reverb_open_parambin( const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_binaural_reverb_close_fx( + REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ +); +#endif void ivas_binaural_reverb_close( REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ ); @@ -1625,6 +1723,16 @@ void ivas_binaural_reverb_processSubframe_fx( ); #endif +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_reverb_open( + REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ + const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ + const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ + const Word32 *lr_energy_and_iac_fx[], /* i : precomuputed lr energies and iac */ + RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ + const int32_t output_Fs /* i : output sampling rate */ +); +#else ivas_error ivas_reverb_open( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ @@ -1633,6 +1741,7 @@ ivas_error ivas_reverb_open( RENDER_CONFIG_DATA *pConfig, /* i : Reverb configuration */ const int32_t output_Fs /* i : output sampling rate */ ); +#endif // IVAS_FLOAT_FIXED void ivas_reverb_close( REVERB_HANDLE *hReverb /* i/o: Reverberator handle */ @@ -1732,8 +1841,8 @@ void ivas_reverb_iir_filt_init( void ivas_reverb_iir_filt_set( ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ UWord16 nr_taps, /* i : number of IIR filter taps */ - const float *coefA, /* i : A filter coefficients to set */ - const float *coefB /* i : the B filter coefficients to set */ + const Word16 *coefA, /* i : A filter coefficients to set */ + const Word16 *coefB /* i : the B filter coefficients to set */ ); void ivas_reverb_iir_filt_2taps_feed_blk_fx( ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ @@ -1841,6 +1950,10 @@ void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( const int16_t fft_size ); #ifdef IVAS_FLOAT_FIXED +void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( + rv_fftwf_type_complex_fx *spectrum, + Word32 *fft_real, + const Word16 fft_size); void ivas_reverb_define_window_fft_fx( Word32 *pWindow, //output in Q31 const Word16 transitionStart, @@ -1862,8 +1975,8 @@ Word16 ivas_reverb_calc_color_filters_fx( const Word32 *pWindow, const Word16 fft_size, const Word16 delay, - Word32 **pBeqL, - Word32 **pBeqR, + rv_fftwf_type_complex_fx *pBeqL, + rv_fftwf_type_complex_fx *pBeqR, Word16 *q_pBeqL, Word16 *q_pBeqR ); @@ -1884,8 +1997,8 @@ Word16 ivas_reverb_calc_correl_filters_fx( const Word32 *pWindow, //input in Q30 const Word16 fft_size, const Word16 delay, - Word32 **pU, //input in Q31 - Word32 **pV, //input in Q31 + rv_fftwf_type_complex_fx *pU, //input in Q31 + rv_fftwf_type_complex_fx *pV, //input in Q31 Word16 *q_pU, //Output q Word16 *q_pV //output q ); @@ -2068,9 +2181,15 @@ ivas_error ivas_er_process( * Rotation Prototypes *-----------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_headTrack_open_fx( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ +); +#else ivas_error ivas_headTrack_open( HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ ); +#endif void ivas_headTrack_close( HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */ @@ -2082,7 +2201,14 @@ void Euler2Quat( const float roll, /* i : roll (z) */ IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ ); - +#ifdef IVAS_FLOAT_FIXED +void Euler2Quat_fx( + const Word32 yaw, /* i : yaw (x) Q22 */ + const Word32 pitch, /* i : pitch (y) Q22 */ + const Word32 roll, /* i : roll (z) Q22 */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ +); +#endif float deg2rad( float degrees ); @@ -2292,6 +2418,12 @@ void ivas_render_config_close( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_render_config_init_from_rom_fx( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +); +#endif + ivas_error ivas_render_config_init_from_rom( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ); @@ -2519,12 +2651,20 @@ void ivas_create_masa_out_meta( float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : Estimated surround coherence */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_dirac_ana_open_fx( + DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ + Word32 input_Fs +); +#else ivas_error ivas_dirac_ana_open( DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ int32_t input_Fs ); +#endif + #ifdef IVAS_FLOAT_FIXED -void ivas_dirac_ana( +void ivas_dirac_ana_fx( DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ Word32 data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ const Word16 input_frame, /* i : Input frame size */ @@ -2538,9 +2678,16 @@ void ivas_dirac_ana( const int16_t nchan_transport /* i : Number of transport channels */ ); #endif + +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_ana_close_fx( + DIRAC_ANA_HANDLE ( *hDirAC ) /* i/o: analysis DIRAC handle */ +); +#else void ivas_dirac_ana_close( DIRAC_ANA_HANDLE ( *hDirAC ) /* i/o: analysis DIRAC handle */ ); +#endif void ivas_prerend_merge_masa_metadata( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ diff --git a/lib_rend/ivas_reflections.c b/lib_rend/ivas_reflections.c index 7a82e922c8e6ea0d11f0665a05c716382f203bfa..dcb41e6aa867bc0f57dd4aa32da4d0f9fd4e8f35 100644 --- a/lib_rend/ivas_reflections.c +++ b/lib_rend/ivas_reflections.c @@ -600,7 +600,7 @@ ivas_error ivas_er_encoder_init( Function computes reflections using the shoebox library and sets up the circular buffers structure for the early reflections process *-----------------------------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_er_compute_reflections( er_struct_t *reflections ) { @@ -751,6 +751,95 @@ ivas_error ivas_er_compute_reflections( return error; } + +#else +ivas_error ivas_er_compute_reflections( + er_struct_t *reflections) +{ + ivas_error error = IVAS_ERR_OK; + uint16_t circ_len, i, j; + float tmp; + + reflections->is_ready = 0; + + /* Disabled case */ + if (reflections->audio_config == IVAS_AUDIO_CONFIG_INVALID) + { + return error; + } + + /* Run shoebox with current reflection parameters */ + ivas_shoebox_set_scene(&(reflections->shoebox_lib), &(reflections->shoebox_data), reflections->shoebox_lib.cal.list_orig, + reflections->source_positions, reflections->is_cartesian, reflections->is_relative); + + /* Convert reflection times in seconds to samples and keep track of max */ + circ_len = 0; + for (i = 0; i < reflections->shoebox_data.n_sources; i++) + { + for (j = 0; j < reflections->shoebox_data.n_ref; j++) + { + tmp = reflections->shoebox_data.times.data[j + (i * reflections->shoebox_data.n_ref)]; + tmp = roundf(tmp * reflections->output_Fs); + reflections->shoebox_data.times.data[j + (i * reflections->shoebox_data.n_ref)] = tmp; + circ_len = ((uint16_t)tmp > circ_len) ? (uint16_t)tmp : circ_len; + } + } + + /* If max delay is less than max frame size, use max frame size to compute circ buffer length */ + circ_len = (circ_len > (uint16_t)reflections->max_frame_size) ? circ_len : (uint16_t)reflections->max_frame_size; + circ_len += (uint16_t)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 */ + /* Otherwise allocate new circ buffers */ + if (reflections->circ_buffers) + { + if (reflections->circ_len == circ_len) + { + /* circ buffers exist and size is the same */ + set_f(reflections->circ_buffers, 0.0f, reflections->shoebox_data.n_sources * reflections->circ_len); + } + else + { + /* circ buffers exist but size is different */ + reflections->circ_len = circ_len; + free(reflections->circ_buffers); + if ((reflections->circ_buffers = (float *)malloc(reflections->shoebox_data.n_sources * reflections->circ_len * sizeof(float))) == NULL) + { + return IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections buffers"); + } + set_f(reflections->circ_buffers, 0.0f, reflections->shoebox_data.n_sources * reflections->circ_len); + } + } + else + { + /* circ buffers do not exist */ + reflections->circ_len = circ_len; + if ((reflections->circ_buffers = (float *)malloc(reflections->shoebox_data.n_sources * reflections->circ_len * sizeof(float))) == NULL) + { + return IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections buffers"); + } + set_f(reflections->circ_buffers, 0.0f, reflections->shoebox_data.n_sources * reflections->circ_len); + } + + + /* Initialize circular buffer insertion point */ + reflections->circ_insert = reflections->circ_len - (uint16_t)reflections->max_frame_size; + + /* Get total reflections number */ + reflections->n_total_reflections = reflections->shoebox_data.n_sources * reflections->shoebox_data.n_ref; + + /* Check that reflection buffers were allocated */ + if (error != IVAS_ERR_OK) + { + return error; + } + + return error; +} + +#endif + #ifdef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index c51c0e16153a1efa262fd5c3168c8f6c506b9c2f..fb788fa4e0f4f94738a13a2a8b8bd14f8d515333 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" /*-----------------------------------------------------------------------* * Local constants @@ -55,6 +55,20 @@ * Allocates the renderer configuration structure *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_render_config_open( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +) +{ + /* Allocate HR filter set for headphones configuration */ + IF( ( *hRenderConfig = (RENDER_CONFIG_HANDLE) malloc( sizeof( RENDER_CONFIG_DATA ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer configuration!" ); + } + + return IVAS_ERR_OK; +} +#else ivas_error ivas_render_config_open( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ) @@ -67,6 +81,7 @@ ivas_error ivas_render_config_open( return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -75,6 +90,23 @@ ivas_error ivas_render_config_open( * Deallocates the renderer configuration structure *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_render_config_close( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +) +{ + test(); + IF( hRenderConfig == NULL || *hRenderConfig == NULL ) + { + return; + } + + free( *hRenderConfig ); + *hRenderConfig = NULL; + + return; +} +#else void ivas_render_config_close( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ) @@ -89,6 +121,7 @@ void ivas_render_config_close( return; } +#endif /*-------------------------------------------------------------------* @@ -97,6 +130,41 @@ void ivas_render_config_close( * Initializes the renderer configuration structure from ROM *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_render_config_init_from_rom_fx( + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +) +{ + Word16 i; + 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; + ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; + ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_PRE_DELAY; + ( *hRenderConfig )->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_INPUT_DELAY; + ( *hRenderConfig )->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + 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 ); + + Copy32( ivas_reverb_default_fc_fx, ( *hRenderConfig )->roomAcoustics.pFc_input_fx, IVAS_REVERB_DEFAULT_N_BANDS ); + Copy32( ivas_reverb_default_RT60_fx, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60_fx, IVAS_REVERB_DEFAULT_N_BANDS ); + Copy32( ivas_reverb_default_DSR_fx, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr_fx, IVAS_REVERB_DEFAULT_N_BANDS ); + + /*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 */ + } + + return IVAS_ERR_OK; +} +#endif + ivas_error ivas_render_config_init_from_rom( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ) @@ -127,4 +195,4 @@ ivas_error ivas_render_config_init_from_rom( } return IVAS_ERR_OK; -} +} \ No newline at end of file diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 92c7681eb27dca99893a87aff2588aa1ac3c4b84..d9500910162510d5768b41eec807ff7067199a30 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -81,6 +81,10 @@ static Word16 wrap_rad_fixed( /* should be a divisor of the frame length at any sampling rate and an even number*/ #define FFT_FILTER_WND_FLAT_REGION ( 0.40f ) /* flat section (==1) length of FFT filter window, in proportion to overlap */ #define FFT_FILTER_WND_TRANS_REGION ( 0.15f ) /* transition (1->0) length of FFT filter window, in proportion to overlap */ +#ifdef IVAS_FLOAT_FIXED +#define FFT_FILTER_WND_FLAT_REGION_FX ( 26214 )/*Q16 flat section (==1) length of FFT filter window, in proportion to overlap */ +#define FFT_FILTER_WND_TRANS_REGION_FX ( 9830 ) /*Q16 transition (1->0) length of FFT filter window, in proportion to overlap */ +#endif // IVAS_FLOAT_FIXED #define REF_LF_MIN ( 100.0f ) #define REF_LF_MAX ( 250.0f ) #define REF_HF_MIN ( 5000.0f ) @@ -219,19 +223,20 @@ static uint16_t binRend_rand( return (uint16_t) ( hReverb->binRend_RandNext / 65536 ) % 32768; } -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- * ivas_binaural_reverb_setPreDelay() * * *------------------------------------------------------------------------*/ -static void ivas_binaural_reverb_setPreDelay( +#ifdef IVAS_FLOAT_FIXED +static void ivas_binaural_reverb_setPreDelay_fx( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const Word16 delaySamples /* i : reverb pre-delay in CLDFB slots */ ) { - IF ( LT_16( delaySamples, 1 ) ) + IF( LT_16( delaySamples, 1 ) ) { hReverb->preDelayBufferLength = 1; move16(); @@ -239,7 +244,7 @@ static void ivas_binaural_reverb_setPreDelay( return; } - IF ( GT_16( delaySamples, REVERB_PREDELAY_MAX ) ) + IF( GT_16( delaySamples, REVERB_PREDELAY_MAX ) ) { hReverb->preDelayBufferLength = REVERB_PREDELAY_MAX; move16(); @@ -253,12 +258,6 @@ static void ivas_binaural_reverb_setPreDelay( return; } #else -/*------------------------------------------------------------------------- - * ivas_binaural_reverb_setPreDelay() - * - * - *------------------------------------------------------------------------*/ - static void ivas_binaural_reverb_setPreDelay( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const int16_t delaySamples /* i : reverb pre-delay in CLDFB slots */ @@ -284,6 +283,7 @@ static void ivas_binaural_reverb_setPreDelay( } #endif + /*------------------------------------------------------------------------- * ivas_binaural_reverb_setReverbTimes() * @@ -977,9 +977,9 @@ static ivas_error compute_t60_coeffs_fx( Word16 bin_idx, loop_idx, tf_T60_len, len; ivas_error error; - Word16 loop_delay_sec_fx, inv_hfs_fx, norm_f_e, tmp; + Word16 loop_delay_sec_fx, norm_f_e, tmp; Word32 freq_Nyquist_fx = L_shr(output_Fs, 1); - Word16 target_gains_db_fx[RV_LENGTH_NR_FC], target_gains_exp; + Word16 target_gains_db_fx[RV_LENGTH_NR_FC]; Word16 norm_f_fx[RV_LENGTH_NR_FC]; Word32 *targetT60_fx, *pFc_fx; Word16 *pCoeffs_a_fx, *pCoeffs_b_fx, *targetT60_e; @@ -1494,6 +1494,29 @@ static ivas_error initialize_reverb_filters( * Sets t60 number of taps and coefficients A and B *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static ivas_error set_t60_filter( + REVERB_HANDLE hReverb, + const UWord16 branch, + const UWord16 nr_taps, + const Word16 coefA[], + const Word16 coefB[] ) +{ + IF ( GE_32(branch , hReverb->nr_of_branches) ) + { + return IVAS_ERR_INTERNAL; + } + + IF ( GT_32(nr_taps , IVAS_REV_MAX_IIR_FILTER_LENGTH) ) + { + return IVAS_ERR_INTERNAL; + } + + ivas_reverb_iir_filt_set( &( hReverb->t60[branch] ), nr_taps, coefA, coefB ); + + return IVAS_ERR_OK; +} +#else static ivas_error set_t60_filter( REVERB_HANDLE hReverb, const uint16_t branch, @@ -1515,6 +1538,7 @@ static ivas_error set_t60_filter( return IVAS_ERR_OK; } +#endif #ifdef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* @@ -1593,20 +1617,20 @@ static ivas_error set_feedback_gain_fx( static ivas_error set_correl_fft_filter( REVERB_HANDLE hReverb, const UWord16 channel, - rv_fftwf_type_complex *pSpectrum ) + rv_fftwf_type_complex_fx *pSpectrum ) { - if ( channel > 1 ) + IF ( GT_32(channel , 1) ) { return IVAS_ERR_INTERNAL; } - if ( channel == 0 ) + IF ( EQ_32(channel , 0) ) { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_correl_0.fft_spectrum, hReverb->fft_filter_correl_0.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( pSpectrum, hReverb->fft_filter_correl_0.fft_spectrum_fx, hReverb->fft_filter_correl_0.fft_size ); } - else + ELSE { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_correl_1.fft_spectrum, hReverb->fft_filter_correl_1.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( pSpectrum, hReverb->fft_filter_correl_1.fft_spectrum_fx, hReverb->fft_filter_correl_1.fft_size ); } return IVAS_ERR_OK; @@ -1622,20 +1646,20 @@ static ivas_error set_correl_fft_filter( static ivas_error set_color_fft_filter( REVERB_HANDLE hReverb, const UWord16 channel, - rv_fftwf_type_complex *pSpectrum ) + rv_fftwf_type_complex_fx *pSpectrum ) { - if ( channel > 1 ) + IF ( GT_32(channel , 1) ) { return IVAS_ERR_INTERNAL; } - if ( channel == 0 ) + IF ( EQ_32(channel , 0) ) { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_color_0.fft_spectrum, hReverb->fft_filter_color_0.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( pSpectrum, hReverb->fft_filter_color_0.fft_spectrum_fx, hReverb->fft_filter_color_0.fft_size ); } else { - ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( pSpectrum, hReverb->fft_filter_color_1.fft_spectrum, hReverb->fft_filter_color_1.fft_size ); + ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( pSpectrum, hReverb->fft_filter_color_1.fft_spectrum_fx, hReverb->fft_filter_color_1.fft_size ); } return IVAS_ERR_OK; @@ -2121,13 +2145,13 @@ static ivas_error setup_FDN_branches( REVERB_HANDLE hReverb, ivas_reverb_params_t *pParams ) { - int16_t nr_coefs, branch_idx, channel_idx; + Word16 nr_coefs, branch_idx, channel_idx; ivas_error error; - float *pCoef_a, *pCoef_b; + Word16 *pCoef_a, *pCoef_b; error = IVAS_ERR_OK; /* initialize feedback branches */ - for ( branch_idx = 0; branch_idx < IVAS_REV_MAX_NR_BRANCHES; branch_idx++ ) + FOR ( branch_idx = 0; branch_idx < IVAS_REV_MAX_NR_BRANCHES; branch_idx++ ) { ivas_rev_delay_line_init( &( hReverb->delay_line[branch_idx] ), hReverb->loop_delay_buffer_fx[branch_idx], init_loop_delay[branch_idx], pParams->pLoop_delays[branch_idx] ); ivas_reverb_iir_filt_init( &( hReverb->t60[branch_idx] ), IVAS_REV_MAX_IIR_FILTER_LENGTH ); @@ -2135,38 +2159,38 @@ static ivas_error setup_FDN_branches( hReverb->mixer_fx[1][branch_idx] = 0; } clear_buffers( hReverb ); - nr_coefs = pParams->t60_filter_order + 1; + nr_coefs = add(pParams->t60_filter_order , 1); - if ( IVAS_REV_MAX_IIR_FILTER_LENGTH < nr_coefs ) + IF ( LT_16(IVAS_REV_MAX_IIR_FILTER_LENGTH , nr_coefs) ) { return IVAS_ERR_INTERNAL; } - else + ELSE { - for ( branch_idx = 0; branch_idx < pParams->nr_loops; branch_idx++ ) + FOR ( branch_idx = 0; branch_idx < pParams->nr_loops; branch_idx++ ) { - pCoef_a = &pParams->pT60_filter_coeff[2 * nr_coefs * branch_idx + nr_coefs]; - pCoef_b = &pParams->pT60_filter_coeff[2 * nr_coefs * 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*/ - if ( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) + IF ( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = set_feedback_delay( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ) != IVAS_ERR_OK ) + IF ( ( error = set_feedback_delay( 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 ( ( error = set_feedback_gain_fx( hReverb, branch_idx, &( pParams->pLoop_feedback_matrix_fx[branch_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) { return error; } } } - for ( channel_idx = 0; channel_idx < pParams->nr_outputs; channel_idx++ ) + 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 ( ( error = set_mixer_level_fx( hReverb, channel_idx, &( pParams->pLoop_extract_matrix_fx[channel_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) { return error; } @@ -2250,159 +2274,106 @@ ivas_error ivas_reverb_open( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ - const float *lr_energy_and_iac[], /* i : precomuputed lr energies and iac */ + const Word32 *lr_energy_and_iac_fx[], /* i : precomuputed lr energies and iac */ RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ const int32_t output_Fs /* i : output sampling rate */ ) { ivas_error error; REVERB_HANDLE pState = NULL; - int16_t bin_idx, subframe_len, output_frame, predelay_bf_len, loop_idx; + Word16 bin_idx, subframe_len, output_frame, predelay_bf_len, loop_idx; ivas_reverb_params_t params; - rv_fftwf_type_complex pFft_wf_filter_ch0[RV_LENGTH_NR_FC]; - rv_fftwf_type_complex pFft_wf_filter_ch1[RV_LENGTH_NR_FC]; - float pColor_target_l[RV_LENGTH_NR_FC]; - float pColor_target_r[RV_LENGTH_NR_FC]; - float pTime_window[RV_FILTER_MAX_FFT_SIZE]; - float freq_step; - int16_t fft_hist_size, transition_start, transition_length; - int16_t nr_fc_input, nr_fc_fft_filter; + Word32 pColor_target_l_fx[RV_LENGTH_NR_FC]; + Word32 pColor_target_r_fx[RV_LENGTH_NR_FC]; + Word32 pTime_window_fx[RV_FILTER_MAX_FFT_SIZE]; + Word32 freq_step_fx; + Word16 fft_hist_size, transition_start, transition_length; + Word16 nr_fc_input, nr_fc_fft_filter; + rv_fftwf_type_complex_fx pFft_wf_filter_ch0_fx[RV_LENGTH_NR_FC]; + rv_fftwf_type_complex_fx pFft_wf_filter_ch1_fx[RV_LENGTH_NR_FC]; error = IVAS_ERR_OK; - output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); - subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + output_frame = extract_l(Mult_32_16( output_Fs , INV_FRAME_PER_SEC_Q15)); + subframe_len = shr(output_frame , 2); /*output_frame / MAX_PARAM_SPATIAL_SUBFRAMES*/ predelay_bf_len = output_frame; nr_fc_input = hRenderConfig->roomAcoustics.nBands; /* Allocate main reverb. handle */ - if ( ( pState = (REVERB_HANDLE) malloc( sizeof( REVERB_DATA ) ) ) == NULL ) + IF ( ( pState = (REVERB_HANDLE) malloc( sizeof( REVERB_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " ); } - if ( ( error = set_base_config( ¶ms, output_Fs ) ) != IVAS_ERR_OK ) + IF ( ( error = set_base_config( ¶ms, output_Fs ) ) != IVAS_ERR_OK ) { return error; } /* Allocate memory for feedback delay lines */ - for ( loop_idx = 0; loop_idx < IVAS_REV_MAX_NR_BRANCHES; loop_idx++ ) + FOR ( loop_idx = 0; loop_idx < IVAS_REV_MAX_NR_BRANCHES; loop_idx++ ) { - if ( ( pState->loop_delay_buffer_fx[loop_idx] = (Word32 *) malloc( params.pLoop_delays[loop_idx] * sizeof( float ) ) ) == NULL ) + IF ( ( pState->loop_delay_buffer_fx[loop_idx] = (Word32 *) malloc( params.pLoop_delays[loop_idx] * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CREND Reverberator" ); } } /* Allocate memory for the pre-delay delay line */ - if ( ( pState->pPredelay_buffer_fx = (Word32 *) malloc( output_frame * sizeof( float ) ) ) == NULL ) + IF ( ( pState->pPredelay_buffer_fx = (Word32 *) malloc( output_frame * sizeof(Word32) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CREND Reverberator" ); } pState->nr_of_branches = IVAS_REV_MAX_NR_BRANCHES; set_fft_and_datablock_sizes( pState, subframe_len ); - nr_fc_fft_filter = ( pState->fft_size >> 1 ) + 1; + nr_fc_fft_filter = add( extract_l( L_shr( pState->fft_size, 1 ) ), 1 ); /* === 'Control logic': compute the reverb processing parameters from the === */ /* === room, source and listener acoustic information provided in the reverb config === */ /* Setting up shared temporary buffers for fc, RT60, DSR, etc. */ - params.pHrtf_avg_pwr_response_l = &pFft_wf_filter_ch0[0][0]; - params.pHrtf_avg_pwr_response_r = params.pHrtf_avg_pwr_response_l + nr_fc_fft_filter; - params.pRt60 = &pFft_wf_filter_ch1[0][0]; - params.pDsr = params.pRt60 + nr_fc_fft_filter; - params.pFc = &pState->fft_filter_color_0.fft_spectrum[0]; - params.pHrtf_inter_aural_coherence = &pState->fft_filter_color_1.fft_spectrum[0]; - + params.pHrtf_avg_pwr_response_l_fx = &pFft_wf_filter_ch0_fx[0][0]; + params.pHrtf_avg_pwr_response_r_fx = params.pHrtf_avg_pwr_response_l_fx + nr_fc_fft_filter; + params.pRt60_fx = &pFft_wf_filter_ch1_fx[0][0]; + params.pDsr_fx = params.pRt60_fx + nr_fc_fft_filter; + params.pFc_fx = &pState->fft_filter_color_0.fft_spectrum_fx[0]; + params.pHrtf_inter_aural_coherence_fx = &pState->fft_filter_color_1.fft_spectrum_fx[0]; /* Note: these temp buffers can only be used before the final step of the FFT filter design : */ /* before calls to ivas_reverb_calc_correl_filters(...) or to ivas_reverb_calc_color_filters(...) */ /* set the uniform frequency grid for FFT filtering */ - freq_step = 0.5f * output_Fs / ( nr_fc_fft_filter - 1 ); - for ( bin_idx = 0; bin_idx < nr_fc_fft_filter; bin_idx++ ) + freq_step_fx = L_mult0( extract_l(L_shr(output_Fs,2)), div_s( 1, ( nr_fc_fft_filter - 1 ) ) );/*Q14:0.5f * output_Fs / ( nr_fc_fft_filter - 1 )*/ + FOR ( bin_idx = 0; bin_idx < nr_fc_fft_filter; bin_idx++ ) { - params.pFc[bin_idx] = freq_step * bin_idx; + params.pFc_fx[bin_idx] = W_extract_l(W_mult0_32_32(freq_step_fx , bin_idx));/*Q14*/ } - if ( hHrtf == NULL && lr_energy_and_iac != NULL ) + IF ( hHrtf == NULL && lr_energy_and_iac_fx != NULL ) { - params.pHrtf_avg_pwr_response_l_const = lr_energy_and_iac[0]; - params.pHrtf_avg_pwr_response_r_const = lr_energy_and_iac[1]; - params.pHrtf_inter_aural_coherence_const = lr_energy_and_iac[2]; + params.pHrtf_avg_pwr_response_l_const_fx = lr_energy_and_iac_fx[0]; + params.pHrtf_avg_pwr_response_r_const_fx = lr_energy_and_iac_fx[1]; + params.pHrtf_inter_aural_coherence_const_fx = lr_energy_and_iac_fx[2]; } /* set up reverb acoustic data on the basis of HRTF data and renderer config */ - -#ifdef IVAS_FLOAT_FIXED - Word32 *pRt60_fx = (Word32 *)malloc(sizeof(Word32) * nr_fc_fft_filter); - Word32 *pFc_fx = (Word32 *)malloc(sizeof(Word32) * nr_fc_fft_filter); + Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 2 ); Word16 *pRt60_e = (Word16 *)malloc(sizeof(Word16) * nr_fc_fft_filter); - Word32 *pDsr_fx = (Word32 *)malloc(sizeof(Word32) * nr_fc_fft_filter); Word16 *pDsr_e = (Word16 *)malloc(sizeof(Word16) * nr_fc_fft_filter); - Word32 *pHrtf_avg_pwr_response_l_fx = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32)); - Word32 *pHrtf_avg_pwr_response_r_fx = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32)); - Word32 *pHrtf_inter_aural_coherence_fx = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32)); - params.pRt60_fx = pRt60_fx; - params.pFc_fx = pFc_fx; params.pRt60_e = pRt60_e; - params.pDsr_fx = pDsr_fx; params.pDsr_e = pDsr_e; - params.pHrtf_avg_pwr_response_l_fx = pHrtf_avg_pwr_response_l_fx; - params.pHrtf_avg_pwr_response_r_fx = pHrtf_avg_pwr_response_r_fx; - params.pHrtf_inter_aural_coherence_fx = pHrtf_inter_aural_coherence_fx; - - for (int i = 0; i < nr_fc_fft_filter; i++) - { - params.pFc_fx[i] = (Word32)(params.pFc[i] * ONE_IN_Q16); - } - - for (int i = 0; i < 60; i++) - { - hRenderConfig->roomAcoustics.pFc_input_fx[i] = (Word32)(hRenderConfig->roomAcoustics.pFc_input[i] * ONE_IN_Q16); - hRenderConfig->roomAcoustics.pAcoustic_rt60_fx[i] = (Word32)((hRenderConfig->roomAcoustics.pAcoustic_rt60[i]) * ONE_IN_Q26); - hRenderConfig->roomAcoustics.pAcoustic_dsr_fx[i] = (Word32)(hRenderConfig->roomAcoustics.pAcoustic_dsr[i] * ONE_IN_Q30); - } - - hRenderConfig->roomAcoustics.inputPreDelay_fx = (Word32) (hRenderConfig->roomAcoustics.inputPreDelay * ONE_IN_Q27 ); - hRenderConfig->roomAcoustics.acousticPreDelay_fx = (Word32) (hRenderConfig->roomAcoustics.acousticPreDelay * ONE_IN_Q27); set_reverb_acoustic_data_fx( ¶ms, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); - - for (int i = 0; i < nr_fc_fft_filter; i++) { - params.pRt60[i] = fabsf(me2f(pRt60_fx[i], pRt60_e[i])); - params.pDsr[i] = fabsf(me2f(pDsr_fx[i], pDsr_e[i])); - } - - if (hHrtf != NULL) { - for (int i = 0; i < nr_fc_fft_filter; i++) - { - params.pHrtf_avg_pwr_response_l[i] = (float)params.pHrtf_avg_pwr_response_l_fx[i] / (ONE_IN_Q23); - params.pHrtf_avg_pwr_response_r[i] = (float)params.pHrtf_avg_pwr_response_r_fx[i] / (ONE_IN_Q23); - params.pHrtf_inter_aural_coherence[i] = (float)params.pHrtf_inter_aural_coherence_fx[i] / (ONE_IN_Q27); - } - - params.pHrtf_avg_pwr_response_l_const = (const float *)params.pHrtf_avg_pwr_response_l; - params.pHrtf_avg_pwr_response_r_const = (const float *)params.pHrtf_avg_pwr_response_r; - params.pHrtf_inter_aural_coherence_const = (const float *)params.pHrtf_inter_aural_coherence; + Scale_sig32( params.pFc_fx, nr_fc_fft_filter, -2 ); + for ( int i = 0; i < nr_fc_fft_filter; i++ ) + { + params.pRt60_fx[i] = L_abs(params.pRt60_fx[i]); + params.pDsr_fx[i] = L_abs(params.pDsr_fx[i]); } - free(pRt60_fx); - free(pFc_fx); - free(pRt60_e); - free(pDsr_fx); - free(pDsr_e); - free(pHrtf_avg_pwr_response_l_fx); - free(pHrtf_avg_pwr_response_r_fx); - free(pHrtf_inter_aural_coherence_fx); -#else - set_reverb_acoustic_data( ¶ms, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); -#endif - /* set reverb acoustic configuration based on renderer config */ pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; - if ( hRenderConfig->roomAcoustics.use_er == 1 ) + IF ( hRenderConfig->roomAcoustics.use_er == 1 ) { pState->pConfig.roomAcoustics.use_er = hRenderConfig->roomAcoustics.use_er; pState->pConfig.roomAcoustics.lowComplexity = hRenderConfig->roomAcoustics.lowComplexity; @@ -2412,250 +2383,143 @@ ivas_error ivas_reverb_open( pState->dmx_gain_fx = calc_dmx_gain_fx(); /* set up predelay - must be after set_base_config() and before compute_t60_coeffs() */ -#ifdef IVAS_FLOAT_FIXED - hRenderConfig->roomAcoustics.acousticPreDelay_fx = floatToFixed( hRenderConfig->roomAcoustics.acousticPreDelay, 27 ); calc_predelay_fx( ¶ms, hRenderConfig->roomAcoustics.acousticPreDelay_fx, output_Fs ); -#else - calc_predelay( ¶ms, hRenderConfig->roomAcoustics.acousticPreDelay, output_Fs ); -#endif // IVAS_FLOAT_FIXED /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ -#ifdef IVAS_FLOAT_FIXED - float *pCoeffs = params.pT60_filter_coeff; - Word16 *pCoeffs_fx = params.pT60_filter_coeff_fx; - params.pRt60_fx = (Word32 *)malloc(sizeof(Word32) * nr_fc_fft_filter); - params.pFc_fx = (Word32 *)malloc(sizeof(Word32) * nr_fc_fft_filter); - params.pRt60_e = (Word16 *)malloc(sizeof(Word16) * nr_fc_fft_filter); - for (int i = 0; i < nr_fc_fft_filter; i++) - { - params.pFc_fx[i] = (Word32)(params.pFc[i] * ONE_IN_Q14); - } - - for (int i = 0; i < nr_fc_fft_filter; i++) - { - f2me(params.pRt60[i], ¶ms.pRt60_fx[i], ¶ms.pRt60_e[i]); - } - - for (int i = 0; i < 64; i++) { - pCoeffs_fx[i] = (Word16)(pCoeffs[i] * ( 1 << 14)); - } - if ( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ) != IVAS_ERR_OK ) + IF ( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ) != IVAS_ERR_OK ) { return error; } - for (int i = 0; i < 64; i++) { - pCoeffs[i] = (float)pCoeffs_fx[i] / (1 << 14); - } -#else - /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ - if ( ( error = compute_t60_coeffs( ¶ms, nr_fc_fft_filter, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif /* Compute target levels (gains) for the coloration filters */ -#ifdef IVAS_FLOAT_FIXED - Word32 *pFc = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32*)); - Word32 *pDsr = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32*)); Word32 *pHrtf_avg_pwr_response_l_const = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32*)); Word32 *pHrtf_avg_pwr_response_r_const = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32*)); - Word32 *pT60_filter_coeff = (Word32*)malloc((params.nr_loops * 4 + 4) * sizeof(Word32*)); - Word32 *pColor_target_l_fx = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32*)); - Word32 *pColor_target_r_fx = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32*)); + Word16 lenT60_filter_coeff = add(params.t60_filter_order, 1); + lenT60_filter_coeff = add(i_mult(shl(lenT60_filter_coeff, 1), sub(params.nr_loops, 1)), add(lenT60_filter_coeff, 2)); + Word32 *pT60_filter_coeff = (Word32*)malloc((lenT60_filter_coeff) * sizeof(Word32*)); - for (int i = 0; i < nr_fc_fft_filter; i++) + FOR (int i = 0; i < nr_fc_fft_filter; i++) { - pFc[i] = (Word32)(params.pFc[i] * ONE_IN_Q14); - pDsr[i] = (Word32)(params.pDsr[i] * ONE_IN_Q31); - pHrtf_avg_pwr_response_l_const[i] = (Word32)(params.pHrtf_avg_pwr_response_l_const[i] * ONE_IN_Q28); - pHrtf_avg_pwr_response_r_const[i] = (Word32)(params.pHrtf_avg_pwr_response_r_const[i] * ONE_IN_Q28); + params.pDsr_fx[i] = L_shl(params.pDsr_fx[i] , params.pDsr_e[i]); + pHrtf_avg_pwr_response_l_const[i] = L_shl(params.pHrtf_avg_pwr_response_l_const_fx[i] ,5);/*Q23+5*/ + pHrtf_avg_pwr_response_r_const[i] = L_shl(params.pHrtf_avg_pwr_response_r_const_fx[i] ,5);/*Q23+5*/ } - for (int i = 0; i < params.nr_loops * 4 + 4; i++) + FOR (int i = 0; i < lenT60_filter_coeff; i++) { - pT60_filter_coeff[i] = (Word32)(params.pT60_filter_coeff[i] * ONE_IN_Q31); + pT60_filter_coeff[i] = L_shl_sat(params.pT60_filter_coeff_fx[i] ,17); } - ivas_reverb_calc_color_levels_fx(output_Fs, nr_fc_fft_filter, params.nr_loops, pFc, pDsr, pHrtf_avg_pwr_response_l_const, pHrtf_avg_pwr_response_r_const, + 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); - for (int i = 0; i < nr_fc_fft_filter; i++) - { - pColor_target_l[i] = (float)pColor_target_l_fx[i] / ONE_IN_Q30; - pColor_target_r[i] = (float)pColor_target_r_fx[i] / ONE_IN_Q30; - } - free(pFc); - free(pDsr); + free(pHrtf_avg_pwr_response_l_const); free(pHrtf_avg_pwr_response_r_const); free(pT60_filter_coeff); -#else - ivas_reverb_calc_color_levels( output_Fs, nr_fc_fft_filter, params.nr_loops, params.pFc, params.pDsr, params.pHrtf_avg_pwr_response_l_const, params.pHrtf_avg_pwr_response_r_const, - params.pLoop_delays, params.pT60_filter_coeff, pColor_target_l, pColor_target_r ); -#endif + /* Defining appropriate windowing parameters for FFT filters to prevent aliasing */ fft_hist_size = pState->fft_size - pState->fft_subblock_size; - transition_start = (int16_t) roundf( FFT_FILTER_WND_FLAT_REGION * fft_hist_size ); - transition_length = (int16_t) roundf( FFT_FILTER_WND_TRANS_REGION * fft_hist_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 )); /* Compute the window used for FFT filters */ -#ifdef IVAS_FLOAT_FIXED - Word32 *pTime_window_fx = (Word32*)malloc(512 * sizeof(Word32*)); ivas_reverb_define_window_fft_fx(pTime_window_fx, transition_start, transition_length, nr_fc_fft_filter); - for (int i = 0; i < RV_FILTER_MAX_FFT_SIZE; i++) { - pTime_window[i] = (float)pTime_window_fx[i] / ONE_IN_Q31; - } - free(pTime_window_fx); -#else - ivas_reverb_define_window_fft( pTime_window, transition_start, transition_length, nr_fc_fft_filter ); -#endif - /* === Now, copy parameters from ivas_reverb_params_t into DSP blocks === */ /* === to be used for subsequent audio signal processing === */ pState->do_corr_filter = params.do_corr_filter; /* clear & init jot reverb fft filters */ - if ( ( error = initialize_reverb_filters( pState ) ) != IVAS_ERR_OK ) + IF ( ( error = initialize_reverb_filters( pState ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED - Word32** pFft_wf_filter_ch0_fx = (Word32**)malloc(nr_fc_fft_filter * sizeof(Word32*)); - - for (int i = 0; i < nr_fc_fft_filter; i++) { - pFft_wf_filter_ch0_fx[i] = (Word32*)malloc(2 * sizeof(Word32)); - } - - Word32** pFft_wf_filter_ch1_fx = (Word32**)malloc(nr_fc_fft_filter * sizeof(Word32*)); - - for (int i = 0; i < nr_fc_fft_filter; i++) { - pFft_wf_filter_ch1_fx[i] = (Word32*)malloc(2 * sizeof(Word32)); - } - Word32* pWindow_fx = (Word32*)malloc(512 * sizeof(Word32)); -#endif - if ( pState->do_corr_filter ) + Word16 q_pFft_wf_filter_ch0_fx = 23, q_pFft_wf_filter_ch1_fx = 23; + IF ( pState->do_corr_filter ) { + q_pFft_wf_filter_ch0_fx = 31; + q_pFft_wf_filter_ch1_fx = 31; /* Computing correlation filters on the basis of target IA coherence */ -#ifdef IVAS_FLOAT_FIXED - Word16 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] = ((Word32)pFft_wf_filter_ch0[i][0] * ONE_IN_Q31); - pFft_wf_filter_ch0_fx[i][1] = ((Word32)pFft_wf_filter_ch0[i][1] * ONE_IN_Q31); + 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); + pFft_wf_filter_ch0_fx[i][1] = L_shl_sat(pFft_wf_filter_ch0_fx[i][1] , 8); } - for (int i = 0; i < nr_fc_fft_filter; i++) { - pFft_wf_filter_ch1_fx[i][0] = (Word32)(pFft_wf_filter_ch1_fx[i][0] * ONE_IN_Q31); - pFft_wf_filter_ch1_fx[i][1] = (Word32)(pFft_wf_filter_ch1_fx[i][1] * ONE_IN_Q31); + 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); + pFft_wf_filter_ch1_fx[i][1] = L_shl_sat(pFft_wf_filter_ch1_fx[i][1] ,8); } - for (int i = 0; i < RV_FILTER_MAX_FFT_SIZE; i++) { - pWindow_fx[i] = (Word32)(pTime_window[i] * ONE_IN_Q30); + FOR (int i = 0; i < RV_FILTER_MAX_FFT_SIZE; i++) { + pTime_window_fx[i] = L_shr( pTime_window_fx[i], 1 );/*Scaling signal down to 30*/ } Word32* pHrtf_inter_aural_coherence_const = (Word32*)malloc(nr_fc_fft_filter * sizeof(Word32)); - for (int i = 0; i < nr_fc_fft_filter; i++) { - pHrtf_inter_aural_coherence_const[i] = (Word32)(params.pHrtf_inter_aural_coherence_const[i] * ONE_IN_Q30); - } - ivas_reverb_calc_correl_filters_fx(pHrtf_inter_aural_coherence_const, pWindow_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[i][0] = (float)pFft_wf_filter_ch0_fx[i][0] / (1u << q_pFft_wf_filter_ch0_fx); - pFft_wf_filter_ch0[i][1] = (float)pFft_wf_filter_ch0_fx[i][1] / (1u << q_pFft_wf_filter_ch0_fx); - } - - for (int i = 0; i < nr_fc_fft_filter; i++) { - pFft_wf_filter_ch1[i][0] = (float)pFft_wf_filter_ch1_fx[i][0] / (1u << q_pFft_wf_filter_ch1_fx); - pFft_wf_filter_ch1[i][1] = (float)pFft_wf_filter_ch1_fx[i][1] / (1u << q_pFft_wf_filter_ch1_fx); + FOR (int 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*/ } + 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); -#else - ivas_reverb_calc_correl_filters( params.pHrtf_inter_aural_coherence_const, pTime_window, pState->fft_size, 0.0f, pFft_wf_filter_ch0, pFft_wf_filter_ch1 ); -#endif + 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 ); + } + 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 ); + } /* Copying the computed FFT correlation filters to the fft_filter components */ - if ( ( error = set_correl_fft_filter( pState, 0, pFft_wf_filter_ch0 ) ) != IVAS_ERR_OK ) + IF ( ( error = set_correl_fft_filter( pState, 0, pFft_wf_filter_ch0_fx ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = set_correl_fft_filter( pState, 1, pFft_wf_filter_ch1 ) ) != IVAS_ERR_OK ) + IF ( ( error = set_correl_fft_filter( pState, 1, pFft_wf_filter_ch1_fx ) ) != IVAS_ERR_OK ) { return error; } } /* Computing coloration filters on the basis of target responses */ -#if 1 - Word16 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] = pFft_wf_filter_ch0[i][0] * 2147483648; - pFft_wf_filter_ch0_fx[i][1] = pFft_wf_filter_ch0[i][1] * 2147483648; - } - for (int i = 0; i < nr_fc_fft_filter; i++) { - pFft_wf_filter_ch1_fx[i][0] = pFft_wf_filter_ch1_fx[i][0] * 2147483648; - pFft_wf_filter_ch1_fx[i][1] = pFft_wf_filter_ch1_fx[i][1] * 2147483648; - } - for (int i = 0; i < RV_FILTER_MAX_FFT_SIZE; i++) { - pWindow_fx[i] = pTime_window[i] * (1 << 30); - } - - for (int i = 0; i < nr_fc_fft_filter; i++) { - pColor_target_l_fx[i] = pColor_target_l[i] * ONE_IN_Q30; - pColor_target_r_fx[i] = pColor_target_r[i] * ONE_IN_Q30; + 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 ); } - ivas_reverb_calc_color_filters_fx(pColor_target_l_fx, pColor_target_r_fx, pWindow_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[i][0] = (float)pFft_wf_filter_ch0_fx[i][0] / (1u << q_pFft_wf_filter_ch0_fx); - pFft_wf_filter_ch0[i][1] = (float)pFft_wf_filter_ch0_fx[i][1] / (1u << q_pFft_wf_filter_ch0_fx); + 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 ); } - for (int i = 0; i < nr_fc_fft_filter; i++) { - pFft_wf_filter_ch1[i][0] = (float)pFft_wf_filter_ch1_fx[i][0] / (1u << q_pFft_wf_filter_ch1_fx); - pFft_wf_filter_ch1[i][1] = (float)pFft_wf_filter_ch1_fx[i][1] / (1u << q_pFft_wf_filter_ch1_fx); - } + 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*/ - for (int i = 0; i < nr_fc_fft_filter; i++) { - free(pFft_wf_filter_ch1_fx[i]); - free(pFft_wf_filter_ch0_fx[i]); - } - free(pFft_wf_filter_ch1_fx); - free(pFft_wf_filter_ch0_fx); - free(pWindow_fx); - free(pColor_target_r_fx); - free(pColor_target_l_fx); -#else - ivas_reverb_calc_color_filters( pColor_target_l, pColor_target_r, pTime_window, pState->fft_size, 0.0f, pFft_wf_filter_ch0, pFft_wf_filter_ch1 ); -#endif /* Copying the computed FFT colorations filters to the fft_filter components */ - if ( ( error = set_color_fft_filter( pState, 0, pFft_wf_filter_ch0 ) ) != IVAS_ERR_OK ) + IF ( ( error = set_color_fft_filter( pState, 0, pFft_wf_filter_ch0_fx ) ) != IVAS_ERR_OK ) { return error; } - if ( ( error = set_color_fft_filter( pState, 1, pFft_wf_filter_ch1 ) ) != IVAS_ERR_OK ) + IF ( ( error = set_color_fft_filter( pState, 1, pFft_wf_filter_ch1_fx ) ) != IVAS_ERR_OK ) { return error; } /* init predelay */ ivas_rev_delay_line_init( &( pState->predelay_line ), pState->pPredelay_buffer_fx, params.pre_delay, predelay_bf_len ); - for ( Word16 k = 0; k < pState->fft_filter_ols.fft_size; k++ ) - { - pState->fft_filter_correl_0.fft_spectrum_fx[k] = (Word32) ( pState->fft_filter_correl_0.fft_spectrum[k] * ONE_IN_Q31 ); - pState->fft_filter_color_0.fft_spectrum_fx[k] = (Word32) ( pState->fft_filter_color_0.fft_spectrum[k] * ONE_IN_Q31 ); - pState->fft_filter_correl_1.fft_spectrum_fx[k] = (Word32) ( pState->fft_filter_correl_1.fft_spectrum[k] * ONE_IN_Q31 ); - pState->fft_filter_color_1.fft_spectrum_fx[k] = (Word32) ( pState->fft_filter_color_1.fft_spectrum[k] * ONE_IN_Q31 ); - } /* set up feedback delay network */ - if ( ( error = setup_FDN_branches( pState, ¶ms ) ) != IVAS_ERR_OK ) + IF ( ( error = setup_FDN_branches( pState, ¶ms ) ) != IVAS_ERR_OK ) { return error; } - + free( pDsr_e ); + free( pRt60_e ); *hReverb = pState; return error; @@ -3910,11 +3774,12 @@ static ivas_error ivas_binaural_reverb_open( for ( k = 0; k < REVERB_PREDELAY_MAX + 1; k++ ) { +#ifndef IVAS_FLOAT_FIXED set_f( hReverb->preDelayBufferReal[k], 0.0f, hReverb->numBins ); set_f( hReverb->preDelayBufferImag[k], 0.0f, hReverb->numBins ); -#ifdef IVAS_FLOAT_FIXED - set_l( hReverb->preDelayBufferReal_fx[k], 0, hReverb->numBins ); - set_l( hReverb->preDelayBufferImag_fx[k], 0, hReverb->numBins ); +#else + set32_fx( hReverb->preDelayBufferReal_fx[k], 0, hReverb->numBins ); + set32_fx( hReverb->preDelayBufferImag_fx[k], 0, hReverb->numBins ); #endif } @@ -3924,6 +3789,7 @@ static ivas_error ivas_binaural_reverb_open( hReverb->loopBufLengthMax[bin] = (int16_t) ( 500 / ( 1 + bin ) + ( CLDFB_NO_CHANNELS_MAX - bin ) ); len = hReverb->loopBufLengthMax[bin] + hReverb->blockSize; +#ifndef IVAS_FLOAT_FIXED if ( ( hReverb->loopBufReal[bin] = (float *) malloc( len * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); @@ -3935,7 +3801,7 @@ static ivas_error ivas_binaural_reverb_open( } set_f( hReverb->loopBufReal[bin], 0.0f, len ); set_f( hReverb->loopBufImag[bin], 0.0f, len ); -#ifdef IVAS_FLOAT_FIXED +#else if ( ( hReverb->loopBufReal_fx[bin] = (Word32 *) malloc( len * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); @@ -3945,8 +3811,8 @@ static ivas_error ivas_binaural_reverb_open( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); } - set_l( hReverb->loopBufReal_fx[bin], 0, len ); - set_l( hReverb->loopBufImag_fx[bin], 0, len ); + set32_fx( hReverb->loopBufReal_fx[bin], 0, len ); + set32_fx( hReverb->loopBufImag_fx[bin], 0, len ); #endif /* Determine loop buffer length. The following formula is manually tuned to generate sufficiently long @@ -3999,8 +3865,8 @@ static ivas_error ivas_binaural_reverb_open( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); } - set_l( hReverb->outputBufferReal_fx[bin][chIdx], 0, len ); - set_l( hReverb->outputBufferImag_fx[bin][chIdx], 0, len ); + set32_fx( hReverb->outputBufferReal_fx[bin][chIdx], 0, len ); + set32_fx( hReverb->outputBufferImag_fx[bin][chIdx], 0, len ); #else if ( ( hReverb->outputBufferReal[bin][chIdx] = (float *) malloc( len * sizeof( float ) ) ) == NULL ) { @@ -4027,20 +3893,17 @@ static ivas_error ivas_binaural_reverb_open( } ivas_binaural_reverb_setReverbTimes_fx( hReverb, sampling_rate, revTimes_fx, revEnes_fx ); - FOR(Word16 bin = 0; bin < hReverb->numBins; bin++) - { - hReverb->binauralCoherenceDirectGains[bin] = (float)hReverb->binauralCoherenceDirectGains_fx[bin] / ONE_IN_Q31; - hReverb->binauralCoherenceCrossmixGains[bin] = (float)hReverb->binauralCoherenceCrossmixGains_fx[bin] / ONE_IN_Q31; - hReverb->loopAttenuationFactor[bin] = (float)hReverb->loopAttenuationFactor_fx[bin] / ONE_IN_Q31; - hReverb->reverbEqGains[bin] = (float)hReverb->reverbEqGains_fx[bin] / ONE_IN_Q31; - } free(revTimes_fx); free(revEnes_fx); #else ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, revTimes, revEnes ); #endif +#ifdef IVAS_FLOAT_FIXED + ivas_binaural_reverb_setPreDelay_fx( hReverb, preDelay ); +#else ivas_binaural_reverb_setPreDelay( hReverb, preDelay ); +#endif return IVAS_ERR_OK; } @@ -4149,12 +4012,13 @@ ivas_error ivas_binaural_reverb_open_parambin( *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -void ivas_binaural_reverb_close( +void ivas_binaural_reverb_close_fx( REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ ) { Word16 bin, chIdx; + test(); IF( hReverb == NULL || *hReverb == NULL ) { return; @@ -4165,7 +4029,6 @@ void ivas_binaural_reverb_close( FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) { free( ( *hReverb )->tapPhaseShiftType[bin][chIdx] ); - free( ( *hReverb )->tapPointersReal_fx[bin][chIdx] ); free( ( *hReverb )->tapPointersImag_fx[bin][chIdx] ); free( ( *hReverb )->outputBufferReal_fx[bin][chIdx] ); @@ -4185,16 +4048,16 @@ void ivas_binaural_reverb_close( REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ ) { - Word16 bin, chIdx; + int16_t bin, chIdx; - IF( hReverb == NULL || *hReverb == NULL ) + if ( hReverb == NULL || *hReverb == NULL ) { return; } - FOR( bin = 0; bin < ( *hReverb )->numBins; bin++ ) + for ( bin = 0; bin < ( *hReverb )->numBins; bin++ ) { - FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) { free( ( *hReverb )->tapPhaseShiftType[bin][chIdx] ); free( ( *hReverb )->tapPointersReal[bin][chIdx] ); @@ -4211,4 +4074,4 @@ void ivas_binaural_reverb_close( return; } -#endif \ No newline at end of file +#endif diff --git a/lib_rend/ivas_reverb_fft_filter.c b/lib_rend/ivas_reverb_fft_filter.c index ff9b2e71cb63da1a041e87f5b36e8fdb3ea53d2d..47b5292659c76f9f8816de3097deac8bc339ffda 100644 --- a/lib_rend/ivas_reverb_fft_filter.c +++ b/lib_rend/ivas_reverb_fft_filter.c @@ -689,6 +689,26 @@ void ivas_reverb_fft_filter_ComplexMul( * * Convert the FFTWF formatted spectrum to fft_real formatted spectrum *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( + rv_fftwf_type_complex_fx *spectrum, + Word32 *fft_real, + const Word16 fft_size ) +{ + Word16 i, h; + + h = shr(fft_size , 1); + fft_real[0] = spectrum[0][0]; + fft_real[h] = spectrum[h][0]; + for ( i = 1; i < h; i++ ) + { + fft_real[i] = spectrum[i][0]; + fft_real[fft_size - i] = spectrum[i][1]; + } + + return; +} +#endif // IVAS_FLOAT_FIXED void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR( rv_fftwf_type_complex *spectrum, diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index d146071f0aa07fba064b9777a598f560f49d2449..e76cadc3737a56e6983916ecb3d2eed4b0eb0665 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -190,9 +190,9 @@ static void calc_min_phase( return; } - +#ifdef IVAS_FLOAT_FIXED static void calc_min_phase_fx( - Word32 **pSpectrum, + rv_fftwf_type_complex_fx *pSpectrum, const Word16 fft_size, Word32 *pMinPhase, Word16 *q_pCepstrum @@ -359,6 +359,7 @@ static void calc_min_phase_fx( return; } +#endif /*-------------------------------------------------------------------* * calc_min_phase_filter() * @@ -396,9 +397,9 @@ static void calc_min_phase_filter( return; } - +#ifdef IVAS_FLOAT_FIXED static void calc_min_phase_filter_fx( - Word32 **pH_flt, + rv_fftwf_type_complex_fx *pH_flt, const Word16 fft_size, Word16 delay) { @@ -429,6 +430,7 @@ static void calc_min_phase_filter_fx( return; } +#endif /*-------------------------------------------------------------------* * apply_window_fft() * @@ -482,9 +484,9 @@ static void apply_window_fft( return; } - +#ifdef IVAS_FLOAT_FIXED static void apply_window_fft_fx( - Word32 **pH_flt, + rv_fftwf_type_complex_fx *pH_flt, const Word32 *pWindow, const Word16 fft_size, Word16 *q_pFilter @@ -554,6 +556,7 @@ static void apply_window_fft_fx( return; } +#endif /*-------------------------------------------------------------------* * response_step_limit() * @@ -842,15 +845,15 @@ int16_t ivas_reverb_calc_color_filters( return 0; } - +#ifdef IVAS_FLOAT_FIXED Word16 ivas_reverb_calc_color_filters_fx( const Word32 *pTargetL, const Word32 *pTargetR, const Word32 *pWindow, const Word16 fft_size, const Word16 delay, - Word32 **pBeqL, - Word32 **pBeqR, + rv_fftwf_type_complex_fx *pBeqL, + rv_fftwf_type_complex_fx *pBeqR, Word16 *q_pBeqL, Word16 *q_pBeqR ) @@ -883,6 +886,7 @@ Word16 ivas_reverb_calc_color_filters_fx( return 0; } +#endif /*-------------------------------------------------------------------* * ivas_reverb_calc_correl_filters() * @@ -926,14 +930,14 @@ int16_t ivas_reverb_calc_correl_filters( return 0; } - +#ifdef IVAS_FLOAT_FIXED Word16 ivas_reverb_calc_correl_filters_fx( Word32 *pTargetICC, //input in Q30 const Word32 *pWindow, //input in Q30 const Word16 fft_size, const Word16 delay, - Word32 **pU, //input in Q31 - Word32 **pV, //input in Q31 + rv_fftwf_type_complex_fx *pU, //input in Q31 + rv_fftwf_type_complex_fx *pV, //input in Q31 Word16 *q_pU, //Output q Word16 *q_pV //output q ) @@ -976,6 +980,7 @@ Word16 ivas_reverb_calc_correl_filters_fx( return 0; } +#endif /*-------------------------------------------------------------------* * ivas_reverb_calc_color_levels() * @@ -1323,7 +1328,8 @@ void ivas_reverb_interpolate_acoustic_data_fx( input_idx++; } 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(rel_offset, 16); + rel_offset = L_shl_sat(rel_offset, 16+rel_offset_e); + rel_offset_e = 0; } } Word32 mult1; diff --git a/lib_rend/ivas_reverb_iir_filter.c b/lib_rend/ivas_reverb_iir_filter.c index 382da50c1e9ed031c90a20408ff592fe42cc8fe6..faf6f857fe60c97aa0420cf14423e977008903dd 100644 --- a/lib_rend/ivas_reverb_iir_filter.c +++ b/lib_rend/ivas_reverb_iir_filter.c @@ -108,15 +108,15 @@ void ivas_reverb_iir_filt_init( void ivas_reverb_iir_filt_set( ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ UWord16 nr_taps, /* i : number of IIR filter taps */ - const float *coefA, /* i : A filter coefficients to set */ - const float *coefB /* i : the B filter coefficients to set */ + const Word16 *coefA, /* i : A filter coefficients to set */ + const Word16 *coefB /* i : the B filter coefficients to set */ ) { UWord16 i; - IF ( nr_taps > iirFilter->MaxTaps ) + IF ( GT_32(nr_taps , iirFilter->MaxTaps) ) { - nr_taps = (uint16_t) iirFilter->MaxTaps; + nr_taps = (UWord16) iirFilter->MaxTaps; } iirFilter->nr_taps = nr_taps; @@ -126,15 +126,15 @@ void ivas_reverb_iir_filt_set( { FOR ( i = 0; i < iirFilter->nr_taps; i++ ) { - iirFilter->CoefB_fx[i] = (Word32) ( coefB[i] * ONE_IN_Q30 ); + iirFilter->CoefB_fx[i] = L_shl(coefB[i],16) ;/*Q30*/ } } ELSE { FOR ( i = 0; i < iirFilter->nr_taps; i++ ) { - iirFilter->CoefA_fx[i] = (Word32) ( coefA[i] * ONE_IN_Q30 ); - iirFilter->CoefB_fx[i] = (Word32) ( coefB[i] * ONE_IN_Q30 ); + iirFilter->CoefA_fx[i] = L_shl(coefA[i],16) ;/*Q30*/ + iirFilter->CoefB_fx[i] = L_shl(coefB[i],16) ;/*Q30*/ } } diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c index 7a84cc2d1561cd5c60637ac95263bee503c398fc..310968d998fff60e238c0fa13f826b6ec23781b4 100644 --- a/lib_rend/ivas_rom_binauralRenderer.c +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -47698,12 +47698,13 @@ const float fastconvReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX] = #ifdef IVAS_FLOAT_FIXED const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /*Q-31*/= { --741942720,-686022272,-715028288,-775076224,-803800960,-796237568,-770141312,-747545472,-736820992,-711570880, --679682880,-654928832,-633196288,-617506752,-601123648,-580415424,-567025856,-550623424,-536654016,-519776928, --504817568,-493163168,-480456512,-469858688,-456552864,-446008736,-433967776,-425403616,-416412096,-399234400, --392295872,-390756128,-386091776,-384573504,-379121056,-370071552,-367440896,-360672032,-360721408,-363373568, --359359904,-356323360,-351253152,-346943168,-340172160,-336405472,-333613728,-329810528,-325506976,-322043104, --318265664,-314490400,-310715104,-306939840,-303164576,-299389280,-295611872,-291836576,-288061312,-284286048 + 741942720,686022272,715028288,775076224,803800960,796237568,770141312,747545472,736820992, + 711570880,679682880,654928832,633196288,617506752,601123648,580415424,567025856,550623424, + 536654016,519776928,504817568,493163168,480456512,469858688,456552864,446008736,433967776, + 425403616,416412096,399234400,392295872,390756128,386091776,384573504,379121056,370071552, + 367440896,360672032,360721408,363373568,359359904,356323360,351253152,346943168,340172160, + 336405472,333613728,329810528,325506976,322043104,318265664,314490400,310715104,306939840, + 303164576,299389280,295611872,291836576,288061312,284286048 }; #endif // IVAS_FLOAT_FIXED @@ -47720,11 +47721,13 @@ const float parametricReverberationTimes[CLDFB_NO_CHANNELS_MAX] = #ifdef IVAS_FLOAT_FIXED const Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] /*Q-31*/= { - -412276064,-308677152,-243799520,-201511280,-193589216,-171714944,-143009520,-156122064,-164263168,-176233248, - -183105200,-201571408,-218830736,-244229024,-252642864,-243726512,-270851360,-271235776,-266133360,-249251984, - -211587264,-110556752,-64317136,-54165980,-45404248,-41570988,-35878008,-34847216,-39548060,-39554500,-36715528, - -32682554,-30524332,-20815560,-8581345,-3463891,-2072321,-1380832,-1069446,-895500,-652835,-388694,-249108,-242665, - -219043,-167503,-137438,-128849,-135291,-133143,-130996,-111669,-85899,-64424,-30064,-15032,-6442,-2147,0,0, + 412276064,308677152,243799520,201511280,193589216,171714944,143009520,156122064,164263168, + 176233248,183105200,201571408,218830736,244229024,252642864,243726512,270851360,271235776, + 266133360,249251984,211587264,110556752,64317136,54165980,45404248,41570988,35878008, + 34847216,39548060,39554500,36715528,32682554,30524332,20815560,8581345,3463891, + 2072321,1380832,1069446,895500,652835,388694,249108,242665,219043, + 167503,137438,128849,135291,133143,130996,111669,85899,64424, + 30064,15032,6442,2147,0,0 }; #endif // IVAS_FLOAT_FIXED @@ -47739,15 +47742,15 @@ const float parametricReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX] = }; #ifdef IVAS_FLOAT_FIXED -const Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]/*Q-31*/ = +const Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]/*Q-28*/ = { - -1278914560, -1469108608, -2147483647 - 1, -1890004608, -1560359424, -1136244352, -980880320, -822859904, -712393344, - -709882944, -937310016, -1272336768, -1647858688, -2147483647 - 1, -2147483647 - 1, -2147483647 - 1, -2147483647 - 1, -2147483647 - 1, - -2147483647 - 1, -2147483647 - 1, -2147483647 - 1, -2147483647 - 1, -808619904, -378908448, -321778944, -279832160, -294396384, - -628592064, -1246109568, -1574331008, -1577608064, -1642900096, -1631784832, -1183766016, -553299136, -195307200, - -112115824, -117877528, -108836616, -76572824, -47888884, -34220152, -27120570, -22909356, -19503446, -16683800, - -17248588, -23562190, -31726924, -36056252, -35111356, -91716880, -166079936, -142245024, -90293096, -42986180, - -16956530, -6328634, -2001454, -326417 + 159864320,183638576,279548416,236250576,195044928,142030544,122610040,102857488,89049168, + 88735368,117163752,159042096,205982336,298174336,415684640,522399296,684511744,908078208, + 1136966912,1258442624,893532544,352242880,101077488,47363556,40222368,34979020,36799548, + 78574008,155763696,196791376,197201008,205362512,203973104,147970752,69162392,24413400, + 14014478,14734691,13604577,9571603,5986110,4277519,3390071,2863669,2437930, + 2085475,2156073,2945273,3965865,4507031,4388919,11464610,20759992,17780628, + 11286637,5373272,2119566,791079,250181,40802 }; #endif // IVAS_FLOAT_FIXED diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 3a29189236d04f53dc153a7760f03d669ec00808..8354ef582f431bdbe64da7babb2d588f0586b6cb 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -87,7 +87,7 @@ extern float fastconvReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX]; #ifdef IVAS_FLOAT_FIXED extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX];/*Q-31*/ extern const Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX];/*Q-31*/ -extern const Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX];/*Q-31*/ +extern const Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX];/*Q-28*/ #endif // IVAS_FLOAT_FIXED extern const float parametricReverberationTimes[CLDFB_NO_CHANNELS_MAX]; extern const float parametricReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX]; diff --git a/lib_rend/ivas_rom_rend.c b/lib_rend/ivas_rom_rend.c index 539d9acb3b5d6b70291ef794730cec0fddabcfec..eaba2d206c856baf04fdc5cf49cfb2918be3c9c3 100644 --- a/lib_rend/ivas_rom_rend.c +++ b/lib_rend/ivas_rom_rend.c @@ -687,145 +687,284 @@ const float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC] = { 0.203638f, 0.171419f, 0.139199f, 0.126311f, 0.126311f }; #ifdef IVAS_FLOAT_FIXED -const UWord16 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-15*/ = { - 32211, 30587, 25862, 18822, 11164, 4725, 616, 0, 0, 0, 391, 1162, 1415, 1391, 1369, 1263, 947, 562, 379, - 464, 649, 805, 956, 1092, 1095, 970, 900, 898, 824, 639, 482, 465, 528, 533, 431, 283, 164, 85, 34, 6, - 0, 0, 0, 36, 130, 229, 312, 377, 406, 378, 300, 203, 116, 45, 0, 0, 0, 0, 1, 30, 69, 100, 117, 123, 120, - 101, 67, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 31, 59, 76, 79, 68, 50, 29, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 27, 42, 50, 50, 43, 31, 17, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 20, 31, 41, 52, 62, - 71, 79, 88, 96, 103, 110, 117, 123, 128, 130, 130, 128, 123, 114, 103, 91, 76, 59, 41, 23, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25, 17, 0, 55, 108, 53, 0, 52, 247, 19, 0, 66, 338, 70, 0, 115, 303, 168, 0, 74, 212, 193, 0, 28, 149, - 134, 0, 0, 106, 50, 8, 6, 44, 28, 0 -}; -const UWord16 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-15*/ = { - 32069, 31863, 31445, 31191, 31222, 31295, 31151, 30899, 30926, 31400, 31932, 32143, 32002, 31737, 31524, - 31367, 31210, 31068, 30981, 30907, 30745, 30482, 30254, 30187, 30217, 30173, 30053, 29970, 29954, 29932, - 29873, 29838, 29891, 30001, 30076, 30074, 30038, 30029, 30042, 30022, 29950, 29863, 29802, 29756, 29693, - 29603, 29511, 29442, 29391, 29324, 29224, 29114, 29030, 28968, 28887, 28768, 28652, 28590, 28555, 28503, - 28437, 28401, 28413, 28449, 28472, 28486, 28529, 28624, 28747, 28864, 28979, 29136, 29356, 29598, 29813, - 30015, 30241, 30484, 30697, 30848, 30956, 31056, 31153, 31207, 31186, 31110, 31025, 30937, 30804, 30595, - 30363, 30154, 29951, 29709, 29421, 29127, 28860, 28604, 28325, 28020, 27731, 27496, 27304, 27123, 26956, - 26860, 26860, 26920, 27001, 27101, 27250, 27451, 27663, 27848, 28006, 28173, 28359, 28531, 28649, 28726, - 28810, 28905, 28960, 28948, 28898, 28847, 28793, 28702, 28560, 28396, 28248, 28119, 27978, 27806, 27630, - 27493, 27388, 27261, 27097, 26941, 26821, 26713, 26579, 26421, 26276, 26169, 26084, 25993, 25898, 25835, - 25828, 25856, 25879, 25896, 25949, 26049, 26160, 26243, 26305, 26382, 26482, 26570, 26614, 26627, 26654, - 26703, 26734, 26717, 26681, 26679, 26697, 26694, 26661, 26630, 26630, 26654, 26670, 26664, 26659, 26688, - 26748, 26798, 26811, 26824, 26895, 27002, 27062, 27084, 27145, 27265, 27379, 27439, 27491, 27599, 27746, - 27852, 27897, 27955, 28057, 28091, 27925, 27603, 27238, 26740, 25949, 24880, 23702, 22488, 21123, 19491, - 17693, 15981, 14436, 12776, 10592, 7813, 4890, 2543, 1069, 348, 80, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -const UWord16 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-15*/ = { - 32069, 31863, 31445, 31191, 31222, 31295, 31151, 30899, 30926, 31400, 31932, 32143, 32002, 31737, 31524, - 31367, 31210, 31068, 30980, 30907, 30745, 30482, 30254, 30187, 30217, 30173, 30053, 29970, 29954, 29932, - 29873, 29838, 29891, 30001, 30076, 30074, 30038, 30029, 30042, 30022, 29950, 29863, 29802, 29756, 29693, - 29603, 29511, 29442, 29391, 29324, 29224, 29114, 29030, 28968, 28887, 28768, 28652, 28590, 28555, 28503, - 28437, 28401, 28413, 28449, 28472, 28486, 28529, 28624, 28747, 28864, 28979, 29136, 29356, 29598, 29813, - 30015, 30241, 30484, 30697, 30848, 30956, 31056, 31153, 31207, 31186, 31110, 31025, 30937, 30804, 30595, - 30364, 30154, 29951, 29709, 29421, 29127, 28860, 28604, 28325, 28020, 27731, 27496, 27304, 27123, 26956, - 26860, 26860, 26920, 27001, 27101, 27250, 27451, 27663, 27848, 28006, 28173, 28359, 28531, 28649, 28726, - 28810, 28905, 28960, 28948, 28897, 28847, 28793, 28702, 28560, 28396, 28248, 28119, 27978, 27806, 27630, - 27493, 27388, 27261, 27097, 26941, 26821, 26713, 26579, 26421, 26276, 26169, 26084, 25993, 25898, 25835, - 25828, 25856, 25879, 25896, 25949, 26049, 26160, 26243, 26305, 26382, 26482, 26570, 26614, 26627, 26654, - 26703, 26734, 26717, 26681, 26679, 26697, 26694, 26661, 26630, 26630, 26654, 26670, 26664, 26659, 26688, - 26748, 26798, 26811, 26824, 26895, 27002, 27062, 27084, 27145, 27265, 27379, 27439, 27491, 27599, 27746, - 27852, 27897, 27955, 28057, 28090, 27925, 27603, 27238, 26739, 25949, 24880, 23702, 22488, 21123, 19491, - 17693, 15981, 14436, 12776, 10592, 7813, 4890, 2543, 1069, 348, 80, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -const UWord16 defaultHRIR_coherence_32kHz_fx[257] /*Q-15*/ = { - 32012,31549,29232,25671,21280,16002,11011,6448,3083,552,157,0,0,0,88,309,807,1275,1355,1353,1297,1279, - 1213,1075,806,522,304,230,254,387,509,615,715,813,905,940,938,856,788,744,737,725,657,543,399,318,287, - 328,374,403,358,280,179,96,34,5,0,0,0,0,0,0,0,0,0,7,45,98,162,212,256,293,300,291,246,189,123,63,20,3, - 0,0,0,0,0,0,0,0,0,0,0,8,23,31,36,38,34,25,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,11,18,23,19,10,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,11,19,25,28,27,24,16,8,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,9,15,21,28,35,41,48,55,62,68,74, - 79,83,87,91,94,98,102,106,111,119,127,136,145,155,166,177,189,200,210,219,226,232,237,239,239,233,224, - 211,193,174,149,123,97,83,77,81,82 -}; -const UWord16 defaultHRIR_left_avg_power_32kHz_fx[257] /*Q-15*/ = { - 34171,34113,33819,33565,33338,33397,33493,33645,33642,33572,33391,33314,33308,33603,33918,34267,34419, - 34473,34327,34162,33984,33890,33804,33727,33619,33507,33410,33339,33285,33182,33038,32833,32634,32464, - 32400,32383,32399,32360,32296,32193,32118,32060,32045,32018,31983,31916,31868,31850,31897,31963,32035, - 32067,32073,32036,32005,31984,31979,31972,31946,31895,31826,31744,31668,31604,31546,31486,31409,31316, - 31212,31114,31026,30953,30880,30801,30697,30581,30458,30352,30254,30168,30071,29965,29838,29714,29591, - 29503,29422,29352,29272,29187,29096,29020,28956,28928,28903,28879,28839,28796,28758,28744,28748,28783, - 28816,28846,28871,28902,28959,29045,29150,29266,29375,29471,29564,29659,29772,29887,30006,30089,30153, - 30190,30215,30237,30263,30280,30290,30248,30187,30098,30003,29907,29813,29701,29576,29403,29225,29037, - 28868,28704,28543,28361,28165,27941,27724,27516,27327,27141,26948,26738,26518,26298,26093,25910,25750, - 25598,25449,25305,25163,25065,24991,24954,24947,24948,24954,24967,24985,25043,25113,25202,25280,25350, - 25397,25443,25489,25556,25622,25686,25720,25741,25741,25745,25752,25765,25767,25752,25703,25641,25562, - 25486,25413,25336,25245,25135,25000,24859,24722,24599,24486,24373,24250,24112,23969,23831,23716,23612, - 23515,23401,23277,23139,23004,22873,22757,22637,22515,22365,22208,22039,21877,21720,21576,21432,21287, - 21125,20963,20801,20668,20550,20461,20370,20278,20176,20089,20024,20008,20007,20017,20019,20014,20051, - 20122,20243,20403,20584,20814,21138,21523,21921,22069,21841,20583,18845,16215,13564,10899,9201,7926,7286, - 7157 -}; -const UWord16 defaultHRIR_right_avg_power_32kHz_fx[257] /*Q-15*/ = { - 34171,34113,33819,33565,33338,33397,33493,33645,33642,33572,33391,33314,33308,33603,33918,34267,34419, - 34473,34327,34162,33984,33890,33804,33727,33619,33507,33410,33339,33285,33182,33038,32833,32634,32464, - 32400,32383,32399,32360,32296,32193,32118,32060,32045,32018,31983,31916,31868,31850,31897,31963,32035, - 32067,32074,32036,32005,31984,31979,31972,31946,31895,31826,31744,31668,31604,31546,31486,31409,31316, - 31212,31114,31026,30953,30880,30801,30697,30581,30458,30352,30254,30168,30071,29965,29838,29714,29591, - 29503,29422,29352,29272,29187,29096,29020,28956,28928,28902,28879,28839,28796,28758,28744,28748,28783, - 28816,28846,28871,28902,28959,29045,29150,29266,29375,29471,29564,29659,29772,29888,30006,30089,30153, - 30190,30214,30236,30263,30280,30290,30248,30187,30098,30003,29907,29813,29701,29576,29403,29225,29037, - 28868,28704,28543,28361,28165,27941,27724,27516,27327,27142,26948,26738,26518,26298,26093,25910,25750, - 25598,25449,25305,25163,25065,24991,24954,24947,24948,24954,24967,24985,25043,25113,25202,25280,25350, - 25396,25443,25489,25556,25622,25686,25720,25741,25741,25745,25752,25764,25767,25752,25703,25641,25562, - 25486,25413,25336,25246,25136,25000,24859,24722,24599,24486,24373,24250,24112,23969,23831,23716,23612, - 23515,23401,23277,23139,23004,22873,22757,22637,22515,22365,22208,22039,21877,21720,21576,21432,21287, - 21125,20963,20801,20668,20550,20461,20370,20278,20176,20089,20024,20008,20007,20017,20019,20015,20051, - 20122,20243,20403,20584,20814,21138,21524,21922,22069,21841,20583,18845,16215,13564,10899,9201,7926,7286, - 7157 -}; -const UWord16 defaultHRIR_coherence_16kHz_fx[257] /*Q-15*/ = { - 31768,31768,31304,30146,28987,27616,25398,23180,20962,18325,15689,13052,10721,8465,6210,4393,2867,1342, - 374,240,106,0,0,0,0,0,0,0,83,188,293,489,745,1001,1166,1193,1220,1236,1212,1188,1164,1163,1162,1162,1115, - 1057,998,893,756,620,497,395,294,214,223,232,241,301,360,420,466,510,553,592,628,664,698,729,761,785,779, - 773,767,729,691,653,630,611,592,585,586,587,575,543,511,471,403,334,265,225,185,145,152,170,189,208,228, - 249,250,223,196,163,109,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,7,13,19,42,64,86, - 102,116,130,134,132,130,118,92,66,42,28,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,24,63,103,157,235,312,398,518,638,758,937,1117,1296,1533,1784,2035,2136,2136 -}; -const UWord16 defaultHRIR_left_avg_power_16kHz_fx[257] /*Q-15*/ = { - 36465,36465,36392,36209,36026,35860,35762,35664,35565,35651,35736,35821,35904,35987,36069,36071,36020, - 35969,35903,35814,35725,35656,35663,35671,35678,35800,35921,36043,36201,36368,36535,36661,36759,36857, - 36895,36841,36788,36718,36578,36439,36299,36213,36127,36041,35999,35967,35935,35873,35790,35707,35610, - 35492,35373,35268,35212,35157,35101,35062,35022,34983,34867,34732,34598,34449,34292,34135,34026,33990, - 33954,33930,33953,33977,34000,33932,33864,33795,33687,33568,33449,33373,33325,33278,33241,33219,33197, - 33162,33074,32986,32897,32811,32725,32639,32623,32626,32628,32639,32657,32675,32669,32627,32585,32543, - 32497,32452,32407,32390,32374,32357,32309,32252,32195,32114,32017,31919,31838,31779,31721,31665,31621, - 31578,31534,31418,31302,31186,31052,30914,30775,30679,30610,30542,30474,30406,30339,30253,30093,29934, - 29774,29612,29450,29287,29196,29122,29048,28966,28879,28792,28665,28481,28296,28115,27946,27777,27607, - 27525,27443,27361,27255,27143,27031,26870,26675,26481,26303,26149,25995,25854,25769,25684,25599,25461, - 25323,25185,25006,24816,24627,24481,24364,24246,24144,24065,23985,23888,23724,23559,23395,23214,23033, - 22852,22754,22677,22600,22522,22443,22365,22239,22044,21848,21657,21487,21316,21146,21109,21073,21036, - 20964,20883,20801,20633,20407,20181,19982,19825,19668,19541,19536,19530,19524,19411,19299,19186,18934, - 18647,18360,18149,17988,17828,17735,17744,17753,17722,17532,17342,17152,16740,16328,15915,15723,15586, - 15449,15527,15748,15969,16047,15911,15774,15458,14421,13384,12347,10837,9328,7819,6672,5617,4561,4138, - 4138 -}; -const UWord16 defaultHRIR_right_avg_power_16kHz_fx[257] /*Q-15*/ = { - 36465,36465,36392,36209,36026,35860,35762,35664,35565,35651,35736,35821,35904,35987,36069,36071,36020, - 35969,35903,35814,35725,35656,35663,35670,35678,35800,35921,36043,36201,36368,36535,36660,36759,36857, - 36895,36841,36788,36718,36578,36439,36299,36213,36127,36041,35999,35967,35935,35873,35790,35707,35610, - 35492,35373,35268,35212,35157,35101,35062,35022,34983,34867,34732,34598,34449,34292,34135,34026,33990, - 33954,33930,33953,33977,34000,33932,33864,33795,33687,33568,33449,33373,33325,33278,33241,33219,33197, - 33162,33074,32986,32897,32811,32725,32639,32623,32625,32628,32639,32657,32675,32669,32627,32585,32543, - 32497,32452,32407,32390,32374,32357,32309,32252,32195,32114,32017,31919,31838,31779,31721,31665,31622, - 31578,31534,31418,31302,31186,31052,30913,30775,30679,30610,30542,30474,30406,30339,30253,30093,29934, - 29774,29612,29450,29287,29196,29122,29048,28966,28879,28792,28665,28481,28296,28115,27946,27777,27607, - 27525,27443,27361,27255,27143,27031,26870,26675,26481,26303,26149,25995,25854,25769,25684,25599,25461, - 25323,25185,25006,24816,24627,24481,24364,24246,24144,24065,23985,23888,23724,23559,23395,23214,23033, - 22852,22754,22677,22600,22522,22443,22365,22239,22044,21848,21657,21487,21316,21146,21109,21073,21037, - 20964,20883,20801,20633,20407,20181,19982,19825,19668,19541,19536,19530,19524,19411,19299,19186,18934, - 18647,18360,18149,17988,17828,17735,17744,17753,17722,17532,17342,17152,16740,16328,15915,15723,15586, - 15449,15527,15748,15969,16047,15911,15774,15458,14421,13384,12347,10837,9328,7819,6672,5617,4561,4138, - 4138 +const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { + 131936432,125285536,105934832,77097344,45729324,19356880,2523696,0,0, + 0,1602425,4763253,5796595,5698884,5608690,5175704,3880368,2303444, + 1553033,1902670,2661537,3300414,3919560,4475624,4485288,3976468,3688169, + 3682129,3375844,2619661,1976758,1906026,2165066,2186943,1765500,1162325, + 671759,348160,140123,27783,0,0,0,148981,534991, + 939926,1281242,1547798,1665910,1550617,1228897,835102,478486,185757, + 0,0,0,0,4294,124554,284273,410840,479828, + 507343,493652,417417,278367,114890,0,0,0,0, + 0,0,0,0,0,29125,130728,242531,313264, + 326954,282528,204816,121735,46976,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,31943,114353,173543, + 205218,205755,176362,128043,69927,20803,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,3355,38117,83214,127372,170993,215553,257966, + 294607,327222,360643,395137,425738,452447,480096,507208,525462, + 533247,534186,526804,505463,469896,424799,372856,312190,242397, + 168711,95831,28319,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,102810,72074,0, + 226962,443858,219445,0,214882,1013209,77846,0,273535, + 1385798,289239,0,472983,1241648,688671,0,306821,870536, + 792153,0,115695,613375,552574,0,0,434462,205890, + 34762,26709,182938,117843,0 +}; +const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 8209721,8156956,8050127,7984940,7992858,8011649,7974747,7910306,7917252, + 8038476,8174723,8228729,8192717,8124794,8070352,8029995,7989956,7953608, + 7931152,7912210,7870745,7803402,7745101,7727896,7735563,7724331,7693670, + 7672548,7668253,7662666,7647508,7638633,7652147,7680265,7699593,7698955, + 7689828,7687614,7690835,7685852,7667229,7645042,7629506,7617787,7601639, + 7578545,7554822,7537315,7524279,7507108,7481430,7453328,7431803,7415991, + 7395254,7364820,7335141,7319069,7310202,7296948,7280120,7270700,7273946, + 7282989,7288836,7292510,7303600,7327768,7359376,7389357,7418784,7458856, + 7515186,7577119,7632232,7684091,7741771,7803922,7858506,7897295,7924793, + 7950529,7975309,7989134,7983815,7964337,7942418,7920028,7885853,7832460, + 7773178,7719675,7667640,7605540,7531820,7456659,7388182,7322718,7251305, + 7173342,7099371,7039023,6989942,6943645,6900871,6876377,6876200,6891753, + 6912280,6938008,6976184,7027514,7081939,7129159,7169768,7212416,7260113, + 7303961,7334160,7353923,7375390,7399868,7413919,7410756,7397888,7384995, + 7371128,7347783,7311469,7269433,7231533,7198642,7162562,7118413,7073358, + 7038218,7011467,6978885,6936976,6896929,6866243,6838636,6804318,6763793, + 6726715,6699377,6677726,6654422,6630095,6613880,6612001,6619165,6625113, + 6629517,6642997,6668750,6697196,6718344,6734173,6753895,6779589,6802146, + 6813185,6816633,6823486,6836086,6844013,6839567,6830432,6829887,6834652, + 6833897,6825424,6817447,6817430,6823444,6827572,6826137,6824845,6832135, + 6847612,6860472,6863735,6867082,6885344,6912573,6928050,6933679,6949215, + 6980018,7009084,7024486,7037715,7065515,7103221,7130283,7141717,7156523, + 7182804,7191302,7148830,7066479,6973039,6845448,6642997,6369529,6067757, + 5757018,5407708,4989863,4529504,4091224,3695693,3270760,2711684,2000297, + 1252050,651123,273904,89170,20652,2843,209,134,134, + 125,117,92,75,75,75,58,50,50, + 58,50,41,41,50,41,41,41,41, + 41,41,41,41,41,41,41,41,41, + 41,41,41,41,41 +}; +const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 8209721,8156956,8050144,7984965,7992850,8011640,7974756,7910323,7917252, + 8038484,8174707,8228738,8192709,8124794,8070361,8030003,7989948,7953583, + 7931127,7912202,7870737,7803402,7745101,7727896,7735563,7724331,7693679, + 7672548,7668236,7662658,7647491,7638624,7652147,7680265,7699609,7698964, + 7689820,7687597,7690827,7685844,7667229,7645050,7629472,7617779,7601639, + 7578545,7554822,7537315,7524288,7507133,7481447,7453337,7431803,7415982, + 7395229,7364812,7335141,7319077,7310185,7296931,7280120,7270700,7273955, + 7282998,7288836,7292494,7303583,7327776,7359401,7389382,7418776,7458856, + 7515186,7577127,7632241,7684082,7741787,7803939,7858523,7897295,7924793, + 7950529,7975309,7989125,7983824,7964320,7942426,7920062,7885853,7832443, + 7773194,7719675,7667640,7605556,7531829,7456675,7388199,7322726,7251305, + 7173333,7099379,7039032,6989967,6943653,6900880,6876377,6876226,6891753, + 6912271,6937999,6976184,7027514,7081931,7129151,7169768,7212416,7260122, + 7303961,7334160,7353940,7375398,7399868,7413910,7410731,7397871,7384978, + 7371145,7347791,7311477,7269450,7231542,7198633,7162554,7118413,7073358, + 7038218,7011475,6978885,6936976,6896920,6866226,6838628,6804310,6763785, + 6726707,6699369,6677709,6654414,6630095,6613889,6612010,6619148,6625071, + 6629508,6642989,6668750,6697204,6718352,6734190,6753920,6779597,6802146, + 6813210,6816641,6823495,6836095,6844030,6839559,6830457,6829904,6834677, + 6833905,6825416,6817455,6817421,6823428,6827555,6826129,6824837,6832135, + 6847620,6860472,6863735,6867082,6885336,6912582,6928059,6933679,6949232, + 6980026,7009084,7024477,7037706,7065489,7103188,7130275,7141708,7156497, + 7182812,7191285,7148847,7066488,6973047,6845439,6642997,6369529,6067757, + 5757001,5407699,4989863,4529504,4091224,3695702,3270751,2711693,2000297, + 1252050,651123,273904,89170,20652,2843,209,134,134, + 125,117,92,75,75,75,58,50,50, + 58,50,41,41,50,41,41,41,41, + 41,41,41,41,41,41,41,41,41, + 41,41,41,41,41 +}; +const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { + 131125216,129227112,119736576,105149792,87165424,65548180,45102524,26414452,12630962, + 2261837,646258,0,0,0,362790,1269699,3305916,5226035, + 5552185,5544266,5313545,5242007,4972498,4406099,3304843,2138491,1245809, + 945832,1040724,1586856,2087488,2519669,2930509,3330210,3706959,3852988, + 3845069,3506438,3230889,3049963,3020838,2972117,2692944,2226269,1634369, + 1306206,1176284,1344056,1533169,1651817,1468073,1147695,736184,393929, + 141465,23622,0,0,0,0,0,0,0, + 0,0,31004,186025,403995,663840,869999,1052669,1200174, + 1230910,1195208,1010927,774704,504121,258100,82812,13824,0, + 0,0,0,0,0,0,0,0,0, + 0,35567,94757,127104,150189,159048,139586,103616,29662, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,13287,46305,75833,95294,77980,44426,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,13153,45768,78383,106434, + 117574,114487,101871,68719,36641,6039,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1476, + 5234,21072,40667,63619,89120,116098,144015,171932,199715, + 227901,255818,281723,304405,324941,341584,357824,373796,388962, + 403995,419296,437818,458621,488820,521301,557674,596329,636728, + 680886,727728,776315,821546,862751,897916,926773,952409,971870, + 980460,981802,955227,918049,865167,793897,713233,613106,507477, + 398224,342255,316082,334604,338228 +}; +const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 8747993,8732977,8657866,8592845,8534553,8549703,8574332,8613196,8612450, + 8594632,8548151,8528631,8527079,8602383,8683241,8772412,8811402,8825092, + 8787822,8745552,8699960,8676052,8653847,8634210,8606620,8577981,8553109, + 8534922,8521190,8494783,8457906,8405301,8354525,8310963,8294462,8290268, + 8294278,8284279,8267812,8241648,8222362,8207531,8203647,8196752,8187852, + 8170672,8158450,8153660,8165857,8182684,8201064,8209352,8210920,8201391, + 8193506,8188086,8186669,8185008,8178398,8165219,8147653,8126564,8107262, + 8090653,8075973,8060647,8040892,8017060,7990510,7965369,7942812,7924139, + 7905508,7885266,7858574,7828903,7797253,7770124,7745051,7723047,7698192, + 7671231,7638683,7606840,7575458,7552800,7532081,7514280,7493736,7472068, + 7448614,7429295,7412736,7405756,7399180,7393182,7382990,7372018,7362119, + 7358680,7359552,7368629,7377118,7384718,7391127,7398953,7413675,7435679, + 7462522,7492302,7520043,7544714,7568412,7592915,7621662,7651325,7681599, + 7702873,7719423,7728886,7735043,7740672,7747517,7751812,7754412,7743650, + 7728089,7705339,7680970,7656341,7632308,7603568,7571683,7527366,7481606, + 7433699,7390347,7348345,7307132,7260525,7210319,7153108,7097458,7044149, + 6995864,6948351,6898883,6845179,6788657,6732512,6680016,6632990,6592154, + 6553113,6515029,6478094,6441947,6416664,6397714,6388260,6386465,6386851, + 6388319,6391700,6396364,6411102,6429029,6451720,6471844,6489796,6501641, + 6513435,6525204,6542518,6559405,6575670,6584344,6589771,6589813,6590845, + 6592531,6595845,6596365,6592707,6580091,6564161,6543961,6524642,6505902, + 6486113,6462969,6434800,6400113,6364034,6328861,6297445,6268521,6239597, + 6208098,6172732,6136241,6100909,6071330,6044722,6020084,5990858,5959116, + 5923599,5889046,5855634,5825838,5795177,5763938,5725518,5685253,5642211, + 5600763,5560540,5523688,5486661,5449525,5408043,5366612,5325264,5291257, + 5260940,5238031,5214778,5191290,5165126,5142795,5126186,5122067,5121799, + 5124433,5124877,5123837,5133241,5151268,5182239,5223192,5269715,5328527, + 5411331,5510141,5612029,5649811,5591443,5269488,4824515,4151102,3472472, + 2790361,2355655,2029229,1865232,1832432 +}; +const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 8747984,8732969,8657857,8592837,8534561,8549686,8574315,8613188,8612450, + 8594632,8548151,8528622,8527070,8602392,8683241,8772404,8811402,8825109, + 8787822,8745552,8699951,8676044,8653847,8634226,8606620,8577964,8553100, + 8534914,8521190,8494808,8457931,8405310,8354525,8310963,8294471,8290276, + 8294278,8284287,8267820,8241639,8222362,8207540,8203664,8196752,8187826, + 8170663,8158450,8153685,8165873,8182684,8201064,8209360,8210945,8201416, + 8193531,8188095,8186669,8185008,8178398,8165219,8147653,8126539,8107237, + 8090644,8075973,8060664,8040875,8017043,7990510,7965369,7942812,7924122, + 7905499,7885283,7858574,7828903,7797270,7770116,7745034,7723056,7698192, + 7671222,7638675,7606840,7575466,7552809,7532089,7514280,7493736,7472068, + 7448597,7429287,7412753,7405756,7399163,7393174,7382981,7372009,7362111, + 7358680,7359560,7368637,7377126,7384718,7391135,7398970,7413692,7435679, + 7462514,7492293,7520026,7544705,7568403,7592915,7621688,7651341,7681582, + 7702873,7719423,7728877,7735026,7740663,7747517,7751829,7754437,7743650, + 7728080,7705330,7680970,7656349,7632308,7603568,7571700,7527383,7481623, + 7433716,7390363,7348353,7307132,7260525,7210327,7153125,7097475,7044149, + 6995872,6948359,6898883,6845179,6788657,6732520,6680024,6632990,6592154, + 6553113,6515037,6478102,6441947,6416664,6397714,6388269,6386457,6386843, + 6388327,6391700,6396347,6411102,6429029,6451712,6471844,6489796,6501624, + 6513427,6525213,6542518,6559405,6575653,6584327,6589763,6589813,6590845, + 6592531,6595836,6596365,6592716,6580099,6564169,6543978,6524642,6505894, + 6486122,6462994,6434817,6400122,6364034,6328852,6297428,6268521,6239597, + 6208090,6172723,6136241,6100909,6071330,6044722,6020076,5990842,5959107, + 5923599,5889037,5855617,5825829,5795169,5763921,5725518,5685253,5642194, + 5600755,5560548,5523688,5486661,5449508,5408026,5366603,5325256,5291257, + 5260949,5238040,5214778,5191281,5165134,5142795,5126194,5122075,5121799, + 5124441,5124877,5123854,5133241,5151259,5182230,5223192,5269715,5328527, + 5411340,5510149,5612037,5649820,5591435,5269472,4824498,4151094,3472472, + 2790378,2355663,2029237,1865240,1832432 +}; +const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { + 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, + 75063144,64263984,53464828,43914296,34675820,25437480,17993766,11746601,5499437, + 1532229,985023,437818,0,0,0,0,0,0, + 0,343865,773496,1203261,2004810,3054258,4103707,4777480,4887673, + 4998000,5066316,4966727,4867271,4767816,4765534,4763253,4760971,4569174, + 4329998,4090822,3659312,3099355,2539533,2037290,1621350,1205543,880065, + 916304,952677,988916,1233058,1477200,1721342,1912602,2090441,2268413, + 2427327,2573490,2719788,2859643,2989834,3120025,3219078,3193576,3168075, + 3142574,2987686,2832665,2677778,2583691,2504771,2425851,2397128,2401692, + 2406255,2356594,2225464,2094333,1933137,1651280,1369423,1087566,924357, + 761148,597940,625051,699677,774302,854295,937779,1021128,1026631, + 915230,803830,670014,446676,223338,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,5100,30735, + 56371,81872,173140,264408,355542,419698,477144,534455,552037, + 543044,533918,485599,378494,271254,173946,115964,57982,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,671,1476,2415,99723,261321,423054,646795, + 963549,1280302,1632087,2124129,2616037,3108080,3841982,4575885,5309922, + 6280181,7309766,8339216,8750996,8750996 +}; +const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 9335246,9335246,9316514,9269680,9222847,9180350,9155201,9130044,9104894, + 9126688,9148473,9170267,9191549,9212688,9233844,9234423,9221295,9208167, + 9191205,9168497,9145789,9127997,9129884,9131780,9133676,9164823,9195978, + 9227125,9267550,9310290,9353038,9385225,9410374,9435531,9445170,9431538, + 9417907,9399855,9364128,9328409,9292682,9270670,9248667,9226655,9215783, + 9207688,9199593,9183605,9162356,9141108,9116244,9085961,9055678,9028608, + 9014432,9000255,8986078,8975962,8965845,8955728,8926108,8891606,8857103, + 8819145,8778896,8738639,8710806,8701604,8692401,8686227,8692209,8698190, + 8704171,8686706,8669232,8651767,8623917,8593466,8563024,8543554,8531399, + 8519252,8509748,8504203,8498667,8489716,8467083,8444459,8421835,8399773, + 8377711,8355649,8351698,8352268,8352847,8355833,8360430,8365027,8363484, + 8352721,8341959,8331028,8319460,8307884,8296308,8292063,8287827,8283582, + 8271142,8256647,8242159,8221389,8196442,8171494,8150547,8135607,8120659, + 8106465,8095225,8083992,8072760,8043073,8013394,7983706,7949422,7913997, + 7878564,7853893,7836394,7818904,7801472,7784141,7766811,7744782,7703972, + 7663169,7622359,7580802,7539253,7497696,7474266,7455367,7436467,7415496, + 7393140,7370784,7338471,7291235,7244007,7197551,7154232,7110914,7067595, + 7046615,7025627,7004647,6977485,6948779,6920073,6878751,6829015,6779278, + 6733644,6694184,6654724,6618804,6597044,6575284,6553524,6518183,6482842, + 6447501,6401632,6353137,6304634,6267229,6237215,6207201,6181045,6160677, + 6140310,6115580,6073427,6031275,5989122,5942817,5896503,5850198,5825150, + 5805428,5785707,5765742,5745626,5725510,5693398,5643285,5593180,5544358, + 5500720,5457091,5413454,5404126,5394797,5385469,5366930,5346085,5325239, + 5282164,5224274,5166376,5115566,5075376,5035186,5002731,5001238,4999736, + 4998243,4969436,4940630,4911823,4847290,4773822,4700355,4646282,4605153, + 4564023,4540250,4542523,4544788,4536869,4488241,4439612,4390983,4285488, + 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, + 4073222,4038317,3957300,3691818,3426335,3160861,2774481,2388110,2001740, + 1708239,1437966,1167685,1059581,1059581 +}; +const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 9335246,9335246,9316514,9269689,9222855,9180358,9155201,9130035,9104869, + 9126663,9148465,9170258,9191540,9212688,9233827,9234415,9221295,9208175, + 9191213,9168488,9145755,9127963,9129867,9131772,9133676,9164831,9195978, + 9227133,9267550,9310281,9353021,9385200,9410357,9435506,9445153,9431522, + 9417899,9399855,9364119,9328384,9292648,9270653,9248658,9226663,9215792, + 9207688,9199593,9183596,9162348,9141100,9116236,9085953,9055678,9028617, + 9014432,9000255,8986070,8975962,8965853,8955745,8926116,8891614,8857103, + 8819145,8778888,8738631,8710789,8701587,8692385,8686219,8692200,8698181, + 8704162,8686697,8669232,8651775,8623917,8593466,8563016,8543546,8531390, + 8519244,8509739,8504203,8498675,8489724,8467100,8444468,8421844,8399773, + 8377703,8355641,8351681,8352252,8352830,8355817,8360414,8365019,8363475, + 8352721,8341959,8331037,8319469,8307893,8296316,8292072,8287835,8283591, + 8271142,8256647,8242151,8221381,8196433,8171494,8150547,8135616,8120676, + 8106482,8095250,8084009,8072777,8043081,8013385,7983698,7949405,7913972, + 7878547,7853876,7836386,7818904,7801481,7784150,7766819,7744790,7703980, + 7663161,7622350,7580793,7539244,7497696,7474258,7455358,7436459,7415487, + 7393132,7370776,7338471,7291244,7244016,7197560,7154241,7110914,7067587, + 7046607,7025627,7004647,6977485,6948770,6920064,6878742,6829006,6779270, + 6733644,6694184,6654724,6618813,6597053,6575301,6553549,6518191,6482842, + 6447492,6401623,6353137,6304643,6267229,6237215,6207201,6181037,6160677, + 6140310,6115580,6073427,6031275,5989122,5942817,5896512,5850207,5825167, + 5805445,5785723,5765750,5745626,5725493,5693382,5643276,5593180,5544375, + 5500729,5457074,5413429,5404109,5394789,5385478,5366939,5346093,5325247, + 5282172,5224282,5166384,5115574,5075384,5035195,5002739,5001238,4999736, + 4998243,4969436,4940630,4911823,4847290,4773814,4700338,4646274,4605153, + 4564023,4540258,4542523,4544788,4536878,4488249,4439612,4390983,4285480, + 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, + 4073222,4038317,3957292,3691809,3426327,3160844,2774473,2388110,2001740, + 1708239,1437966,1167685,1059573,1059573 }; #endif // IVAS_FLOAT_FIXED /*----------------------------------------------------------------------------------* @@ -904,6 +1043,44 @@ const Word32 t_design_11_elevation_int[70] = //Q22 * Reverberator ROM tables *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +const Word32 ivas_reverb_default_fc_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q16*/ = +{ + 1310720 , 1638400 , 2064384 , 2621440 , 3276800 , + 4128768 , 5242880 , 6553600 , 8192000 , + 10485760 , 13107200 , 16384000 , 20643840 , + 26214400 , 32768000 , 41287680 , 52428800 , + 65536000 , 81920000 , 104857600 , 131072000 , + 163840000 , 206438400 , 262144000 , 327680000 , + 412876800 , 524288000 , 655360000 , 819200000 , + 1048576000 , 1310720000 +}; + +const Word32 ivas_reverb_default_RT60_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q30*/ = +{ + 1462651136 , 1555422464 , 1413903232 , 1695116160 , 1585487232 , + 1498299392 , 1383945856 , 1445471232 , 1155238784 , + 1116798848 , 1177894784 , 1165009920 , 1171452288 , + 1117121024 , 1127321600 , 1148796416 , 1184122496 , + 1257781120 , 1184015104 , 1145252992 , 1132797568 , + 1133119744 , 1129683712 , 1134837760 , 1118946304 , + 1050355712 , 864222592 , 815442496 , 772503552 , + 662305408 , 644577984 +}; + +const Word32 ivas_reverb_default_DSR_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q0*/ = +{ + 0 , 0 , 0 , 0 , + 0 , 0 , 0 , 0 , + 0 , 0 , 0 , 0 , + 0 , 0 , 0 , 0 , + 0 , 0 , 0 , 0 , + 0 , 0 , 0 , 0 , + 0 , 0 , 0 , 0 , + 0 , 0 , 0 +}; +#endif + const float ivas_reverb_default_fc[IVAS_REVERB_DEFAULT_N_BANDS] = { 20.0f, 25.0f, 31.5f, 40.0f, @@ -1336,7 +1513,7 @@ const float ls_conversion_cicpX_stereo[12][2] = {0.849999964f, 0.000000000f}, {0.000000000f, 0.849999964f} }; - +#ifndef IVAS_FLOAT_FIXED const LS_CONVERSION_MATRIX ls_conversion_cicp12_cicp6[] = { /* First row indicates the number of non-zero elements and the number of matrix columns */ @@ -1651,5 +1828,5 @@ const LS_CONVERSION_MAPPING ls_conversion_mapping[LS_SETUP_CONVERSION_NUM_MAPPIN {IVAS_AUDIO_CONFIG_5_1_4, IVAS_AUDIO_CONFIG_7_1_4, ls_conversion_cicp16_cicp19}, }; - +#endif /* clang-format on */ diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index 9418f2e62901593f4b867f8805568c17e0361138..7ffcb441e31506db4e11eead6b652f47d884f9e2 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -121,17 +121,17 @@ extern const float defaultHRIR_left_avg_power_16kHz[LR_IAC_LENGTH_NR_FC]; extern const float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC]; #ifdef IVAS_FLOAT_FIXED -extern const UWord16 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ -extern const UWord16 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ -extern const UWord16 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ +extern const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ +extern const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const UWord16 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ -extern const UWord16 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ -extern const UWord16 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ +extern const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ +extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const UWord16 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ -extern const UWord16 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ -extern const UWord16 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-15*/ +extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ +extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ #endif // IVAS_FLOAT_FIXED /*----------------------------------------------------------------------------------* * t-design and SN3D normalization table @@ -155,6 +155,12 @@ extern const Word32 t_design_11_elevation_int[70]; * Reverberator ROM tables *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +extern const Word32 ivas_reverb_default_fc_fx[]; +extern const Word32 ivas_reverb_default_RT60_fx[]; +extern const Word32 ivas_reverb_default_DSR_fx[]; +#endif + extern const float ivas_reverb_default_fc[]; extern const float ivas_reverb_default_RT60[]; extern const float ivas_reverb_default_DSR[]; @@ -180,8 +186,9 @@ extern const Word32 ls_conversion_cicpX_stereo_fx[12][2]; #endif /* Mapping table of input config : output config with corresponding matrix */ +#ifndef IVAS_FLOAT_FIXED extern const LS_CONVERSION_MAPPING ls_conversion_mapping[]; -#ifdef IVAS_FLOAT_FIXED +#else extern const LS_CONVERSION_MAPPING_FX ls_conversion_mapping_fx[]; #endif diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 030c503e09ce899a0aaa3785ca0bc5a1db932666..7a9db2c7983cfa15839798056b8c41dee2f74543 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -108,41 +108,80 @@ static bool are_orientations_same( const IVAS_QUATERNION *orientation1, const IV * Allocate and initialize Head-Tracking handle *-----------------------------------------------------------------------*/ -ivas_error ivas_headTrack_open( +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_headTrack_open_fx( HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ ) { - int16_t i; + Word16 i; ivas_error error; /* Allocate Head-Tracking handle */ - if ( ( *hHeadTrackData = (HEAD_TRACK_DATA_HANDLE) malloc( sizeof( HEAD_TRACK_DATA ) ) ) == NULL ) + IF( ( *hHeadTrackData = (HEAD_TRACK_DATA_HANDLE) malloc( sizeof( HEAD_TRACK_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for head-tracking memory\n" ) ); } /* Initialization */ - ( *hHeadTrackData )->lrSwitchInterpVal = 0.0f; + ( *hHeadTrackData )->lrSwitchInterpVal_fx = 0; + move32(); ( *hHeadTrackData )->lrSwitchedCurrent = 0; + move32(); ( *hHeadTrackData )->lrSwitchedNext = 0; - if ( ( ( *hHeadTrackData )->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) + move32(); + IF( ( ( *hHeadTrackData )->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); } -#ifdef IVAS_FLOAT_FIXED - - if ( ( error = ivas_orient_trk_Init_fx( ( *hHeadTrackData )->OrientationTracker ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_orient_trk_Init_fx( ( *hHeadTrackData )->OrientationTracker ) ) != IVAS_ERR_OK ) { return error; } + /* Initialise Rmat_prev to I, Rmat will be computed later */ + FOR( i = 0; i < 3; i++ ) + { + set32_fx( ( *hHeadTrackData )->Rmat_prev_fx[i], 0, 3 ); + ( *hHeadTrackData )->Rmat_prev_fx[i][i] = ONE_IN_Q31; + move32(); + } + + + set32_fx( ( *hHeadTrackData )->chEneIIR_fx[0], 0, MASA_FREQUENCY_BANDS ); + set32_fx( ( *hHeadTrackData )->chEneIIR_fx[1], 0, MASA_FREQUENCY_BANDS ); + set32_fx( ( *hHeadTrackData )->procChEneIIR_fx[0], 0, MASA_FREQUENCY_BANDS ); + set32_fx( ( *hHeadTrackData )->procChEneIIR_fx[1], 0, MASA_FREQUENCY_BANDS ); + + return IVAS_ERR_OK; +} #else +ivas_error ivas_headTrack_open( + HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */ +) +{ + int16_t i; + ivas_error error; + + /* Allocate Head-Tracking handle */ + if ( ( *hHeadTrackData = (HEAD_TRACK_DATA_HANDLE) malloc( sizeof( HEAD_TRACK_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for head-tracking memory\n" ) ); + } + + /* Initialization */ + ( *hHeadTrackData )->lrSwitchInterpVal = 0.0f; + ( *hHeadTrackData )->lrSwitchedCurrent = 0; + ( *hHeadTrackData )->lrSwitchedNext = 0; + if ( ( ( *hHeadTrackData )->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); + } + if ( ( error = ivas_orient_trk_Init( ( *hHeadTrackData )->OrientationTracker ) ) != IVAS_ERR_OK ) { return error; } -#endif /* Initialise Rmat_prev to I, Rmat will be computed later */ for ( i = 0; i < 3; i++ ) @@ -159,6 +198,7 @@ ivas_error ivas_headTrack_open( return IVAS_ERR_OK; } +#endif /*-----------------------------------------------------------------------* @@ -278,7 +318,7 @@ void QuatToRotMat( return; } - +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * Euler2Quat() * @@ -305,6 +345,29 @@ void Euler2Quat( return; } +#else + +void Euler2Quat_fx( + const Word32 yaw, /* i : yaw (x) */ + const Word32 pitch, /* i : pitch (y) */ + const Word32 roll, /* i : roll (z) */ + IVAS_QUATERNION *quat /* o : quaternion describing the rotation */ +) +{ + Word16 cr = getCosWord16( extract_l( L_shr_r( roll, 10 ) ) ); + Word16 sr = getSinWord16( extract_l( L_shr_r( roll, 10 ) ) ); + Word16 cp = getCosWord16( extract_l( L_shr_r( pitch, 10 ) ) ); + Word16 sp = getSinWord16( extract_l( L_shr_r( pitch, 10 ) ) ); + Word16 cy = getCosWord16( extract_l( L_shr_r( yaw, 10 ) ) ); + Word16 sy = getSinWord16( extract_l( L_shr_r( yaw, 10 ) ) ); + quat->w_fx = L_shr_r( L_add( Mpy_32_16_1( L_mult0( cr, cp ), cy ), Mpy_32_16_1( L_mult0( sr, sp ), sy ) ), 5 ); + quat->x_fx = L_shr_r( L_sub( Mpy_32_16_1( L_mult0( sr, cp ), cy ), Mpy_32_16_1( L_mult0( cr, sp ), sy ) ), 5 ); + quat->y_fx = L_shr_r( L_add( Mpy_32_16_1( L_mult0( sr, cp ), sy ), Mpy_32_16_1( L_mult0( cr, sp ), cy ) ), 5 ); + quat->z_fx = L_shr_r( L_sub( Mpy_32_16_1( L_mult0( cr, cp ), sy ), Mpy_32_16_1( L_mult0( sr, sp ), cy ) ), 5 ); + + return; +} +#endif /*------------------------------------------------------------------------- @@ -925,7 +988,7 @@ void rotateFrame_sd( { azimuth_fx = (Word32) azimuth * ONE_IN_Q22; elevation_fx = (Word32) elevation * ONE_IN_Q22; - efap_determine_gains_fixed( hEFAPdata, tmp_gains_fx, azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); + efap_determine_gains_fx( hEFAPdata, tmp_gains_fx, azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); FOR( ch_out = 0; ch_out < nchan; ch_out++ ) @@ -950,7 +1013,7 @@ void rotateFrame_sd( azimuth_fx = (Word32) azimuth * ONE_IN_Q22; elevation_fx = (Word32) elevation * ONE_IN_Q22; - efap_determine_gains_fixed( hEFAPdata, tmp_gains_fx, azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); + efap_determine_gains_fx( hEFAPdata, tmp_gains_fx, azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); FOR( ch_out = 0; ch_out < nchan; ch_out++ ) { @@ -1488,7 +1551,7 @@ void rotateFrame_sd_cldfb_fixed( IF( hEFAPdata != NULL && ( hOutputSetup->ls_azimuth[n] != azimuth || hOutputSetup->ls_elevation[n] != elevation ) ) { // efap_determine_gains( hEFAPdata, gains[n], azimuth, elevation, EFAP_MODE_EFAP ); - efap_determine_gains_fixed( hEFAPdata, gains_fx[n], L_shl( azimuth, Q22 ), L_shl( elevation, Q22 ), EFAP_MODE_EFAP ); + efap_determine_gains_fx( hEFAPdata, gains_fx[n], L_shl( azimuth, Q22 ), L_shl( elevation, Q22 ), EFAP_MODE_EFAP ); } ELSE { @@ -1593,7 +1656,23 @@ ivas_error ivas_external_orientation_open( * * Deallocate external orientation handle *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_external_orientation_close( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ +) +{ + test(); + IF( hExtOrientationData == NULL || *hExtOrientationData == NULL ) + { + return; + } + free( ( *hExtOrientationData ) ); + *hExtOrientationData = NULL; + + return; +} +#else void ivas_external_orientation_close( EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ ) @@ -1608,6 +1687,7 @@ void ivas_external_orientation_close( return; } +#endif /*-----------------------------------------------------------------------* @@ -1631,21 +1711,21 @@ ivas_error ivas_combined_orientation_open( identity.x = identity.y = identity.z = 0.0f; origo.x = origo.y = origo.z = 0.0f; #ifdef IVAS_FLOAT_FIXED - identity.w_fx = ONE_IN_Q30; - identity.w_qfact = 1; + identity.w_fx = ONE_IN_Q31; + identity.w_qfact = 31; identity.x_fx = 0; - identity.x_qfact = 1; + identity.x_qfact = 31; identity.y_fx = 0; - identity.y_qfact = 1; + identity.y_qfact = 31; identity.z_fx = 0; - identity.z_qfact = 1; + identity.z_qfact = 31; origo.x_fx = 0; - origo.x_qfact = 0; + origo.x_qfact = 31; origo.y_fx = 0; - origo.y_qfact = 0; + origo.y_qfact = 31; origo.z_fx = 0; - origo.z_qfact = 0; + origo.z_qfact = 31; #endif /* Allocate handle */ @@ -1669,6 +1749,9 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->lrSwitchedNext = 0; ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; ( *hCombinedOrientationData )->lrSwitchInterpVal = 0.0f; +#ifdef IVAS_FLOAT_FIXED + (*hCombinedOrientationData)->lrSwitchInterpVal_fx = 0; +#endif ( *hCombinedOrientationData )->isInterpolationOngoing = FALSE; ( *hCombinedOrientationData )->Quaternions_ext_interpolation_start = identity; ( *hCombinedOrientationData )->Quaternions_ext_interpolation_target = identity; @@ -1702,6 +1785,14 @@ ivas_error ivas_combined_orientation_open( set_zero( ( *hCombinedOrientationData )->chEneIIR[1], MASA_FREQUENCY_BANDS ); set_zero( ( *hCombinedOrientationData )->procChEneIIR[0], MASA_FREQUENCY_BANDS ); set_zero( ( *hCombinedOrientationData )->procChEneIIR[1], MASA_FREQUENCY_BANDS ); +#ifdef IVAS_FLOAT_FIXED + set_zero_fx((*hCombinedOrientationData)->chEneIIR_fx[0], MASA_FREQUENCY_BANDS); + set_zero_fx((*hCombinedOrientationData)->chEneIIR_fx[1], MASA_FREQUENCY_BANDS); + set_zero_fx((*hCombinedOrientationData)->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS); + set_zero_fx((*hCombinedOrientationData)->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS); + (*hCombinedOrientationData)->q_chEneIIR = Q31; + (*hCombinedOrientationData)->q_procChEneIIR = Q31; +#endif ( *hCombinedOrientationData )->isExtOrientationFrozen = 0; ( *hCombinedOrientationData )->isHeadRotationFrozen = 0; @@ -1720,6 +1811,23 @@ ivas_error ivas_combined_orientation_open( * Deallocate combined orientation handle *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_combined_orientation_close( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + test(); + IF( hCombinedOrientationData == NULL || *hCombinedOrientationData == NULL ) + { + return; + } + + free( ( *hCombinedOrientationData ) ); + *hCombinedOrientationData = NULL; + + return; +} +#else void ivas_combined_orientation_close( COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ ) @@ -1734,6 +1842,7 @@ void ivas_combined_orientation_close( return; } +#endif /*------------------------------------------------------------------------- @@ -1893,7 +2002,31 @@ ivas_error combine_external_and_head_orientations( if ( hCombinedOrientationData->isInterpolationOngoing == true && hCombinedOrientationData->interpolationCoefficient <= 1.0f && are_orientations_same( &hCombinedOrientationData->Quaternions_ext_interpolation_target, &hExtOrientationData->Quaternions[i] ) == true ) { /* Continue interpolation */ - QuaternionSlerp( hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i] ); +#ifdef IVAS_FLOAT_FIXED + hCombinedOrientationData->interpolationCoefficient_fx = float_to_fix(hCombinedOrientationData->interpolationCoefficient, Q30); + hCombinedOrientationData->Quaternions_ext_interpolation_start.w_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_start.w, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_start.x_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_start.x, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_start.y_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_start.y, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_start.z_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_start.z, Q29); + + hCombinedOrientationData->Quaternions_ext_interpolation_target.w_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_target.w, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_target.x_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_target.x, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_target.y_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_target.y, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_target.z_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_target.z, Q29); + + hCombinedOrientationData->Quaternions_ext_interpolation_start.w_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_start.x_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_start.y_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_start.z_qfact = Q29; + hCombinedOrientationData->Quaternions_ext_interpolation_target.w_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_target.x_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_target.y_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_target.z_qfact = Q29; + + QuaternionSlerp_fx(hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i]); + + hCombinedOrientationData->Quaternions[i].w = fixedToFloat_32(hCombinedOrientationData->Quaternions[i].w_fx, hCombinedOrientationData->Quaternions[i].w_qfact); + hCombinedOrientationData->Quaternions[i].x = fixedToFloat_32(hCombinedOrientationData->Quaternions[i].x_fx, hCombinedOrientationData->Quaternions[i].x_qfact); + hCombinedOrientationData->Quaternions[i].y = fixedToFloat_32(hCombinedOrientationData->Quaternions[i].y_fx, hCombinedOrientationData->Quaternions[i].y_qfact); + hCombinedOrientationData->Quaternions[i].z = fixedToFloat_32(hCombinedOrientationData->Quaternions[i].z_fx, hCombinedOrientationData->Quaternions[i].z_qfact); + +#else + QuaternionSlerp(hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i]); +#endif hCombinedOrientationData->interpolationCoefficient += hCombinedOrientationData->interpolationIncrement; } else @@ -2144,7 +2277,31 @@ static void external_target_interpolation( /* Interpolate */ hCombinedOrientationData->isInterpolationOngoing = TRUE; - QuaternionSlerp( hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i] ); +#ifdef IVAS_FLOAT_FIXED + hCombinedOrientationData->interpolationCoefficient_fx = float_to_fix(hCombinedOrientationData->interpolationCoefficient, Q30); + hCombinedOrientationData->Quaternions_ext_interpolation_start.w_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_start.w, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_start.x_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_start.x, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_start.y_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_start.y, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_start.z_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_start.z, Q29); + + hCombinedOrientationData->Quaternions_ext_interpolation_target.w_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_target.w, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_target.x_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_target.x, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_target.y_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_target.y, Q29); + hCombinedOrientationData->Quaternions_ext_interpolation_target.z_fx = float_to_fix(hCombinedOrientationData->Quaternions_ext_interpolation_target.z, Q29); + + hCombinedOrientationData->Quaternions_ext_interpolation_start.w_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_start.x_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_start.y_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_start.z_qfact = Q29; + hCombinedOrientationData->Quaternions_ext_interpolation_target.w_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_target.x_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_target.y_qfact = hCombinedOrientationData->Quaternions_ext_interpolation_target.z_qfact = Q29; + + QuaternionSlerp_fx(hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i]); + + hCombinedOrientationData->Quaternions[i].w = fixedToFloat_32(hCombinedOrientationData->Quaternions[i].w_fx, hCombinedOrientationData->Quaternions[i].w_qfact); + hCombinedOrientationData->Quaternions[i].x = fixedToFloat_32(hCombinedOrientationData->Quaternions[i].x_fx, hCombinedOrientationData->Quaternions[i].x_qfact); + hCombinedOrientationData->Quaternions[i].y = fixedToFloat_32(hCombinedOrientationData->Quaternions[i].y_fx, hCombinedOrientationData->Quaternions[i].y_qfact); + hCombinedOrientationData->Quaternions[i].z = fixedToFloat_32(hCombinedOrientationData->Quaternions[i].z_fx, hCombinedOrientationData->Quaternions[i].z_qfact); + +#else + QuaternionSlerp(hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i]); +#endif hCombinedOrientationData->interpolationCoefficient += hCombinedOrientationData->interpolationIncrement; } else diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index bb2a94de2ab2f4e32431d8d4d41e62e6f922927c..5d7adc221e812380603fb852f952f6cbbada890a 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -42,12 +42,12 @@ #include #include "wmc_auto.h" - /*-------------------------------------------------------------------* * ivas_sba_prototype_renderer() * * Render prototype audio signals using SBA mixing matrices *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void ivas_sba_prototype_renderer_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -248,7 +248,7 @@ void ivas_sba_prototype_renderer_fx( return; } - +#else void ivas_sba_prototype_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ @@ -407,3 +407,4 @@ void ivas_sba_prototype_renderer( return; } +#endif diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index dc2dec4eff0114ca6727061af16f43b71d747ee3..ece1d6785ac1339a05192042066c048550eb8477 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -191,6 +191,7 @@ typedef struct dirac_decorr_state_structure #ifdef IVAS_FLOAT_FIXED Word32 *decorr_buffer_fx; Word16 q_decorr_buffer; + Word16 decorr_buffer_len; Word32 *direct_energy_smooth_fx; Word16 q_direct_energy_smooth; Word32 *reverb_energy_smooth_fx; @@ -226,6 +227,7 @@ typedef struct ivas_spatial_parametric_rend_common_data_structure float **energy_ratio2; #ifdef IVAS_FLOAT_FIXED Word32 **diffuseness_vector_fx; + Word16 q_diffuseness_vector; Word32 **energy_ratio1_fx; Word32 **energy_ratio2_fx; #endif @@ -255,6 +257,11 @@ typedef struct dirac_dec_stack_mem { /*Decorrelator*/ float *frame_dec_f; +#ifdef IVAS_FLOAT_FIXED + Word32 *frame_dec_f_fx; + Word16 frame_dec_f_q; + Word16 frame_dec_f_len; +#endif /*Prototypes*/ float *proto_direct_buffer_f; @@ -272,10 +279,14 @@ typedef struct dirac_dec_stack_mem /*Prototypes*/ Word32 *proto_direct_buffer_f_fx; Word32 *proto_diffuse_buffer_f_fx; + Word16 proto_diffuse_buffer_f_len; + Word16 proto_diffuse_buffer_f_q; /*Prototype NRGs*/ Word32 *proto_power_smooth_fx; Word32 *proto_power_diff_smooth_fx; + Word16 proto_power_diff_smooth_q; + Word16 proto_power_diff_smooth_len; /*Gain or power factors for directional and diffuse streams*/ Word32 *direct_power_factor_fx; @@ -333,6 +344,7 @@ typedef struct dirac_output_synthesis_params_structure float diffuse_compensation_factor_decorr; #ifdef IVAS_FLOAT_FIXED Word32 *proto_matrix_fx; + Word16 proto_matrix_e; Word32 diffuse_compensation_factor_fx; // Q27 Word32 diffuse_compensation_factor_decorr_fx; // Q29 #endif @@ -401,6 +413,9 @@ typedef struct dirac_output_synthesis_state_structure Word16 *proto_power_smooth_prev_fx; /* Smoothed power of the prototype signals of the previous synthesis block. Size: num_freq_bands*num_channels. */ Word32 *proto_power_diff_smooth_fx; + Word16 proto_power_diff_smooth_q; + Word16 proto_power_diff_smooth_len; + Word16 *proto_power_diff_smooth_prev_fx; /* only pointer to local buffers */ @@ -408,6 +423,7 @@ typedef struct dirac_output_synthesis_state_structure Word16 proto_direct_buffer_f_q; Word32 *proto_diffuse_buffer_f_fx; /* Buffer for diffuse sound prototype signals. Size: 2*num_freq_bands*num_channels*buffer_length (complex interleaved). */ Word16 proto_diffuse_buffer_f_q; + Word16 proto_diffuse_buffer_f_len; /* Output gain memories */ Word32 *gains_dir_prev_fx; /* Direct sound gains of current synthesis block. Size: num_freq_bands*num_channel. */ @@ -590,12 +606,15 @@ typedef struct ivas_dirac_rend_data_structure float *frequency_axis; float *diffuse_response_function; #ifdef IVAS_FLOAT_FIXED - Word16 *buffer_intensity_real_fx[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; - Word16 *buffer_energy_fx; + Word32 *buffer_intensity_real_fx[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + Word16 q_buffer_intensity_real[CLDFB_NO_CHANNELS_MAX]; + Word32 *buffer_energy_fx; + Word16 q_buffer_energy[CLDFB_NO_CHANNELS_MAX]; Word16 *diffuse_response_function_fx; Word16 diffuse_response_function_q; // Q15 Word16 *frequency_axis_fx; - Word32 *hoa_encoder_fx; + Word32 *hoa_encoder_fx; // Q29 + Word16 hoa_encoder_len; #endif float *hoa_encoder; #ifndef IVAS_FLOAT_FIXED @@ -624,9 +643,13 @@ typedef struct ivas_dirac_rend_data_structure float *proto_frame_f; float *proto_frame_dec_f; #ifdef IVAS_FLOAT_FIXED - Word16 *proto_frame_f_fx; + Word32 *proto_frame_f_fx; Word16 proto_frame_f_q; - Word16 *proto_frame_dec_f_fx; + Word16 proto_frame_f_len; + + Word32 *proto_frame_dec_f_fx; + Word16 proto_frame_dec_f_q; + Word16 proto_frame_dec_f_len; #endif DIRAC_DEC_STACK_MEM stack_mem; @@ -709,14 +732,13 @@ typedef struct vbap_data_structure /* Binaural reverberator structure */ typedef struct ivas_binaural_reverb_struct { +#ifndef IVAS_FLOAT_FIXED float *loopBufReal[CLDFB_NO_CHANNELS_MAX]; float *loopBufImag[CLDFB_NO_CHANNELS_MAX]; float preDelayBufferReal[REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; float preDelayBufferImag[REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; -#ifndef IVAS_FLOAT_FIXED float **tapPointersReal[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; float **tapPointersImag[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; -#endif float binauralCoherenceCrossmixGains[CLDFB_NO_CHANNELS_MAX]; float binauralCoherenceDirectGains[CLDFB_NO_CHANNELS_MAX]; @@ -725,8 +747,7 @@ typedef struct ivas_binaural_reverb_struct float *outputBufferReal[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; float *outputBufferImag[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; - -#ifdef IVAS_FLOAT_FIXED +#else Word32 *loopBufReal_fx[CLDFB_NO_CHANNELS_MAX]; Word32 *loopBufImag_fx[CLDFB_NO_CHANNELS_MAX]; Word32 preDelayBufferReal_fx[REVERB_PREDELAY_MAX + 1][CLDFB_NO_CHANNELS_MAX]; @@ -734,28 +755,28 @@ typedef struct ivas_binaural_reverb_struct Word32 **tapPointersReal_fx[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; Word32 **tapPointersImag_fx[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; - Word32 binauralCoherenceCrossmixGains_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 binauralCoherenceDirectGains_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 reverbEqGains_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 loopAttenuationFactor_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 binauralCoherenceCrossmixGains_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 binauralCoherenceDirectGains_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 reverbEqGains_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 loopAttenuationFactor_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ Word32 *outputBufferReal_fx[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; Word32 *outputBufferImag_fx[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; #endif - int16_t numBins; + Word16 numBins; - int16_t useBinauralCoherence; - int16_t loopBufLength[CLDFB_NO_CHANNELS_MAX]; - int16_t loopBufLengthMax[CLDFB_NO_CHANNELS_MAX]; - int16_t preDelayBufferIndex; - int16_t preDelayBufferLength; + Word16 useBinauralCoherence; + Word16 loopBufLength[CLDFB_NO_CHANNELS_MAX]; + Word16 loopBufLengthMax[CLDFB_NO_CHANNELS_MAX]; + Word16 preDelayBufferIndex; + Word16 preDelayBufferLength; - int16_t taps[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; - int16_t *tapPhaseShiftType[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; + Word16 taps[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; + Word16 *tapPhaseShiftType[CLDFB_NO_CHANNELS_MAX][BINAURAL_CHANNELS]; - int16_t blockSize; - uint32_t binRend_RandNext; - int16_t highestBinauralCoherenceBin; + Word16 blockSize; + UWord32 binRend_RandNext; + Word16 highestBinauralCoherenceBin; #ifndef IVAS_FLOAT_FIXED float dmxmtx[BINAURAL_CHANNELS][MAX_OUTPUT_CHANNELS]; @@ -973,67 +994,71 @@ typedef struct EFAP typedef struct ivas_orient_trk_state_t { IVAS_HEAD_ORIENT_TRK_T orientation_tracking; +#ifndef IVAS_FLOAT_FIXED float centerAdaptationRate; float offCenterAdaptationRate; float adaptationAngle; +#endif float alpha; - IVAS_QUATERNION absAvgRot; /* average absolute orientation */ - IVAS_QUATERNION refRot; /* reference orientation */ - IVAS_QUATERNION trkRot; /* tracked rotation */ - #ifdef IVAS_FLOAT_FIXED - Word32 centerAdaptationRate_fx; - Word32 offCenterAdaptationRate_fx; - Word32 adaptationAngle_fx; + Word32 centerAdaptationRate_fx; /* Q31 */ + Word32 offCenterAdaptationRate_fx; /* Q31 */ + Word32 adaptationAngle_fx; /* Q29 */ +#endif Word32 alpha_fx; -#endif + IVAS_QUATERNION absAvgRot; /* average absolute orientation */ + IVAS_QUATERNION refRot; /* reference orientation */ + IVAS_QUATERNION trkRot; /* tracked rotation */ } ivas_orient_trk_state_t; /*----------------------------------------------------------------------------------* * Head rotation data structure *----------------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED + typedef struct { Word8 headRotEnabled; IVAS_QUATERNION headPositions[MAX_PARAM_SPATIAL_SUBFRAMES]; IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; #ifdef IVAS_FLOAT_FIXED - Word32 crossfade_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; -#endif - float crossfade[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - ivas_orient_trk_state_t *hOrientationTracker; - -} IVAS_REND_HeadRotData; + Word32 crossfade_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q31 */ #else -typedef struct -{ - int8_t headRotEnabled; - IVAS_QUATERNION headPositions[MAX_PARAM_SPATIAL_SUBFRAMES]; - IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; float crossfade[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; +#endif ivas_orient_trk_state_t *hOrientationTracker; } IVAS_REND_HeadRotData; -#endif + typedef struct ivas_binaural_head_track_struct { IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; +#ifndef IVAS_FLOAT_FIXED float Rmat[3][3]; float Rmat_prev[3][3]; +#else + Word32 Rmat_fx[3][3]; + Word32 Rmat_prev_fx[3][3]; +#endif - uint8_t lrSwitchedNext; - uint8_t lrSwitchedCurrent; + UWord8 lrSwitchedNext; + UWord8 lrSwitchedCurrent; +#ifndef IVAS_FLOAT_FIXED float lrSwitchInterpVal; float chEneIIR[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ float procChEneIIR[2][MASA_FREQUENCY_BANDS]; +#else + Word32 lrSwitchInterpVal_fx; - int16_t shd_rot_max_order; + Word32 chEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ + Word32 procChEneIIR_fx[2][MASA_FREQUENCY_BANDS]; +#endif + + Word16 shd_rot_max_order; ivas_orient_trk_state_t *OrientationTracker; } HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; @@ -1071,12 +1096,21 @@ typedef struct ivas_combined_orientation_struct IVAS_QUATERNION Quaternion_prev_extOrientation; IVAS_QUATERNION Quaternions_ext_interpolation_start; IVAS_QUATERNION Quaternions_ext_interpolation_target; - float Rmat[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; + float Rmat[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; float Rmat_prev[3][3]; Word32 Rmat_prev_fx[3][3]; float chEneIIR[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ float procChEneIIR[2][MASA_FREQUENCY_BANDS]; +#ifdef IVAS_FLOAT_FIXED + Word32 lrSwitchInterpVal_fx; + Word32 interpolationCoefficient_fx; + Word32 interpolationIncrement_Fx; + Word32 chEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ + Word16 q_chEneIIR; + Word32 procChEneIIR_fx[2][MASA_FREQUENCY_BANDS]; + Word16 q_procChEneIIR; +#endif Word16 shd_rot_max_order; IVAS_VECTOR3 listenerPos[MAX_PARAM_SPATIAL_SUBFRAMES]; IVAS_QUATERNION Quaternion_frozen_ext; @@ -1131,60 +1165,47 @@ typedef struct ivas_combined_orientation_struct typedef struct _IVAS_RENDER_CONFIG RENDER_CONFIG_DATA; typedef struct _IVAS_RENDER_CONFIG *RENDER_CONFIG_HANDLE; -#ifdef IVAS_FLOAT_FIXED -typedef struct ivas_rev_delay_line_t -{ - //float *pBuffer; - Word32 *pBuffer_fx; - UWord16 MaxDelay; - Word16 Delay; - UWord16 BufferPos; - Word16 Gain_fx; -} ivas_rev_delay_line_t; -#else typedef struct ivas_rev_delay_line_t { +#ifndef IVAS_FLOAT_FIXED float *pBuffer; +#else + Word32 *pBuffer_fx; +#endif uint16_t MaxDelay; int16_t Delay; uint16_t BufferPos; +#ifndef IVAS_FLOAT_FIXED float Gain; +#else + Word16 Gain_fx; +#endif } ivas_rev_delay_line_t; -#endif -#ifdef IVAS_FLOAT_FIXED -typedef struct ivas_rev_iir_filter_t -{ - uint16_t MaxTaps; - uint16_t nr_taps; - uint16_t isFIR; - //float Output; - Word32 Output_fx; - float CoefA[IVAS_REV_MAX_IIR_FILTER_LENGTH]; - Word32 CoefA_fx[IVAS_REV_MAX_IIR_FILTER_LENGTH]; - float CoefB[IVAS_REV_MAX_IIR_FILTER_LENGTH]; - Word32 CoefB_fx[IVAS_REV_MAX_IIR_FILTER_LENGTH]; - // float pBuffer[IVAS_REV_MAX_IIR_FILTER_LENGTH]; - Word32 pBuffer_fx[IVAS_REV_MAX_IIR_FILTER_LENGTH]; -} ivas_rev_iir_filter_t; -#else typedef struct ivas_rev_iir_filter_t { uint16_t MaxTaps; uint16_t nr_taps; uint16_t isFIR; +#ifndef IVAS_FLOAT_FIXED float Output; float CoefA[IVAS_REV_MAX_IIR_FILTER_LENGTH]; float CoefB[IVAS_REV_MAX_IIR_FILTER_LENGTH]; float pBuffer[IVAS_REV_MAX_IIR_FILTER_LENGTH]; +#else + Word32 Output_fx; + Word32 CoefA_fx[IVAS_REV_MAX_IIR_FILTER_LENGTH]; /* Q30 */ + Word32 CoefB_fx[IVAS_REV_MAX_IIR_FILTER_LENGTH]; /* Q30 */ + Word32 pBuffer_fx[IVAS_REV_MAX_IIR_FILTER_LENGTH]; +#endif } ivas_rev_iir_filter_t; -#endif typedef float rv_fftwf_type_complex[2]; /* complex type of fftwf library */ #ifdef IVAS_FLOAT_FIXED +typedef Word32 rv_fftwf_type_complex_fx[2]; /* complex type of fftwf library */ /* Convertion block for FFT filter: from time domain to frequency domain (with OLS) and back */ typedef struct ivas_reverb_t2f_f2t_t { @@ -1396,13 +1417,15 @@ typedef struct er_struct_t Word32 output_Fs_fx; Word32 source_positions_fx[75]; Word32 user_origin_fx[3]; //is not needed + Word32 *circ_buffers; #else float source_positions[75]; float user_origin[3]; float output_Fs; + float *circ_buffers; #endif - Word32 *circ_buffers; + UWord16 *closest_ch_idx; shoebox_output_t shoebox_data; shoebox_obj_t shoebox_lib; @@ -1563,36 +1586,34 @@ typedef struct /* Shared memory for use when evaluating BSpline HR filter model*/ typedef struct { -#ifdef IVAS_FLOAT_FIXED - Word32 *hrfModL_fx; - Word32 *hrfModR_fx; - Word16 hrfModL_e; - Word16 hrfModR_e; -#endif +#ifndef IVAS_FLOAT_FIXED float BM[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; -#ifdef IVAS_FLOAT_FIXED +#else Word32 BM_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; // Q30 #endif ValueIndex_t BMEnergiesL[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; ValueIndex_t BMEnergiesR[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; int16_t UseIndsL[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; int16_t UseIndsR[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; +#ifndef IVAS_FLOAT_FIXED float *hrfModL; float *hrfModR; -#ifdef IVAS_FLOAT_FIXED - Word32 elevBfVec_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; // Q30 - Word32 azimBfVec_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS][HRTF_MODEL_BSPLINE_NUM_COEFFS]; // Q30 -#endif float elevBfVec[HRTF_MODEL_BSPLINE_NUM_COEFFS]; float azimBfVec[HRTF_MODEL_BSPLINE_NUM_COEFFS][HRTF_MODEL_BSPLINE_NUM_COEFFS]; float BM_ITD[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; float elevBfVecITD[HRTF_MODEL_BSPLINE_NUM_COEFFS]; float azimBfVecITD[HRTF_MODEL_BSPLINE_NUM_COEFFS]; float itdMod; -#ifdef IVAS_FLOAT_FIXED - Word32 BM_ITD_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; // Q30 - Word32 elevBfVecITD_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; // Q30 - Word32 azimBfVecITD_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; // Q30 +#else + Word32 *hrfModL_fx; + Word32 *hrfModR_fx; + Word16 hrfModL_e; + Word16 hrfModR_e; + Word32 elevBfVec_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; // Q30 + Word32 azimBfVec_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS][HRTF_MODEL_BSPLINE_NUM_COEFFS]; // Q30 + Word32 BM_ITD_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; // Q30 + Word32 elevBfVecITD_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; // Q30 + Word32 azimBfVecITD_fx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; // Q30 Word32 itdMod_fx; #endif @@ -1645,7 +1666,7 @@ typedef struct TDREND_HRFILT_FiltSet_struct Word16 *Elev_p_fx; Word16 *LeftFiltSet_p_fx; Word16 *RightFiltSet_p_fx; - const UWord16 *lr_energy_and_iac_fx[3]; /* left/right energy and interaural coherence for late reverb *//*Q-15*/ + const Word32 *lr_energy_and_iac_fx[3]; /* left/right energy and interaural coherence for late reverb */ Word32 latency_s_fx;/*Q-31*/ #endif // IVAS_FLOAT_FIXED float *lr_energy_and_iac_dyn[3]; @@ -1656,13 +1677,14 @@ typedef struct TDREND_HRFILT_FiltSet_struct typedef struct { TDREND_DistAttenModel_t DistAttenModel; +#ifndef IVAS_FLOAT_FIXED float RefDist; float MaxDist; float RollOffFactor; -#ifdef IVAS_FLOAT_FIXED - Word32 RefDist_fx; - Word32 MaxDist_fx; - Word32 RollOffFactor_fx; // Q30 +#else + Word32 RefDist_fx; /* Q30 */ + Word32 MaxDist_fx; /* Q27 */ + Word32 RollOffFactor_fx; /* Q30 */ #endif // IVAS_FLOAT_FIXED } TDREND_DistAtten_t; @@ -1789,7 +1811,7 @@ typedef struct ivas_binaural_td_rendering_struct typedef struct { - int32_t binaural_latency_ns; + Word32 binaural_latency_ns; BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; TDREND_HRFILT_FiltSet_t *hHrtfTD; @@ -1983,7 +2005,7 @@ typedef struct ivas_hrtfs_parambin_struct Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS];/*Q-14*/ Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX];/*Q-31*/ Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX];/*Q-31*/ - Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX];/*Q-31*/ + Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX];/*Q-28*/ #endif // IVAS_FLOAT_FIXED float parametricReverberationTimes[CLDFB_NO_CHANNELS_MAX]; @@ -2034,12 +2056,21 @@ typedef struct typedef struct ivas_LS_setupconversion_struct { +#ifndef IVAS_FLOAT_FIXED float *dmxMtx[MAX_OUTPUT_CHANNELS]; +#else Word32 *dmxMtx_fx[MAX_OUTPUT_CHANNELS]; // Q30 +#endif +#ifndef IVAS_FLOAT_FIXED float *targetEnergyPrev[MAX_OUTPUT_CHANNELS]; +#else Word32 *targetEnergyPrev_fx[MAX_OUTPUT_CHANNELS]; +#endif +#ifndef IVAS_FLOAT_FIXED float *dmxEnergyPrev[MAX_OUTPUT_CHANNELS]; +#else Word32 *dmxEnergyPrev_fx[MAX_OUTPUT_CHANNELS]; +#endif int16_t sfbOffset[MAX_SFB + 2]; int16_t sfbCnt; #ifdef IVAS_FLOAT_FIXED @@ -2062,7 +2093,7 @@ typedef struct ivas_LS_setupconversion_mapping_fx AUDIO_CONFIG output_config; const LS_CONVERSION_MATRIX_FX *conversion_matrix_fx; } LS_CONVERSION_MAPPING_FX; -#endif +#else typedef struct ivas_LS_setupconversion_matrix { @@ -2076,17 +2107,17 @@ typedef struct ivas_LS_setupconversion_mapping AUDIO_CONFIG output_config; const LS_CONVERSION_MATRIX *conversion_matrix; } LS_CONVERSION_MAPPING; - +#endif typedef struct ivas_mono_downmix_renderer_struct { +#ifndef IVAS_FLOAT_FIXED float inputEnergy; float protoEnergy; -#ifdef IVAS_FLOAT_FIXED +#else Word32 inputEnergy_fx; Word16 Q_inputEner; Word32 protoEnergy_fx; Word16 Q_protoEner; - #endif } MONO_DOWNMIX_RENDERER_STRUCT, *MONO_DOWNMIX_RENDERER_HANDLE; @@ -2107,7 +2138,6 @@ typedef struct ivas_LS_setup_custom Word16 num_lfe; /* number of LFE channels */ Word16 lfe_idx[MAX_OUTPUT_CHANNELS]; /* index for LFE channel insertion */ Word16 separate_ch_found; /* flag to indicate if a center channel was found */ - float separate_ch_gains[MAX_OUTPUT_CHANNELS]; /* gains to pan McMASA separateChannel in case no center channel is present */ Word16 separate_ch_gains_fx[MAX_OUTPUT_CHANNELS]; /* gains to pan McMASA separateChannel in case no center channel is present */ } LSSETUP_CUSTOM_STRUCT, *LSSETUP_CUSTOM_HANDLE; @@ -2256,17 +2286,26 @@ typedef struct ivas_dirac_ana_data_structure HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[DIRAC_MAX_ANA_CHANS]; /* DirAC parameter estimation */ +#ifndef IVAS_FLOAT_FIXED float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ +#else Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ +#endif int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; int16_t block_grouping[5]; /* diffuseness */ int16_t index_buffer_intensity; +#ifndef IVAS_FLOAT_FIXED float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; +#else Word32 *buffer_intensity_real_fx[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; +#endif +#ifndef IVAS_FLOAT_FIXED float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; +#else Word32 buffer_energy_fx[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; +#endif MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; diff --git a/lib_rend/ivas_vbap.c b/lib_rend/ivas_vbap.c index a579af75dd5eb479c0cb09d873f52d443bd5a878..3c3fd8023356d1fe9325e4941ec85b90070cbe46 100644 --- a/lib_rend/ivas_vbap.c +++ b/lib_rend/ivas_vbap.c @@ -310,13 +310,6 @@ ivas_error vbap_init_data_fx( set16_fx( vbap->top_virtual_speaker_node_division_gains_fx, 0, num_speaker_nodes ); is_success &= vbap->top_virtual_speaker_node_division_gains_fx != NULL; - IF( ( vbap->top_virtual_speaker_node_division_gains_fx = (Word16 *) malloc( num_speaker_nodes * sizeof( Word16 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VBAP data\n" ) ); - } - set16_fx( vbap->top_virtual_speaker_node_division_gains_fx, 0, num_speaker_nodes ); - is_success &= vbap->top_virtual_speaker_node_division_gains_fx != NULL; - IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { IF( ( vbap->object_mode_top_virtual_speaker_node_division_gains_fx = (Word16 *) malloc( num_speaker_nodes * sizeof( Word16 ) ) ) == NULL ) @@ -767,6 +760,14 @@ void vbap_free_data_fx( { free( ( *hVBAPdata )->object_mode_back_virtual_speaker_node_division_gains_fx ); } + 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 ) + { + free( ( *hVBAPdata )->search_struct[1].triplets ); + } free( *hVBAPdata ); *hVBAPdata = NULL; @@ -1545,6 +1546,8 @@ static void determine_virtual_speaker_node_division_gains_fx( } } + free(exp_virtual_node_division_gains); + return; } #else diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index c7eb4e35c0b4cf2d466ff8a51054bb921f788f44..98730d63001ac529cc51e39a1c8bbfd267a760d1 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -190,13 +190,13 @@ typedef struct { Word16 numLfeChannels; bool pan_lfe; - float lfeInputGain; + //float lfeInputGain; Word32 lfeInputGain_fx; - float lfeOutputAzimuth; + //float lfeOutputAzimuth; Word16 lfeOutputAzimuth_fx; - float lfeOutputElevation; + //float lfeOutputElevation; Word16 lfeOutputElevation_fx; - IVAS_REND_LfePanMtx lfePanMtx; + //IVAS_REND_LfePanMtx lfePanMtx; IVAS_REND_LfePanMtx_fx lfePanMtx_fx; } lfe_routing; #else @@ -464,6 +464,32 @@ static void freeMcLfeDelayBuffer( return; } +#ifdef IVAS_FLOAT_FIXED +static IVAS_QUATERNION quaternionInit_fx( + void ) +{ + IVAS_QUATERNION q; + q.w_fx = ONE_IN_Q29; + move32(); + q.x_fx = q.y_fx = q.z_fx = 0; + move32(); + move32(); + move32(); + + q.w_qfact = q.x_qfact = q.y_qfact = q.z_qfact = Q29; + move16(); + move16(); + move16(); + move16(); + +#ifndef IVAS_FLOAT_FIXED_TO_BE_REMOVED + q.w = 1.0f; + q.x = q.y = q.z = 0.0f; +#endif + + return q; +} +#else static IVAS_QUATERNION quaternionInit( void ) { @@ -472,6 +498,8 @@ static IVAS_QUATERNION quaternionInit( q.x = q.y = q.z = 0.0f; return q; } +#endif + #ifdef IVAS_FLOAT_FIXED static Word32 *getSmplPtr_fx( IVAS_REND_AudioBuffer buffer, @@ -739,9 +767,9 @@ static ivas_error validateOutputAudioConfig( * *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED IVAS_REND_AudioConfigType getAudioConfigType( const AUDIO_CONFIG config ) -#ifdef IVAS_FLOAT_FIXED { IVAS_REND_AudioConfigType type; @@ -790,6 +818,8 @@ IVAS_REND_AudioConfigType getAudioConfigType( return type; } #else +IVAS_REND_AudioConfigType getAudioConfigType( + const AUDIO_CONFIG config) { IVAS_REND_AudioConfigType type; @@ -910,6 +940,7 @@ ivas_error getAudioConfigNumChannels( case IVAS_AUDIO_CONFIG_OBA: case IVAS_AUDIO_CONFIG_MASA1: *numChannels = 1; + move16(); BREAK; case IVAS_AUDIO_CONFIG_STEREO: case IVAS_AUDIO_CONFIG_BINAURAL: @@ -917,28 +948,36 @@ ivas_error getAudioConfigNumChannels( case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: case IVAS_AUDIO_CONFIG_MASA2: *numChannels = 2; + move16(); BREAK; case IVAS_AUDIO_CONFIG_FOA: *numChannels = 4; + move16(); BREAK; case IVAS_AUDIO_CONFIG_5_1: *numChannels = 6; + move16(); BREAK; case IVAS_AUDIO_CONFIG_7_1: case IVAS_AUDIO_CONFIG_5_1_2: *numChannels = 8; + move16(); BREAK; case IVAS_AUDIO_CONFIG_HOA2: *numChannels = 9; + move16(); BREAK; case IVAS_AUDIO_CONFIG_5_1_4: *numChannels = 10; + move16(); BREAK; case IVAS_AUDIO_CONFIG_7_1_4: *numChannels = 12; + move16(); BREAK; case IVAS_AUDIO_CONFIG_HOA3: *numChannels = 16; + move16(); BREAK; default: return IVAS_ERR_NUM_CHANNELS_UNKNOWN; @@ -1090,7 +1129,7 @@ static LSSETUP_CUSTOM_STRUCT defaultCustomLs( ls.num_lfe = 0; set_s( ls.lfe_idx, 0, MAX_OUTPUT_CHANNELS ); ls.separate_ch_found = 0; - set_f( ls.separate_ch_gains, 0, MAX_OUTPUT_CHANNELS ); + set_val_Word16( ls.separate_ch_gains_fx, 0, MAX_OUTPUT_CHANNELS ); return ls; } @@ -1114,6 +1153,8 @@ static LSSETUP_CUSTOM_STRUCT defaultCustomLs( return ls; } #endif + + #ifdef IVAS_FLOAT_FIXED static ivas_error getSpeakerAzimuths_fx( AUDIO_CONFIG config, @@ -1257,17 +1298,20 @@ static ivas_error getAmbisonicsOrder_fx( AUDIO_CONFIG config, Word16 *order ) { - switch ( config ) + SWITCH ( config ) { case IVAS_AUDIO_CONFIG_FOA: *order = 1; - break; + move16(); + BREAK; case IVAS_AUDIO_CONFIG_HOA2: *order = 2; - break; + move16(); + BREAK; case IVAS_AUDIO_CONFIG_HOA3: *order = 3; - break; + move16(); + BREAK; default: return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unsupported audio config" ); } @@ -1542,7 +1586,84 @@ static ivas_error getMcConfigValues( return IVAS_ERR_OK; } +#ifdef IVAS_FLOAT_FIXED +static ivas_error initEfap( + EFAP_WRAPPER *pEfapWrapper, + AUDIO_CONFIG outConfig, + const LSSETUP_CUSTOM_STRUCT *pCustomLsOut ) +{ + ivas_error error; + const float *azimuths; + const float *elevations; + /*To be replaced with pointers*/ + Word32 azimuths_fx[MAX_OUTPUT_CHANNELS]; + Word32 elevations_fx[MAX_OUTPUT_CHANNELS]; + int16_t numNonLfeChannels; + + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + pEfapWrapper->speakerConfig = IVAS_AUDIO_CONFIG_7_1_4; + } + else + { + pEfapWrapper->speakerConfig = outConfig; + } + pEfapWrapper->pCustomLsSetup = pCustomLsOut; + + /* If re-initializing, free existing EFAP handle. */ + if ( pEfapWrapper->hEfap != NULL ) + { + efap_free_data( &pEfapWrapper->hEfap ); + } + + /* Only initialize EFAP handle if output config is channel-based */ + if ( getAudioConfigType( pEfapWrapper->speakerConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + pEfapWrapper->hEfap = NULL; + return IVAS_ERR_OK; + } + + if ( outConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + /*float2fix block: to be removed*/ + floatToFixed_arrL( (float *) pCustomLsOut->ls_azimuth, (Word32 *) pCustomLsOut->ls_azimuth_fx, Q22, pCustomLsOut->num_spk ); + floatToFixed_arrL( (float *) pCustomLsOut->ls_elevation, (Word32 *) pCustomLsOut->ls_elevation_fx, Q22, pCustomLsOut->num_spk ); + /*float2fix block end*/ + 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 ) + { + return error; + } + } + else + { + if ( ( error = getSpeakerAzimuths( pEfapWrapper->speakerConfig, &azimuths ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getSpeakerElevations( pEfapWrapper->speakerConfig, &elevations ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getNumNonLfeChannelsInSpeakerLayout( pEfapWrapper->speakerConfig, &numNonLfeChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*float2fix block: to be removed*/ + floatToFixed_arrL( (float *) azimuths, azimuths_fx, Q22, numNonLfeChannels ); + floatToFixed_arrL( (float *) elevations, elevations_fx, Q22, numNonLfeChannels ); + /*float2fix block end*/ + if ( ( error = efap_init_data_fx( &pEfapWrapper->hEfap, azimuths_fx, elevations_fx, numNonLfeChannels, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + return IVAS_ERR_OK; +} +#else static ivas_error initEfap( EFAP_WRAPPER *pEfapWrapper, AUDIO_CONFIG outConfig, @@ -1608,6 +1729,7 @@ static ivas_error initEfap( return IVAS_ERR_OK; } +#endif #ifdef IVAS_FLOAT_FIXED static ivas_error getEfapGains_fx( @@ -1624,18 +1746,18 @@ static ivas_error getEfapGains_fx( ivas_error error; /* EFAP returns an array of gains only for non-LFE speakers */ - efap_determine_gains_fixed( efapWrapper.hEfap, tmpPanGains, azi, ele, EFAP_MODE_EFAP ); + efap_determine_gains_fx( efapWrapper.hEfap, tmpPanGains, azi, ele, EFAP_MODE_EFAP ); /* Now copy to buffer that includes LFE channels */ IF( EQ_32( efapWrapper.speakerConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { numChannels = add( efapWrapper.pCustomLsSetup->num_spk, efapWrapper.pCustomLsSetup->num_lfe ); - move16(); readPtr = tmpPanGains; - move16(); lfeCount = 0; + move16(); FOR( i = 0; i < numChannels; ++i ) { + test(); IF( LT_16( lfeCount, efapWrapper.pCustomLsSetup->num_lfe ) && EQ_16( i, efapWrapper.pCustomLsSetup->lfe_idx[lfeCount] ) ) { panGains[i] = 0; @@ -1658,7 +1780,6 @@ static ivas_error getEfapGains_fx( } readPtr = tmpPanGains; - move32(); FOR( i = 0; i < numChannels; ++i ) { @@ -1679,6 +1800,74 @@ static ivas_error getEfapGains_fx( return IVAS_ERR_OK; } #endif +#ifdef IVAS_FLOAT_FIXED +static ivas_error getEfapGains( + EFAP_WRAPPER efapWrapper, + const float azi, + const float ele, + pan_vector panGains ) +{ + pan_vector tmpPanGains; /* tmp pan gain buffer without LFE channels */ + pan_vector_fx tmpPanGains_fx; /* tmp pan gain buffer without LFE channels */ + float *readPtr; + int16_t i; + int16_t lfeCount; + int16_t numChannels; + ivas_error error; + + /* EFAP returns an array of gains only for non-LFE speakers */ + efap_determine_gains_fx( efapWrapper.hEfap, tmpPanGains_fx, floatToFixed( azi, Q22 ), floatToFixed( ele, Q22 ), EFAP_MODE_EFAP ); + /* float2fix to be removed */ + + /*fix2float: to be removed*/ + fixedToFloat_arrL(tmpPanGains_fx, tmpPanGains, Q30, efapWrapper.hEfap->numSpk); + + /* Now copy to buffer that includes LFE channels */ + if ( efapWrapper.speakerConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + numChannels = efapWrapper.pCustomLsSetup->num_spk + efapWrapper.pCustomLsSetup->num_lfe; + readPtr = tmpPanGains; + + for ( i = 0, lfeCount = 0; i < numChannels; ++i ) + { + if ( lfeCount < efapWrapper.pCustomLsSetup->num_lfe && i == efapWrapper.pCustomLsSetup->lfe_idx[lfeCount] ) + { + panGains[i] = 0.0f; + ++lfeCount; + } + else + { + panGains[i] = *readPtr; + ++readPtr; + } + } + } + else + { + if ( ( error = getAudioConfigNumChannels( efapWrapper.speakerConfig, &numChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + readPtr = tmpPanGains; + + for ( i = 0; i < numChannels; ++i ) + { + if ( i == LFE_CHANNEL ) + { + panGains[i] = 0.0f; + } + else + { + panGains[i] = *readPtr; + ++readPtr; + } + } + } + + return IVAS_ERR_OK; +} +#else static ivas_error getEfapGains( EFAP_WRAPPER efapWrapper, const float azi, @@ -1740,14 +1929,14 @@ static ivas_error getEfapGains( return IVAS_ERR_OK; } +#endif #ifdef IVAS_FLOAT_FIXED -static ivas_error initHeadRotation( +static ivas_error initHeadRotation_fx( IVAS_REND_HANDLE hIvasRend ) { Word16 i, crossfade_len; Word32 tmp_fx; - float tmp; ivas_error error; /* Head rotation is enabled by default */ @@ -1755,19 +1944,20 @@ static ivas_error initHeadRotation( /* Initialize 5ms crossfade */ crossfade_len = L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES; - tmp = 1.f / ( crossfade_len - 1 ); + move16(); tmp_fx = Q31_BY_SUB_FRAME_240; + move16(); - for ( i = 0; i < crossfade_len; i++ ) + FOR( i = 0; i < crossfade_len; i++ ) { - hIvasRend->headRotData.crossfade[i] = i * tmp; hIvasRend->headRotData.crossfade_fx[i] = UL_Mpy_32_32( i, tmp_fx ); + move32(); } /* Initialize with unit quaternions */ FOR( i = 0; i < hIvasRend->num_subframes; ++i ) { - hIvasRend->headRotData.headPositions[i] = quaternionInit(); + hIvasRend->headRotData.headPositions[i] = quaternionInit_fx(); } @@ -1776,17 +1966,10 @@ static ivas_error initHeadRotation( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); } -#ifdef IVAS_FLOAT_FIXED IF( ( error = ivas_orient_trk_Init_fx( hIvasRend->headRotData.hOrientationTracker ) ) != IVAS_ERR_OK ) { return error; } -#else - IF( ( error = ivas_orient_trk_Init( hIvasRend->headRotData.hOrientationTracker ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif return IVAS_ERR_OK; } @@ -1829,6 +2012,21 @@ static ivas_error initHeadRotation( return IVAS_ERR_OK; } #endif + + +#ifdef IVAS_FLOAT_FIXED +static void closeHeadRotation( + IVAS_REND_HANDLE hIvasRend ) +{ + test(); + IF( ( hIvasRend != NULL ) && ( hIvasRend->headRotData.hOrientationTracker != NULL ) ) + { + free( hIvasRend->headRotData.hOrientationTracker ); + } + + return; +} +#else static void closeHeadRotation( IVAS_REND_HANDLE hIvasRend ) { @@ -1839,6 +2037,7 @@ static void closeHeadRotation( return; } +#endif static void initRotMatrix( @@ -1999,6 +2198,20 @@ static rendering_context getRendCtx( } +#ifdef IVAS_FLOAT_FIXED +static TDREND_WRAPPER defaultTdRendWrapper( + void ) +{ + TDREND_WRAPPER w; + + w.binaural_latency_ns = 0; + move32(); + w.hBinRendererTd = NULL; + w.hHrtfTD = NULL; + + return w; +} +#else static TDREND_WRAPPER defaultTdRendWrapper( void ) { @@ -2010,8 +2223,26 @@ static TDREND_WRAPPER defaultTdRendWrapper( return w; } +#endif + +#ifdef IVAS_FLOAT_FIXED +static bool isIoConfigPairSupported( + const AUDIO_CONFIG inConfig, + const AUDIO_CONFIG outConfig ) +{ + /* Rendering mono or stereo to binaural is not supported */ + test(); + test(); + IF( ( EQ_32( inConfig, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_STEREO ) ) && EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) + { + return false; + } + /* If not returned so far, config pair is supported */ + return true; +} +#else static bool isIoConfigPairSupported( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig ) @@ -2025,6 +2256,7 @@ static bool isIoConfigPairSupported( /* If not returned so far, config pair is supported */ return true; } +#endif static ivas_error initIsmMasaRendering( @@ -2095,10 +2327,45 @@ static ivas_error setRendInputActiveIsm( if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) { +#ifdef IVAS_FLOAT_FIXED /*Cleanup changes: float to fixed*/ + IF( hRendCfg ) + { + hRendCfg->roomAcoustics.acousticPreDelay_fx = floatToFixed( hRendCfg->roomAcoustics.acousticPreDelay, 27 ); + FOR( int i = 0; i < 60; i++ ) + { + hRendCfg->roomAcoustics.pFc_input_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pFc_input[i] * ONE_IN_Q16 ); + hRendCfg->roomAcoustics.pAcoustic_rt60_fx[i] = (Word32) ( ( hRendCfg->roomAcoustics.pAcoustic_rt60[i] ) * ONE_IN_Q26 ); + hRendCfg->roomAcoustics.pAcoustic_dsr_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pAcoustic_dsr[i] * ONE_IN_Q30 ); + } + + hRendCfg->roomAcoustics.inputPreDelay_fx = (Word32) ( hRendCfg->roomAcoustics.inputPreDelay * ONE_IN_Q27 ); + hRendCfg->roomAcoustics.dimensions.x_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.x * 4194304 ); // Q10.22, min value:1, max :999.0 + hRendCfg->roomAcoustics.dimensions.y_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.y * 4194304 ); // Q10.22 + hRendCfg->roomAcoustics.dimensions.z_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.z * 4194304 ); // Q10.22 + + + FOR( int ii = 0; ii < 6; ii++ ) + { + hRendCfg->roomAcoustics.AbsCoeff_fx[ii] = (Word32) ( hRendCfg->roomAcoustics.AbsCoeff[ii] * 1073741824 ); // Q2.30 min :0 max 1 + } + + hRendCfg->roomAcoustics.ListenerOrigin.x_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.x * 4194304 ); //( 2147483648 >> 2 ); + hRendCfg->roomAcoustics.ListenerOrigin.y_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.y * ( 4194304 ) ); + hRendCfg->roomAcoustics.ListenerOrigin.z_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.z * ( 4194304 ) ); + } +#endif // 1 if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } +#ifdef IVAS_FLOAT_FIXED /*Cleanup changes: fixed to float*/ + IF(inputIsm->crendWrapper && inputIsm->crendWrapper->hHrtfCrend != NULL ) + { + inputIsm->crendWrapper->hHrtfCrend->gain_lfe = fixedToFloat( inputIsm->crendWrapper->hHrtfCrend->gain_lfe_fx, 14 ); + inputIsm->crendWrapper->hHrtfCrend->latency_s = fixedToFloat( inputIsm->crendWrapper->hHrtfCrend->latency_s_fx, 31 ); + fixedToFloat_arr( inputIsm->crendWrapper->hHrtfCrend->inv_diffuse_weight_fx, inputIsm->crendWrapper->hHrtfCrend->inv_diffuse_weight, 15, 16 ); + } +#endif } else if ( outConfig == IVAS_AUDIO_CONFIG_MASA1 || outConfig == IVAS_AUDIO_CONFIG_MASA2 ) { @@ -2116,10 +2383,28 @@ static ivas_error setRendInputActiveIsm( if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { +#ifdef IVAS_FLOAT_FIXED +#if 1 /*TODO:To be removed later*/ + hRendCfg->roomAcoustics.acousticPreDelay_fx = floatToFixed( hRendCfg->roomAcoustics.acousticPreDelay, 27 ); + for ( int i = 0; i < 60; i++ ) + { + hRendCfg->roomAcoustics.pFc_input_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pFc_input[i] * ONE_IN_Q16 ); + hRendCfg->roomAcoustics.pAcoustic_rt60_fx[i] = (Word32) ( ( hRendCfg->roomAcoustics.pAcoustic_rt60[i] ) * ONE_IN_Q26 ); + hRendCfg->roomAcoustics.pAcoustic_dsr_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pAcoustic_dsr[i] * ONE_IN_Q30 ); + } + + hRendCfg->roomAcoustics.inputPreDelay_fx = (Word32) ( hRendCfg->roomAcoustics.inputPreDelay * ONE_IN_Q27 ); +#endif + if ( ( error = ivas_reverb_open( &( 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 } } @@ -2187,7 +2472,7 @@ static void copyLsConversionMatrixToPanMatrix_fx( return; } -#endif +#else static void copyLsConversionMatrixToPanMatrix( const LS_CONVERSION_MATRIX *lsConvMatrix, @@ -2212,7 +2497,7 @@ static void copyLsConversionMatrixToPanMatrix( return; } - +#endif static void setZeroPanMatrix( pan_matrix panMatrix ) { @@ -2246,9 +2531,10 @@ static void fillIdentityPanMatrix_fx( { Word16 i; - FOR( i = 0; i < min( MAX_INPUT_CHANNELS, MAX_OUTPUT_CHANNELS ); ++i ) + FOR( i = 0; i < s_min( MAX_INPUT_CHANNELS, MAX_OUTPUT_CHANNELS ); ++i ) { panMatrix[i][i] = ONE_IN_Q31; + move32(); } return; @@ -2295,12 +2581,15 @@ static ivas_error initMcPanGainsWithConversionMapping_fx( Word16 i; ivasConfigIn = inputMc->base.inConfig; + move32(); ivasConfigOut = outConfig; + move32(); /* Find conversion mapping for current I/O config pair. * Stay with default panning matrix if conversion_matrix is NULL */ FOR( i = 0; i < LS_SETUP_CONVERSION_NUM_MAPPINGS; ++i ) { + test(); IF( EQ_32( ls_conversion_mapping_fx[i].input_config, ivasConfigIn ) && EQ_32( ls_conversion_mapping_fx[i].output_config, ivasConfigOut ) ) { /* Mapping found with valid matrix - copy */ @@ -2320,7 +2609,7 @@ static ivas_error initMcPanGainsWithConversionMapping_fx( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Missing multichannel conversion mapping" ); } -#endif +#else static ivas_error initMcPanGainsWithConversionMapping( input_mc *inputMc, @@ -2355,6 +2644,7 @@ static ivas_error initMcPanGainsWithConversionMapping( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Missing multichannel conversion mapping" ); } +#endif #ifdef IVAS_FLOAT_FIXED static ivas_error initMcPanGainsWithEfap_fx( input_mc *inputMc, @@ -2384,6 +2674,7 @@ static ivas_error initMcPanGainsWithEfap_fx( } inLfeChIdx = LFE_CHANNEL; + move16(); } ELSE { @@ -2416,6 +2707,8 @@ static ivas_error initMcPanGainsWithEfap_fx( ++outChIdx; } + test(); + test(); IF( NE_32( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && GE_16( inLfeChIdx, 0 ) ) { inputMc->panGains_fx[inLfeChIdx][LFE_CHANNEL] = ONE_IN_Q31; @@ -2593,6 +2886,7 @@ static ivas_error initMcPanGainsWithMonoOut_fx( /* ls_conversion_cicpX_stereo contains gains for side speakers. * 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 ) ) { skipSideSpeakers = true; @@ -2601,6 +2895,7 @@ static ivas_error initMcPanGainsWithMonoOut_fx( move16(); FOR( writeIdx = 0; writeIdx < numInChannels; ++writeIdx ) { + test(); IF( ( skipSideSpeakers ) && EQ_16( readIdx, 4 ) ) { /* Skip gains for side speakers in lookup table */ @@ -2695,6 +2990,7 @@ 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; + test(); 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; @@ -2784,35 +3080,37 @@ static bool configsAreEqual( Word16 i; /* Both input and output are custom LS - compare structs */ - IF ( EQ_16(configA , IVAS_AUDIO_CONFIG_LS_CUSTOM) && EQ_16(configB , IVAS_AUDIO_CONFIG_LS_CUSTOM) ) + test(); + IF( EQ_16( configA, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && EQ_16( configB, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF ( NE_16(customLsA.num_spk , customLsB.num_spk) ) + IF( NE_16( customLsA.num_spk, customLsB.num_spk ) ) { return false; } - IF ( NE_16(customLsA.num_lfe , customLsB.num_lfe )) + IF( NE_16( customLsA.num_lfe, customLsB.num_lfe ) ) { return false; } - IF ( NE_16(customLsA.is_planar_setup , customLsB.is_planar_setup) ) + IF( NE_16( customLsA.is_planar_setup, customLsB.is_planar_setup ) ) { return false; } - FOR ( i = 0; i < customLsA.num_spk; ++i ) + FOR( i = 0; i < customLsA.num_spk; ++i ) { /* Compare to nearest degree (hence the int16_t cast) */ - IF ( NE_32(customLsA.ls_azimuth_fx[i] , customLsB.ls_azimuth_fx[i]) || - NE_32(customLsA.ls_elevation_fx[i] , customLsB.ls_elevation_fx[i] )) + test(); + IF( NE_32( customLsA.ls_azimuth_fx[i], customLsB.ls_azimuth_fx[i] ) || + NE_32( customLsA.ls_elevation_fx[i], customLsB.ls_elevation_fx[i] ) ) { return false; } } - FOR ( i = 0; i < customLsA.num_lfe; ++i ) + FOR( i = 0; i < customLsA.num_lfe; ++i ) { - IF ( NE_16(customLsA.lfe_idx[i] , customLsB.lfe_idx[i]) ) + IF( NE_16( customLsA.lfe_idx[i], customLsB.lfe_idx[i] ) ) { return false; } @@ -2885,31 +3183,29 @@ static ivas_error updateLfePanGainsForMcOut( error = IVAS_ERR_OK; /* If panning is not required, simply return */ - IF ( !inputMc->lfeRouting.pan_lfe ) + IF( !inputMc->lfeRouting.pan_lfe ) { return error; } numLfeIn = getNumLfeChannels( inputMc ); - move16(); - IF ( EQ_16(outConfig , IVAS_AUDIO_CONFIG_LS_CUSTOM) ) + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { numOutChannels = add( inputMc->base.ctx.pCustomLsOut->num_spk, inputMc->base.ctx.pCustomLsOut->num_lfe ); - move16(); } ELSE { - IF ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) + IF( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) { return error; } } - FOR ( i = 0; i < numLfeIn; i++ ) + 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( ( 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; } @@ -3052,17 +3348,20 @@ static ivas_error updateMcPanGainsForMcOut( +-----------+-------------+---------------+-----------+--------------------+ */ - IF ( configsAreEqual( inputMc->base.inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ) ) + test(); + test(); + IF( configsAreEqual( inputMc->base.inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ) ) { 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_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 ) ) { - IF ( EQ_16(inputMc->base.inConfig , IVAS_AUDIO_CONFIG_MONO ) && ( inputMc->nonDiegeticPan ) ) + test(); + IF( EQ_16( 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 ); + 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 ); move32(); inputMc->panGains_fx[0][1] = L_sub( ONE_IN_Q31, inputMc->panGains_fx[0][0] ); move32(); @@ -3073,11 +3372,11 @@ static ivas_error updateMcPanGainsForMcOut( error = initMcPanGainsWithEfap_fx( inputMc, outConfig ); } } - ELSE IF ( EQ_16(outConfig , IVAS_AUDIO_CONFIG_MONO) ) + ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MONO ) ) { error = initMcPanGainsWithMonoOut_fx( inputMc ); } - ELSE IF( EQ_16(outConfig , IVAS_AUDIO_CONFIG_STEREO) ) + ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_STEREO ) ) { error = initMcPanGainsWithStereoLookup_fx( inputMc ); } @@ -3087,7 +3386,7 @@ static ivas_error updateMcPanGainsForMcOut( } /* check for errors from above block */ - IF ( error != IVAS_ERR_OK ) + IF( error != IVAS_ERR_OK ) { return error; } @@ -3193,14 +3492,14 @@ static ivas_error updateMcPanGainsForAmbiOut( } ch_in = 0; move16(); - FOR ( ch_out = 0; ch_in < numNonLfeInChannels; ++ch_out ) + FOR( ch_out = 0; ch_in < numNonLfeInChannels; ++ch_out ) { - IF ( EQ_16(ch_in , LFE_CHANNEL )) + IF( EQ_16( ch_in, LFE_CHANNEL ) ) { ++ch_out; } ivas_dirac_dec_get_response_fixed( (Word16) L_shr( spkAzi_fx[ch_in], 22 ), (Word16) L_shr( spkEle_fx[ch_in], 22 ), inputMc->panGains_fx[ch_out], outAmbiOrder ); - FOR ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { Word32 temp = inputMc->panGains_fx[ch_out][i]; move32(); @@ -3221,11 +3520,11 @@ static ivas_error updateMcPanGainsForAmbiOut( move32(); ch_in = 0; move16(); - FOR ( ch_out = 0; ch_in < numNonLfeInChannels; ++ch_out ) + FOR( ch_out = 0; ch_in < numNonLfeInChannels; ++ch_out ) { - FOR ( lfeIdx = 0; lfeIdx < inputMc->customLsInput.num_lfe; ++lfeIdx ) + FOR( lfeIdx = 0; lfeIdx < inputMc->customLsInput.num_lfe; ++lfeIdx ) { - IF ( EQ_16(inputMc->customLsInput.lfe_idx[lfeIdx] , ch_in )) + IF( EQ_16( inputMc->customLsInput.lfe_idx[lfeIdx], ch_in ) ) { ++ch_out; BREAK; @@ -3233,7 +3532,7 @@ static ivas_error updateMcPanGainsForAmbiOut( } ivas_dirac_dec_get_response_fixed( (Word16) L_shr( spkAzi_fx[ch_in], 22 ), (Word16) L_shr( spkEle_fx[ch_in], 22 ), inputMc->panGains_fx[ch_out], outAmbiOrder ); - FOR ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { Word32 temp = inputMc->panGains_fx[ch_out][i]; move32(); @@ -3246,7 +3545,7 @@ static ivas_error updateMcPanGainsForAmbiOut( } /* update LFE panning */ - IF ( ( error = updateLfePanGainsForAmbiOut( inputMc, outConfig ) ) != IVAS_ERR_OK ) + IF( ( error = updateLfePanGainsForAmbiOut( inputMc, outConfig ) ) != IVAS_ERR_OK ) { return error; } @@ -3336,7 +3635,7 @@ static ivas_error updateMcPanGains( setZeroPanMatrix_fx( inputMc->panGains_fx ); error = IVAS_ERR_OK; - SWITCH ( getAudioConfigType( outConfig ) ) + SWITCH( getAudioConfigType( outConfig ) ) { case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: error = updateMcPanGainsForMcOut( inputMc, outConfig ); @@ -3364,23 +3663,23 @@ 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( error != IVAS_ERR_OK ) { return error; } /* Copy LFE routing to pan gains array */ - IF (EQ_16( inputMc->base.inConfig , IVAS_AUDIO_CONFIG_LS_CUSTOM )) + IF( EQ_16( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - FOR ( i = 0; i < inputMc->customLsInput.num_lfe; ++i ) + FOR( i = 0; i < inputMc->customLsInput.num_lfe; ++i ) { - mvr2r_Word32( inputMc->lfeRouting.lfePanMtx_fx[i], inputMc->panGains_fx[inputMc->customLsInput.lfe_idx[i]], IVAS_MAX_OUTPUT_CHANNELS ); + Copy32( inputMc->lfeRouting.lfePanMtx_fx[i], inputMc->panGains_fx[inputMc->customLsInput.lfe_idx[i]], IVAS_MAX_OUTPUT_CHANNELS ); } } ELSE { /* For code simplicity, always copy LFE gains. If config has no LFE, gains will be zero anyway. */ - mvr2r_Word32( inputMc->lfeRouting.lfePanMtx_fx[0], inputMc->panGains_fx[LFE_CHANNEL], IVAS_MAX_OUTPUT_CHANNELS ); + Copy32( inputMc->lfeRouting.lfePanMtx_fx[0], inputMc->panGains_fx[LFE_CHANNEL], IVAS_MAX_OUTPUT_CHANNELS ); } return IVAS_ERR_OK; @@ -3514,19 +3813,83 @@ static ivas_error initMcBinauralRendering( if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && inputMc->hReverb == NULL ) { +#ifdef IVAS_FLOAT_FIXED +#if 1 /*TODO:To be removed later*/ + hRendCfg->roomAcoustics.acousticPreDelay_fx = floatToFixed( hRendCfg->roomAcoustics.acousticPreDelay, 27 ); + for ( int i = 0; i < 60; i++ ) + { + hRendCfg->roomAcoustics.pFc_input_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pFc_input[i] * ONE_IN_Q16 ); + hRendCfg->roomAcoustics.pAcoustic_rt60_fx[i] = (Word32) ( ( hRendCfg->roomAcoustics.pAcoustic_rt60[i] ) * ONE_IN_Q26 ); + hRendCfg->roomAcoustics.pAcoustic_dsr_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pAcoustic_dsr[i] * ONE_IN_Q30 ); + } + + hRendCfg->roomAcoustics.inputPreDelay_fx = (Word32) ( hRendCfg->roomAcoustics.inputPreDelay * ONE_IN_Q27 ); +#endif + if ( ( error = ivas_reverb_open( &( inputMc->hReverb ), outConfig, NULL,inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + +#if 1 /*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 ) { /* open CREND */ +#ifdef IVAS_FLOAT_FIXED /*Cleanup changes: float to fixed*/ + IF( hRendCfg ) + { + hRendCfg->roomAcoustics.acousticPreDelay_fx = floatToFixed( hRendCfg->roomAcoustics.acousticPreDelay, 27 ); + FOR( int i = 0; i < 60; i++ ) + { + hRendCfg->roomAcoustics.pFc_input_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pFc_input[i] * ONE_IN_Q16 ); + hRendCfg->roomAcoustics.pAcoustic_rt60_fx[i] = (Word32) ( ( hRendCfg->roomAcoustics.pAcoustic_rt60[i] ) * ONE_IN_Q26 ); + hRendCfg->roomAcoustics.pAcoustic_dsr_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pAcoustic_dsr[i] * ONE_IN_Q30 ); + } + + hRendCfg->roomAcoustics.inputPreDelay_fx = (Word32) ( hRendCfg->roomAcoustics.inputPreDelay * ONE_IN_Q27 ); + hRendCfg->roomAcoustics.dimensions.x_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.x * 4194304 ); // Q10.22, min value:1, max :999.0 + hRendCfg->roomAcoustics.dimensions.y_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.y * 4194304 ); // Q10.22 + hRendCfg->roomAcoustics.dimensions.z_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.z * 4194304 ); // Q10.22 + + + FOR( int ii = 0; ii < 6; ii++ ) + { + hRendCfg->roomAcoustics.AbsCoeff_fx[ii] = (Word32) ( hRendCfg->roomAcoustics.AbsCoeff[ii] * 1073741824 ); // Q2.30 min :0 max 1 + } + + hRendCfg->roomAcoustics.ListenerOrigin.x_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.x * 4194304 ); //( 2147483648 >> 2 ); + hRendCfg->roomAcoustics.ListenerOrigin.y_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.y * ( 4194304 ) ); + hRendCfg->roomAcoustics.ListenerOrigin.z_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.z * ( 4194304 ) ); + } +#endif // 1 if ( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, NULL, outSampleRate ) ) != IVAS_ERR_OK ) { return error; } +#ifdef IVAS_FLOAT_FIXED /*Cleanup changes: fixed to float*/ + IF(inputMc->crendWrapper && inputMc->crendWrapper->hHrtfCrend != NULL ) + + { + inputMc->crendWrapper->hHrtfCrend->gain_lfe = fixedToFloat( inputMc->crendWrapper->hHrtfCrend->gain_lfe_fx, 14 ); + inputMc->crendWrapper->hHrtfCrend->latency_s = fixedToFloat( inputMc->crendWrapper->hHrtfCrend->latency_s_fx, 31 ); + fixedToFloat_arr( inputMc->crendWrapper->hHrtfCrend->inv_diffuse_weight_fx, inputMc->crendWrapper->hHrtfCrend->inv_diffuse_weight, 15, 16 ); + } +#endif } /* Initialise the EFAP handle for rotation on input layout */ @@ -3592,14 +3955,15 @@ static lfe_routing defaultLfeRouting( /* Set all output gains to zero, then route each input LFE consecutively to the next available output LFE. */ - FOR ( i = 0; i < RENDERER_MAX_INPUT_LFE_CHANNELS; ++i ) + FOR( i = 0; i < RENDERER_MAX_INPUT_LFE_CHANNELS; ++i ) { set_val_Word32( routing.lfePanMtx_fx[i], 0, IVAS_MAX_OUTPUT_CHANNELS ); } routing.pan_lfe = false; routing.lfeInputGain_fx = ONE_IN_Q31; + move32(); - SWITCH ( inConfig ) + SWITCH( inConfig ) { case IVAS_AUDIO_CONFIG_5_1: case IVAS_AUDIO_CONFIG_5_1_2: @@ -3618,7 +3982,7 @@ static lfe_routing defaultLfeRouting( move16(); } - SWITCH ( outConfig ) + SWITCH( outConfig ) { case IVAS_AUDIO_CONFIG_5_1: case IVAS_AUDIO_CONFIG_5_1_2: @@ -3629,7 +3993,7 @@ static lfe_routing defaultLfeRouting( move32(); BREAK; case IVAS_AUDIO_CONFIG_LS_CUSTOM: - FOR ( i = 0; i < routing.numLfeChannels && i < customLsOut.num_lfe; ++i ) + FOR( i = 0; i < routing.numLfeChannels && i < customLsOut.num_lfe; ++i ) { routing.lfePanMtx_fx[i][customLsOut.lfe_idx[i]] = ONE_IN_Q31; move32(); @@ -3918,7 +4282,7 @@ static void clearInputMc( return; } #endif - +#ifdef IVAS_FLOAT_FIXED static ivas_error initSbaPanGainsForMcOut( input_sba *inputSba, const AUDIO_CONFIG outConfig, @@ -3970,7 +4334,7 @@ static ivas_error initSbaPanGainsForMcOut( /* obtain and copy over HOA decoding matrix */ tmpDecMtx = NULL; - if ( ( error = ivas_sba_get_hoa_dec_matrix( hOutSetup, &tmpDecMtx, ambiOrderIn ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_sba_get_hoa_dec_matrix_fx( hOutSetup, &tmpDecMtx, ambiOrderIn ) ) != IVAS_ERR_OK ) { return error; } @@ -3996,6 +4360,77 @@ static ivas_error initSbaPanGainsForMcOut( return IVAS_ERR_OK; } +#else +static ivas_error initSbaPanGainsForMcOut( + input_sba *inputSba, + const AUDIO_CONFIG outConfig, + const LSSETUP_CUSTOM_STRUCT *outSetupCustom ) +{ + int16_t ambiOrderIn; + int16_t chInIdx, chOutIdx; + float *tmpDecMtx, *readPtr; + IVAS_OUTPUT_SETUP hOutSetup; + ivas_error error; + + if ( ( error = getAmbisonicsOrder( inputSba->base.inConfig, &ambiOrderIn ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( getAudioConfigType( outConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + assert( !"Invalid configuration" ); + return IVAS_ERR_WRONG_PARAMS; + } + + switch ( outConfig ) + { + case IVAS_AUDIO_CONFIG_MONO: + hOutSetup.ls_azimuth = ls_azimuth_CICP1; + hOutSetup.ls_elevation = ls_elevation_CICP1; + ivas_output_init( &hOutSetup, outConfig ); + break; + case IVAS_AUDIO_CONFIG_STEREO: + case IVAS_AUDIO_CONFIG_5_1: + case IVAS_AUDIO_CONFIG_7_1: + case IVAS_AUDIO_CONFIG_5_1_2: + case IVAS_AUDIO_CONFIG_5_1_4: + case IVAS_AUDIO_CONFIG_7_1_4: + ivas_output_init( &hOutSetup, outConfig ); + break; + case IVAS_AUDIO_CONFIG_LS_CUSTOM: + ivas_ls_custom_setup( &hOutSetup, outSetupCustom ); + break; + default: + assert( !"Invalid speaker config" ); + return IVAS_ERR_WRONG_PARAMS; + } + + /* obtain and copy over HOA decoding matrix */ + tmpDecMtx = NULL; + if ( ( error = ivas_sba_get_hoa_dec_matrix( hOutSetup, &tmpDecMtx, ambiOrderIn ) ) != IVAS_ERR_OK ) + { + return error; + } + + readPtr = &tmpDecMtx[0]; + for ( chOutIdx = 0; chOutIdx < hOutSetup.nchan_out_woLFE + hOutSetup.num_lfe; ++chOutIdx ) + { + for ( chInIdx = 0; chInIdx < SBA_NHARM_HOA3; ++chInIdx ) + { + if ( hOutSetup.num_lfe > 0 && chOutIdx == hOutSetup.index_lfe[0] ) + { + continue; /* nothing to be rendered to LFE */ + } + inputSba->hoaDecMtx[chInIdx][chOutIdx] = *readPtr++; + } + } + + free( tmpDecMtx ); + + return IVAS_ERR_OK; +} +#endif #ifdef IVAS_FLOAT_FIXED static ivas_error initSbaPanGainsForSbaOut( @@ -4040,6 +4475,33 @@ static ivas_error updateSbaPanGains( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg ) { +#if 1 /*Cleanup changes: float to fixed*/ + IF( hRendCfg ) + { + hRendCfg->roomAcoustics.acousticPreDelay_fx = floatToFixed( hRendCfg->roomAcoustics.acousticPreDelay, 27 ); + FOR( int i = 0; i < 60; i++ ) + { + hRendCfg->roomAcoustics.pFc_input_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pFc_input[i] * ONE_IN_Q16 ); + hRendCfg->roomAcoustics.pAcoustic_rt60_fx[i] = (Word32) ( ( hRendCfg->roomAcoustics.pAcoustic_rt60[i] ) * ONE_IN_Q26 ); + hRendCfg->roomAcoustics.pAcoustic_dsr_fx[i] = (Word32) ( hRendCfg->roomAcoustics.pAcoustic_dsr[i] * ONE_IN_Q30 ); + } + + hRendCfg->roomAcoustics.inputPreDelay_fx = (Word32) ( hRendCfg->roomAcoustics.inputPreDelay * ONE_IN_Q27 ); + hRendCfg->roomAcoustics.dimensions.x_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.x * 4194304 ); // Q10.22, min value:1, max :999.0 + hRendCfg->roomAcoustics.dimensions.y_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.y * 4194304 ); // Q10.22 + hRendCfg->roomAcoustics.dimensions.z_fx = (Word32) ( hRendCfg->roomAcoustics.dimensions.z * 4194304 ); // Q10.22 + + + FOR( int ii = 0; ii < 6; ii++ ) + { + hRendCfg->roomAcoustics.AbsCoeff_fx[ii] = (Word32) ( hRendCfg->roomAcoustics.AbsCoeff[ii] * 1073741824 ); // Q2.30 min :0 max 1 + } + + hRendCfg->roomAcoustics.ListenerOrigin.x_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.x * 4194304 ); //( 2147483648 >> 2 ); + hRendCfg->roomAcoustics.ListenerOrigin.y_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.y * ( 4194304 ) ); + hRendCfg->roomAcoustics.ListenerOrigin.z_fx = (Word32) ( hRendCfg->roomAcoustics.ListenerOrigin.z * ( 4194304 ) ); + } +#endif // 1 ivas_error error; AUDIO_CONFIG inConfig; rendering_context rendCtx; @@ -4100,6 +4562,14 @@ static ivas_error updateSbaPanGains( return error; } +#if 1 /*Cleanup changes: fixed to float*/ + IF( inputSba->crendWrapper != NULL && inputSba->crendWrapper->hHrtfCrend != NULL) + { + inputSba->crendWrapper->hHrtfCrend->gain_lfe = fixedToFloat( inputSba->crendWrapper->hHrtfCrend->gain_lfe_fx, 14 ); + inputSba->crendWrapper->hHrtfCrend->latency_s = fixedToFloat( inputSba->crendWrapper->hHrtfCrend->latency_s_fx, 31 ); + fixedToFloat_arr( inputSba->crendWrapper->hHrtfCrend->inv_diffuse_weight_fx, inputSba->crendWrapper->hHrtfCrend->inv_diffuse_weight, 15, 16 ); + } +#endif return IVAS_ERR_OK; } #else @@ -4171,6 +4641,7 @@ static ivas_error updateSbaPanGains( } #endif + static ivas_error initSbaMasaRendering( input_sba *inputSba, int32_t inSampleRate ) @@ -4179,14 +4650,22 @@ static ivas_error initSbaMasaRendering( ivas_rend_closeCrend( &inputSba->crendWrapper ); +#ifdef IVAS_FLOAT_FIXED + IF ( ( error = ivas_dirac_ana_open_fx( &inputSba->hDirAC, inSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_dirac_ana_open( &inputSba->hDirAC, inSampleRate ) ) != IVAS_ERR_OK ) { return error; } +#endif return IVAS_ERR_OK; } + #ifdef IVAS_FLOAT_FIXED static ivas_error setRendInputActiveSba( void *input, @@ -4307,7 +4786,7 @@ static void clearInputSba( /* Free input's internal handles */ ivas_rend_closeCrend( &inputSba->crendWrapper ); - ivas_dirac_ana_close( &( inputSba->hDirAC ) ); + ivas_dirac_ana_close_fx( &( inputSba->hDirAC ) ); return; } @@ -4468,7 +4947,7 @@ ivas_error IVAS_REND_Open( } /* Initialize headrotation data */ - if ( ( error = initHeadRotation( hIvasRend ) ) != IVAS_ERR_OK ) + IF( ( error = initHeadRotation_fx( hIvasRend ) ) != IVAS_ERR_OK ) { return error; } @@ -4748,6 +5227,38 @@ static LSSETUP_CUSTOM_STRUCT makeCustomLsSetup( } #endif + +#ifdef IVAS_FLOAT_FIXED +static ivas_error validateCustomLsLayout_fx( + const IVAS_CUSTOM_LS_DATA layout ) +{ + Word16 i; + + /* Negative number of speakers or LFEs makes no sense */ + test(); + IF( LT_16( layout.num_spk, 0 ) || LT_16( 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 ) ) + { + return IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT; + } + + /* LFE indices must be positive */ + FOR( i = 0; i < layout.num_lfe; ++i ) + { + IF( LT_16( layout.lfe_idx[i], 0 ) ) + { + return IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT; + } + } + + return IVAS_ERR_OK; +} +#else static ivas_error validateCustomLsLayout( const IVAS_CUSTOM_LS_DATA layout ) { @@ -4776,6 +5287,7 @@ static ivas_error validateCustomLsLayout( return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -4805,10 +5317,17 @@ 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 ); @@ -4883,6 +5402,7 @@ ivas_error IVAS_REND_NumOutChannels( ivas_error error; /* Validate function arguments */ + test(); IF( hIvasRend == NULL || numOutChannels == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -4892,7 +5412,7 @@ ivas_error IVAS_REND_NumOutChannels( SWITCH( hIvasRend->outputConfig ) { case IVAS_AUDIO_CONFIG_LS_CUSTOM: - *numOutChannels = hIvasRend->customLsOut.num_spk + hIvasRend->customLsOut.num_lfe; + *numOutChannels = add( hIvasRend->customLsOut.num_spk, hIvasRend->customLsOut.num_lfe ); BREAK; default: IF( ( error = getAudioConfigNumChannels( hIvasRend->outputConfig, numOutChannels ) ) != IVAS_ERR_OK ) @@ -4941,6 +5461,18 @@ ivas_error IVAS_REND_NumOutChannels( } #endif + +#ifdef IVAS_FLOAT_FIXED +static IVAS_REND_InputId makeInputId( + AUDIO_CONFIG config, + const Word32 inputIndex ) +{ + /* Put config type in second byte (from LSB), put index + 1 in first byte + * + * Index is incremented here so that a valid ID can never be 0. */ + return (IVAS_REND_InputId) UL_or( UL_lshl( ( (UWord32) getAudioConfigType( config ) ), 8 ), L_add( inputIndex, 1 ) ); +} +#else static IVAS_REND_InputId makeInputId( AUDIO_CONFIG config, const int32_t inputIndex ) @@ -4950,62 +5482,65 @@ static IVAS_REND_InputId makeInputId( * Index is incremented here so that a valid ID can never be 0. */ return (IVAS_REND_InputId) ( ( ( (uint32_t) getAudioConfigType( config ) ) << 8 ) | ( inputIndex + 1 ) ); } +#endif +#ifdef IVAS_FLOAT_FIXED static ivas_error getInputById( IVAS_REND_HANDLE hIvasRend, IVAS_REND_InputId inputId, void **ppInput ) { - int32_t inputIndex; + Word32 inputIndex; IVAS_REND_AudioConfigType configType; input_base *pInputBase; /* Reverse makeInputId() */ - inputIndex = ( inputId & 0xFF ) - 1; - configType = ( inputId & 0xFF00 ) >> 8; + inputIndex = L_sub( L_and( inputId, 0xFF ), 1 ); + configType = L_shr( L_and( inputId, 0xFF00 ), 8 ); /* Validate values derived from input ID */ - if ( inputIndex < 0 ) + IF( LT_32( inputIndex, 0 ) ) { return IVAS_ERR_INVALID_INPUT_ID; } - switch ( configType ) + SWITCH( configType ) { case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: - if ( inputIndex > RENDERER_MAX_ISM_INPUTS ) + IF( GT_32( inputIndex, RENDERER_MAX_ISM_INPUTS ) ) { return IVAS_ERR_INVALID_INPUT_ID; } pInputBase = &hIvasRend->inputsIsm[inputIndex].base; - break; + BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: - if ( inputIndex > RENDERER_MAX_MC_INPUTS ) + IF( GT_32( inputIndex, RENDERER_MAX_MC_INPUTS ) ) { return IVAS_ERR_INVALID_INPUT_ID; } pInputBase = &hIvasRend->inputsMc[inputIndex].base; - break; + BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: - if ( inputIndex > RENDERER_MAX_SBA_INPUTS ) + IF( GT_32( inputIndex, RENDERER_MAX_SBA_INPUTS ) ) { return IVAS_ERR_INVALID_INPUT_ID; } pInputBase = &hIvasRend->inputsSba[inputIndex].base; - break; + BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: - if ( inputIndex > RENDERER_MAX_MASA_INPUTS ) + IF( GT_32( inputIndex, RENDERER_MAX_MASA_INPUTS ) ) { return IVAS_ERR_INVALID_INPUT_ID; } pInputBase = &hIvasRend->inputsMasa[inputIndex].base; - break; + BREAK; default: return IVAS_ERR_INVALID_INPUT_ID; } /* Ensure input ID matches and that input is active */ - if ( pInputBase->id != inputId || pInputBase->inConfig == IVAS_AUDIO_CONFIG_INVALID ) + test(); + IF( NE_32( pInputBase->id, inputId ) || EQ_32( pInputBase->inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { return IVAS_ERR_INVALID_INPUT_ID; } @@ -5015,16 +5550,15 @@ static ivas_error getInputById( return IVAS_ERR_OK; } - - -static ivas_error getConstInputById( - IVAS_REND_CONST_HANDLE hIvasRend, - const IVAS_REND_InputId inputId, - const void **ppInput ) +#else +static ivas_error getInputById( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_InputId inputId, + void **ppInput ) { int32_t inputIndex; IVAS_REND_AudioConfigType configType; - const input_base *pInputBase; + input_base *pInputBase; /* Reverse makeInputId() */ inputIndex = ( inputId & 0xFF ) - 1; @@ -5080,17 +5614,150 @@ static ivas_error getConstInputById( return IVAS_ERR_OK; } +#endif -static ivas_error findFreeInputSlot( - const void *inputs, - const int32_t inputStructSize, - const int32_t maxInputs, - int32_t *inputIndex ) -{ - /* Using a void pointer and a separately provided size is a hack for this function - to be reusable for arrays of any input type (input_ism, input_mc, input_sba, input_masa). - Assumptions: +#ifdef IVAS_FLOAT_FIXED +static ivas_error getConstInputById( + IVAS_REND_CONST_HANDLE hIvasRend, + const IVAS_REND_InputId inputId, + const void **ppInput ) +{ + Word32 inputIndex; + IVAS_REND_AudioConfigType configType; + const input_base *pInputBase; + + /* Reverse makeInputId() */ + inputIndex = L_sub( L_and( inputId, 0xFF ), 1 ); + configType = L_shr( L_and( inputId, 0xFF00 ), 8 ); + + /* Validate values derived from input ID */ + IF( LT_32( inputIndex, 0 ) ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + SWITCH( configType ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + IF( GT_32( inputIndex, RENDERER_MAX_ISM_INPUTS ) ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsIsm[inputIndex].base; + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + IF( GT_32( inputIndex, RENDERER_MAX_MC_INPUTS ) ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsMc[inputIndex].base; + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + IF( GT_32( inputIndex, RENDERER_MAX_SBA_INPUTS ) ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsSba[inputIndex].base; + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + IF( GT_32( inputIndex, RENDERER_MAX_MASA_INPUTS ) ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsMasa[inputIndex].base; + BREAK; + default: + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Ensure input ID matches and that input is active */ + test(); + IF( NE_32( pInputBase->id, inputId ) || EQ_32( pInputBase->inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Validation done, set value via output parameter */ + *ppInput = pInputBase; + + return IVAS_ERR_OK; +} +#else +static ivas_error getConstInputById( + IVAS_REND_CONST_HANDLE hIvasRend, + const IVAS_REND_InputId inputId, + const void **ppInput ) +{ + int32_t inputIndex; + IVAS_REND_AudioConfigType configType; + const input_base *pInputBase; + + /* Reverse makeInputId() */ + inputIndex = ( inputId & 0xFF ) - 1; + configType = ( inputId & 0xFF00 ) >> 8; + + /* Validate values derived from input ID */ + if ( inputIndex < 0 ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + switch ( configType ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + if ( inputIndex > RENDERER_MAX_ISM_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsIsm[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + if ( inputIndex > RENDERER_MAX_MC_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsMc[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + if ( inputIndex > RENDERER_MAX_SBA_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsSba[inputIndex].base; + break; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + if ( inputIndex > RENDERER_MAX_MASA_INPUTS ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + pInputBase = &hIvasRend->inputsMasa[inputIndex].base; + break; + default: + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Ensure input ID matches and that input is active */ + if ( pInputBase->id != inputId || pInputBase->inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + return IVAS_ERR_INVALID_INPUT_ID; + } + + /* Validation done, set value via output parameter */ + *ppInput = pInputBase; + + return IVAS_ERR_OK; +} +#endif + +#ifndef IVAS_FLOAT_FIXED +static ivas_error findFreeInputSlot( + const void *inputs, + const int32_t inputStructSize, + const int32_t maxInputs, + int32_t *inputIndex ) +{ + /* Using a void pointer and a separately provided size is a hack for this function + to be reusable for arrays of any input type (input_ism, input_mc, input_sba, input_masa). + Assumptions: - input_base is always the first member in the input struct - provided size is correct */ @@ -5122,6 +5789,48 @@ static ivas_error findFreeInputSlot( return IVAS_ERR_OK; } +#else +static ivas_error findFreeInputSlot_fx( + const void *inputs, + const Word32 inputStructSize, + const Word32 maxInputs, + Word32 *inputIndex ) +{ + /* Using a void pointer and a separately provided size is a hack for this function + to be reusable for arrays of any input type (input_ism, input_mc, input_sba, input_masa). + Assumptions: + - input_base is always the first member in the input struct + - provided size is correct + */ + + Word32 i; + bool canAddInput; + const UWord8 *pByte; + const input_base *pInputBase; + + canAddInput = false; + + /* Find first unused input in array */ + FOR( ( i = 0, pByte = inputs ); i < maxInputs; ( ++i, pByte += inputStructSize ) ) + { + pInputBase = (const input_base *) pByte; + + IF( EQ_32( pInputBase->inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + *inputIndex = i; + canAddInput = true; + BREAK; + } + } + + IF ( !canAddInput ) + { + return IVAS_ERR_TOO_MANY_INPUTS; + } + + return IVAS_ERR_OK; +} +#endif /*-------------------------------------------------------------------* @@ -5129,7 +5838,7 @@ static ivas_error findFreeInputSlot( * * *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_AddInput( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const AUDIO_CONFIG inConfig, /* i : audio config for a new input */ @@ -5195,6 +5904,73 @@ ivas_error IVAS_REND_AddInput( return IVAS_ERR_OK; } +#else +ivas_error IVAS_REND_AddInput_fx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const AUDIO_CONFIG inConfig, /* i : audio config for a new input */ + IVAS_REND_InputId *inputId /* o : ID of the new input */ +) +{ + ivas_error error; + Word32 maxNumInputsOfType; + void *inputsArray; + Word32 inputStructSize; + ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, RENDER_CONFIG_DATA * ); + Word32 inputIndex; + + /* Validate function arguments */ + IF ( hIvasRend == NULL || inputId == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + + SWITCH ( getAudioConfigType( inConfig ) ) + { + case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: + maxNumInputsOfType = RENDERER_MAX_ISM_INPUTS; + inputsArray = hIvasRend->inputsIsm; + inputStructSize = sizeof( *hIvasRend->inputsIsm ); + activateInput = setRendInputActiveIsm; + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: + maxNumInputsOfType = RENDERER_MAX_MC_INPUTS; + inputsArray = hIvasRend->inputsMc; + inputStructSize = sizeof( *hIvasRend->inputsMc ); + activateInput = setRendInputActiveMc; + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: + maxNumInputsOfType = RENDERER_MAX_SBA_INPUTS; + inputsArray = hIvasRend->inputsSba; + inputStructSize = sizeof( *hIvasRend->inputsSba ); + activateInput = setRendInputActiveSba; + BREAK; + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + maxNumInputsOfType = RENDERER_MAX_MASA_INPUTS; + inputsArray = hIvasRend->inputsMasa; + inputStructSize = sizeof( *hIvasRend->inputsMasa ); + activateInput = setRendInputActiveMasa; + 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 ) + { + return error; + } + + *inputId = makeInputId( inConfig, inputIndex ); + + IF ( ( error = activateInput( (uint8_t *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} +#endif /*-------------------------------------------------------------------* @@ -5219,10 +5995,17 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#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 if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputMc ) ) != IVAS_ERR_OK ) { @@ -5269,7 +6052,7 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( * * *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_SetInputGain( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -5294,14 +6077,39 @@ ivas_error IVAS_REND_SetInputGain( return IVAS_ERR_OK; } +#else +ivas_error IVAS_REND_SetInputGain_fx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const Word32 gain /* i : linear gain (not in dB) */ +) +{ + input_base *inputBase; + ivas_error error; + + /* Validate function arguments */ + IF ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF ( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + inputBase->gain_fx = gain; + + return IVAS_ERR_OK; +} +#endif /*-------------------------------------------------------------------* * IVAS_REND_SetInputLfeMtx() * * *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_SetInputLfeMtx( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -5344,6 +6152,50 @@ ivas_error IVAS_REND_SetInputLfeMtx( return IVAS_ERR_OK; } +#else +ivas_error IVAS_REND_SetInputLfeMtx_fx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_REND_LfePanMtx_fx *lfePanMtx /* i : LFE panning matrix */ +) +{ + Word16 i; + input_base *pInputBase; + input_mc *pInputMc; + ivas_error error; + + /* Validate function arguments */ + IF ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF ( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( 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; + } + pInputMc = (input_mc *) pInputBase; + + /* copy LFE panning matrix */ + FOR ( i = 0; i < RENDERER_MAX_INPUT_LFE_CHANNELS; i++ ) + { + Copy32( ( *lfePanMtx )[i], pInputMc->lfeRouting.lfePanMtx_fx[i], IVAS_MAX_OUTPUT_CHANNELS ); + } + + IF ( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} +#endif #ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* @@ -5352,12 +6204,12 @@ ivas_error IVAS_REND_SetInputLfeMtx( * *-------------------------------------------------------------------*/ -ivas_error IVAS_REND_SetInputLfePos( +ivas_error IVAS_REND_SetInputLfePos_fx( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ - const float inputGain, /* i : Input gain to be applied to the LFE channel(s) */ - const float outputAzimuth, /* i : Output azimuth position */ - const float outputElevation /* i : Output elevation position */ + const Word32 inputGain, /* i : Input gain to be applied to the LFE channel(s) */ + const Word16 outputAzimuth, /* i : Output azimuth position */ + const Word16 outputElevation /* i : Output elevation position */ ) { input_base *pInputBase; @@ -5365,17 +6217,17 @@ ivas_error IVAS_REND_SetInputLfePos( ivas_error error; /* Validate function arguments */ - if ( hIvasRend == NULL ) + IF ( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - if ( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ) != IVAS_ERR_OK ) + IF ( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ) != IVAS_ERR_OK ) { return error; } - if ( getAudioConfigType( pInputBase->inConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + IF ( 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; @@ -5383,14 +6235,11 @@ ivas_error IVAS_REND_SetInputLfePos( pInputMc = (input_mc *) pInputBase; pInputMc->lfeRouting.pan_lfe = true; - pInputMc->lfeRouting.lfeInputGain = inputGain; - pInputMc->lfeRouting.lfeInputGain_fx = ( inputGain == 1.0f ) ? ONE_IN_Q31 : (Word32) (inputGain * ( ONE_IN_Q31 )); - pInputMc->lfeRouting.lfeOutputAzimuth = outputAzimuth; + pInputMc->lfeRouting.lfeInputGain_fx = inputGain; // Q31 pInputMc->lfeRouting.lfeOutputAzimuth_fx = (Word16) ( outputAzimuth ); // Q0 - pInputMc->lfeRouting.lfeOutputElevation = outputElevation; pInputMc->lfeRouting.lfeOutputElevation_fx = (Word16) ( outputElevation ); // Q0 - if ( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + IF ( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) { return error; } @@ -5494,7 +6343,7 @@ ivas_error IVAS_REND_RemoveInput( * * *-------------------------------------------------------------------*/ - +#ifndef 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 */ @@ -5522,14 +6371,42 @@ ivas_error IVAS_REND_GetInputNumChannels( return IVAS_ERR_OK; } +#else +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 */ +) +{ + ivas_error error; + const input_base *pInput; + + /* Validate function arguments */ + IF ( hIvasRend == NULL || numChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( ( error = getConstInputById( hIvasRend, inputId, (const void **) &pInput ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF ( ( error = getRendInputNumChannels( pInput, numChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + return IVAS_ERR_OK; +} +#endif /*-------------------------------------------------------------------* * IVAS_REND_GetNumAllObjects() * * *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_GetNumAllObjects( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ int16_t *numChannels /* o : number of all objects */ @@ -5547,7 +6424,25 @@ ivas_error IVAS_REND_GetNumAllObjects( return IVAS_ERR_OK; } +#else +ivas_error IVAS_REND_GetNumAllObjects( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + Word16 *numChannels /* o : number of all objects */ +) +{ + IF ( hIvasRend == NULL || numChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + 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; + } + return IVAS_ERR_OK; +} +#endif /*-------------------------------------------------------------------* * IVAS_REND_GetDelay() @@ -5768,6 +6663,41 @@ ivas_error IVAS_REND_FeedInputAudio( * *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_FeedInputObjectMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_ISM_METADATA objectPosition /* i : object position struct */ +) +{ + input_base *inputBase; + input_ism *inputIsm; + ivas_error error; + + /* Validate function arguments */ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( NE_32( inputBase->inConfig, IVAS_AUDIO_CONFIG_OBA ) ) + { + /* Object metadata should only be fed for object inputs */ + return IVAS_ERR_METADATA_NOT_EXPECTED; + } + + inputIsm = (input_ism *) inputBase; + inputIsm->previousPos = inputIsm->currentPos; + inputIsm->currentPos = objectPosition; + + return IVAS_ERR_OK; +} +#else ivas_error IVAS_REND_FeedInputObjectMetadata( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -5801,6 +6731,7 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -5835,6 +6766,41 @@ ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( * *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_FeedInputMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + IVAS_MASA_METADATA_HANDLE masaMetadata /* i : MASA metadata frame */ +) +{ + ivas_error error; + input_base *inputBase; + input_masa *inputMasa; + + /* Validate function arguments */ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + { + return error; + } + + IF( NE_32( getAudioConfigType( inputBase->inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + { + /* MASA metadata should only be fed for MASA inputs */ + return IVAS_ERR_METADATA_NOT_EXPECTED; + } + + inputMasa = (input_masa *) inputBase; + inputMasa->masaMetadata = *masaMetadata; + inputMasa->metadataHasBeenFed = true; + + return IVAS_ERR_OK; +} +#else ivas_error IVAS_REND_FeedInputMasaMetadata( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -5868,6 +6834,7 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -5901,10 +6868,18 @@ ivas_error IVAS_REND_InitConfig( { return error; } +#ifdef IVAS_FLOAT_FIXED + IF ((error = ivas_render_config_init_from_rom_fx(&hIvasRend->hRendererConfig)) != IVAS_ERR_OK) + { + return error; + } +#endif + /*FLOAT CODE*/ if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) { return error; } + /*----------*/ } else { @@ -6039,22 +7014,32 @@ ivas_error IVAS_REND_SetHeadRotation( } } +#ifdef IVAS_FLOAT_FIXED /* check for Euler angle signaling */ - if ( headRot.w == -3.0f ) + IF( EQ_32( headRot.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) { - Euler2Quat( deg2rad( headRot.x ), deg2rad( headRot.y ), deg2rad( headRot.z ), &rotQuat ); + Euler2Quat_fx( deg2rad_fx( headRot.x_fx ), deg2rad_fx( headRot.y_fx ), deg2rad_fx( headRot.z_fx ), &rotQuat ); } - else + ELSE { rotQuat = headRot; } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_orient_trk_Process_fx( hIvasRend->headRotData.hOrientationTracker, rotQuat, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hIvasRend->headRotData.headPositions[sf_idx] ) ) != IVAS_ERR_OK ) + IF ( ( error = ivas_orient_trk_Process_fx( hIvasRend->headRotData.hOrientationTracker, rotQuat, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hIvasRend->headRotData.headPositions[sf_idx] ) ) != IVAS_ERR_OK ) { return error; } #else + /* check for Euler angle signaling */ + if ( headRot.w == -3.0f ) + { + Euler2Quat( deg2rad( headRot.x ), deg2rad( headRot.y ), deg2rad( headRot.z ), &rotQuat ); + } + else + { + rotQuat = headRot; + } + if ( ( error = ivas_orient_trk_Process( hIvasRend->headRotData.hOrientationTracker, rotQuat, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hIvasRend->headRotData.headPositions[sf_idx] ) ) != IVAS_ERR_OK ) { return error; @@ -6115,19 +7100,23 @@ ivas_error IVAS_REND_DisableHeadRotation( * *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ ) { -#ifdef IVAS_FLOAT_FIXED - ivas_error ret; - ret = ivas_orient_trk_SetTrackingType_fx( hIvasRend->headRotData.hOrientationTracker, orientation_tracking ); - return ret; + return ivas_orient_trk_SetTrackingType_fx( hIvasRend->headRotData.hOrientationTracker, orientation_tracking ); +} #else +ivas_error IVAS_REND_SetOrientationTrackingMode( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ +) +{ return ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, orientation_tracking ); -#endif } +#endif /*-------------------------------------------------------------------* @@ -6184,7 +7173,8 @@ ivas_error IVAS_REND_SetReferenceRotation( * * *-------------------------------------------------------------------*/ -// ToDo: not used + +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_GetMainOrientation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer for main orientation */ @@ -6197,40 +7187,14 @@ ivas_error IVAS_REND_GetMainOrientation( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef IVAS_FLOAT_FIXED - Word16 q_fact = hIvasRend->headRotData.hOrientationTracker->refRot.w_qfact = hIvasRend->headRotData.hOrientationTracker->refRot.x_qfact = - hIvasRend->headRotData.hOrientationTracker->refRot.y_qfact = hIvasRend->headRotData.hOrientationTracker->refRot.z_qfact = Q29; - hIvasRend->headRotData.hOrientationTracker->refRot.w_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->refRot.w, q_fact ); - hIvasRend->headRotData.hOrientationTracker->refRot.x_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->refRot.x, q_fact ); - hIvasRend->headRotData.hOrientationTracker->refRot.y_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->refRot.y, q_fact ); - hIvasRend->headRotData.hOrientationTracker->refRot.z_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->refRot.z, q_fact ); - - - hIvasRend->headRotData.hOrientationTracker->absAvgRot.w_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->absAvgRot.w, Q29 ); - hIvasRend->headRotData.hOrientationTracker->absAvgRot.x_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->absAvgRot.x, Q29 ); - hIvasRend->headRotData.hOrientationTracker->absAvgRot.y_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->absAvgRot.y, Q29 ); - hIvasRend->headRotData.hOrientationTracker->absAvgRot.z_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->absAvgRot.z, Q29 ); - hIvasRend->headRotData.hOrientationTracker->absAvgRot.w_qfact = hIvasRend->headRotData.hOrientationTracker->absAvgRot.x_qfact = - hIvasRend->headRotData.hOrientationTracker->absAvgRot.y_qfact = hIvasRend->headRotData.hOrientationTracker->absAvgRot.z_qfact = Q29; - - error = ivas_orient_trk_GetMainOrientation_fx( hIvasRend->headRotData.hOrientationTracker, pOrientation ); - pOrientation->w = fix_to_float( pOrientation->w_fx, pOrientation->w_qfact ); - pOrientation->x = fix_to_float( pOrientation->x_fx, pOrientation->x_qfact ); - pOrientation->y = fix_to_float( pOrientation->y_fx, pOrientation->y_qfact ); - pOrientation->z = fix_to_float( pOrientation->z_fx, pOrientation->z_qfact ); - IF( error != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = ivas_orient_trk_GetMainOrientation( hIvasRend->headRotData.hOrientationTracker, pOrientation ) ) != IVAS_ERR_OK ) { return error; } -#endif return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -6238,7 +7202,8 @@ ivas_error IVAS_REND_GetMainOrientation( * * *-------------------------------------------------------------------*/ -// ToDo: not used + +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_GetTrackedRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer processed rotation */ @@ -6251,31 +7216,14 @@ ivas_error IVAS_REND_GetTrackedRotation( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef IVAS_FLOAT_FIXED - hIvasRend->headRotData.hOrientationTracker->trkRot.w_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->trkRot.w, Q29 ); - hIvasRend->headRotData.hOrientationTracker->trkRot.x_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->trkRot.x, Q29 ); - hIvasRend->headRotData.hOrientationTracker->trkRot.y_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->trkRot.y, Q29 ); - hIvasRend->headRotData.hOrientationTracker->trkRot.z_fx = (Word32) float_to_fix( hIvasRend->headRotData.hOrientationTracker->trkRot.z, Q29 ); - hIvasRend->headRotData.hOrientationTracker->trkRot.w_qfact = hIvasRend->headRotData.hOrientationTracker->trkRot.x_qfact = - hIvasRend->headRotData.hOrientationTracker->trkRot.y_qfact = hIvasRend->headRotData.hOrientationTracker->trkRot.z_qfact = Q29; - error = ivas_orient_trk_GetTrackedRotation_fx( hIvasRend->headRotData.hOrientationTracker, pRotation ); - pRotation->w = fix_to_float( pRotation->w_fx, pRotation->w_qfact ); - pRotation->x = fix_to_float( pRotation->x_fx, pRotation->x_qfact ); - pRotation->y = fix_to_float( pRotation->y_fx, pRotation->y_qfact ); - pRotation->z = fix_to_float( pRotation->z_fx, pRotation->z_qfact ); - IF( error != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = ivas_orient_trk_GetTrackedRotation( hIvasRend->headRotData.hOrientationTracker, pRotation ) ) != IVAS_ERR_OK ) { return error; } -#endif return IVAS_ERR_OK; } +#endif /*---------------------------------------------------------------------* @@ -6364,7 +7312,8 @@ ivas_error IVAS_REND_CombineHeadAndExternalOrientation( * * *---------------------------------------------------------------------*/ -// ToDo: not used + +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_GetCombinedOrientation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer processed orientation */ @@ -6387,6 +7336,7 @@ ivas_error IVAS_REND_GetCombinedOrientation( return IVAS_ERR_OK; } +#endif /*-------------------------------------------------------------------* @@ -6582,6 +7532,8 @@ static void renderBufferChannel( return; } + +#ifndef IVAS_FLOAT_FIXED static ivas_error chooseCrossfade( const IVAS_REND_HeadRotData *headRotData, const float **pCrossfade ) @@ -6590,17 +7542,19 @@ static ivas_error chooseCrossfade( return IVAS_ERR_OK; } -#ifdef IVAS_FLOAT_FIXED +#else static ivas_error chooseCrossfade_fx( const IVAS_REND_HeadRotData *headRotData, const Word32 **pCrossfade ) { *pCrossfade = headRotData->crossfade_fx; + move32(); return IVAS_ERR_OK; } - #endif + + #ifdef IVAS_FLOAT_FIXED static ivas_error rotateFrameMc_fx( IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ @@ -6706,7 +7660,7 @@ static ivas_error rotateFrameMc_fx( IF( hEFAPdata != NULL && ( NE_32( ls_azimuth[ch_in_woLFE], azimuth_fx ) || NE_32( ls_elevation[ch_in_woLFE], elevation_fx ) ) ) { - efap_determine_gains_fixed( hEFAPdata, tmp_gains, azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); + efap_determine_gains_fx( hEFAPdata, tmp_gains, azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); FOR( ch_out = 0; ch_out < nchan; ch_out++ ) { @@ -6757,8 +7711,7 @@ static ivas_error rotateFrameMc_fx( pop_wmops(); return IVAS_ERR_OK; } -#endif - +#else static ivas_error rotateFrameMc( IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ AUDIO_CONFIG inConfig, /* i : Input Audio config */ @@ -6901,9 +7854,10 @@ static ivas_error rotateFrameMc( pop_wmops(); return IVAS_ERR_OK; } +#endif -#ifdef IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED static ivas_error rotateFrameSba_fx( IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ const AUDIO_CONFIG inConfig, /* i : Input Audio config */ @@ -7138,6 +8092,7 @@ static ivas_error rotateFrameSba( #endif + static ivas_error renderIsmToBinaural( const input_ism *ismInput, IVAS_REND_AudioBuffer outAudio ) @@ -7165,6 +8120,14 @@ static ivas_error renderIsmToBinaural( } +#ifdef IVAS_FLOAT_FIXED +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 ) ); +} +#else static int16_t getNumSubframesInBuffer( const IVAS_REND_AudioBuffer *buffer, const int32_t sampleRate ) @@ -7173,6 +8136,8 @@ static int16_t getNumSubframesInBuffer( return (int16_t) ( buffer->config.numSamplesPerChannel / ( sampleRate / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) ); } +#endif + #ifdef IVAS_FLOAT_FIXED static ivas_error renderIsmToBinauralRoom( @@ -7761,6 +8726,10 @@ 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 ); @@ -8731,6 +9700,8 @@ static ivas_error renderInputMc( return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); } mcInput->base.numNewSamplesPerChannel = 0; + /* To be removed */ + mcInput->base.gain = fix_to_float( mcInput->base.gain_fx, Q30 ); /* Apply input gain to new audio */ v_multc( inAudio.data, mcInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); @@ -9362,7 +10333,7 @@ static void renderSbaToMasa( push_wmops( "renderMcToMasa" ); copyBufferTo2dArray_fx( sbaInput->base.inputBuffer, tmpRendBuffer ); - ivas_dirac_ana( sbaInput->hDirAC, tmpRendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels ); + ivas_dirac_ana_fx( sbaInput->hDirAC, tmpRendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels ); accumulate2dArrayToBuffer_fx( tmpRendBuffer, &outAudio ); pop_wmops(); @@ -9739,6 +10710,10 @@ static ivas_error renderInputMasa( } masaInput->base.numNewSamplesPerChannel = 0; +#ifdef IVAS_FLOAT_FIXED + masaInput->base.gain = fix_to_float( masaInput->base.gain_fx, Q30 ); +#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 ); @@ -9837,46 +10812,80 @@ static ivas_error renderActiveInputsMasa( * Get metadata of the estimated MASA frame *---------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED ivas_error IVAS_REND_GetMasaMetadata( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ const IVAS_REND_AudioConfigType inputType /* i : Input type */ ) { - if ( hIvasRend == NULL ) + IF( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } /* Get the metadata handle */ - if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) { *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; } - else if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + ELSE IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; } - else if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + ELSE IF( EQ_32( inputType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; } - else + ELSE { return IVAS_ERR_NOT_SUPPORTED_OPTION; } return IVAS_ERR_OK; } - - -/*---------------------------------------------------------------------* - * IVAS_REND_MergeMasaMetadata( ) - * - * Merge MASA metadata from two formats - *---------------------------------------------------------------------*/ - -ivas_error IVAS_REND_MergeMasaMetadata( +#else +ivas_error IVAS_REND_GetMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ + const IVAS_REND_AudioConfigType inputType /* i : Input type */ +) +{ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Get the metadata handle */ + if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; + } + else if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; + } + else if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; + } + else + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + return IVAS_ERR_OK; +} +#endif + + +/*---------------------------------------------------------------------* + * IVAS_REND_MergeMasaMetadata( ) + * + * Merge MASA metadata from two formats + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_MergeMasaMetadata( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to merged metadata */ const IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ @@ -9958,6 +10967,23 @@ ivas_error IVAS_REND_MergeMasaMetadata( * Set the total number of objects to the first object data *---------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_SetTotalNumberOfObjects( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const UWord16 total_num_objects /* i : total number of objects */ +) +{ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasRend->inputsIsm[0].total_num_objects = total_num_objects; + move16(); + + return IVAS_ERR_OK; +} +#else ivas_error IVAS_REND_SetTotalNumberOfObjects( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ const uint16_t total_num_objects /* i : total number of objects */ @@ -9972,6 +10998,7 @@ ivas_error IVAS_REND_SetTotalNumberOfObjects( return IVAS_ERR_OK; } +#endif /*---------------------------------------------------------------------* @@ -10189,128 +11216,578 @@ static ivas_error getSamplesInternal( } } - if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( numOutChannels != outAudio.config.numChannels ) + { + return IVAS_ERR_WRONG_NUM_CHANNELS; + } + + /* Clear original output buffer */ + set_zero( outAudio.data, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel ); + + + if ( ( error = renderActiveInputsIsm( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = renderActiveInputsMc( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = renderActiveInputsSba( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = renderActiveInputsMasa( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } + + +#ifndef DISABLE_LIMITER + limitRendererOutput( hIvasRend->hLimiter, outAudio.data, outAudio.config.numSamplesPerChannel, IVAS_LIMITER_THRESHOLD ); +#endif + + /* update global cominbed orientation start index */ + ivas_combined_orientation_update_start_index( hIvasRend->hCombinedOrientationData, outAudio.config.numSamplesPerChannel ); + + return IVAS_ERR_OK; +} +#endif + +/*-------------------------------------------------------------------* + * IVAS_REND_GetSamples() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetSamples( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ +) +{ + + return getSamplesInternal( hIvasRend, outAudio ); +} + + +/*-------------------------------------------------------------------* + * IVAS_REND_Close() + * + * + *-------------------------------------------------------------------*/ + +void IVAS_REND_Close( + IVAS_REND_HANDLE *phIvasRend /* i/o: Pointer to renderer handle */ +) +{ + uint16_t i; + IVAS_REND_HANDLE hIvasRend; + + /* Validate function arguments */ + if ( phIvasRend == NULL || *phIvasRend == NULL ) + { + return; + } + hIvasRend = *phIvasRend; + + if ( hIvasRend->efapOutWrapper.hEfap != NULL ) + { + efap_free_data( &hIvasRend->efapOutWrapper.hEfap ); + } + + /* clear inputs */ + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + { + clearInputIsm( &hIvasRend->inputsIsm[i] ); + } + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + clearInputMc( &hIvasRend->inputsMc[i] ); + } + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + clearInputSba( &hIvasRend->inputsSba[i] ); + } + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + { + clearInputMasa( &hIvasRend->inputsMasa[i] ); + } + + /* clear Config. Renderer */ + ivas_render_config_close( &( hIvasRend->hRendererConfig ) ); + + ivas_limiter_close( &hIvasRend->hLimiter ); + + + closeHeadRotation( hIvasRend ); + + ivas_external_orientation_close( &hIvasRend->hExternalOrientationData ); + ivas_combined_orientation_close( &hIvasRend->hCombinedOrientationData ); + + free( hIvasRend ); + *phIvasRend = NULL; + + return; +} + +#ifdef IVAS_FLOAT_FIXED +static ivas_error ivas_masa_ext_rend_dirac_rend_init( + input_masa *inputMasa ) +{ + int16_t nchan_out_woLFE; + int16_t nchan_transport; + uint16_t i, j, k; + float ls_azimuth[MAX_OUTPUT_CHANNELS]; + float ls_elevation[MAX_OUTPUT_CHANNELS]; + int32_t output_Fs; + ivas_error error; + DIRAC_REND_HANDLE hDirACRend; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + error = IVAS_ERR_OK; + + hDirACRend = NULL; + output_Fs = *( inputMasa->base.ctx.pOutSampleRate ); + + hSpatParamRendCom = inputMasa->hMasaExtRend->hSpatParamRendCom; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hDirACRend = (DIRAC_REND_HANDLE) malloc( sizeof( DIRAC_REND_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC renderer\n" ) ); + } + + nchan_transport = inputMasa->base.inConfig == IVAS_AUDIO_CONFIG_MASA2 ? 2 : 1; + + /*-----------------------------------------------------------------* + * output setup: for parametric binaural renderer, use output setup, otherwise internal setup + *-----------------------------------------------------------------*/ + + ivas_output_init( &hDirACRend->hOutSetup, *inputMasa->base.ctx.pOutConfig ); + + if ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + /* Copy from ivas_ls_custom_setup */ + hDirACRend->hOutSetup.nchan_out_woLFE = inputMasa->base.ctx.pCustomLsOut->num_spk; + hDirACRend->hOutSetup.ls_azimuth = inputMasa->base.ctx.pCustomLsOut->ls_azimuth; + hDirACRend->hOutSetup.ls_elevation = inputMasa->base.ctx.pCustomLsOut->ls_elevation; + + hDirACRend->hOutSetup.num_lfe = inputMasa->base.ctx.pCustomLsOut->num_lfe; + hDirACRend->hOutSetup.index_lfe[0] = inputMasa->base.ctx.pCustomLsOut->lfe_idx[0]; + + hDirACRend->hOutSetup.is_loudspeaker_setup = TRUE; + hDirACRend->hOutSetup.is_planar_setup = (int8_t) inputMasa->base.ctx.pCustomLsOut->is_planar_setup; + } + + nchan_out_woLFE = hDirACRend->hOutSetup.nchan_out_woLFE; + + if ( hDirACRend->hOutSetup.ls_azimuth != NULL && hDirACRend->hOutSetup.ls_elevation != NULL ) + { + mvr2r( hDirACRend->hOutSetup.ls_azimuth, ls_azimuth, nchan_out_woLFE ); + mvr2r( hDirACRend->hOutSetup.ls_elevation, ls_elevation, nchan_out_woLFE ); + } + + if ( hDirACRend->hOutSetup.ambisonics_order == -1 ) + { + hDirACRend->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; /* Order 3 is used by default in DirAC for SHD processing */ + if ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_MONO || hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_STEREO ) + { + hDirACRend->hOutSetup.ambisonics_order = SBA_FOA_ORDER; + } + } + else if ( hDirACRend->hOutSetup.ambisonics_order >= SBA_FOA_ORDER ) + { + mvr2r( ls_azimuth_4d4, ls_azimuth, DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS ); + mvr2r( ls_elevation_4d4, ls_elevation, DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS ); + } + + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + if ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_MONO ) + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_MONO; + hDirACRend->panningConf = DIRAC_PANNING_HOA3; + nchan_out_woLFE = 1; + } + else if ( hDirACRend->hOutSetup.is_loudspeaker_setup ) + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_PSD_LS; + hDirACRend->panningConf = DIRAC_PANNING_VBAP; + } + else if ( !hDirACRend->hOutSetup.is_loudspeaker_setup && nchan_transport > 1 ) + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_PSD_SHD; + hDirACRend->panningConf = DIRAC_PANNING_HOA3; + } + else + { + hDirACRend->synthesisConf = DIRAC_SYNTHESIS_GAIN_SHD; + hDirACRend->panningConf = DIRAC_PANNING_HOA3; + } + + if ( ( hDirACRend->frequency_axis = (float *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirACRend->frequency_axis, 0.0f, hSpatParamRendCom->num_freq_bands ); + +#ifdef IVAS_FLOAT_FIXED + hDirACRend->frequency_axis_fx = (Word16 *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( Word16 ) ); + ivas_dirac_dec_get_frequency_axis_fx( hDirACRend->frequency_axis_fx, output_Fs, hSpatParamRendCom->num_freq_bands ); + + FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) + { + hDirACRend->frequency_axis[i] = (float) hDirACRend->frequency_axis_fx[i]; + } +#else + ivas_dirac_dec_get_frequency_axis( hDirACRend->frequency_axis, output_Fs, hSpatParamRendCom->num_freq_bands ); +#endif + + if ( hDirACRend->panningConf == DIRAC_PANNING_HOA3 && nchan_transport == 2 ) + { + if ( ( hDirACRend->masa_stereo_type_detect = (MASA_STEREO_TYPE_DETECT *) malloc( sizeof( MASA_STEREO_TYPE_DETECT ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + ivas_masa_init_stereotype_detection( hDirACRend->masa_stereo_type_detect ); + } + else + { + hDirACRend->masa_stereo_type_detect = NULL; + } + + hSpatParamRendCom->numIsmDirections = 0; + + /*-----------------------------------------------------------------* + * (re)configure sub-modules + *-----------------------------------------------------------------*/ + + /* prototype signal computation */ + /* allocate output setup related arrays */ + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) + { + /* Directional and diffuses components in output LS format */ + hDirACRend->num_outputs_diff = nchan_out_woLFE; + hDirACRend->num_outputs_dir = nchan_out_woLFE; + } + else if ( 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_dir = ivas_sba_get_nchan( hDirACRend->hOutSetup.ambisonics_order, 0 ); + } + else if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + hDirACRend->num_outputs_diff = DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS; + hDirACRend->num_outputs_dir = nchan_out_woLFE; + } + else if ( 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 */ + } + else + { + assert( 0 && "DirAC: not existing synthesis methods!" ); + } + + if ( ( hDirACRend->proto_index_dir = (int16_t *) malloc( sizeof( int16_t ) * hDirACRend->num_outputs_dir ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirACRend->proto_index_diff = (int16_t *) malloc( sizeof( int16_t ) * hDirACRend->num_outputs_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + set_s( hDirACRend->proto_index_dir, 0, hDirACRend->num_outputs_dir ); + set_s( hDirACRend->proto_index_diff, 0, hDirACRend->num_outputs_diff ); + + hDirACRend->sba_map_tc = sba_map_tc; + + if ( nchan_transport == 1 ) + { + hDirACRend->num_protos_ambi = 1; + hDirACRend->num_protos_dir = 1; + hDirACRend->num_protos_diff = 1; + } + else if ( nchan_transport == 2 ) + { + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + hDirACRend->num_protos_ambi = 2; + hDirACRend->num_protos_diff = 1; + hDirACRend->num_protos_dir = 2; + hDirACRend->proto_index_dir[1] = 1; + } + else if ( hDirACRend->hOutSetup.output_config == IVAS_AUDIO_CONFIG_MONO ) + { + /* Following the foa rendering for code compatibility */ + hDirACRend->num_protos_ambi = 2; + hDirACRend->num_protos_dir = 2; + hDirACRend->num_protos_diff = 3; + hDirACRend->proto_index_dir[0] = 0; + hDirACRend->proto_index_diff[0] = 0; + } + else + { + hDirACRend->num_protos_ambi = 2; + hDirACRend->num_protos_diff = 3; + + for ( k = 0; k < hDirACRend->num_outputs_diff; k++ ) + { + if ( ls_azimuth[k] > 0.0f ) + { + hDirACRend->proto_index_diff[k] = 1; + } + else if ( ls_azimuth[k] < 0.0f ) + { + hDirACRend->proto_index_diff[k] = 2; + } + else + { + hDirACRend->proto_index_diff[k] = 0; + } + } + + if ( hDirACRend->hOutSetup.is_loudspeaker_setup ) + { + hDirACRend->num_protos_dir = 3; + mvs2s( hDirACRend->proto_index_diff, hDirACRend->proto_index_dir, nchan_out_woLFE ); + } + else + { + hDirACRend->num_protos_dir = 2; + hDirACRend->proto_index_dir[1] = 1; + } + } + } + + /* direct/diffuse responses */ +#ifdef IVAS_FLOAT_FIXED + IF( ( hDirACRend->diffuse_response_function_fx = (Word16 *) malloc( sizeof( Word16 ) * hDirACRend->num_outputs_dir ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } +#endif + if ( ( hDirACRend->diffuse_response_function = (float *) malloc( sizeof( float ) * hDirACRend->num_outputs_dir ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) || ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) || ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) ) + { +#ifdef IVAS_FLOAT_FIXED + initDiffuseResponses_fx( hDirACRend->diffuse_response_function_fx, nchan_out_woLFE, hDirACRend->hOutSetup.output_config, + hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, MASA_FORMAT, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); + FOR( i = 0; i < hDirACRend->num_outputs_dir; i++ ) + { + hDirACRend->diffuse_response_function[i] = fix16_to_float( hDirACRend->diffuse_response_function_fx[i], Q15 ); + } +#else + initDiffuseResponses( hDirACRend->diffuse_response_function, nchan_out_woLFE, hDirACRend->hOutSetup.output_config, + hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, MASA_FORMAT, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); +#endif + } + else + { +#ifdef IVAS_FLOAT_FIXED + initDiffuseResponses_fx( hDirACRend->diffuse_response_function_fx, hDirACRend->num_outputs_dir, IVAS_AUDIO_CONFIG_FOA, + hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, MASA_FORMAT, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); + FOR( i = 0; i < hDirACRend->num_outputs_dir; i++ ) + { + hDirACRend->diffuse_response_function[i] = fix16_to_float( hDirACRend->diffuse_response_function_fx[i], Q15 ); + } +#else + initDiffuseResponses( hDirACRend->diffuse_response_function, hDirACRend->num_outputs_dir, IVAS_AUDIO_CONFIG_FOA, + hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, MASA_FORMAT, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); +#endif + } + + hDirACRend->hoa_encoder = NULL; +#ifdef IVAS_FLOAT_FIXED + hDirACRend->hoa_encoder_fx = NULL; +#endif + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { +#ifdef IVAS_FLOAT_FIXED + IF ( ( hDirACRend->hoa_encoder_fx = (Word32 *) malloc( nchan_out_woLFE * hDirACRend->num_outputs_diff * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + set32_fx( hDirACRend->hoa_encoder_fx, 0, nchan_out_woLFE * hDirACRend->num_outputs_diff ); + hDirACRend->hoa_encoder_len = nchan_out_woLFE * hDirACRend->num_outputs_diff; +#endif + if ( ( hDirACRend->hoa_encoder = (float *) malloc( nchan_out_woLFE * hDirACRend->num_outputs_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + set_f( hDirACRend->hoa_encoder, 0.0f, nchan_out_woLFE * hDirACRend->num_outputs_diff ); + compute_hoa_encoder_mtx( ls_azimuth, ls_elevation, hDirACRend->hoa_encoder, hDirACRend->num_outputs_diff, hDirACRend->hOutSetup.ambisonics_order ); + } + + /* VBAP */ + inputMasa->hMasaExtRend->hVBAPdata = NULL; + + if ( hDirACRend->panningConf == DIRAC_PANNING_VBAP ) + { +#ifdef IVAS_FLOAT_FIXED + Word32 ls_azimuth_fx[MAX_OUTPUT_CHANNELS]; + Word32 ls_elevation_fx[MAX_OUTPUT_CHANNELS]; + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + ls_azimuth_fx[i] = (Word32) float_to_fix( ls_azimuth[i], Q22 ); + ls_elevation_fx[i] = (Word32) float_to_fix( ls_elevation[i], Q22 ); + } + IF( ( error = vbap_init_data_fx( &( inputMasa->hMasaExtRend->hVBAPdata ), ls_azimuth_fx, ls_elevation_fx, nchan_out_woLFE, MASA_FORMAT ) ) != IVAS_ERR_OK ) + { + return error; + } + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + ls_azimuth[i] = (float) fix_to_float( ls_azimuth_fx[i], Q22 ); + ls_elevation[i] = (float) fix_to_float( ls_elevation_fx[i], Q22 ); + } +#else + if ( ( error = vbap_init_data( &( inputMasa->hMasaExtRend->hVBAPdata ), ls_azimuth, ls_elevation, nchan_out_woLFE, MASA_FORMAT ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + } + + /* HOA panning/dec */ + hDirACRend->hoa_decoder = NULL; + if ( hDirACRend->panningConf == DIRAC_PANNING_HOA3 ) { - return error; + 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 ) + { + return error; + } + + hDirACRend->hoa_decoder = inputMasa->hMasaExtRend->hoa_dec_mtx; + } } - if ( numOutChannels != outAudio.config.numChannels ) + /* decorrelation */ + hDirACRend->proto_signal_decorr_on = 1; + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) { - return IVAS_ERR_WRONG_NUM_CHANNELS; + hDirACRend->proto_signal_decorr_on = 0; } - /* Clear original output buffer */ - set_zero( outAudio.data, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel ); + if ( hDirACRend->proto_signal_decorr_on ) + { +#ifdef IVAS_FLOAT_FIXED + hDirACRend->frequency_axis[i] = (float)hDirACRend->frequency_axis_fx[i]; + 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 ) + { + return error; + } +#else - if ( ( error = renderActiveInputsIsm( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) - { - return error; + if ( ( error = ivas_dirac_dec_decorr_open( &( 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, + nchan_transport, + output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif } - if ( ( error = renderActiveInputsMc( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) - { - return error; - } - if ( ( error = renderActiveInputsSba( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) + /* output synthesis */ +#ifdef IVAS_FLOAT_FIXED + if ( ( ivas_dirac_dec_output_synthesis_open_fx( hSpatParamRendCom, hDirACRend, RENDERER_DIRAC, nchan_transport, output_Fs, 0 ) ) != IVAS_ERR_OK ) { return error; } - - if ( ( error = renderActiveInputsMasa( hIvasRend, outAudio ) ) != IVAS_ERR_OK ) +#else + if ( ( ivas_dirac_dec_output_synthesis_open( hSpatParamRendCom, hDirACRend, RENDERER_DIRAC, nchan_transport, output_Fs, 0 ) ) != IVAS_ERR_OK ) { return error; } - - -#ifndef DISABLE_LIMITER - limitRendererOutput( hIvasRend->hLimiter, outAudio.data, outAudio.config.numSamplesPerChannel, IVAS_LIMITER_THRESHOLD ); -#endif - - /* update global cominbed orientation start index */ - ivas_combined_orientation_update_start_index( hIvasRend->hCombinedOrientationData, outAudio.config.numSamplesPerChannel ); - - return IVAS_ERR_OK; -} #endif + hDirACRend->h_output_synthesis_psd_params.use_onset_filters = hDirACRend->proto_signal_decorr_on; -/*-------------------------------------------------------------------* - * IVAS_REND_GetSamples() - * - * - *-------------------------------------------------------------------*/ - -ivas_error IVAS_REND_GetSamples( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ -) -{ - - return getSamplesInternal( hIvasRend, outAudio ); -} - - -/*-------------------------------------------------------------------* - * IVAS_REND_Close() - * - * - *-------------------------------------------------------------------*/ - -void IVAS_REND_Close( - IVAS_REND_HANDLE *phIvasRend /* i/o: Pointer to renderer handle */ -) -{ - uint16_t i; - IVAS_REND_HANDLE hIvasRend; - - /* Validate function arguments */ - if ( phIvasRend == NULL || *phIvasRend == NULL ) + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - return; + hDirACRend->h_output_synthesis_psd_params.use_onset_filters = 0; } - hIvasRend = *phIvasRend; - if ( hIvasRend->efapOutWrapper.hEfap != NULL ) - { - efap_free_data( &hIvasRend->efapOutWrapper.hEfap ); - } + /*-----------------------------------------------------------------* + * memory allocation + *-----------------------------------------------------------------*/ - /* clear inputs */ - for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) - { - clearInputIsm( &hIvasRend->inputsIsm[i] ); - } - for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) - { - clearInputMc( &hIvasRend->inputsMc[i] ); - } - for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - clearInputSba( &hIvasRend->inputsSba[i] ); + hDirACRend->proto_frame_f = NULL; } - for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + else { - clearInputMasa( &hIvasRend->inputsMasa[i] ); + 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" ) ); + } } - /* clear Config. Renderer */ - ivas_render_config_close( &( hIvasRend->hRendererConfig ) ); - ivas_limiter_close( &hIvasRend->hLimiter ); + hDirACRend->buffer_energy = NULL; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + hDirACRend->buffer_intensity_real[i][j] = NULL; + } + } - closeHeadRotation( hIvasRend ); + /* output synthesis */ + ivas_dirac_dec_output_synthesis_init( hSpatParamRendCom, hDirACRend, nchan_out_woLFE, 0 ); - ivas_external_orientation_close( &hIvasRend->hExternalOrientationData ); - ivas_combined_orientation_close( &hIvasRend->hCombinedOrientationData ); + /* Allocate stack memory */ + if ( ( error = ivas_dirac_alloc_mem( hDirACRend, RENDERER_DIRAC, hSpatParamRendCom->num_freq_bands, &( hDirACRend->stack_mem ), 0 ) ) != IVAS_ERR_OK ) + { + return error; + } - free( hIvasRend ); - *phIvasRend = NULL; + inputMasa->hMasaExtRend->hDirACRend = hDirACRend; - return; + return error; } - - +#else static ivas_error ivas_masa_ext_rend_dirac_rend_init( input_masa *inputMasa ) { @@ -10416,17 +11893,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( } set_f( hDirACRend->frequency_axis, 0.0f, hSpatParamRendCom->num_freq_bands ); -#ifdef IVAS_FLOAT_FIXED - hDirACRend->frequency_axis_fx = (Word16 *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( Word16 ) ); - ivas_dirac_dec_get_frequency_axis_fx( hDirACRend->frequency_axis_fx, output_Fs, hSpatParamRendCom->num_freq_bands ); - - FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) - { - hDirACRend->frequency_axis[i] = (float) hDirACRend->frequency_axis_fx[i]; - } -#else ivas_dirac_dec_get_frequency_axis( hDirACRend->frequency_axis, output_Fs, hSpatParamRendCom->num_freq_bands ); -#endif if ( hDirACRend->panningConf == DIRAC_PANNING_HOA3 && nchan_transport == 2 ) { @@ -10551,12 +12018,6 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( } /* direct/diffuse responses */ -#ifdef IVAS_FLOAT_FIXED - IF( ( hDirACRend->diffuse_response_function_fx = (Word16 *) malloc( sizeof( Word16 ) * hDirACRend->num_outputs_dir ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } -#endif if ( ( hDirACRend->diffuse_response_function = (float *) malloc( sizeof( float ) * hDirACRend->num_outputs_dir ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -10564,31 +12025,13 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( if ( ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS ) || ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) || ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) ) { -#ifdef IVAS_FLOAT_FIXED - initDiffuseResponses_fx( hDirACRend->diffuse_response_function_fx, nchan_out_woLFE, hDirACRend->hOutSetup.output_config, - hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, MASA_FORMAT, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); - FOR( i = 0; i < hDirACRend->num_outputs_dir; i++ ) - { - hDirACRend->diffuse_response_function[i] = fix16_to_float( hDirACRend->diffuse_response_function_fx[i], Q15 ); - } -#else initDiffuseResponses( hDirACRend->diffuse_response_function, nchan_out_woLFE, hDirACRend->hOutSetup.output_config, hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, MASA_FORMAT, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); -#endif } else { -#ifdef IVAS_FLOAT_FIXED - initDiffuseResponses_fx( hDirACRend->diffuse_response_function_fx, hDirACRend->num_outputs_dir, IVAS_AUDIO_CONFIG_FOA, - hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, MASA_FORMAT, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); - FOR( i = 0; i < hDirACRend->num_outputs_dir; i++ ) - { - hDirACRend->diffuse_response_function[i] = fix16_to_float( hDirACRend->diffuse_response_function_fx[i], Q15 ); - } -#else initDiffuseResponses( hDirACRend->diffuse_response_function, hDirACRend->num_outputs_dir, IVAS_AUDIO_CONFIG_FOA, hDirACRend->hOutSetup, hDirACRend->hOutSetup.ambisonics_order, MASA_FORMAT, &hDirACRend->num_ele_spk_no_diffuse_rendering, IVAS_AUDIO_CONFIG_INVALID ); -#endif } hDirACRend->hoa_encoder = NULL; @@ -10608,29 +12051,10 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( if ( hDirACRend->panningConf == DIRAC_PANNING_VBAP ) { -#ifdef IVAS_FLOAT_FIXED - Word32 ls_azimuth_fx[MAX_OUTPUT_CHANNELS]; - Word32 ls_elevation_fx[MAX_OUTPUT_CHANNELS]; - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - ls_azimuth_fx[i] = (Word32) float_to_fix( ls_azimuth[i], Q22 ); - ls_elevation_fx[i] = (Word32) float_to_fix( ls_elevation[i], Q22 ); - } - IF( ( error = vbap_init_data_fx( &( inputMasa->hMasaExtRend->hVBAPdata ), ls_azimuth_fx, ls_elevation_fx, nchan_out_woLFE, MASA_FORMAT ) ) != IVAS_ERR_OK ) - { - return error; - } - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - ls_azimuth[i] = (float) fix_to_float( ls_azimuth_fx[i], Q22 ); - ls_elevation[i] = (float) fix_to_float( ls_elevation_fx[i], Q22 ); - } -#else if ( ( error = vbap_init_data( &( inputMasa->hMasaExtRend->hVBAPdata ), ls_azimuth, ls_elevation, nchan_out_woLFE, MASA_FORMAT ) ) != IVAS_ERR_OK ) { return error; } -#endif } /* HOA panning/dec */ @@ -10657,23 +12081,6 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( if ( hDirACRend->proto_signal_decorr_on ) { -#ifdef IVAS_FLOAT_FIXED - hDirACRend->frequency_axis[i] = (float)hDirACRend->frequency_axis_fx[i]; - 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 ) - { - return error; - } - -#else - if ( ( error = ivas_dirac_dec_decorr_open( &( hDirACRend->h_freq_domain_decorr_ap_params ), &( hDirACRend->h_freq_domain_decorr_ap_state ), hSpatParamRendCom->num_freq_bands, @@ -10686,21 +12093,13 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( { return error; } -#endif } /* output synthesis */ -#ifdef IVAS_FLOAT_FIXED - if ( ( ivas_dirac_dec_output_synthesis_open_fx( hSpatParamRendCom, hDirACRend, RENDERER_DIRAC, nchan_transport, output_Fs, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( ivas_dirac_dec_output_synthesis_open( hSpatParamRendCom, hDirACRend, RENDERER_DIRAC, nchan_transport, output_Fs, 0 ) ) != IVAS_ERR_OK ) { return error; } -#endif hDirACRend->h_output_synthesis_psd_params.use_onset_filters = hDirACRend->proto_signal_decorr_on; if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) @@ -10748,6 +12147,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( return error; } +#endif static ivas_error ivas_masa_ext_rend_parambin_init( input_masa *inputMasa /* i/o: MASA external renderer structure */ @@ -11094,13 +12494,24 @@ 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 ) { diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index a5fb7b313797f2e79f6e37cb514555df272c9c1f..1353922151a57f6a67185ccf0ccb4228c7ec2e64 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -160,7 +160,13 @@ ivas_error IVAS_REND_AddInput( const IVAS_AUDIO_CONFIG inConfig, /* i : audio config for a new input */ IVAS_REND_InputId *inputId /* o : ID of the new input */ ); - +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_AddInput_fx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_AUDIO_CONFIG inConfig, /* i : audio config for a new input */ + IVAS_REND_InputId *inputId /* o : ID of the new input */ +); +#endif /* Note: this will reset any custom LFE routing set for the input */ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ @@ -173,7 +179,19 @@ ivas_error IVAS_REND_SetInputGain( const IVAS_REND_InputId inputId, /* i : ID of the input */ const float gain /* i : linear gain (not in dB) */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_SetInputGain_fx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const Word32 gain /* i : linear gain (not in dB) */ +); +ivas_error IVAS_REND_SetInputLfeMtx_fx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const IVAS_REND_LfePanMtx_fx *lfePanMtx /* i : LFE panning matrix */ +); +#endif // IVAS_FLOAT_FIXED ivas_error IVAS_REND_SetInputLfeMtx( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -187,7 +205,15 @@ ivas_error IVAS_REND_SetInputLfePos( const float outputAzimuth, /* i : Output azimuth position */ const float outputElevation /* i : Output elevation position */ ); - +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_SetInputLfePos_fx( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + const Word32 inputGain, /* i : Input gain to be applied to the LFE channel(s) */ + const Word16 outputAzimuth, /* i : Output azimuth position */ + const Word16 outputElevation /* i : Output elevation position */ +); +#endif // IVAS_FLOAT_FIXED ivas_error IVAS_REND_RemoveInput( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId /* i : ID of the input */ @@ -325,10 +351,17 @@ ivas_error IVAS_REND_MergeMasaMetadata( const IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_SetTotalNumberOfObjects( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const UWord16 total_num_objects /* i : total number of objects */ +); +#else ivas_error IVAS_REND_SetTotalNumberOfObjects( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ const uint16_t total_num_objects /* i : total number of objects */ ); +#endif ivas_error IVAS_REND_SetIsmMetadataDelay( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 31be0923217a3c14685e7c6ada8998bb8f339ba8..29bd4a8b080477c528347910ce10cbfd141de9a3 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -549,10 +549,10 @@ static ivas_error LoadBSplineBinary( HRTF_energy_sections_precalc( model ); HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; +#ifndef IVAS_FLOAT_FIXED HrFiltSet_p->ModelEval.hrfModL = (float *) malloc( model->K * sizeof( float ) ); HrFiltSet_p->ModelEval.hrfModR = (float *) malloc( model->K * sizeof( float ) ); - -#ifdef IVAS_FLOAT_FIXED +#else HrFiltSet_p->ModelEval.hrfModL_fx = (Word32 *) malloc( model->K * sizeof( Word32 ) ); HrFiltSet_p->ModelEval.hrfModR_fx = (Word32 *) malloc( model->K * sizeof( Word32 ) ); #endif @@ -884,9 +884,13 @@ ivas_error dealloc_HRTF_binary( free( hHrtf->ModelParams.EL_dyn_fx ); free( hHrtf->ModelParams.ER_dyn_fx ); #endif - +#ifdef IVAS_FLOAT_FIXED + free( hHrtf->ModelEval.hrfModL_fx ); + free( hHrtf->ModelEval.hrfModR_fx ); +#else free( hHrtf->ModelEval.hrfModL ); free( hHrtf->ModelEval.hrfModR ); +#endif for ( i = 0; i < 3; i++ ) {