diff --git a/apps/renderer.c b/apps/renderer.c index df81d926b290269bd3d7b197fbcc63157920fc90..49fbee9dd5ace22e10d4658d25de218498d0ca85 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -937,12 +937,20 @@ int main( fprintf( stderr, "Error in IVAS_REND_SetTotalNumberOfObjects(): %s\n", ivas_error_to_string( error ) ); exit( -1 ); } - +#ifdef IVAS_FLOAT_FIXED + Word32 var1 = (Word32)(args.syncMdDelay); + IF((error = IVAS_REND_SetIsmMetadataDelay(hIvasRend, var1)) != IVAS_ERR_OK) + { + fprintf(stderr, "Error in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string(error)); + exit(-1); + } +#else if ( ( error = IVAS_REND_SetIsmMetadataDelay( hIvasRend, args.syncMdDelay ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string( error ) ); exit( -1 ); } +#endif } IVAS_REND_LfePanMtx lfePanMatrix; diff --git a/lib_com/float_to_fix_ops.c b/lib_com/float_to_fix_ops.c index cc820e04e132bd0e712d35e9e2a9296598b1cf97..c11bc4f464f5e2d8602c1bd074ab56a040655827 100644 --- a/lib_com/float_to_fix_ops.c +++ b/lib_com/float_to_fix_ops.c @@ -297,153 +297,3 @@ Word16 L_get_q_buf1( float *ptr_flt, Word16 length ) } } #endif - -#ifdef IVAS_FLOAT_FIXED -void stereo_tcx_dec_mode_switch_reconf_To_fixed( - Decoder_State *st, - Word16 tofix, - Word16 last_element_mode) -{ - bool reconf = ( st->bits_frame_nominal != st->last_bits_frame_nominal ) || - ( st->bwidth != st->last_bwidth ) || - ( st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE && !( st->prev_bfi == 1 && st->last_core == ACELP_CORE && st->last_con_tcx == 1 ) ) || - ( st->idchan == 1 && st->element_mode == IVAS_CPE_MDCT && last_element_mode != IVAS_CPE_MDCT ); - if ( reconf ) - { - Word16 Q_cldfbAna_cldfb_state = 0, Q_cldfbBPF_cldfb_state = 0, Q_cldfbSyn_cldfb_state = 0, Q_cldfbSynHB_cldfb_state = 0;//, - - if ( tofix ) - { - - IF( st->hTcxDec ) - { - st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); - st->output_frame_fx = st->hTcxDec->L_frameTCX; - } - IF( st->hHQ_core ) - { - //st->hHQ_core->Q_old_out = Q_factor_arr( st->hHQ_core->old_out, L_FRAME48k ); - //st->hHQ_core->Q_old_outLB = Q_factor_arr( st->hHQ_core->old_outLB, L_FRAME32k ); - st->hHQ_core->Q_fer_samples = 0; - } - IF( st->cldfbAna ) - { - Q_cldfbAna_cldfb_state = Q_factor_arrL( st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_length ) - 1; - floatToFixed_arrL( st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_fx, Q_cldfbAna_cldfb_state, st->cldfbAna->cldfb_state_length ); - } - IF( st->cldfbBPF ) - { - Q_cldfbBPF_cldfb_state = Q_factor_arrL( st->cldfbBPF->cldfb_state, st->cldfbBPF->cldfb_state_length ) - 1; - floatToFixed_arrL( st->cldfbBPF->cldfb_state, st->cldfbBPF->cldfb_state_fx, Q_cldfbBPF_cldfb_state, st->cldfbBPF->cldfb_state_length ); - } - IF( st->cldfbSyn ) - { - Q_cldfbSyn_cldfb_state = Q_factor_arrL( st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_length ) - 1; - floatToFixed_arrL( st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_fx, Q_cldfbSyn_cldfb_state, st->cldfbSyn->cldfb_state_length ); - } - IF( st->cldfbSynHB ) - { - Q_cldfbSynHB_cldfb_state = Q_factor_arrL( st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_length ) - 1; - floatToFixed_arrL( st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_fx, Q_cldfbSynHB_cldfb_state, st->cldfbSynHB->cldfb_state_length ); - } - st->last_gain_syn_deemph = 0; - } - else - { - IF( st->cldfbAna ) - { - Q_cldfbAna_cldfb_state = Q_factor_arrL( st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_length ) - 1; - fixedToFloat_arrL( st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, Q_cldfbAna_cldfb_state, st->cldfbAna->cldfb_state_length ); - } - IF( st->cldfbBPF ) - { - Q_cldfbBPF_cldfb_state = Q_factor_arrL( st->cldfbBPF->cldfb_state, st->cldfbBPF->cldfb_state_length ) - 1; - fixedToFloat_arrL( st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, Q_cldfbBPF_cldfb_state, st->cldfbBPF->cldfb_state_length ); - } - IF( st->cldfbSyn ) - { - Q_cldfbSyn_cldfb_state = Q_factor_arrL( st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_length ) - 1; - fixedToFloat_arrL( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, Q_cldfbSyn_cldfb_state, st->cldfbSyn->cldfb_state_length ); - } - IF( st->cldfbSynHB ) - { - Q_cldfbSynHB_cldfb_state = Q_factor_arrL( st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_length ) - 1; - fixedToFloat_arrL( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, Q_cldfbSynHB_cldfb_state, st->cldfbSynHB->cldfb_state_length ); - } - } - } -} - -void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( - Decoder_State *st, - Word16 tofix, - Word16 last_element_mode, - const FRAME_MODE frameMode) -{ - UNUSED_PARAM(frameMode); - bool reconf = ( st->bits_frame_nominal != st->last_bits_frame_nominal ) || - ( st->bwidth != st->last_bwidth ) || - ( st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE && !( st->prev_bfi == 1 && st->last_core == ACELP_CORE && st->last_con_tcx == 1 ) ) || - ( st->idchan == 1 && st->element_mode == IVAS_CPE_MDCT && last_element_mode != IVAS_CPE_MDCT ); - if ( reconf ) - { - Word16 Q_cldfbSynHB_cldfb_state = 0;//, - - - if ( tofix ) - { - - IF( st->hTcxDec ) - { - st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); - st->output_frame_fx = st->hTcxDec->L_frameTCX; - } - IF( st->hHQ_core ) - { - st->hHQ_core->Q_old_out = 0; - st->hHQ_core->Q_old_outLB = 0; - st->hHQ_core->Q_fer_samples = 0; - } - IF( st->cldfbSynHB ) - { - Q_cldfbSynHB_cldfb_state = Q_factor_arrL( st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_length ) - 1; - floatToFixed_arrL( st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_fx, Q_cldfbSynHB_cldfb_state, st->cldfbSynHB->cldfb_state_length ); - } - - - st->last_gain_syn_deemph = 0; - } - else - { - IF( st->hTcxDec ) - { - st->hTcxDec->conCngLevelBackgroundTrace_e = 0; - st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; - st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - st->hTcxDec->conLastFrameLevel = st->hTcxDec->LastFrameLevel_bfi_fx; - } - IF( st->cldfbSynHB ) - { - Q_cldfbSynHB_cldfb_state = Q_factor_arrL( st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_length ) - 1; - fixedToFloat_arrL( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, Q_cldfbSynHB_cldfb_state, st->cldfbSynHB->cldfb_state_length ); - } - } - } - - if ( tofix ) - { - st->Q_syn = 0; - st->prev_Q_syn = st->Q_syn; - st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; - st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; - - st->mem_error = st->hBPF->pst_mem_deemp_err_fx; - - // u8bit to 16bit - FOR(int l = 0; l < IGF_START_MX; l++) - { - st->hIGFDec->infoTCXNoise_evs[l] = (Word16)st->hIGFDec->infoTCXNoise[l]; - } - } -} -#endif // IVAS_FLOAT_FIXED diff --git a/lib_com/options.h b/lib_com/options.h index 16625f71954a720465959a77764a007ec53f8cad..5f8aa90fe4b9a13972ee844b601bd339c593a332 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -140,7 +140,7 @@ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -#define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO +//#define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO #define UNUSED_PARAM(...) (void)(__VA_ARGS__) diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index 6c37b6b075e30d7616b09e08fcdff2256dacbcbf..b883b924e97659f85af0f454407158415daf0c83 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -62,18 +62,6 @@ /* conversion functions: */ -// needed to be removed -void stereo_tcx_dec_mode_switch_reconf_To_fixed( - Decoder_State *st, - Word16 tofix, - Word16 last_element_mode ); - -void stereo_tcx_dec_mode_switch_reconf_To_fixed_2( - Decoder_State *st, - Word16 tofix, - Word16 last_element_mode, - const FRAME_MODE frameMode); - // Float to Word32 Word32 float_to_fix( float number, Word32 Q ); // Word32 to Float @@ -9358,12 +9346,6 @@ void ivas_bw_switching_pre_proc_fx( Word16 Q_audio ); -#ifdef IVAS_FLOAT_FIXED -/* float2fix and fix2float utilities (to be removed) */ -void acelp_decoder_state_float2fix(Decoder_State *st); -void acelp_decoder_state_fix2float(Decoder_State *st); -#endif - uint32_t mvl2s_r( const Word32 x[], /* i : input vector */ const Word16 q, diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index bf525061ee0357f17a685fec27c67326440957eb..d235d54b66569178e6ed422618b289d7d7dc37ee 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -1946,10 +1946,6 @@ ivas_error acelp_core_dec_ivas_fx( } } - pop_wmops(); - - - { if (save_hb_synth_fx16) { Copy_Scale_sig_32_16(save_hb_synth_fx, save_hb_synth_fx16, L_FRAME48k, 0); @@ -1966,20 +1962,10 @@ ivas_error acelp_core_dec_ivas_fx( } + pop_wmops(); return error; - } - -void acelp_decoder_state_float2fix(Decoder_State *st/*, STEREO_CNG_DEC_HANDLE hStereoCng*/) { - if(st->cldfbSynHB) - floatToFixed_arrL(st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_fx, Q10, st->cldfbSynHB->p_filter_length); } -void acelp_decoder_state_fix2float(Decoder_State *st) { - /* CLDFB */ - if (st->cldfbSynHB) - fixedToFloat_arrL(st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, Q10, st->cldfbSynHB->p_filter_length); - -} static void rescale_fdCngDec(HANDLE_FD_CNG_DEC hFdCngDec, Word16 Exp_diff) { Scale_sig32(hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, Exp_diff); diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index b20c34570b75b1691637e3b8a746a13490bf1611..7b22bf9e52b5bfa5e09bad7daf44871b4bdabf8d 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -1151,6 +1151,7 @@ void open_decoder_LPD_ivas_fx( IF( st->hTcxDec != NULL ) { st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); + st->output_frame_fx = st->hTcxDec->L_frameTCX; IF( EQ_16( st->ini_frame, 0 ) ) { st->L_frameTCX_past = st->hTcxDec->L_frameTCX; diff --git a/lib_dec/core_dec_switch.c b/lib_dec/core_dec_switch.c index 67dcade7ee9ec1ed96a1dab6ead70fdbbe2ec4bb..2fe543ca8e3721028206fea9ac840af28b7f59b0 100644 --- a/lib_dec/core_dec_switch.c +++ b/lib_dec/core_dec_switch.c @@ -46,24 +46,6 @@ * * *-------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -void open_decoder_LPD_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 last_total_brate, /* i : last total bitrate */ - const Word16 bwidth, /* i : audio bandwidth */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - const Word16 last_element_mode, /* i : last element mode */ - const Word16 is_init, /* i : indicate call from init_decoder() to avoid double TC initialization */ - Word16* Q_syn_Overl_TDAC, - Word16* Q_fer_samples, - Word16* Q_syn_Overl, - Word16* Q_syn_Overl_TDACFB, - Word16* Q_syn_OverlFB, - Word16* Q_old_out, - Word16* Q_old_outLB, - Word16* Q_old_Aq_12_8); -#endif // IVAS_FLOAT_FIXED #ifndef IVAS_FLOAT_FIXED void mode_switch_decoder_LPD( diff --git a/lib_dec/core_dec_switch_fx.c b/lib_dec/core_dec_switch_fx.c index 8f7f18de8b361405648f7786b7ca2b1e0ed233d7..1d487992cb6c4d3166784bf16aa93404d35c8497 100644 --- a/lib_dec/core_dec_switch_fx.c +++ b/lib_dec/core_dec_switch_fx.c @@ -355,6 +355,7 @@ void mode_switch_decoder_LPD_ivas_fx( IF( st->hTcxDec != NULL ) { st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); + st->output_frame_fx = st->hTcxDec->L_frameTCX; } IF( st->hTcxCfg != NULL ) diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 157c6180cb1bff62db22e5fc30d2da7957786fd3..ae20b0b42191bfb8a85e97a8dcd79cec4edff421 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -186,6 +186,8 @@ ivas_error ivas_core_dec( { floatToFixed_arr32( st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_fx, Q11, st->cldfbSyn->cldfb_size ); } + IF(st->cldfbSynHB) + floatToFixed_arrL(st->cldfbSynHB->cldfb_state, st->cldfbSynHB->cldfb_state_fx, Q10, st->cldfbSynHB->p_filter_length); } output_Fs = sts[0]->output_Fs; @@ -426,7 +428,6 @@ ivas_error ivas_core_dec( scale_sig32(st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_size, sub(Q10, Q11)); IF(st->cldfbSyn) scale_sig32(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_size, sub(Q10, Q11)); - acelp_decoder_state_float2fix(st); IF( st->hFdCngDec != NULL ) { @@ -444,7 +445,6 @@ 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); IF(st->cldfbAna) scale_sig32(st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_size, sub(Q10, Q11)); /* 9 * (Word16)(st->L_frame * FRAMES_PER_SEC * INV_CLDFB_BANDWIDTH + 0.5f) */ IF(st->cldfbBPF) @@ -467,7 +467,18 @@ ivas_error ivas_core_dec( 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; - stereo_tcx_dec_mode_switch_reconf_To_fixed_2( st, 1, last_element_mode, frameMode[n]); + st->Q_syn = 0; + st->prev_Q_syn = st->Q_syn; + st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; + st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; + + st->mem_error = st->hBPF->pst_mem_deemp_err_fx; + + // u8bit to 16bit + FOR(int l = 0; l < IGF_START_MX; l++) + { + st->hIGFDec->infoTCXNoise_evs[l] = (Word16)st->hIGFDec->infoTCXNoise[l]; + } /* TCX decoder */ Scale_sig( st->hPFstat->mem_stp, L_SUBFR, -Qsyn_temp ); @@ -481,11 +492,16 @@ ivas_error ivas_core_dec( st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->Q_old_wtda; Copy_Scale_sig_16_32( output_16_fx[n], output_32_fx[n], L_FRAME48k, Q11 ); - stereo_tcx_dec_mode_switch_reconf_To_fixed_2( st, 0, last_element_mode, frameMode[n] ); + IF( st->hTcxDec ) + { + st->hTcxDec->conNoiseLevelIndex = st->hTcxDec->NoiseLevelIndex_bfi; + st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; + st->hTcxDec->conLastFrameLevel = st->hTcxDec->LastFrameLevel_bfi_fx; + } st->hBPF->pst_mem_deemp_err_fx = (Word16)st->mem_error; } - if ( st->core == HQ_CORE ) + IF ( EQ_16(st->core, HQ_CORE) ) { /* HQ core decoder */ Q_synth = 0; @@ -518,16 +534,6 @@ ivas_error ivas_core_dec( } /* n_channels loop */ - FOR(n = 0; n < n_channels; n++) - { - st = sts[n]; - IF( st->cldfbAna ) - fixedToFloat_arrL( st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, Q10, st->cldfbAna->cldfb_size ); - IF( st->cldfbBPF ) - fixedToFloat_arrL( st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, Q11, st->cldfbBPF->cldfb_size ); - IF( st->cldfbSyn ) - fixedToFloat_arrL( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, Q11, st->cldfbSyn->cldfb_size ); - } /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Decoding @@ -540,22 +546,36 @@ ivas_error ivas_core_dec( { IF ( hMCT ) { - pop_wmops(); + FOR(n = 0; n < n_channels; n++) + { + st = sts[n]; + IF( st->cldfbAna ) + fixedToFloat_arrL( st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, Q10, st->cldfbAna->cldfb_size ); + IF( st->cldfbBPF ) + fixedToFloat_arrL( st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, Q11, st->cldfbBPF->cldfb_size ); + IF( st->cldfbSyn ) + fixedToFloat_arrL( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, Q11, st->cldfbSyn->cldfb_size ); + IF(st->cldfbSynHB) + fixedToFloat_arrL(st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, Q10, st->cldfbSynHB->cldfb_size); + } + pop_wmops(); return error; } ELSE { -#if 1 Word16 e_sig = 17; Word16 ch; sts = hCPE->hCoreCoder; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - stereo_tcx_dec_mode_switch_reconf_To_fixed( sts[ch], 1, hCPE->last_element_mode ); - st = sts[ch]; + st->last_gain_syn_deemph = 0; + IF( st->hHQ_core ) + { + st->hHQ_core->Q_fer_samples = 0; + } st->prev_Q_syn = st->Q_syn; Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, st->Q_syn - st->hHQ_core->Q_old_wtda_LB ); @@ -567,19 +587,11 @@ ivas_error ivas_core_dec( st->hTcxDec->conCurrLevelIndex = st->hTcxDec->CurrLevelIndex_bfi; } -#endif stereo_mdct_core_dec_fx( st_ivas, hCPE, output_32_fx, synth_16_fx ); - - -#if 1 // Fix to float conversion - FOR( ch = 0; ch < 2; ch++ ) { - stereo_tcx_dec_mode_switch_reconf_To_fixed( sts[ch], 0, hCPE->last_element_mode ); - st = hCPE->hCoreCoder[ch]; - st->hHQ_core->Q_old_wtda_LB = st->Q_syn; st->hHQ_core->Q_old_wtda = st->Q_syn; } @@ -590,7 +602,6 @@ ivas_error ivas_core_dec( #else Scale_sig( synth_16_fx[0], L_FRAME48k, e_sig - 15 ); Scale_sig( synth_16_fx[1], L_FRAME48k, e_sig - 15 ); -#endif #endif } } @@ -600,14 +611,14 @@ ivas_error ivas_core_dec( sts[0] = hCPE->hCoreCoder[0]; sts[1] = hCPE->hCoreCoder[1]; - if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) + IF ( hCPE->last_element_brate <= IVAS_SID_5k2 ) { sts[0]->hHQ_core->exp_old_out = 15 - sts[0]->hHQ_core->Q_old_wtda; sts[1]->hHQ_core->exp_old_out = 15 - sts[1]->hHQ_core->Q_old_wtda; } updateBuffersForDmxMdctStereo_fx( hCPE, output_frame, output_32_fx[0], output_32_fx[1], synth_16_fx ); - if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) + IF ( hCPE->last_element_brate <= IVAS_SID_5k2 ) { sts[0]->hHQ_core->Q_old_wtda = 15 - sts[0]->hHQ_core->exp_old_out; sts[1]->hHQ_core->Q_old_wtda = 15 - sts[1]->hHQ_core->exp_old_out; @@ -634,7 +645,7 @@ ivas_error ivas_core_dec( * Stereo CNG updates *---------------------------------------------------------------------*/ - if ( sts[0]->element_mode == IVAS_CPE_TD && hCPE->hStereoCng != NULL ) + IF ( EQ_16(sts[0]->element_mode, IVAS_CPE_TD) && hCPE->hStereoCng != NULL ) { /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ Word16 Q_c_PS_LT = 31, Q_output = 11; @@ -695,17 +706,9 @@ ivas_error ivas_core_dec( /*size of synth is choosen as delay comp to start with*/ /*-------------------cldfb-start-------------------------*/ - if (st->cldfbAna != NULL) + IF (st->cldfbSyn != NULL) { - floatToFixed_arrL(st->cldfbAna->cldfb_state, st->cldfbAna->cldfb_state_fx, 10, st->cldfbAna->cldfb_size); - } - if (st->cldfbSyn != NULL) - { - floatToFixed_arrL(st->cldfbSyn->cldfb_state, st->cldfbSyn->cldfb_state_fx, 4, st->cldfbSyn->p_filter_length); - } - if (st->cldfbBPF != NULL) - { - floatToFixed_arrL(st->cldfbBPF->cldfb_state, st->cldfbBPF->cldfb_state_fx, 11, st->cldfbBPF->cldfb_size); + scale_sig32(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub(Q4, Q11)); } Word16 q_audio, old_syn_fx; @@ -785,17 +788,9 @@ ivas_error ivas_core_dec( /*note : cldfb_size here signifies the original size which was assigned to cldfb_state_fx buffer not its current size*/ - if (st->cldfbAna != NULL) - { - fixedToFloat_arrL(st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, 10, st->cldfbAna->cldfb_size); - } - if (st->cldfbSyn != NULL) + IF (st->cldfbSyn != NULL) { - fixedToFloat_arrL(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, 4, st->cldfbSyn->p_filter_length); - } - if (st->cldfbBPF != NULL) - { - fixedToFloat_arrL(st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, 11, st->cldfbBPF->cldfb_size); + scale_sig32(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub(Q11, Q4)); } #ifdef MSAN_FIX @@ -1298,6 +1293,18 @@ ivas_error ivas_core_dec( } /* n_channels loop */ + FOR(n = 0; n < n_channels; n++) + { + st = sts[n]; + IF( st->cldfbAna ) + fixedToFloat_arrL( st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, Q10, st->cldfbAna->cldfb_size ); + IF( st->cldfbBPF ) + fixedToFloat_arrL( st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, Q11, st->cldfbBPF->cldfb_size ); + IF( st->cldfbSyn ) + fixedToFloat_arrL( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, Q11, st->cldfbSyn->cldfb_size ); + IF(st->cldfbSynHB) + fixedToFloat_arrL(st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, Q10, st->cldfbSynHB->cldfb_size); + } pop_wmops(); return error; diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 52bad0aba68fffb9335244a5fe17e872130ef8d2..826f7c883adbe271701fd180968a9af8c510b9dc 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1299,12 +1299,10 @@ ivas_error ivas_init_decoder_front( return error; } - /*FLOAT CODE*/ IF ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig ) ) != IVAS_ERR_OK ) { return error; } - /*---------*/ } return error; diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 9895ea1732754532e7668c7377172ffe8245b5fd..f1e909c95f80fa6b4465f1242bf8b96fdaa0e8be 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -3023,7 +3023,6 @@ void stereo_dft_generate_res_pred( * * ---------------------------------------------------------------*/ #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 */ @@ -3326,310 +3325,6 @@ void stereo_dft_dec_smooth_parameters( return; } -#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 */ - 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; - - N_div = STEREO_DFT_NBDIV; - k_offset = STEREO_DFT_OFFSET; - - 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 ); - } - - 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 - { - 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 ); - } - } - - /* 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 ) - { - 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 - { - /* 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->ipd_xfade_target = hStereoDft->gipd[k + k_offset]; - hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset]; - hStereoDft->ipd_xfade_counter = 0; - } - } - - 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 - { - 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 ); - } - - /* 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 ) - { - 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; - } - - 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]; - } - - return; - } - - /* 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]; - } - - 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]; - } - } - - /* predictive values */ - for ( ; b < nbands; 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; - } - } - - for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->res_cod_band_max; b++ ) - { - 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 ) - { - 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]; - } - - 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 ); - } - - /* Smoothing of prediction gains between ftrames */ - for ( ; b < hStereoDft->nbands; b++ ) - { - if ( hStereoDft->attackPresent ) - { - 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]; - } - 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[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX]; - - if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW ) - { - 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 - { - 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 - { - if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW ) - { - 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]; - } - else - { - 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 ( !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 ); - } - } - - /* 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; - } - - 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]]; - } - } - - - 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]; - } - } - - /*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 - { - *( 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 ); - } - } - - hStereoDft->itd[( k + k_offset ) - k2] = hStereoDft->itd[k + k_offset]; - } /*end of interpolation*/ - } - - return; -} -#endif #endif #ifndef IVAS_FLOAT_FIXED diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index ab8475dfe4d74bb2c61e0cdc1823d559eebe256a..9486ea931ad17ef650f93c79587f0d430653d539 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1620,7 +1620,61 @@ ivas_error IVAS_DEC_GetNumOutputChannels( * * Get metadata of one object decoded in the most recent frame *---------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_DEC_GetObjectMetadata( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_ISM_METADATA *metadata, /* o : struct where metadata decoded in most recently decoded frame will be written */ + const UWord16 zero_flag, /* i : if this flag is enabled, this function outputs a zero-initialized metadata struct */ + const UWord16 objectIdx /* i : index of the queried object */ +) +{ + Decoder_Struct *st_ivas; + ISM_METADATA_HANDLE hIsmMeta; + + IF(hIvasDec == NULL || hIvasDec->st_ivas == NULL) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + IF(NE_16((Word16)st_ivas->ivas_format, ISM_FORMAT) && NE_16((Word16)st_ivas->ivas_format, MASA_ISM_FORMAT) && NE_16((Word16)st_ivas->ivas_format, SBA_ISM_FORMAT)) + { + return IVAS_ERR_WRONG_MODE; + } + IF(GE_16(objectIdx, st_ivas->nchan_ism)) + { + return IVAS_ERR_INVALID_INDEX; + } + + hIsmMeta = st_ivas->hIsmMetaData[objectIdx]; + + IF(hIsmMeta == NULL || zero_flag) + { + metadata->azimuth_fx = 0; + metadata->elevation_fx = 0; + metadata->radius_fx = 512; + metadata->yaw_fx = 0; + metadata->pitch_fx = 0; + metadata->spread_fx = 0; + metadata->gainFactor_fx = ONE_IN_Q31; + metadata->non_diegetic_flag = 0; + } + ELSE + { + metadata->azimuth_fx = hIsmMeta->azimuth_fx; + metadata->elevation_fx = hIsmMeta->elevation_fx; + metadata->radius_fx = hIsmMeta->radius_fx; + metadata->yaw_fx = hIsmMeta->yaw_fx; + metadata->pitch_fx = hIsmMeta->pitch_fx; + metadata->spread_fx = 0; + metadata->gainFactor_fx = ONE_IN_Q31; + metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; + } + + return IVAS_ERR_OK; +} +#else ivas_error IVAS_DEC_GetObjectMetadata( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_ISM_METADATA *metadata, /* o : struct where metadata decoded in most recently decoded frame will be written */ @@ -1686,7 +1740,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( #endif return IVAS_ERR_OK; } - +#endif /*---------------------------------------------------------------------* * IVAS_DEC_GetMasaMetadata( ) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 5865e018465686bac2e788db913709cdbb3ff2d7..eaa1f735a992fc6129a57c184f21ee286f0a0005 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -173,7 +173,11 @@ typedef struct #endif OMASA_ANA_HANDLE hOMasa; uint16_t total_num_objects; +#ifdef IVAS_FLOAT_FIXED + Word32 ism_metadata_delay_ms_fx; +#else float ism_metadata_delay_ms; +#endif } input_ism; #else typedef struct @@ -2264,7 +2268,31 @@ static bool isIoConfigPairSupported( } #endif +#ifdef IVAS_FLOAT_FIXED +static ivas_error initIsmMasaRendering( + input_ism *inputIsm, + const Word32 inSampleRate) +{ + ivas_error error; + + IF(inputIsm->tdRendWrapper.hBinRendererTd != NULL) + { + ivas_td_binaural_close_fx(&inputIsm->tdRendWrapper.hBinRendererTd); + inputIsm->tdRendWrapper.hHrtfTD = NULL; + } + + ivas_rend_closeCrend(&inputIsm->crendWrapper); + + ivas_reverb_close(&inputIsm->hReverb); + IF((error = ivas_omasa_ana_open(&inputIsm->hOMasa, inSampleRate, inputIsm->total_num_objects)) != IVAS_ERR_OK) + { + return error; + } + + return IVAS_ERR_OK; +} +#else static ivas_error initIsmMasaRendering( input_ism *inputIsm, const Word32 inSampleRate ) @@ -2292,6 +2320,7 @@ static ivas_error initIsmMasaRendering( return IVAS_ERR_OK; } +#endif #ifdef IVAS_FLOAT_FIXED @@ -3910,164 +3939,137 @@ static ivas_error initMcBinauralRendering( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, - uint8_t reconfigureFlag ) + UWord8 reconfigureFlag) { ivas_error error; - int32_t binauralDelayNs; - int32_t outSampleRate; - int8_t useTDRend; + Word32 binauralDelayNs; + Word32 outSampleRate; + Word8 useTDRend; /* Allocate TD binaural renderer for custom loudspeaker layouts (regardless of headrotation) or planar MC layouts with headrotation, CREND for the rest */ useTDRend = FALSE; - if ( outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + IF(NE_16(outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR)) { - if ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + test(); + test(); + IF(EQ_16(inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM) && NE_16(outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB)) { useTDRend = TRUE; } - else if ( ( inConfig == IVAS_AUDIO_CONFIG_5_1 || inConfig == IVAS_AUDIO_CONFIG_7_1 ) && - ( inputMc->base.ctx.pHeadRotData->headRotEnabled ) ) + ELSE IF((EQ_16(inConfig, IVAS_AUDIO_CONFIG_5_1) || EQ_16(inConfig, IVAS_AUDIO_CONFIG_7_1)) && + (inputMc->base.ctx.pHeadRotData->headRotEnabled)) { useTDRend = TRUE; } } /* if TD renderer was open and we need to use CREND, close it */ - if ( !reconfigureFlag || ( !useTDRend && inputMc->tdRendWrapper.hBinRendererTd != NULL ) ) + test(); + IF(!reconfigureFlag || (!useTDRend && inputMc->tdRendWrapper.hBinRendererTd != NULL)) { - ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); + ivas_td_binaural_close_fx(&inputMc->tdRendWrapper.hBinRendererTd); inputMc->tdRendWrapper.hHrtfTD = NULL; } /* if we need to use TD renderer and CREND was open, close it */ - if ( useTDRend ) + IF(useTDRend) { - ivas_rend_closeCrend( &inputMc->crendWrapper ); + ivas_rend_closeCrend(&inputMc->crendWrapper); } - if ( !reconfigureFlag || ( !useTDRend && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && inputMc->hReverb != NULL ) ) + test(); + test(); + IF(!reconfigureFlag || (!useTDRend && NE_16(outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB) && inputMc->hReverb != NULL)) { - ivas_reverb_close( &inputMc->hReverb ); + ivas_reverb_close(&inputMc->hReverb); } - if ( !reconfigureFlag || ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM && !inputMc->base.ctx.pHeadRotData->headRotEnabled ) ) + test(); + test(); + IF(!reconfigureFlag || (EQ_16(inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM) && !inputMc->base.ctx.pHeadRotData->headRotEnabled)) { - if ( inputMc->efapInWrapper.hEfap != NULL ) + IF(inputMc->efapInWrapper.hEfap != NULL) { - efap_free_data( &inputMc->efapInWrapper.hEfap ); + efap_free_data(&inputMc->efapInWrapper.hEfap); } } outSampleRate = *inputMc->base.ctx.pOutSampleRate; - if ( useTDRend && inputMc->tdRendWrapper.hBinRendererTd == NULL ) + test(); + test(); + IF(useTDRend && inputMc->tdRendWrapper.hBinRendererTd == NULL) { -#ifdef IVAS_FLOAT_FIXED Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; - Word16 ivas_format = ( EQ_16( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) ? MC_FORMAT : ISM_FORMAT; - if ( ( error = ivas_td_binaural_open_ext_fx( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + IF((error = ivas_td_binaural_open_ext_fx(&inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, SrcInd, &num_src)) != IVAS_ERR_OK) { return error; } - Word16 nchan_rend = num_src; - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + IF(EQ_16(outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB) && inputMc->hReverb == NULL) { nchan_rend--; /* Skip LFE channel -- added to the others */ } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + FOR(Word16 nS = 0; nS < nchan_rend; nS++) { TDREND_SRC_t *Src_p = inputMc->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) + IF(Src_p != NULL) { - IF( Src_p->SrcSpatial_p != NULL ) + IF(Src_p->SrcSpatial_p != NULL) { Src_p->SrcSpatial_p->q_Pos_p = 31; } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputMc->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = 31; + IF(inputMc->tdRendWrapper.hBinRendererTd->Sources[nS] != NULL) + { + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputMc->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = 31; } } -#else - if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif - if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && inputMc->hReverb == NULL ) + } + if (outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && inputMc->hReverb == NULL) { -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) + IF((error = ivas_reverb_open_fx(&(inputMc->hReverb), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate)) != IVAS_ERR_OK) { return error; } -#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 ) + 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 ) + IF((error = ivas_rend_openCrend(&inputMc->crendWrapper, (EQ_16(inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM)) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, NULL, outSampleRate)) != IVAS_ERR_OK) { return error; } } /* Initialise the EFAP handle for rotation on input layout */ - if ( inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL ) + IF(NE_16(inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM) && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL) { - if ( ( error = initEfap( &inputMc->efapInWrapper, inConfig, NULL ) ) != IVAS_ERR_OK ) + IF((error = initEfap(&inputMc->efapInWrapper, inConfig, NULL)) != IVAS_ERR_OK) { return error; } } /* determine binaural delay ( used for aligning LFE to output signal ) */ - binauralDelayNs = max( ( inputMc->crendWrapper != NULL ) ? inputMc->crendWrapper->binaural_latency_ns : 0, inputMc->tdRendWrapper.binaural_latency_ns ); - inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); + binauralDelayNs = max((inputMc->crendWrapper != NULL) ? inputMc->crendWrapper->binaural_latency_ns : 0, inputMc->tdRendWrapper.binaural_latency_ns); + Word16 exp = 0; + Word16 var1 = BASOP_Util_Divide3232_Scale(*inputMc->base.ctx.pOutSampleRate, 1000000000, &exp); + Word32 var2 = L_shr_r(Mpy_32_32(binauralDelayNs, L_deposit_h(var1)), -exp);//31 + exp + inputMc->binauralDelaySmp = (Word16)var2; + //inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); - if ( inputMc->binauralDelaySmp > MAX_BIN_DELAY_SAMPLES ) + IF(inputMc->binauralDelaySmp > MAX_BIN_DELAY_SAMPLES) { - return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid delay for LFE binaural rendering!)" ); + return IVAS_ERROR(IVAS_ERR_WRONG_PARAMS, "Invalid delay for LFE binaural rendering!)"); } return IVAS_ERR_OK; -} + } #else static ivas_error initMcBinauralRendering( input_mc *inputMc, @@ -7426,7 +7428,7 @@ ivas_error IVAS_REND_InitConfig( { return error; } -//#else +#else IF ((error = ivas_render_config_init_from_rom(&hIvasRend->hRendererConfig)) != IVAS_ERR_OK) { return error; @@ -7466,18 +7468,10 @@ 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 { @@ -8961,7 +8955,11 @@ static ivas_error renderIsmToBinaural( Word16 exp = *outAudio.pq_fact; push_wmops( "renderIsmToBinaural" ); /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ +#ifdef IVAS_FLOAT_FIXED + ism_md_subframe_update_ext = round_fx(div_l(ismInput->ism_metadata_delay_ms_fx, (1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES))); +#else ism_md_subframe_update_ext = (Word16) roundf( ismInput->ism_metadata_delay_ms / ( 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) );/*To be cleaned up later*/ +#endif copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpTDRendBuffer ); #if 1 ismInput->currentPos.azimuth_fx = floatToFixed(ismInput->currentPos.azimuth, Q22); @@ -9425,8 +9423,11 @@ static ivas_error renderIsmToBinauralReverb( push_wmops( "renderIsmToBinauralRoom" ); /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ +#ifdef IVAS_FLOAT_FIXED + ism_md_subframe_update_ext = round_fx(div_l(ismInput->ism_metadata_delay_ms_fx, (1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES))); +#else ism_md_subframe_update_ext = (Word16) roundf( ismInput->ism_metadata_delay_ms / ( 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) );/*ism_metadata_delay_ms :To be replaced later*/ - +#endif copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpRendBuffer_fx ); #if 1 ismInput->currentPos.azimuth_fx = floatToFixed(ismInput->currentPos.azimuth, Q22); @@ -12780,7 +12781,26 @@ ivas_error IVAS_REND_SetTotalNumberOfObjects( * * Set the Metadata Delay in ms in order to sync with audio delay *---------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_SetIsmMetadataDelay( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const Word32 sync_md_delay /* i : ISM Metadata Delay in ms to sync with audio delay */ +) +{ + Word16 i; + + IF(hIvasRend == NULL) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + FOR(i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i) + { + hIvasRend->inputsIsm[i].ism_metadata_delay_ms_fx = sync_md_delay; + } + return IVAS_ERR_OK; +} +#else ivas_error IVAS_REND_SetIsmMetadataDelay( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ const float sync_md_delay /* i : ISM Metadata Delay in ms to sync with audio delay */ @@ -12799,6 +12819,7 @@ ivas_error IVAS_REND_SetIsmMetadataDelay( return IVAS_ERR_OK; } +#endif #ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* @@ -14543,6 +14564,77 @@ static ivas_error initMasaExtRenderer( } #endif // IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED +static void freeMasaExtRenderer( + MASA_EXT_REND_HANDLE *hMasaExtRendOut) +{ + MASA_EXT_REND_HANDLE hMasaExtRend; + Word16 i; + + IF(hMasaExtRendOut == NULL || *hMasaExtRendOut == NULL) + { + return; + } + + hMasaExtRend = *hMasaExtRendOut; + + IF(hMasaExtRend->hDirACRend != NULL) + { + ivas_dirac_rend_close_fx(&hMasaExtRend->hDirACRend); + } + + IF(hMasaExtRend->hSpatParamRendCom != NULL) + { + ivas_spat_hSpatParamRendCom_close_fx(&hMasaExtRend->hSpatParamRendCom); + } + + IF(hMasaExtRend->hDiracDecBin != NULL) + { + ivas_dirac_dec_close_binaural_data(&hMasaExtRend->hDiracDecBin); + } + + IF (hMasaExtRend->hReverb != NULL) + { + ivas_binaural_reverb_close_fx(&hMasaExtRend->hReverb); + } + + IF(hMasaExtRend->hHrtfParambin != NULL) + { + ivas_HRTF_parambin_binary_close_fx(&hMasaExtRend->hHrtfParambin); + } + + IF(hMasaExtRend->hVBAPdata != NULL) + { + vbap_free_data_fx(&hMasaExtRend->hVBAPdata); + } + + IF(hMasaExtRend->hoa_dec_mtx != NULL) + { + free(hMasaExtRend->hoa_dec_mtx); + } + + FOR(i = 0; i < MASA_MAX_TRANSPORT_CHANNELS; i++) + { + IF(hMasaExtRend->cldfbAnaRend[i] != NULL) + { + deleteCldfb_ivas(&hMasaExtRend->cldfbAnaRend[i]); + } + } + + FOR(i = 0; i < MAX_OUTPUT_CHANNELS; i++) + { + IF(hMasaExtRend->cldfbSynRend[i] != NULL) + { + deleteCldfb_ivas(&hMasaExtRend->cldfbSynRend[i]); + } + } + + free(hMasaExtRend); + *hMasaExtRendOut = NULL; + + return; +} +#else static void freeMasaExtRenderer( MASA_EXT_REND_HANDLE *hMasaExtRendOut ) { @@ -14635,6 +14727,7 @@ static void freeMasaExtRenderer( return; } +#endif #ifdef IVAS_FLOAT_FIXED static void intermidiate_ext_dirac_render( diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 3d6cac9823a6be11f9514e173119763234174df4..08b14c4d6cec6a41dc389cf28098a037eb05c6e7 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -383,10 +383,17 @@ ivas_error IVAS_REND_SetTotalNumberOfObjects( ); #endif +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_SetIsmMetadataDelay( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const Word32 sync_md_delay /* i : Metadata Delay in ms to sync with audio delay */ +); +#else ivas_error IVAS_REND_SetIsmMetadataDelay( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ const float sync_md_delay /* i : Metadata Delay in ms to sync with audio delay */ ); +#endif ivas_error IVAS_REND_GetNumAllObjects( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */