Loading lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ #ifdef SPLIT_REND_WITH_HEAD_ROT #define SPLIT_REND_POSE_CORRECTION_UNUSED_BITS #define ISAR_BITSTREAM_UPDATE_LC3PLUS /* FhG: Multiple improvements to the ISAR bitstream when LC3plus is used. See MR 1456 for details. */ #define FIX_1372_ISAR_POST_REND #endif #define NONBE_FIX_855_JBM_FLUSH_OFFSET /* FhG: issue #855: add missing switch here for the code in JBM flushing */ #define FIX_923_EXTERNAL_REND_COMMAND_LINE /* VA: issue 923: enable external renderer command-line options in UPPER case letters */ Loading lib_isar/isar_prot.h +10 −0 Original line number Diff line number Diff line Loading @@ -118,12 +118,22 @@ void isar_log_cldfb2wav_data( const char *filename ); #endif #ifndef FIX_1372_ISAR_POST_REND void isar_SplitRenderer_PostRenderer( ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ const IVAS_QUATERNION Quaternion_act ); #else void isar_SplitRenderer_PostRenderer( ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ const IVAS_QUATERNION Quaternion_act, Word16 *Q_in ); #endif void isar_splitBinLCLDDecProcess( ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE hSplitBinLCLDDec, Loading lib_isar/isar_splitRendererPost.c +92 −111 Original line number Diff line number Diff line Loading @@ -101,7 +101,7 @@ ivas_error isar_splitBinPostRendOpen( { for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { if ( ( error = openCldfb( &( hBinRend->cldfbSynReconsBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) if ( ( error = openCldfb_ivas_fx( &( hBinRend->cldfbSynReconsBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) { return error; } Loading Loading @@ -150,7 +150,7 @@ void isar_splitBinPostRendClose( { if ( ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] != NULL ) { deleteCldfb( &( ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] ) ); deleteCldfb_ivas_fx( &( ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] ) ); ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] = NULL; } } Loading Loading @@ -1737,30 +1737,41 @@ static void interpolate_rend_md_fx( * * *-----------------------------------------------------------------------------------------*/ #ifndef FIX_1372_ISAR_POST_REND void isar_SplitRenderer_PostRenderer( ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ const IVAS_QUATERNION Quaternion_act ) #else void isar_SplitRenderer_PostRenderer( ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ const IVAS_QUATERNION Quaternion_act, Word16 *Q_in ) #endif { int16_t pos_idx, b, brange[2], ch_idx1; int16_t num_md_bands, slot_idx, b2, index_slot, num_slots, sf_idx_md; Word32 pred_out_re_fx[BINAURAL_CHANNELS], pred_out_im_fx[BINAURAL_CHANNELS], tmp_re_fx, tmp_im_fx, gd_int_fx; #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG ISAR_BIN_HR_SPLIT_REND_MD rot_md_act[MAX_HEAD_ROT_POSES][MAX_SPLIT_REND_MD_BANDS]; Word32 gd_int_fx; #ifndef FIX_1372_ISAR_POST_REND Word32 pred_out_re_fx[BINAURAL_CHANNELS], pred_out_im_fx[BINAURAL_CHANNELS]; Word32 tmp_re_fx, tmp_im_fx; Word16 exp_tmp1, exp_tmp2; #else ISAR_BIN_HR_SPLIT_REND_MD rot_md_act[1][MAX_SPLIT_REND_MD_BANDS]; Word64 pred_out_re_fx64[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], pred_out_im_fx64[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; Word64 tmp_re_fx64, tmp_im_fx64, out64_re, out64_im; Word16 shift64 = 63; #endif ISAR_BIN_HR_SPLIT_REND_MD rot_md_act[1][MAX_SPLIT_REND_MD_BANDS]; int16_t interp_yaw_pose_idx[2], interp_pitch_pose_idx[2], interp_roll_pose_idx[2]; Word32 interp_yaw_fact_fx, interp_pitch_fact_fx, interp_roll_fact_fx; Word16 Q_yaw = Q31, Q_pitch = Q31, Q_roll = Q31; Word32 mix_mat_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; Word32 mix_mat_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG float Cldfb_RealBuffer_Recons_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Recons_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; #endif Word16 fade_fx; Word32 *pMix_mat_re_prev_fx[BINAURAL_CHANNELS]; Word32 *pMix_mat_im_prev_fx[BINAURAL_CHANNELS]; Loading @@ -1771,12 +1782,7 @@ void isar_SplitRenderer_PostRenderer( push_wmops( "isar_SplitRenderer_PostRenderer" ); num_slots = MAX_PARAM_SPATIAL_SUBFRAMES; #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG pos_idx = MAX_HEAD_ROT_POSES - 1; #else pos_idx = 0; #endif sf_idx_md = 0; get_interpolation_vars( pMultiBinPoseData, &hBinPostRenderer->QuaternionsPre[sf_idx_md], &Quaternion_act, interp_yaw_pose_idx, interp_pitch_pose_idx, interp_roll_pose_idx, &interp_yaw_fact_fx, &interp_pitch_fact_fx, &interp_roll_fact_fx, &Q_yaw, &Q_pitch, &Q_roll ); Loading Loading @@ -1808,50 +1814,7 @@ void isar_SplitRenderer_PostRenderer( } } #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES - 1; pos_idx++ ) { for ( b = 0; b < num_md_bands; b++ ) { if ( hBinPostRenderer->pose_type[pos_idx] == PITCH_ONLY ) { for ( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { set_zero( hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[ch_idx1], BINAURAL_CHANNELS ); set_zero( hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_im[ch_idx1], BINAURAL_CHANNELS ); hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[ch_idx1][ch_idx1] = 1.0f; } hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[0][0] *= hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd; hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[1][1] *= hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd2; hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd = 0.0f; } else if ( hBinPostRenderer->pose_type[pos_idx] == ANY_ROLL ) { hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd = 0.0f; } for ( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { /*update the prediction matrix with interpolated matrix*/ rot_md_act[pos_idx][b].pred_mat_re[ch_idx1][0] = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[ch_idx1][0]; rot_md_act[pos_idx][b].pred_mat_re[ch_idx1][1] = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[ch_idx1][1]; rot_md_act[pos_idx][b].pred_mat_im[ch_idx1][0] = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_im[ch_idx1][0]; rot_md_act[pos_idx][b].pred_mat_im[ch_idx1][1] = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_im[ch_idx1][1]; rot_md_act[pos_idx][b].gd = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd; } } } #endif #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) #else pos_idx = 0; #endif { FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) { Loading Loading @@ -1887,15 +1850,13 @@ void isar_SplitRenderer_PostRenderer( brange[0] = pBand_grouping[b]; brange[1] = pBand_grouping[b + 1]; Word16 exp_tmp1, exp_tmp2; FOR( b2 = brange[0]; b2 < brange[1]; b2++ ) { FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { /* Apply prediction matrix */ #ifndef FIX_1372_ISAR_POST_REND ivas_cmult_fix( Cldfb_RealBuffer_Ref_Binaural_fx[0][index_slot][b2], 25, Cldfb_ImagBuffer_Ref_Binaural_fx[0][index_slot][b2], 25, mix_mat_re_fx[0][ch_idx1], 6, mix_mat_im_fx[0][ch_idx1], 6, &tmp_re_fx, &tmp_im_fx, &exp_tmp1, &exp_tmp2 ); // tmp_re_fx = L_shl(tmp_re_fx, sub(exp_tmp1, 6)); //Q25 // tmp_im_fx = L_shl(tmp_im_fx, sub(exp_tmp1, 6)); //Q25 pred_out_re_fx[ch_idx1] = tmp_re_fx; pred_out_im_fx[ch_idx1] = tmp_im_fx; Loading @@ -1903,36 +1864,80 @@ void isar_SplitRenderer_PostRenderer( Word16 exp_im = exp_tmp2; ivas_cmult_fix( Cldfb_RealBuffer_Ref_Binaural_fx[1][index_slot][b2], 25, Cldfb_ImagBuffer_Ref_Binaural_fx[1][index_slot][b2], 25, mix_mat_re_fx[1][ch_idx1], 6, mix_mat_im_fx[1][ch_idx1], 6, &tmp_re_fx, &tmp_im_fx, &exp_tmp1, &exp_tmp2 ); // tmp_re_fx = L_shl(tmp_re_fx, sub(exp_tmp1, 6)); //Q25 // tmp_im_fx = L_shl(tmp_im_fx, sub(exp_tmp1, 6)); //Q25 pred_out_re_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( pred_out_re_fx[ch_idx1], exp_re, tmp_re_fx, exp_tmp1, &exp_re ); pred_out_re_fx[ch_idx1] = L_shl( pred_out_re_fx[ch_idx1], exp_re - 25 ); pred_out_im_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( pred_out_im_fx[ch_idx1], exp_im, tmp_im_fx, exp_tmp2, &exp_im ); pred_out_im_fx[ch_idx1] = L_shl( pred_out_im_fx[ch_idx1], exp_im - 25 ); #else tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_re_fx[0][ch_idx1] ); tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_im_fx[0][ch_idx1] ); out64_re = W_sub( tmp_re_fx64, tmp_im_fx64 ); tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_im_fx[0][ch_idx1] ); tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_re_fx[0][ch_idx1] ); out64_im = W_add( tmp_re_fx64, tmp_im_fx64 ); move64(); move64(); move64(); move64(); move64(); move64(); tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_re_fx[1][ch_idx1] ); tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_im_fx[1][ch_idx1] ); out64_re = W_add( out64_re, W_sub( tmp_re_fx64, tmp_im_fx64 ) ); tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_im_fx[1][ch_idx1] ); tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_re_fx[1][ch_idx1] ); out64_im = W_add( out64_im, W_add( tmp_re_fx64, tmp_im_fx64 ) ); move64(); move64(); move64(); move64(); move64(); move64(); shift64 = s_min( shift64, s_min( W_norm( out64_im ), W_norm( out64_re ) ) ); pred_out_re_fx64[ch_idx1][index_slot][b2] = out64_re; pred_out_im_fx64[ch_idx1][index_slot][b2] = out64_im; move16(); move64(); move64(); #endif } #ifndef FIX_1372_ISAR_POST_REND FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG Cldfb_RealBuffer_Recons_Binaural[pos_idx][ch_idx1][index_slot][b2] = pred_out_re[ch_idx1]; Cldfb_ImagBuffer_Recons_Binaural[pos_idx][ch_idx1][index_slot][b2] = pred_out_im[ch_idx1]; #else Cldfb_RealBuffer_Ref_Binaural_fx[ch_idx1][index_slot][b2] = pred_out_re_fx[ch_idx1]; Cldfb_ImagBuffer_Ref_Binaural_fx[ch_idx1][index_slot][b2] = pred_out_im_fx[ch_idx1]; } #endif } } } #ifdef FIX_1372_ISAR_POST_REND FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) { FOR( b2 = pBand_grouping[0]; b2 < pBand_grouping[num_md_bands]; b2++ ) { Cldfb_RealBuffer_Ref_Binaural_fx[ch_idx1][slot_idx][b2] = W_extract_h( W_shl( pred_out_re_fx64[ch_idx1][slot_idx][b2], shift64 ) ); Cldfb_ImagBuffer_Ref_Binaural_fx[ch_idx1][slot_idx][b2] = W_extract_h( W_shl( pred_out_im_fx64[ch_idx1][slot_idx][b2], shift64 ) ); move32(); move32(); } } } *Q_in = sub( add( *Q_in, shift64 ), Q6 ); move16(); #endif } #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) #else pos_idx = 0; #endif { FOR( b = 0; b < num_md_bands; b++ ) { Loading @@ -1947,43 +1952,6 @@ void isar_SplitRenderer_PostRenderer( } } hBinPostRenderer->cf_flag = 1; #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG { int16_t num_cldfb_bands; num_cldfb_bands = CLDFB_NO_CHANNELS_MAX; for ( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) { index_slot = sf_idx * num_slots + slot_idx; for ( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { mvr2r( Cldfb_RealBuffer_Recons_Binaural[MAX_HEAD_ROT_POSES - 1][ch_idx1][index_slot], Cldfb_RealBuffer_Ref_Binaural[ch_idx1][index_slot], num_cldfb_bands ); mvr2r( Cldfb_ImagBuffer_Recons_Binaural[MAX_HEAD_ROT_POSES - 1][ch_idx1][index_slot], Cldfb_ImagBuffer_Ref_Binaural[ch_idx1][index_slot], num_cldfb_bands ); } } for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { char fname[200] = "recons_out_pos"; char tag[2]; tag[0] = (char) ( '0' + pos_idx ); tag[1] = '\0'; strcat( fname, tag ); strcat( fname, ".wav" ); isar_log_cldfb2wav_data( Cldfb_RealBuffer_Recons_Binaural[pos_idx], Cldfb_ImagBuffer_Recons_Binaural[pos_idx], hBinPostRenderer->cldfbSynReconsBinDec[pos_idx], BINAURAL_CHANNELS, num_cldfb_bands, 48000, num_slots, sf_idx * num_slots, fname ); } } #endif pop_wmops(); return; } Loading @@ -2004,7 +1972,8 @@ static void isar_rend_CldfbSplitPostRendProcessTdIn( Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; num_cldfb_bands = hBinHrSplitPostRend->cldfbSyn[0]->no_channels; Word16 Q_output = 11; Word16 Q_output = Q11; Word16 Q_in = Q6; /* Implement CLDFB analysis */ FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) Loading @@ -2022,7 +1991,11 @@ static void isar_rend_CldfbSplitPostRendProcessTdIn( } } #ifndef FIX_1372_ISAR_POST_REND isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost ); #else isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost, &Q_in ); #endif /* Implement CLDFB synthesis */ FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) Loading @@ -2044,7 +2017,11 @@ static void isar_rend_CldfbSplitPostRendProcessTdIn( Scale_sig32( RealBuffer_fx[slot_idx], CLDFB_NO_CHANNELS_MAX, scaleFactor ); Scale_sig32( ImagBuffer_fx[slot_idx], CLDFB_NO_CHANNELS_MAX, scaleFactor ); } #ifndef FIX_1372_ISAR_POST_REND Q_cldfb = add( scaleFactor, sub( Q_output, Q5 ) ); #else Q_cldfb = add( scaleFactor, Q_in ); #endif Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( sub( Q_cldfb, 1 ), Q11 ) ); cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1 Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( Q11, sub( Q_cldfb, 1 ) ) ); Loading Loading @@ -2082,7 +2059,11 @@ void isar_rend_CldfbSplitPostRendProcess( return; } #ifndef FIX_1372_ISAR_POST_REND isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost ); #else isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost, &Q_cldfb_in ); #endif /* Implement CLDFB synthesis */ FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) Loading lib_isar/isar_splitRendererPre.c +2 −2 Original line number Diff line number Diff line Loading @@ -2780,7 +2780,7 @@ ivas_error isar_splitBinPreRendOpen( { for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { if ( ( error = openCldfb( &( hBinRend->cldfbSynRotBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) if ( ( error = openCldfb_ivas_fx( &( hBinRend->cldfbSynRotBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } Loading Loading @@ -2836,7 +2836,7 @@ void isar_splitBinPreRendClose( { IF( ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] != NULL ) { deleteCldfb( &( ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] ) ); deleteCldfb_ivas_fx( &( ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] ) ); ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] = NULL; } } Loading lib_isar/lib_isar_pre_rend.c +2 −2 Original line number Diff line number Diff line Loading @@ -247,7 +247,7 @@ void ISAR_PRE_REND_close( { IF( hSplitBinRend->hCldfbHandles->cldfbAna[ch] != NULL ) { deleteCldfb( &hSplitBinRend->hCldfbHandles->cldfbAna[ch] ); deleteCldfb_ivas_fx( &hSplitBinRend->hCldfbHandles->cldfbAna[ch] ); hSplitBinRend->hCldfbHandles->cldfbAna[ch] = NULL; } } Loading @@ -257,7 +257,7 @@ void ISAR_PRE_REND_close( { IF( hSplitBinRend->hCldfbHandles->cldfbSyn[ch] != NULL ) { deleteCldfb( &hSplitBinRend->hCldfbHandles->cldfbSyn[ch] ); deleteCldfb_ivas_fx( &hSplitBinRend->hCldfbHandles->cldfbSyn[ch] ); hSplitBinRend->hCldfbHandles->cldfbSyn[ch] = NULL; } } Loading Loading
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ #ifdef SPLIT_REND_WITH_HEAD_ROT #define SPLIT_REND_POSE_CORRECTION_UNUSED_BITS #define ISAR_BITSTREAM_UPDATE_LC3PLUS /* FhG: Multiple improvements to the ISAR bitstream when LC3plus is used. See MR 1456 for details. */ #define FIX_1372_ISAR_POST_REND #endif #define NONBE_FIX_855_JBM_FLUSH_OFFSET /* FhG: issue #855: add missing switch here for the code in JBM flushing */ #define FIX_923_EXTERNAL_REND_COMMAND_LINE /* VA: issue 923: enable external renderer command-line options in UPPER case letters */ Loading
lib_isar/isar_prot.h +10 −0 Original line number Diff line number Diff line Loading @@ -118,12 +118,22 @@ void isar_log_cldfb2wav_data( const char *filename ); #endif #ifndef FIX_1372_ISAR_POST_REND void isar_SplitRenderer_PostRenderer( ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ const IVAS_QUATERNION Quaternion_act ); #else void isar_SplitRenderer_PostRenderer( ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ const IVAS_QUATERNION Quaternion_act, Word16 *Q_in ); #endif void isar_splitBinLCLDDecProcess( ISAR_BIN_HR_SPLIT_LCLD_DEC_HANDLE hSplitBinLCLDDec, Loading
lib_isar/isar_splitRendererPost.c +92 −111 Original line number Diff line number Diff line Loading @@ -101,7 +101,7 @@ ivas_error isar_splitBinPostRendOpen( { for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { if ( ( error = openCldfb( &( hBinRend->cldfbSynReconsBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) if ( ( error = openCldfb_ivas_fx( &( hBinRend->cldfbSynReconsBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) { return error; } Loading Loading @@ -150,7 +150,7 @@ void isar_splitBinPostRendClose( { if ( ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] != NULL ) { deleteCldfb( &( ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] ) ); deleteCldfb_ivas_fx( &( ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] ) ); ( *hBinHrSplitPostRend )->cldfbSynReconsBinDec[i][ch] = NULL; } } Loading Loading @@ -1737,30 +1737,41 @@ static void interpolate_rend_md_fx( * * *-----------------------------------------------------------------------------------------*/ #ifndef FIX_1372_ISAR_POST_REND void isar_SplitRenderer_PostRenderer( ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ const IVAS_QUATERNION Quaternion_act ) #else void isar_SplitRenderer_PostRenderer( ISAR_BIN_HR_SPLIT_POST_REND_HANDLE hBinPostRenderer, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, Word32 Cldfb_RealBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ Word32 Cldfb_ImagBuffer_Ref_Binaural_fx[][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o : Reference/out Binaural signals */ const IVAS_QUATERNION Quaternion_act, Word16 *Q_in ) #endif { int16_t pos_idx, b, brange[2], ch_idx1; int16_t num_md_bands, slot_idx, b2, index_slot, num_slots, sf_idx_md; Word32 pred_out_re_fx[BINAURAL_CHANNELS], pred_out_im_fx[BINAURAL_CHANNELS], tmp_re_fx, tmp_im_fx, gd_int_fx; #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG ISAR_BIN_HR_SPLIT_REND_MD rot_md_act[MAX_HEAD_ROT_POSES][MAX_SPLIT_REND_MD_BANDS]; Word32 gd_int_fx; #ifndef FIX_1372_ISAR_POST_REND Word32 pred_out_re_fx[BINAURAL_CHANNELS], pred_out_im_fx[BINAURAL_CHANNELS]; Word32 tmp_re_fx, tmp_im_fx; Word16 exp_tmp1, exp_tmp2; #else ISAR_BIN_HR_SPLIT_REND_MD rot_md_act[1][MAX_SPLIT_REND_MD_BANDS]; Word64 pred_out_re_fx64[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], pred_out_im_fx64[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; Word64 tmp_re_fx64, tmp_im_fx64, out64_re, out64_im; Word16 shift64 = 63; #endif ISAR_BIN_HR_SPLIT_REND_MD rot_md_act[1][MAX_SPLIT_REND_MD_BANDS]; int16_t interp_yaw_pose_idx[2], interp_pitch_pose_idx[2], interp_roll_pose_idx[2]; Word32 interp_yaw_fact_fx, interp_pitch_fact_fx, interp_roll_fact_fx; Word16 Q_yaw = Q31, Q_pitch = Q31, Q_roll = Q31; Word32 mix_mat_re_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; Word32 mix_mat_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG float Cldfb_RealBuffer_Recons_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Recons_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; #endif Word16 fade_fx; Word32 *pMix_mat_re_prev_fx[BINAURAL_CHANNELS]; Word32 *pMix_mat_im_prev_fx[BINAURAL_CHANNELS]; Loading @@ -1771,12 +1782,7 @@ void isar_SplitRenderer_PostRenderer( push_wmops( "isar_SplitRenderer_PostRenderer" ); num_slots = MAX_PARAM_SPATIAL_SUBFRAMES; #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG pos_idx = MAX_HEAD_ROT_POSES - 1; #else pos_idx = 0; #endif sf_idx_md = 0; get_interpolation_vars( pMultiBinPoseData, &hBinPostRenderer->QuaternionsPre[sf_idx_md], &Quaternion_act, interp_yaw_pose_idx, interp_pitch_pose_idx, interp_roll_pose_idx, &interp_yaw_fact_fx, &interp_pitch_fact_fx, &interp_roll_fact_fx, &Q_yaw, &Q_pitch, &Q_roll ); Loading Loading @@ -1808,50 +1814,7 @@ void isar_SplitRenderer_PostRenderer( } } #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES - 1; pos_idx++ ) { for ( b = 0; b < num_md_bands; b++ ) { if ( hBinPostRenderer->pose_type[pos_idx] == PITCH_ONLY ) { for ( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { set_zero( hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[ch_idx1], BINAURAL_CHANNELS ); set_zero( hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_im[ch_idx1], BINAURAL_CHANNELS ); hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[ch_idx1][ch_idx1] = 1.0f; } hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[0][0] *= hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd; hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[1][1] *= hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd2; hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd = 0.0f; } else if ( hBinPostRenderer->pose_type[pos_idx] == ANY_ROLL ) { hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd = 0.0f; } for ( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { /*update the prediction matrix with interpolated matrix*/ rot_md_act[pos_idx][b].pred_mat_re[ch_idx1][0] = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[ch_idx1][0]; rot_md_act[pos_idx][b].pred_mat_re[ch_idx1][1] = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_re[ch_idx1][1]; rot_md_act[pos_idx][b].pred_mat_im[ch_idx1][0] = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_im[ch_idx1][0]; rot_md_act[pos_idx][b].pred_mat_im[ch_idx1][1] = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].pred_mat_im[ch_idx1][1]; rot_md_act[pos_idx][b].gd = hBinPostRenderer->rot_md[pos_idx][sf_idx][b].gd; } } } #endif #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) #else pos_idx = 0; #endif { FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) { Loading Loading @@ -1887,15 +1850,13 @@ void isar_SplitRenderer_PostRenderer( brange[0] = pBand_grouping[b]; brange[1] = pBand_grouping[b + 1]; Word16 exp_tmp1, exp_tmp2; FOR( b2 = brange[0]; b2 < brange[1]; b2++ ) { FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { /* Apply prediction matrix */ #ifndef FIX_1372_ISAR_POST_REND ivas_cmult_fix( Cldfb_RealBuffer_Ref_Binaural_fx[0][index_slot][b2], 25, Cldfb_ImagBuffer_Ref_Binaural_fx[0][index_slot][b2], 25, mix_mat_re_fx[0][ch_idx1], 6, mix_mat_im_fx[0][ch_idx1], 6, &tmp_re_fx, &tmp_im_fx, &exp_tmp1, &exp_tmp2 ); // tmp_re_fx = L_shl(tmp_re_fx, sub(exp_tmp1, 6)); //Q25 // tmp_im_fx = L_shl(tmp_im_fx, sub(exp_tmp1, 6)); //Q25 pred_out_re_fx[ch_idx1] = tmp_re_fx; pred_out_im_fx[ch_idx1] = tmp_im_fx; Loading @@ -1903,36 +1864,80 @@ void isar_SplitRenderer_PostRenderer( Word16 exp_im = exp_tmp2; ivas_cmult_fix( Cldfb_RealBuffer_Ref_Binaural_fx[1][index_slot][b2], 25, Cldfb_ImagBuffer_Ref_Binaural_fx[1][index_slot][b2], 25, mix_mat_re_fx[1][ch_idx1], 6, mix_mat_im_fx[1][ch_idx1], 6, &tmp_re_fx, &tmp_im_fx, &exp_tmp1, &exp_tmp2 ); // tmp_re_fx = L_shl(tmp_re_fx, sub(exp_tmp1, 6)); //Q25 // tmp_im_fx = L_shl(tmp_im_fx, sub(exp_tmp1, 6)); //Q25 pred_out_re_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( pred_out_re_fx[ch_idx1], exp_re, tmp_re_fx, exp_tmp1, &exp_re ); pred_out_re_fx[ch_idx1] = L_shl( pred_out_re_fx[ch_idx1], exp_re - 25 ); pred_out_im_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( pred_out_im_fx[ch_idx1], exp_im, tmp_im_fx, exp_tmp2, &exp_im ); pred_out_im_fx[ch_idx1] = L_shl( pred_out_im_fx[ch_idx1], exp_im - 25 ); #else tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_re_fx[0][ch_idx1] ); tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_im_fx[0][ch_idx1] ); out64_re = W_sub( tmp_re_fx64, tmp_im_fx64 ); tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_im_fx[0][ch_idx1] ); tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[0][index_slot][b2], mix_mat_re_fx[0][ch_idx1] ); out64_im = W_add( tmp_re_fx64, tmp_im_fx64 ); move64(); move64(); move64(); move64(); move64(); move64(); tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_re_fx[1][ch_idx1] ); tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_im_fx[1][ch_idx1] ); out64_re = W_add( out64_re, W_sub( tmp_re_fx64, tmp_im_fx64 ) ); tmp_re_fx64 = W_mult_32_32( Cldfb_RealBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_im_fx[1][ch_idx1] ); tmp_im_fx64 = W_mult_32_32( Cldfb_ImagBuffer_Ref_Binaural_fx[1][index_slot][b2], mix_mat_re_fx[1][ch_idx1] ); out64_im = W_add( out64_im, W_add( tmp_re_fx64, tmp_im_fx64 ) ); move64(); move64(); move64(); move64(); move64(); move64(); shift64 = s_min( shift64, s_min( W_norm( out64_im ), W_norm( out64_re ) ) ); pred_out_re_fx64[ch_idx1][index_slot][b2] = out64_re; pred_out_im_fx64[ch_idx1][index_slot][b2] = out64_im; move16(); move64(); move64(); #endif } #ifndef FIX_1372_ISAR_POST_REND FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG Cldfb_RealBuffer_Recons_Binaural[pos_idx][ch_idx1][index_slot][b2] = pred_out_re[ch_idx1]; Cldfb_ImagBuffer_Recons_Binaural[pos_idx][ch_idx1][index_slot][b2] = pred_out_im[ch_idx1]; #else Cldfb_RealBuffer_Ref_Binaural_fx[ch_idx1][index_slot][b2] = pred_out_re_fx[ch_idx1]; Cldfb_ImagBuffer_Ref_Binaural_fx[ch_idx1][index_slot][b2] = pred_out_im_fx[ch_idx1]; } #endif } } } #ifdef FIX_1372_ISAR_POST_REND FOR( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { FOR( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) { FOR( b2 = pBand_grouping[0]; b2 < pBand_grouping[num_md_bands]; b2++ ) { Cldfb_RealBuffer_Ref_Binaural_fx[ch_idx1][slot_idx][b2] = W_extract_h( W_shl( pred_out_re_fx64[ch_idx1][slot_idx][b2], shift64 ) ); Cldfb_ImagBuffer_Ref_Binaural_fx[ch_idx1][slot_idx][b2] = W_extract_h( W_shl( pred_out_im_fx64[ch_idx1][slot_idx][b2], shift64 ) ); move32(); move32(); } } } *Q_in = sub( add( *Q_in, shift64 ), Q6 ); move16(); #endif } #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) #else pos_idx = 0; #endif { FOR( b = 0; b < num_md_bands; b++ ) { Loading @@ -1947,43 +1952,6 @@ void isar_SplitRenderer_PostRenderer( } } hBinPostRenderer->cf_flag = 1; #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG { int16_t num_cldfb_bands; num_cldfb_bands = CLDFB_NO_CHANNELS_MAX; for ( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) { index_slot = sf_idx * num_slots + slot_idx; for ( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { mvr2r( Cldfb_RealBuffer_Recons_Binaural[MAX_HEAD_ROT_POSES - 1][ch_idx1][index_slot], Cldfb_RealBuffer_Ref_Binaural[ch_idx1][index_slot], num_cldfb_bands ); mvr2r( Cldfb_ImagBuffer_Recons_Binaural[MAX_HEAD_ROT_POSES - 1][ch_idx1][index_slot], Cldfb_ImagBuffer_Ref_Binaural[ch_idx1][index_slot], num_cldfb_bands ); } } for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { char fname[200] = "recons_out_pos"; char tag[2]; tag[0] = (char) ( '0' + pos_idx ); tag[1] = '\0'; strcat( fname, tag ); strcat( fname, ".wav" ); isar_log_cldfb2wav_data( Cldfb_RealBuffer_Recons_Binaural[pos_idx], Cldfb_ImagBuffer_Recons_Binaural[pos_idx], hBinPostRenderer->cldfbSynReconsBinDec[pos_idx], BINAURAL_CHANNELS, num_cldfb_bands, 48000, num_slots, sf_idx * num_slots, fname ); } } #endif pop_wmops(); return; } Loading @@ -2004,7 +1972,8 @@ static void isar_rend_CldfbSplitPostRendProcessTdIn( Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; num_cldfb_bands = hBinHrSplitPostRend->cldfbSyn[0]->no_channels; Word16 Q_output = 11; Word16 Q_output = Q11; Word16 Q_in = Q6; /* Implement CLDFB analysis */ FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) Loading @@ -2022,7 +1991,11 @@ static void isar_rend_CldfbSplitPostRendProcessTdIn( } } #ifndef FIX_1372_ISAR_POST_REND isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost ); #else isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost, &Q_in ); #endif /* Implement CLDFB synthesis */ FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) Loading @@ -2044,7 +2017,11 @@ static void isar_rend_CldfbSplitPostRendProcessTdIn( Scale_sig32( RealBuffer_fx[slot_idx], CLDFB_NO_CHANNELS_MAX, scaleFactor ); Scale_sig32( ImagBuffer_fx[slot_idx], CLDFB_NO_CHANNELS_MAX, scaleFactor ); } #ifndef FIX_1372_ISAR_POST_REND Q_cldfb = add( scaleFactor, sub( Q_output, Q5 ) ); #else Q_cldfb = add( scaleFactor, Q_in ); #endif Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( sub( Q_cldfb, 1 ), Q11 ) ); cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1 Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( Q11, sub( Q_cldfb, 1 ) ) ); Loading Loading @@ -2082,7 +2059,11 @@ void isar_rend_CldfbSplitPostRendProcess( return; } #ifndef FIX_1372_ISAR_POST_REND isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost ); #else isar_SplitRenderer_PostRenderer( hBinHrSplitPostRend, pMultiBinPoseData, Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, QuaternionPost, &Q_cldfb_in ); #endif /* Implement CLDFB synthesis */ FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) Loading
lib_isar/isar_splitRendererPre.c +2 −2 Original line number Diff line number Diff line Loading @@ -2780,7 +2780,7 @@ ivas_error isar_splitBinPreRendOpen( { for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { if ( ( error = openCldfb( &( hBinRend->cldfbSynRotBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) if ( ( error = openCldfb_ivas_fx( &( hBinRend->cldfbSynRotBinDec[i][ch] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } Loading Loading @@ -2836,7 +2836,7 @@ void isar_splitBinPreRendClose( { IF( ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] != NULL ) { deleteCldfb( &( ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] ) ); deleteCldfb_ivas_fx( &( ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] ) ); ( *hBinHrSplitPreRend )->cldfbSynRotBinDec[i][n] = NULL; } } Loading
lib_isar/lib_isar_pre_rend.c +2 −2 Original line number Diff line number Diff line Loading @@ -247,7 +247,7 @@ void ISAR_PRE_REND_close( { IF( hSplitBinRend->hCldfbHandles->cldfbAna[ch] != NULL ) { deleteCldfb( &hSplitBinRend->hCldfbHandles->cldfbAna[ch] ); deleteCldfb_ivas_fx( &hSplitBinRend->hCldfbHandles->cldfbAna[ch] ); hSplitBinRend->hCldfbHandles->cldfbAna[ch] = NULL; } } Loading @@ -257,7 +257,7 @@ void ISAR_PRE_REND_close( { IF( hSplitBinRend->hCldfbHandles->cldfbSyn[ch] != NULL ) { deleteCldfb( &hSplitBinRend->hCldfbHandles->cldfbSyn[ch] ); deleteCldfb_ivas_fx( &hSplitBinRend->hCldfbHandles->cldfbSyn[ch] ); hSplitBinRend->hCldfbHandles->cldfbSyn[ch] = NULL; } } Loading