Loading lib_com/cnst.h +1 −0 Original line number Diff line number Diff line Loading @@ -732,6 +732,7 @@ enum #define CLDFB_OVRLP_MIN_SLOTS 3 /* CLDFB resampling - minimize processing to minimum required for transition frame ACELP->TCX/HQ */ #define INV_CLDFB_BANDWIDTH ( 1.f / 800.f ) #define INV_CLDFB_BANDWIDTH_Q31 ( 2684355l ) #define CLDFB_BANDWIDTH 800 #define L_FILT_2OVER3 12 #define L_FILT_2OVER3_LP 3 Loading lib_com/ivas_dirac_com.c +313 −17 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ #include "wmc_auto.h" #include "prot_fx1.h" #include "prot_fx2.h" #include "ivas_prot_fx.h" /*-----------------------------------------------------------------------* * Local function prototypes Loading Loading @@ -97,6 +98,135 @@ Word16 ivas_get_hodirac_flag_fx( * * DirAC Configuration function; used also in MASA decoder *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED ivas_error ivas_dirac_config_fx( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ const Word16 enc_dec /* i : encoder or decoder flag */ ) { IVAS_FORMAT ivas_format; Word16 sba_order; Word16 *element_mode; Word32 ivas_total_brate; DIRAC_CONFIG_DATA_HANDLE hConfig; IVAS_QMETADATA_HANDLE hQMetaData; Word32 Fs; Word16 *band_grouping; ivas_error error; Word16 spar_dirac_split_band; IVAS_FB_MIXER_HANDLE hFbMdft; Word16 *dirac_to_spar_md_bands; error = IVAS_ERR_OK; IF ( EQ_16(enc_dec , ENC)) { ivas_format = ((Encoder_Struct *)st_ivas)->hEncoderConfig->ivas_format; element_mode = &((Encoder_Struct *)st_ivas)->hEncoderConfig->element_mode_init; sba_order = ((Encoder_Struct *)st_ivas)->sba_analysis_order; ivas_total_brate = ((Encoder_Struct *)st_ivas)->hEncoderConfig->ivas_total_brate; Fs = ((Encoder_Struct *)st_ivas)->hEncoderConfig->input_Fs; band_grouping = ((Encoder_Struct *)st_ivas)->hDirAC->band_grouping; hConfig = ((Encoder_Struct *)st_ivas)->hDirAC->hConfig; hQMetaData = ((Encoder_Struct *)st_ivas)->hQMetaData; IF (((Encoder_Struct *)st_ivas)->hSpar != NULL) { hFbMdft = ((Encoder_Struct *)st_ivas)->hSpar->hFbMixer; dirac_to_spar_md_bands = ((Encoder_Struct *)st_ivas)->hSpar->dirac_to_spar_md_bands; } ELSE { hFbMdft = NULL; dirac_to_spar_md_bands = NULL; } } ELSE { ivas_format = ((Decoder_Struct *)st_ivas)->ivas_format; element_mode = &((Decoder_Struct *)st_ivas)->element_mode_init; sba_order = ((Decoder_Struct *)st_ivas)->sba_analysis_order; ivas_total_brate = ((Decoder_Struct *)st_ivas)->hDecoderConfig->ivas_total_brate; Fs = ((Decoder_Struct *)st_ivas)->hDecoderConfig->output_Fs; band_grouping = ((Decoder_Struct *)st_ivas)->hDirAC->band_grouping; hConfig = ((Decoder_Struct *)st_ivas)->hDirAC->hConfig; hQMetaData = ((Decoder_Struct *)st_ivas)->hQMetaData; IF (((Decoder_Struct *)st_ivas)->hSpar != NULL) { hFbMdft = ((Decoder_Struct *)st_ivas)->hSpar->hFbMixer; dirac_to_spar_md_bands = ((Decoder_Struct *)st_ivas)->hSpar->dirac_to_spar_md_bands; } ELSE { hFbMdft = NULL; dirac_to_spar_md_bands = NULL; } ((Decoder_Struct *)st_ivas)->hDirAC->hFbMdft = hFbMdft; } IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT) { hConfig->nbands = IVAS_MAX_NUM_BANDS; spar_dirac_split_band = s_min(IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND); IF (ivas_get_hodirac_flag(ivas_total_brate, sba_order))//add call after merge of 100861_dirac_dec { spar_dirac_split_band = 0; } } ELSE { hConfig->nbands = 5; spar_dirac_split_band = 0; } hConfig->enc_param_start_band = 0; hConfig->dec_param_estim = FALSE; IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT) /* skip for MASA decoder */ { IF ((error = ivas_dirac_sba_config_fx(hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band, ivas_format)) != IVAS_ERR_OK) { return error; } IF (hQMetaData != NULL) { IF (enc_dec == ENC) { hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands; } hConfig->enc_param_start_band = add(hQMetaData->q_direction[0].cfg.start_band , spar_dirac_split_band); } hConfig->dec_param_estim = TRUE; IF (hConfig->dec_param_estim == TRUE) { hConfig->enc_param_start_band = spar_dirac_split_band; } IF (ivas_get_hodirac_flag(ivas_total_brate, sba_order)) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; set_c((int8_t *)hQMetaData->twoDirBands, (int8_t)1, hQMetaData->q_direction[0].cfg.nbands); hQMetaData->numTwoDirBands = (uint8_t)hQMetaData->q_direction[0].cfg.nbands; } } IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT) { //100861_dirac_dec ivas_dirac_config_bands(band_grouping, IVAS_MAX_NUM_BANDS, (Word16)(Fs * INV_CLDFB_BANDWIDTH + 0.5f), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft); } ELSE { ivas_dirac_config_bands(band_grouping, hConfig->nbands, (Word16)(Fs * INV_CLDFB_BANDWIDTH + 0.5f), NULL, 0, 0, hFbMdft); } return error; } #endif ivas_error ivas_dirac_config( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ Loading Loading @@ -388,7 +518,7 @@ void ivas_dirac_config_bands_fx( { Word16 step = DIRAC_LOW_BANDRES_STEP; Word16 reduced_band; for ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1; band <= DIRAC_MAX_NBANDS; band += step, reduced_band++ ) for ( band = add(enc_param_start_band , 2), reduced_band = add(enc_param_start_band , 1); band <= DIRAC_MAX_NBANDS; band = add(band, step), reduced_band++ ) { band_grouping[reduced_band] = band_grouping[band]; } Loading Loading @@ -433,6 +563,90 @@ void ivas_dirac_config_bands_fx( * Return maximum SBA DirAC metadata bit-budget and nominal bit-budget *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void ivas_get_dirac_sba_max_md_bits_fx( const Word32 sba_total_brate, Word16 *bits_frame_nominal, Word16 *metadata_max_bits, Word16 *qmetadata_max_bit_req, const Word16 nbands, IVAS_FORMAT ivas_format ) { IF ( sba_total_brate <= IVAS_13k2 ) { *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; *metadata_max_bits = 70; } ELSE IF ( sba_total_brate <= IVAS_16k4 ) { *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; *metadata_max_bits = 80; } ELSE IF ( sba_total_brate <= IVAS_24k4 ) { *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; *metadata_max_bits = 103; /* OSBA needs an additional 2-bits safety margin to avoid acelp crashes */ IF ( ivas_format == SBA_ISM_FORMAT ) { ( *metadata_max_bits ) = sub((*metadata_max_bits), 3); } } ELSE IF ( sba_total_brate <= IVAS_32k ) { *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; *metadata_max_bits = 214; } ELSE IF ( sba_total_brate <= IVAS_48k ) { *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; *metadata_max_bits = 240; } ELSE IF ( sba_total_brate <= IVAS_64k ) { *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; *metadata_max_bits = 200; } ELSE IF ( sba_total_brate <= IVAS_80k ) { *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; *metadata_max_bits = 200; } ELSE IF ( sba_total_brate <= IVAS_96k ) { *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; *metadata_max_bits = 200; } ELSE IF ( sba_total_brate <= IVAS_128k ) { *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; *metadata_max_bits = 250; } ELSE { //*bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); Word16 tmp_exp = 0, tmp; tmp = BASOP_Util_Divide3232_Scale(sba_total_brate, FRAMES_PER_SEC, &tmp_exp); *bits_frame_nominal = shr(tmp, 15 - tmp_exp); *metadata_max_bits = MAX16B; /* no limit */ } Word32 var1 = L_mult0(*metadata_max_bits, nbands); Word16 exp = 0; Word16 var2 = BASOP_Util_Divide3232_Scale(var1, 5, &exp); Word32 var2_32 = L_deposit_h(var2); Word32 var4 = var2_32; Word16 exp_res = 0; IF (var1 % 5 != 0) { var4 = BASOP_Util_Add_Mant32Exp(var2_32, exp, ONE_IN_Q30, 1, &exp_res); } *metadata_max_bits = extract_l(L_min(MAX16B, L_shr(var4, 14))); *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; return; } #endif void ivas_get_dirac_sba_max_md_bits( const int32_t sba_total_brate, int16_t *bits_frame_nominal, Loading Loading @@ -502,12 +716,95 @@ void ivas_get_dirac_sba_max_md_bits( return; } /*------------------------------------------------------------------------- * ivas_dirac_sba_config() * * DirAC Configuration function for SBA *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED ivas_error ivas_dirac_sba_config_fx( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ Word16 *element_mode, /* i/o: element mode of the core coder */ Word32 sba_total_brate, /* i : SBA total bitrate */ const Word16 sba_order, /* i : Ambisonic (SBA) order */ const Word16 nbands /* i : number of frequency bands */ , IVAS_FORMAT ivas_format) { Word16 nbands_coded; Word16 hodirac_flag; ivas_error error; Word32 tmp1 = IVAS_192k; Word32 tmp2 = SPAR_DIRAC_SPLIT_START_BAND; Word16 exp = 0; Word16 tmp3 = BASOP_Util_Divide3232_Scale(tmp1, tmp2, &exp); Word32 res = L_shr(L_deposit_h(tmp3), 31 - exp); error = IVAS_ERR_OK; hQMetaData->is_masa_ivas_format = 0; hodirac_flag = ivas_get_hodirac_flag(sba_total_brate, sba_order);//implemented on 100861_dirac_dec /* map the bitrate for SID frame */ IF (EQ_32(sba_total_brate , IVAS_SID_5k2)) { IF (EQ_16(*element_mode , IVAS_SCE)) { sba_total_brate = ACELP_24k40; } ELSE { sba_total_brate = ACELP_48k; } } ivas_set_qmetadata_maxbit_req(hQMetaData, SBA_FORMAT); IF (LE_32(sba_total_brate , IVAS_16k4)) { hQMetaData->useLowerRes = 1; } ELSE { hQMetaData->useLowerRes = 0; } nbands_coded = nbands; IF (LE_32(sba_total_brate , res)) { hQMetaData->useLowerBandRes = 1; Word16 tmp = nbands % 2; nbands_coded = add(shr(nbands, 1) , tmp); } ELSE { hQMetaData->useLowerBandRes = 0; IF (hodirac_flag == 0) { nbands_coded = nbands - 1; /* always combine the last two bands */ } } { Word16 no_dirs = 1; IF (hodirac_flag) { no_dirs = 2; } IF ((error = ivas_qmetadata_allocate_memory(hQMetaData, nbands_coded, no_dirs, 0)) != IVAS_ERR_OK)//WIP { return error; } } ivas_get_dirac_sba_max_md_bits_fx(sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands, ivas_format); return error; } #endif ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ Loading Loading @@ -584,7 +881,6 @@ ivas_error ivas_dirac_sba_config( return error; } /*------------------------------------------------------------------------- * computeDirectionVectors() * Loading lib_com/ivas_prot.h +12 −0 Original line number Diff line number Diff line Loading @@ -3634,6 +3634,14 @@ int16_t ivas_sba_get_order( const int16_t sba_planar /* i : SBA planar flag */ ); #ifdef IVAS_FLOAT_FIXED Word16 ivas_sba_get_order_fx( const Word16 nb_channels, /* i : Number of ambisonic channels */ const Word16 sba_planar /* i : SBA planar flag */ ); #endif /*! r: Ambisonic (SBA) order used for analysis and coding */ int16_t ivas_sba_get_analysis_order( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ Loading Loading @@ -3849,6 +3857,10 @@ void generate_masking_noise_lb_dirac( ); #ifdef IVAS_FLOAT_FIXED void ivas_dirac_dec_close_fx( DIRAC_DEC_HANDLE *hDirAC_out ); void ivas_dirac_dec_set_md_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 nCldfbTs /* i : number of CLDFB time slots */ Loading lib_com/ivas_prot_fx.h +23 −0 Original line number Diff line number Diff line Loading @@ -1090,4 +1090,27 @@ void stereo_dft_dmx_out_reset_fx( STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ ); void ivas_get_dirac_sba_max_md_bits_fx( const Word32 sba_total_brate, Word16 *bits_frame_nominal, Word16 *metadata_max_bits, Word16 *qmetadata_max_bit_req, const Word16 nbands, IVAS_FORMAT ivas_format); ivas_error ivas_dirac_sba_config_fx( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ Word16 *element_mode, /* i/o: element mode of the core coder */ Word32 sba_total_brate, /* i : SBA total bitrate */ const Word16 sba_order, /* i : Ambisonic (SBA) order */ const Word16 nbands /* i : number of frequency bands */ , IVAS_FORMAT ivas_format); ivas_error ivas_dirac_config_fx( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ const Word16 enc_dec /* i : encoder or decoder flag */ ); #endif lib_com/ivas_sba_config.c +4 −5 Original line number Diff line number Diff line Loading @@ -115,7 +115,6 @@ void ivas_sba_config( } #ifdef IVAS_FLOAT_FIXED /*not tested*/ void ivas_sba_config_fx( const Word32 sba_total_brate, /* i : SBA total bitrate */ Word16 sba_order, /* i : Ambisonic (SBA) order */ Loading @@ -133,11 +132,11 @@ void ivas_sba_config_fx( } ELSE IF( LT_16( sba_order, 0 ) ) { sba_order = ivas_sba_get_order( nb_channels, sba_planar ); sba_order = ivas_sba_get_order_fx( nb_channels, sba_planar ); } ELSE IF( LT_16( nb_channels, 0 ) ) { nb_channels = ivas_sba_get_nchan_fx( sba_order, sba_planar ); nb_channels = (Word16)ivas_sba_get_nchan_fx( sba_order, sba_planar ); } ELSE { Loading Loading @@ -301,7 +300,7 @@ Word16 ivas_sba_get_nchan_fx( } ELSE { nb_channels = mult(add(sba_order , 1) , (sba_order + 1)); nb_channels = mult0(add(sba_order , 1) , add(sba_order , 1)); } return (nb_channels); Loading Loading
lib_com/cnst.h +1 −0 Original line number Diff line number Diff line Loading @@ -732,6 +732,7 @@ enum #define CLDFB_OVRLP_MIN_SLOTS 3 /* CLDFB resampling - minimize processing to minimum required for transition frame ACELP->TCX/HQ */ #define INV_CLDFB_BANDWIDTH ( 1.f / 800.f ) #define INV_CLDFB_BANDWIDTH_Q31 ( 2684355l ) #define CLDFB_BANDWIDTH 800 #define L_FILT_2OVER3 12 #define L_FILT_2OVER3_LP 3 Loading
lib_com/ivas_dirac_com.c +313 −17 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ #include "wmc_auto.h" #include "prot_fx1.h" #include "prot_fx2.h" #include "ivas_prot_fx.h" /*-----------------------------------------------------------------------* * Local function prototypes Loading Loading @@ -97,6 +98,135 @@ Word16 ivas_get_hodirac_flag_fx( * * DirAC Configuration function; used also in MASA decoder *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED ivas_error ivas_dirac_config_fx( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ const Word16 enc_dec /* i : encoder or decoder flag */ ) { IVAS_FORMAT ivas_format; Word16 sba_order; Word16 *element_mode; Word32 ivas_total_brate; DIRAC_CONFIG_DATA_HANDLE hConfig; IVAS_QMETADATA_HANDLE hQMetaData; Word32 Fs; Word16 *band_grouping; ivas_error error; Word16 spar_dirac_split_band; IVAS_FB_MIXER_HANDLE hFbMdft; Word16 *dirac_to_spar_md_bands; error = IVAS_ERR_OK; IF ( EQ_16(enc_dec , ENC)) { ivas_format = ((Encoder_Struct *)st_ivas)->hEncoderConfig->ivas_format; element_mode = &((Encoder_Struct *)st_ivas)->hEncoderConfig->element_mode_init; sba_order = ((Encoder_Struct *)st_ivas)->sba_analysis_order; ivas_total_brate = ((Encoder_Struct *)st_ivas)->hEncoderConfig->ivas_total_brate; Fs = ((Encoder_Struct *)st_ivas)->hEncoderConfig->input_Fs; band_grouping = ((Encoder_Struct *)st_ivas)->hDirAC->band_grouping; hConfig = ((Encoder_Struct *)st_ivas)->hDirAC->hConfig; hQMetaData = ((Encoder_Struct *)st_ivas)->hQMetaData; IF (((Encoder_Struct *)st_ivas)->hSpar != NULL) { hFbMdft = ((Encoder_Struct *)st_ivas)->hSpar->hFbMixer; dirac_to_spar_md_bands = ((Encoder_Struct *)st_ivas)->hSpar->dirac_to_spar_md_bands; } ELSE { hFbMdft = NULL; dirac_to_spar_md_bands = NULL; } } ELSE { ivas_format = ((Decoder_Struct *)st_ivas)->ivas_format; element_mode = &((Decoder_Struct *)st_ivas)->element_mode_init; sba_order = ((Decoder_Struct *)st_ivas)->sba_analysis_order; ivas_total_brate = ((Decoder_Struct *)st_ivas)->hDecoderConfig->ivas_total_brate; Fs = ((Decoder_Struct *)st_ivas)->hDecoderConfig->output_Fs; band_grouping = ((Decoder_Struct *)st_ivas)->hDirAC->band_grouping; hConfig = ((Decoder_Struct *)st_ivas)->hDirAC->hConfig; hQMetaData = ((Decoder_Struct *)st_ivas)->hQMetaData; IF (((Decoder_Struct *)st_ivas)->hSpar != NULL) { hFbMdft = ((Decoder_Struct *)st_ivas)->hSpar->hFbMixer; dirac_to_spar_md_bands = ((Decoder_Struct *)st_ivas)->hSpar->dirac_to_spar_md_bands; } ELSE { hFbMdft = NULL; dirac_to_spar_md_bands = NULL; } ((Decoder_Struct *)st_ivas)->hDirAC->hFbMdft = hFbMdft; } IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT) { hConfig->nbands = IVAS_MAX_NUM_BANDS; spar_dirac_split_band = s_min(IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND); IF (ivas_get_hodirac_flag(ivas_total_brate, sba_order))//add call after merge of 100861_dirac_dec { spar_dirac_split_band = 0; } } ELSE { hConfig->nbands = 5; spar_dirac_split_band = 0; } hConfig->enc_param_start_band = 0; hConfig->dec_param_estim = FALSE; IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT) /* skip for MASA decoder */ { IF ((error = ivas_dirac_sba_config_fx(hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band, ivas_format)) != IVAS_ERR_OK) { return error; } IF (hQMetaData != NULL) { IF (enc_dec == ENC) { hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands; } hConfig->enc_param_start_band = add(hQMetaData->q_direction[0].cfg.start_band , spar_dirac_split_band); } hConfig->dec_param_estim = TRUE; IF (hConfig->dec_param_estim == TRUE) { hConfig->enc_param_start_band = spar_dirac_split_band; } IF (ivas_get_hodirac_flag(ivas_total_brate, sba_order)) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; set_c((int8_t *)hQMetaData->twoDirBands, (int8_t)1, hQMetaData->q_direction[0].cfg.nbands); hQMetaData->numTwoDirBands = (uint8_t)hQMetaData->q_direction[0].cfg.nbands; } } IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT) { //100861_dirac_dec ivas_dirac_config_bands(band_grouping, IVAS_MAX_NUM_BANDS, (Word16)(Fs * INV_CLDFB_BANDWIDTH + 0.5f), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft); } ELSE { ivas_dirac_config_bands(band_grouping, hConfig->nbands, (Word16)(Fs * INV_CLDFB_BANDWIDTH + 0.5f), NULL, 0, 0, hFbMdft); } return error; } #endif ivas_error ivas_dirac_config( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ Loading Loading @@ -388,7 +518,7 @@ void ivas_dirac_config_bands_fx( { Word16 step = DIRAC_LOW_BANDRES_STEP; Word16 reduced_band; for ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1; band <= DIRAC_MAX_NBANDS; band += step, reduced_band++ ) for ( band = add(enc_param_start_band , 2), reduced_band = add(enc_param_start_band , 1); band <= DIRAC_MAX_NBANDS; band = add(band, step), reduced_band++ ) { band_grouping[reduced_band] = band_grouping[band]; } Loading Loading @@ -433,6 +563,90 @@ void ivas_dirac_config_bands_fx( * Return maximum SBA DirAC metadata bit-budget and nominal bit-budget *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void ivas_get_dirac_sba_max_md_bits_fx( const Word32 sba_total_brate, Word16 *bits_frame_nominal, Word16 *metadata_max_bits, Word16 *qmetadata_max_bit_req, const Word16 nbands, IVAS_FORMAT ivas_format ) { IF ( sba_total_brate <= IVAS_13k2 ) { *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; *metadata_max_bits = 70; } ELSE IF ( sba_total_brate <= IVAS_16k4 ) { *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; *metadata_max_bits = 80; } ELSE IF ( sba_total_brate <= IVAS_24k4 ) { *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; *metadata_max_bits = 103; /* OSBA needs an additional 2-bits safety margin to avoid acelp crashes */ IF ( ivas_format == SBA_ISM_FORMAT ) { ( *metadata_max_bits ) = sub((*metadata_max_bits), 3); } } ELSE IF ( sba_total_brate <= IVAS_32k ) { *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; *metadata_max_bits = 214; } ELSE IF ( sba_total_brate <= IVAS_48k ) { *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; *metadata_max_bits = 240; } ELSE IF ( sba_total_brate <= IVAS_64k ) { *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; *metadata_max_bits = 200; } ELSE IF ( sba_total_brate <= IVAS_80k ) { *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; *metadata_max_bits = 200; } ELSE IF ( sba_total_brate <= IVAS_96k ) { *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; *metadata_max_bits = 200; } ELSE IF ( sba_total_brate <= IVAS_128k ) { *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; *metadata_max_bits = 250; } ELSE { //*bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); Word16 tmp_exp = 0, tmp; tmp = BASOP_Util_Divide3232_Scale(sba_total_brate, FRAMES_PER_SEC, &tmp_exp); *bits_frame_nominal = shr(tmp, 15 - tmp_exp); *metadata_max_bits = MAX16B; /* no limit */ } Word32 var1 = L_mult0(*metadata_max_bits, nbands); Word16 exp = 0; Word16 var2 = BASOP_Util_Divide3232_Scale(var1, 5, &exp); Word32 var2_32 = L_deposit_h(var2); Word32 var4 = var2_32; Word16 exp_res = 0; IF (var1 % 5 != 0) { var4 = BASOP_Util_Add_Mant32Exp(var2_32, exp, ONE_IN_Q30, 1, &exp_res); } *metadata_max_bits = extract_l(L_min(MAX16B, L_shr(var4, 14))); *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; return; } #endif void ivas_get_dirac_sba_max_md_bits( const int32_t sba_total_brate, int16_t *bits_frame_nominal, Loading Loading @@ -502,12 +716,95 @@ void ivas_get_dirac_sba_max_md_bits( return; } /*------------------------------------------------------------------------- * ivas_dirac_sba_config() * * DirAC Configuration function for SBA *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED ivas_error ivas_dirac_sba_config_fx( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ Word16 *element_mode, /* i/o: element mode of the core coder */ Word32 sba_total_brate, /* i : SBA total bitrate */ const Word16 sba_order, /* i : Ambisonic (SBA) order */ const Word16 nbands /* i : number of frequency bands */ , IVAS_FORMAT ivas_format) { Word16 nbands_coded; Word16 hodirac_flag; ivas_error error; Word32 tmp1 = IVAS_192k; Word32 tmp2 = SPAR_DIRAC_SPLIT_START_BAND; Word16 exp = 0; Word16 tmp3 = BASOP_Util_Divide3232_Scale(tmp1, tmp2, &exp); Word32 res = L_shr(L_deposit_h(tmp3), 31 - exp); error = IVAS_ERR_OK; hQMetaData->is_masa_ivas_format = 0; hodirac_flag = ivas_get_hodirac_flag(sba_total_brate, sba_order);//implemented on 100861_dirac_dec /* map the bitrate for SID frame */ IF (EQ_32(sba_total_brate , IVAS_SID_5k2)) { IF (EQ_16(*element_mode , IVAS_SCE)) { sba_total_brate = ACELP_24k40; } ELSE { sba_total_brate = ACELP_48k; } } ivas_set_qmetadata_maxbit_req(hQMetaData, SBA_FORMAT); IF (LE_32(sba_total_brate , IVAS_16k4)) { hQMetaData->useLowerRes = 1; } ELSE { hQMetaData->useLowerRes = 0; } nbands_coded = nbands; IF (LE_32(sba_total_brate , res)) { hQMetaData->useLowerBandRes = 1; Word16 tmp = nbands % 2; nbands_coded = add(shr(nbands, 1) , tmp); } ELSE { hQMetaData->useLowerBandRes = 0; IF (hodirac_flag == 0) { nbands_coded = nbands - 1; /* always combine the last two bands */ } } { Word16 no_dirs = 1; IF (hodirac_flag) { no_dirs = 2; } IF ((error = ivas_qmetadata_allocate_memory(hQMetaData, nbands_coded, no_dirs, 0)) != IVAS_ERR_OK)//WIP { return error; } } ivas_get_dirac_sba_max_md_bits_fx(sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands, ivas_format); return error; } #endif ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ Loading Loading @@ -584,7 +881,6 @@ ivas_error ivas_dirac_sba_config( return error; } /*------------------------------------------------------------------------- * computeDirectionVectors() * Loading
lib_com/ivas_prot.h +12 −0 Original line number Diff line number Diff line Loading @@ -3634,6 +3634,14 @@ int16_t ivas_sba_get_order( const int16_t sba_planar /* i : SBA planar flag */ ); #ifdef IVAS_FLOAT_FIXED Word16 ivas_sba_get_order_fx( const Word16 nb_channels, /* i : Number of ambisonic channels */ const Word16 sba_planar /* i : SBA planar flag */ ); #endif /*! r: Ambisonic (SBA) order used for analysis and coding */ int16_t ivas_sba_get_analysis_order( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ Loading Loading @@ -3849,6 +3857,10 @@ void generate_masking_noise_lb_dirac( ); #ifdef IVAS_FLOAT_FIXED void ivas_dirac_dec_close_fx( DIRAC_DEC_HANDLE *hDirAC_out ); void ivas_dirac_dec_set_md_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 nCldfbTs /* i : number of CLDFB time slots */ Loading
lib_com/ivas_prot_fx.h +23 −0 Original line number Diff line number Diff line Loading @@ -1090,4 +1090,27 @@ void stereo_dft_dmx_out_reset_fx( STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ ); void ivas_get_dirac_sba_max_md_bits_fx( const Word32 sba_total_brate, Word16 *bits_frame_nominal, Word16 *metadata_max_bits, Word16 *qmetadata_max_bit_req, const Word16 nbands, IVAS_FORMAT ivas_format); ivas_error ivas_dirac_sba_config_fx( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ Word16 *element_mode, /* i/o: element mode of the core coder */ Word32 sba_total_brate, /* i : SBA total bitrate */ const Word16 sba_order, /* i : Ambisonic (SBA) order */ const Word16 nbands /* i : number of frequency bands */ , IVAS_FORMAT ivas_format); ivas_error ivas_dirac_config_fx( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ const Word16 enc_dec /* i : encoder or decoder flag */ ); #endif
lib_com/ivas_sba_config.c +4 −5 Original line number Diff line number Diff line Loading @@ -115,7 +115,6 @@ void ivas_sba_config( } #ifdef IVAS_FLOAT_FIXED /*not tested*/ void ivas_sba_config_fx( const Word32 sba_total_brate, /* i : SBA total bitrate */ Word16 sba_order, /* i : Ambisonic (SBA) order */ Loading @@ -133,11 +132,11 @@ void ivas_sba_config_fx( } ELSE IF( LT_16( sba_order, 0 ) ) { sba_order = ivas_sba_get_order( nb_channels, sba_planar ); sba_order = ivas_sba_get_order_fx( nb_channels, sba_planar ); } ELSE IF( LT_16( nb_channels, 0 ) ) { nb_channels = ivas_sba_get_nchan_fx( sba_order, sba_planar ); nb_channels = (Word16)ivas_sba_get_nchan_fx( sba_order, sba_planar ); } ELSE { Loading Loading @@ -301,7 +300,7 @@ Word16 ivas_sba_get_nchan_fx( } ELSE { nb_channels = mult(add(sba_order , 1) , (sba_order + 1)); nb_channels = mult0(add(sba_order , 1) , add(sba_order , 1)); } return (nb_channels); Loading