Loading lib_dec/ivas_mc_param_dec.c +204 −91 Original line number Diff line number Diff line Loading @@ -1332,6 +1332,9 @@ void ivas_param_mc_dec_digest_tc( { PARAM_MC_DEC_HANDLE hParamMC; int16_t ch; #ifdef FIX_835_PARAMMC_BUFFER_VALUES int16_t is_next_band, skip_next_band; #endif int16_t slot_idx; int16_t nchan_transport; Loading @@ -1339,8 +1342,16 @@ void ivas_param_mc_dec_digest_tc( int16_t nchan_out_transport, nchan_out_cldfb, i, param_band_idx; int16_t nchan_out_cov; /*CLDFB*/ #ifdef FIX_835_PARAMMC_BUFFER_VALUES float *pCx, *pCx_imag; float cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; float cx_imag[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; float cx_next_band[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; float cx_imag_next_band[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; #else 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]; #endif float real_part, imag_part; /* format converter */ int16_t channel_active[MAX_OUTPUT_CHANNELS]; Loading Loading @@ -1402,11 +1413,25 @@ void ivas_param_mc_dec_digest_tc( ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES /* loop over two bands at a time */ for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) { /* don't process next band if it exceeds the limit */ skip_next_band = ( ( param_band_idx + 1 ) == hParamMC->num_param_bands_synth ) ? 1 : 0; set_zero( cx, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_imag, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_imag_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); #else 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 ); } #endif #endif /* slot loop for gathering the input data */ Loading @@ -1414,6 +1439,10 @@ void ivas_param_mc_dec_digest_tc( { if ( st_ivas->hDecoderConfig->Opt_tsm ) { #if defined( FIX_835_PARAMMC_BUFFER_VALUES ) && !defined( OBJ_EDITING_API ) if ( param_band_idx == 0 ) /* only run cldfbAna once */ { #endif float RealBuffer[CLDFB_NO_CHANNELS_MAX]; float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; Loading @@ -1425,32 +1454,84 @@ void ivas_param_mc_dec_digest_tc( 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 defined( FIX_835_PARAMMC_BUFFER_VALUES ) && !defined( OBJ_EDITING_API ) } #endif } #ifndef OBJ_EDITING_API if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { 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 ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #endif 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], #ifdef FIX_835_PARAMMC_BUFFER_VALUES is_next_band ? cx_next_band : cx, is_next_band ? cx_imag_next_band : cx_imag, param_band_idx + is_next_band, #else cx, cx_imag, #endif hParamMC, nchan_transport ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES } #endif } #endif } #ifndef OBJ_EDITING_API /* map from complex input covariance to real values */ #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #else for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) { #endif /* Cx for transport channels */ #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx = is_next_band ? &cx_next_band[0] : &cx[0]; pCx_imag = is_next_band ? &cx_imag_next_band[0] : &cx_imag[0]; #endif for ( i = 0; i < nchan_transport * nchan_transport; i++ ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES real_part = pCx[i]; imag_part = pCx_imag[i]; #else real_part = cx[param_band_idx][i]; imag_part = cx_imag[param_band_idx][i]; #endif /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ if ( param_band_idx < hParamMC->max_param_band_abs_cov ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx[i] = sqrtf( real_part * real_part + imag_part * imag_part ); #else cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); #endif } else { #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx[i] = real_part; #else cx[param_band_idx][i] = real_part; #endif } } } Loading @@ -1458,16 +1539,45 @@ void ivas_param_mc_dec_digest_tc( /* 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 ) ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES v_add( cx, cx_next_band, cx, nchan_transport * nchan_transport ); mvr2r( cx, cx_next_band, nchan_transport * nchan_transport ); #else 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 ); } #endif } #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #endif /* 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 ); ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, #ifdef FIX_835_PARAMMC_BUFFER_VALUES is_next_band ? cx_next_band : cx, param_band_idx + is_next_band, #else cx, #endif 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 ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES } } #endif #endif pop_wmops(); Loading Loading @@ -1562,6 +1672,7 @@ void ivas_param_mc_dec_prepare_renderer( ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES /* loop over two bands at a time */ for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) Loading @@ -1573,133 +1684,134 @@ void ivas_param_mc_dec_prepare_renderer( set_zero( cx_imag, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_imag_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); #else 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 ); } #endif /* slot loop for gathering the input data */ for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) { if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #endif 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], #ifdef FIX_835_PARAMMC_BUFFER_VALUES is_next_band ? cx_next_band : cx, is_next_band ? cx_imag_next_band : cx_imag, param_band_idx + is_next_band, #else cx, cx_imag, #endif hParamMC, nchan_transport ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES } #endif } } /* map from complex input covariance to real values */ #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #else for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) { #endif /* Cx for transport channels */ #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx = is_next_band ? &cx_next_band[0] : &cx[0]; pCx_imag = is_next_band ? &cx_imag_next_band[0] : &cx_imag[0]; #endif for ( i = 0; i < nchan_transport * nchan_transport; i++ ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES real_part = pCx[i]; imag_part = pCx_imag[i]; #else real_part = cx[param_band_idx][i]; imag_part = cx_imag[param_band_idx][i]; #endif /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ if ( param_band_idx < hParamMC->max_param_band_abs_cov ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx[i] = sqrtf( real_part * real_part + imag_part * imag_part ); #else cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); #endif } else { #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx[i] = real_part; #else cx[param_band_idx][i] = real_part; #endif } } } /* 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 ) ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES v_add( cx, cx_next_band, cx, nchan_transport * nchan_transport ); mvr2r( cx, cx_next_band, nchan_transport * nchan_transport ); #else 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 ); } #endif } #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #endif /* generate mixing matrices */ ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, #ifdef FIX_835_PARAMMC_BUFFER_VALUES is_next_band ? cx_next_band : cx, param_band_idx + is_next_band, #else cx, #endif 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 ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES } } #else 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 ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { 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 ); } } /* 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 ); } } /* 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 ); #endif pop_wmops(); Loading @@ -1708,6 +1820,7 @@ void ivas_param_mc_dec_prepare_renderer( } #endif /*------------------------------------------------------------------------- * ivas_param_mc_dec_render() * Loading Loading
lib_dec/ivas_mc_param_dec.c +204 −91 Original line number Diff line number Diff line Loading @@ -1332,6 +1332,9 @@ void ivas_param_mc_dec_digest_tc( { PARAM_MC_DEC_HANDLE hParamMC; int16_t ch; #ifdef FIX_835_PARAMMC_BUFFER_VALUES int16_t is_next_band, skip_next_band; #endif int16_t slot_idx; int16_t nchan_transport; Loading @@ -1339,8 +1342,16 @@ void ivas_param_mc_dec_digest_tc( int16_t nchan_out_transport, nchan_out_cldfb, i, param_band_idx; int16_t nchan_out_cov; /*CLDFB*/ #ifdef FIX_835_PARAMMC_BUFFER_VALUES float *pCx, *pCx_imag; float cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; float cx_imag[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; float cx_next_band[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; float cx_imag_next_band[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; #else 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]; #endif float real_part, imag_part; /* format converter */ int16_t channel_active[MAX_OUTPUT_CHANNELS]; Loading Loading @@ -1402,11 +1413,25 @@ void ivas_param_mc_dec_digest_tc( ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES /* loop over two bands at a time */ for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) { /* don't process next band if it exceeds the limit */ skip_next_band = ( ( param_band_idx + 1 ) == hParamMC->num_param_bands_synth ) ? 1 : 0; set_zero( cx, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_imag, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_imag_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); #else 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 ); } #endif #endif /* slot loop for gathering the input data */ Loading @@ -1414,6 +1439,10 @@ void ivas_param_mc_dec_digest_tc( { if ( st_ivas->hDecoderConfig->Opt_tsm ) { #if defined( FIX_835_PARAMMC_BUFFER_VALUES ) && !defined( OBJ_EDITING_API ) if ( param_band_idx == 0 ) /* only run cldfbAna once */ { #endif float RealBuffer[CLDFB_NO_CHANNELS_MAX]; float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; Loading @@ -1425,32 +1454,84 @@ void ivas_param_mc_dec_digest_tc( 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 defined( FIX_835_PARAMMC_BUFFER_VALUES ) && !defined( OBJ_EDITING_API ) } #endif } #ifndef OBJ_EDITING_API if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { 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 ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #endif 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], #ifdef FIX_835_PARAMMC_BUFFER_VALUES is_next_band ? cx_next_band : cx, is_next_band ? cx_imag_next_band : cx_imag, param_band_idx + is_next_band, #else cx, cx_imag, #endif hParamMC, nchan_transport ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES } #endif } #endif } #ifndef OBJ_EDITING_API /* map from complex input covariance to real values */ #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #else for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) { #endif /* Cx for transport channels */ #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx = is_next_band ? &cx_next_band[0] : &cx[0]; pCx_imag = is_next_band ? &cx_imag_next_band[0] : &cx_imag[0]; #endif for ( i = 0; i < nchan_transport * nchan_transport; i++ ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES real_part = pCx[i]; imag_part = pCx_imag[i]; #else real_part = cx[param_band_idx][i]; imag_part = cx_imag[param_band_idx][i]; #endif /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ if ( param_band_idx < hParamMC->max_param_band_abs_cov ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx[i] = sqrtf( real_part * real_part + imag_part * imag_part ); #else cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); #endif } else { #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx[i] = real_part; #else cx[param_band_idx][i] = real_part; #endif } } } Loading @@ -1458,16 +1539,45 @@ void ivas_param_mc_dec_digest_tc( /* 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 ) ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES v_add( cx, cx_next_band, cx, nchan_transport * nchan_transport ); mvr2r( cx, cx_next_band, nchan_transport * nchan_transport ); #else 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 ); } #endif } #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #endif /* 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 ); ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, #ifdef FIX_835_PARAMMC_BUFFER_VALUES is_next_band ? cx_next_band : cx, param_band_idx + is_next_band, #else cx, #endif 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 ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES } } #endif #endif pop_wmops(); Loading Loading @@ -1562,6 +1672,7 @@ void ivas_param_mc_dec_prepare_renderer( ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES /* loop over two bands at a time */ for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) Loading @@ -1573,133 +1684,134 @@ void ivas_param_mc_dec_prepare_renderer( set_zero( cx_imag, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero( cx_imag_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); #else 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 ); } #endif /* slot loop for gathering the input data */ for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) { if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #endif 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], #ifdef FIX_835_PARAMMC_BUFFER_VALUES is_next_band ? cx_next_band : cx, is_next_band ? cx_imag_next_band : cx_imag, param_band_idx + is_next_band, #else cx, cx_imag, #endif hParamMC, nchan_transport ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES } #endif } } /* map from complex input covariance to real values */ #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #else for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) { #endif /* Cx for transport channels */ #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx = is_next_band ? &cx_next_band[0] : &cx[0]; pCx_imag = is_next_band ? &cx_imag_next_band[0] : &cx_imag[0]; #endif for ( i = 0; i < nchan_transport * nchan_transport; i++ ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES real_part = pCx[i]; imag_part = pCx_imag[i]; #else real_part = cx[param_band_idx][i]; imag_part = cx_imag[param_band_idx][i]; #endif /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ if ( param_band_idx < hParamMC->max_param_band_abs_cov ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx[i] = sqrtf( real_part * real_part + imag_part * imag_part ); #else cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); #endif } else { #ifdef FIX_835_PARAMMC_BUFFER_VALUES pCx[i] = real_part; #else cx[param_band_idx][i] = real_part; #endif } } } /* 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 ) ) { #ifdef FIX_835_PARAMMC_BUFFER_VALUES v_add( cx, cx_next_band, cx, nchan_transport * nchan_transport ); mvr2r( cx, cx_next_band, nchan_transport * nchan_transport ); #else 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 ); } #endif } #ifdef FIX_835_PARAMMC_BUFFER_VALUES for ( is_next_band = 0; is_next_band < 2; is_next_band++ ) { if ( is_next_band && skip_next_band ) { continue; } #endif /* generate mixing matrices */ ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, #ifdef FIX_835_PARAMMC_BUFFER_VALUES is_next_band ? cx_next_band : cx, param_band_idx + is_next_band, #else cx, #endif 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 ); #ifdef FIX_835_PARAMMC_BUFFER_VALUES } } #else 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 ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { 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 ); } } /* 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 ); } } /* 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 ); #endif pop_wmops(); Loading @@ -1708,6 +1820,7 @@ void ivas_param_mc_dec_prepare_renderer( } #endif /*------------------------------------------------------------------------- * ivas_param_mc_dec_render() * Loading