Loading lib_com/ivas_prot_fx.h +15 −0 Original line number Diff line number Diff line Loading @@ -692,4 +692,19 @@ Word16 ivas_jbm_dec_get_render_granularity( const MC_MODE mc_mode, /* i : MC mode */ const Word32 output_Fs /* i : sampling rate */ ); // ivas_stereo_dft_com.c void stereo_dft_config_fx( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const Word32 brate, /* i : IVAS/CPE/nominal total bitrate */ Word16 *bits_frame_nominal, /* o : primary channel nominal bits per frame */ Word16 *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame*/ ); Word16 stereo_dft_band_config_fx( Word16 *band_limits, /* o : DFT band limits */ const Word16 band_res, /* i : DFT band resolution */ const Word16 NFFT, /* i : analysis/synthesis window length */ const Word16 enc_dec /* i : flag to indicate enc vs dec */ ); #endif No newline at end of file lib_com/ivas_stereo_dft_com.c +223 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,229 @@ #include "prot.h" #include "cnst.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * stereo_dft_config() * * DFT Stereo Configuration function *------------------------------------------------------------------------*/ void stereo_dft_config_fx( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const Word32 brate, /* i : IVAS/CPE/nominal total bitrate */ Word16 *bits_frame_nominal, /* o : primary channel nominal bits per frame */ Word16 *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame*/ ) { IF( hConfig != NULL ) { hConfig->band_res = STEREO_DFT_BAND_RES_HIGH; move16(); hConfig->prm_res = 2; move16(); hConfig->dmx_active = STEREO_DFT_DMX_ACTIVE; move16(); hConfig->ada_wb_res_cod_mode = 0; move16(); } *bits_frame_nominal_2 = 5000 / FRAMES_PER_SEC; move16(); /* ITD, IPD and residual coding is not used in SID/No data */ IF( EQ_32( brate, FRAME_NO_DATA ) ) { *bits_frame_nominal = FRAME_NO_DATA; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( EQ_32( brate, IVAS_SID_5k2 ) ) { *bits_frame_nominal = SID_2k40 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( LE_32( brate, IVAS_13k2 ) ) { *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( LE_32( brate, IVAS_16k4 ) ) { *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( LE_32( brate, IVAS_24k4 ) ) { *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( LE_32( brate, IVAS_32k ) ) { *bits_frame_nominal = ACELP_24k40 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->ada_wb_res_cod_mode = 1; move16(); hConfig->res_pred_mode = STEREO_DFT_RESPRED_STEFI; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_1kHz; move16(); } } ELSE IF( LE_32( brate, IVAS_48k ) ) { *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_STEFI; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_1_6kHz; move16(); } } ELSE { assert( 0 && "Bit-rate not supported by DFT stereo." ); } test(); IF( hConfig != NULL && hConfig->force_mono_transmission ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); hConfig->ada_wb_res_cod_mode = 0; move16(); } /*sanity check*/ IF( hConfig != NULL ) { assert( LE_16( hConfig->prm_res, STEREO_DFT_NBDIV ) ); /* make sure residual switching and ESF are not active at the same time */ assert( !( EQ_16( hConfig->ada_wb_res_cod_mode, 1 ) && EQ_16( hConfig->res_pred_mode, STEREO_DFT_RESPRED_ESF ) ) ); } return; } /*------------------------------------------------------------------------- * stereo_dft_band_config() * * Stereo DFT bands condfiguration *------------------------------------------------------------------------*/ Word16 stereo_dft_band_config_fx( Word16 *band_limits, /* o : DFT band limits */ const Word16 band_res, /* i : DFT band resolution */ const Word16 NFFT, /* i : analysis/synthesis window length */ const Word16 enc_dec /* i : flag to indicate enc vs dec */ ) { Word16 nbands; /*sanity check*/ assert( ( EQ_16( band_res, 1 ) || EQ_16( band_res, 0 ) || EQ_16( band_res, 2 ) ) && "stereo DFT: Parameter band resolution not supported!\n" ); band_limits[0] = 1; move16(); nbands = 0; move16(); WHILE( LT_16( band_limits[nbands++], shr( NFFT, 1 ) ) ) { IF( EQ_16( band_res, 0 ) ) { assert( 0 && "stereo DFT: band config failed!\n" ); } ELSE IF( EQ_16( band_res, 1 ) ) { IF( EQ_16( enc_dec, ENC ) ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB4_BANDS ) ) && "stereo DFT: band config failed!\n" ); } ELSE { IF( EQ_16( enc_dec, ENC ) ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB8_BANDS ) ) && "stereo DFT: band config failed!\n" ); } } nbands = sub( nbands, 1 ); band_limits[nbands] = shr( NFFT, 1 ); /*Nyquist Freq*/ move16(); return ( nbands ); } #endif /*------------------------------------------------------------------------- * stereo_dft_config() Loading lib_dec/ivas_cpe_dec.c +31 −2 Original line number Diff line number Diff line Loading @@ -42,6 +42,9 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #include <math.h> #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif /*--------------------------------------------------------------------------* Loading Loading @@ -165,6 +168,16 @@ ivas_error ivas_cpe_dec( { if ( st_ivas->hQMetaData != NULL && ivas_total_brate > IVAS_SID_5k2 ) { #ifdef IVAS_FLOAT_FIXED if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, Mpy_32_32(1503238554 /* 0.7f in Q31 */, L_mult0(st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC) ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } else { stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, L_mult0(st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } #else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, (int32_t) ( 0.7f * st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); Loading @@ -173,10 +186,21 @@ ivas_error ivas_cpe_dec( { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } #endif } else { /* Note: This only works for stereo operation. If DTX would be applied for multiple CPEs a different bitrate signaling is needed */ #ifdef IVAS_FLOAT_FIXED if ( ivas_total_brate <= IVAS_SID_5k2 ) { stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } else { stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } #else if ( ivas_total_brate <= IVAS_SID_5k2 ) { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); Loading @@ -185,6 +209,7 @@ ivas_error ivas_cpe_dec( { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } #endif } } Loading @@ -197,7 +222,11 @@ ivas_error ivas_cpe_dec( } else { #ifdef IVAS_FLOAT_FIXED stereo_dft_config_fx( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); #else stereo_dft_config( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); #endif } } Loading lib_dec/ivas_stereo_dft_dec.c +30 −6 Original line number Diff line number Diff line Loading @@ -292,7 +292,11 @@ ivas_error stereo_dft_dec_create( } else { #ifdef IVAS_FLOAT_FIXED stereo_dft_config_fx( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS ); #else stereo_dft_config( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS ); #endif } stereo_dft_dec_open( hStereoDft_loc, output_Fs, nchan_transport ); Loading Loading @@ -399,7 +403,11 @@ static void stereo_dft_dec_open( /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ set_s( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB ); #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); #endif hStereoDft->hb_stefi_delay = NS2SA( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); if ( nchan_transport > 2 ) Loading Loading @@ -1855,7 +1863,11 @@ void stereo_dft_dec( /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ if ( output_frame < inner_frame_tbl[st0->bwidth] && !sba_dirac_stereo_flag ) { #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); #endif } if ( !st0->bfi ) Loading Loading @@ -1924,7 +1936,11 @@ void stereo_dft_dec( if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[st0->bwidth] / L_FRAME48k; #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, 2, NFFT_inner, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, 2, NFFT_inner, DEC ); #endif } Loading Loading @@ -2601,7 +2617,11 @@ void stereo_dft_dec_read_BS( { hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW; hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); #endif if ( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND ) { Loading @@ -2611,7 +2631,11 @@ void stereo_dft_dec_read_BS( } else { #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); #endif } hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; Loading lib_dec/ivas_stereo_dft_dec_dmx.c +7 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,9 @@ #include "ivas_rom_dec.h" #include "rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif /*------------------------------------------------------------------------- Loading Loading @@ -112,7 +115,11 @@ void stereo_dft_unify_dmx( /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ if ( output_frame < inner_frame_tbl[st0->bwidth] ) { #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); #endif } if ( prev_bfi ) { Loading Loading
lib_com/ivas_prot_fx.h +15 −0 Original line number Diff line number Diff line Loading @@ -692,4 +692,19 @@ Word16 ivas_jbm_dec_get_render_granularity( const MC_MODE mc_mode, /* i : MC mode */ const Word32 output_Fs /* i : sampling rate */ ); // ivas_stereo_dft_com.c void stereo_dft_config_fx( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const Word32 brate, /* i : IVAS/CPE/nominal total bitrate */ Word16 *bits_frame_nominal, /* o : primary channel nominal bits per frame */ Word16 *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame*/ ); Word16 stereo_dft_band_config_fx( Word16 *band_limits, /* o : DFT band limits */ const Word16 band_res, /* i : DFT band resolution */ const Word16 NFFT, /* i : analysis/synthesis window length */ const Word16 enc_dec /* i : flag to indicate enc vs dec */ ); #endif No newline at end of file
lib_com/ivas_stereo_dft_com.c +223 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,229 @@ #include "prot.h" #include "cnst.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * stereo_dft_config() * * DFT Stereo Configuration function *------------------------------------------------------------------------*/ void stereo_dft_config_fx( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const Word32 brate, /* i : IVAS/CPE/nominal total bitrate */ Word16 *bits_frame_nominal, /* o : primary channel nominal bits per frame */ Word16 *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame*/ ) { IF( hConfig != NULL ) { hConfig->band_res = STEREO_DFT_BAND_RES_HIGH; move16(); hConfig->prm_res = 2; move16(); hConfig->dmx_active = STEREO_DFT_DMX_ACTIVE; move16(); hConfig->ada_wb_res_cod_mode = 0; move16(); } *bits_frame_nominal_2 = 5000 / FRAMES_PER_SEC; move16(); /* ITD, IPD and residual coding is not used in SID/No data */ IF( EQ_32( brate, FRAME_NO_DATA ) ) { *bits_frame_nominal = FRAME_NO_DATA; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( EQ_32( brate, IVAS_SID_5k2 ) ) { *bits_frame_nominal = SID_2k40 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( LE_32( brate, IVAS_13k2 ) ) { *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( LE_32( brate, IVAS_16k4 ) ) { *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( LE_32( brate, IVAS_24k4 ) ) { *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_ESF; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); } } ELSE IF( LE_32( brate, IVAS_32k ) ) { *bits_frame_nominal = ACELP_24k40 / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->ada_wb_res_cod_mode = 1; move16(); hConfig->res_pred_mode = STEREO_DFT_RESPRED_STEFI; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_1kHz; move16(); } } ELSE IF( LE_32( brate, IVAS_48k ) ) { *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; move16(); IF( hConfig != NULL ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_STEFI; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_1_6kHz; move16(); } } ELSE { assert( 0 && "Bit-rate not supported by DFT stereo." ); } test(); IF( hConfig != NULL && hConfig->force_mono_transmission ) { hConfig->res_pred_mode = STEREO_DFT_RESPRED_OFF; move16(); hConfig->band_res = STEREO_DFT_BAND_RES_LOW; move16(); hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; move16(); hConfig->ada_wb_res_cod_mode = 0; move16(); } /*sanity check*/ IF( hConfig != NULL ) { assert( LE_16( hConfig->prm_res, STEREO_DFT_NBDIV ) ); /* make sure residual switching and ESF are not active at the same time */ assert( !( EQ_16( hConfig->ada_wb_res_cod_mode, 1 ) && EQ_16( hConfig->res_pred_mode, STEREO_DFT_RESPRED_ESF ) ) ); } return; } /*------------------------------------------------------------------------- * stereo_dft_band_config() * * Stereo DFT bands condfiguration *------------------------------------------------------------------------*/ Word16 stereo_dft_band_config_fx( Word16 *band_limits, /* o : DFT band limits */ const Word16 band_res, /* i : DFT band resolution */ const Word16 NFFT, /* i : analysis/synthesis window length */ const Word16 enc_dec /* i : flag to indicate enc vs dec */ ) { Word16 nbands; /*sanity check*/ assert( ( EQ_16( band_res, 1 ) || EQ_16( band_res, 0 ) || EQ_16( band_res, 2 ) ) && "stereo DFT: Parameter band resolution not supported!\n" ); band_limits[0] = 1; move16(); nbands = 0; move16(); WHILE( LT_16( band_limits[nbands++], shr( NFFT, 1 ) ) ) { IF( EQ_16( band_res, 0 ) ) { assert( 0 && "stereo DFT: band config failed!\n" ); } ELSE IF( EQ_16( band_res, 1 ) ) { IF( EQ_16( enc_dec, ENC ) ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB4_BANDS ) ) && "stereo DFT: band config failed!\n" ); } ELSE { IF( EQ_16( enc_dec, ENC ) ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB8_BANDS ) ) && "stereo DFT: band config failed!\n" ); } } nbands = sub( nbands, 1 ); band_limits[nbands] = shr( NFFT, 1 ); /*Nyquist Freq*/ move16(); return ( nbands ); } #endif /*------------------------------------------------------------------------- * stereo_dft_config() Loading
lib_dec/ivas_cpe_dec.c +31 −2 Original line number Diff line number Diff line Loading @@ -42,6 +42,9 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #include <math.h> #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif /*--------------------------------------------------------------------------* Loading Loading @@ -165,6 +168,16 @@ ivas_error ivas_cpe_dec( { if ( st_ivas->hQMetaData != NULL && ivas_total_brate > IVAS_SID_5k2 ) { #ifdef IVAS_FLOAT_FIXED if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, Mpy_32_32(1503238554 /* 0.7f in Q31 */, L_mult0(st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC) ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } else { stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, L_mult0(st_ivas->hQMetaData->bits_frame_nominal, FRAMES_PER_SEC), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } #else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, (int32_t) ( 0.7f * st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); Loading @@ -173,10 +186,21 @@ ivas_error ivas_cpe_dec( { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } #endif } else { /* Note: This only works for stereo operation. If DTX would be applied for multiple CPEs a different bitrate signaling is needed */ #ifdef IVAS_FLOAT_FIXED if ( ivas_total_brate <= IVAS_SID_5k2 ) { stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } else { stereo_dft_config_fx( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } #else if ( ivas_total_brate <= IVAS_SID_5k2 ) { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); Loading @@ -185,6 +209,7 @@ ivas_error ivas_cpe_dec( { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } #endif } } Loading @@ -197,7 +222,11 @@ ivas_error ivas_cpe_dec( } else { #ifdef IVAS_FLOAT_FIXED stereo_dft_config_fx( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); #else stereo_dft_config( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); #endif } } Loading
lib_dec/ivas_stereo_dft_dec.c +30 −6 Original line number Diff line number Diff line Loading @@ -292,7 +292,11 @@ ivas_error stereo_dft_dec_create( } else { #ifdef IVAS_FLOAT_FIXED stereo_dft_config_fx( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS ); #else stereo_dft_config( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS ); #endif } stereo_dft_dec_open( hStereoDft_loc, output_Fs, nchan_transport ); Loading Loading @@ -399,7 +403,11 @@ static void stereo_dft_dec_open( /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ set_s( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB ); #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); #endif hStereoDft->hb_stefi_delay = NS2SA( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); if ( nchan_transport > 2 ) Loading Loading @@ -1855,7 +1863,11 @@ void stereo_dft_dec( /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ if ( output_frame < inner_frame_tbl[st0->bwidth] && !sba_dirac_stereo_flag ) { #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); #endif } if ( !st0->bfi ) Loading Loading @@ -1924,7 +1936,11 @@ void stereo_dft_dec( if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[st0->bwidth] / L_FRAME48k; #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, 2, NFFT_inner, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, 2, NFFT_inner, DEC ); #endif } Loading Loading @@ -2601,7 +2617,11 @@ void stereo_dft_dec_read_BS( { hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW; hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); #endif if ( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND ) { Loading @@ -2611,7 +2631,11 @@ void stereo_dft_dec_read_BS( } else { #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); #endif } hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; Loading
lib_dec/ivas_stereo_dft_dec_dmx.c +7 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,9 @@ #include "ivas_rom_dec.h" #include "rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif /*------------------------------------------------------------------------- Loading Loading @@ -112,7 +115,11 @@ void stereo_dft_unify_dmx( /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ if ( output_frame < inner_frame_tbl[st0->bwidth] ) { #ifdef IVAS_FLOAT_FIXED hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); #else hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); #endif } if ( prev_bfi ) { Loading