diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 22b726f314c24f72afc86f61bf74fb73d28ede2c..bcf502033a6ddb0af293c17a8272f62acb5a5b8c 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -162,7 +162,12 @@ ivas_error ivas_dirac_config( 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( hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_sba_config( hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + ivas_format +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -319,7 +324,12 @@ void ivas_get_dirac_sba_max_md_bits( int16_t *bits_frame_nominal, int16_t *metadata_max_bits, int16_t *qmetadata_max_bit_req, - const int16_t nbands ) + const int16_t nbands +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + IVAS_FORMAT ivas_format +#endif +) { if ( sba_total_brate <= IVAS_13k2 ) { @@ -335,6 +345,13 @@ void ivas_get_dirac_sba_max_md_bits( { *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; *metadata_max_bits = 103; +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + /* OSBA needs an additional 2-bits safety margin to avoid acelp crashes */ + if ( ivas_format == SBA_ISM_FORMAT ) + { + ( *metadata_max_bits ) -= 3; + } +#endif } else if ( sba_total_brate <= IVAS_32k ) { @@ -390,6 +407,10 @@ ivas_error ivas_dirac_sba_config( int32_t sba_total_brate, /* i : SBA total bitrate */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int16_t nbands /* i : number of frequency bands */ +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + IVAS_FORMAT ivas_format +#endif ) { int16_t nbands_coded; @@ -452,7 +473,12 @@ ivas_error ivas_dirac_sba_config( } } - ivas_get_dirac_sba_max_md_bits( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands ); + ivas_get_dirac_sba_max_md_bits( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + ivas_format +#endif + ); return error; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index de6579f85c4bd52e996d4d6393d72d036eb997ac..c796afaecc35ae1ada1f924ecb37078712e77c9f 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3647,6 +3647,10 @@ void ivas_get_dirac_sba_max_md_bits( int16_t *metadata_max_bits, int16_t *qmetadata_max_bit_req, const int16_t nbands +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + IVAS_FORMAT ivas_format +#endif ); ivas_error ivas_dirac_sba_config( @@ -3655,6 +3659,10 @@ ivas_error ivas_dirac_sba_config( int32_t sba_total_brate, /* i : SBA total bitrate */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int16_t nbands /* i : number of frequency bands */ +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + IVAS_FORMAT ivas_format +#endif ); ivas_error ivas_dirac_dec_config( diff --git a/lib_com/options.h b/lib_com/options.h index d738ad025f4d0e24b318e526aca65279c3999e4e..8ab496fe29c07a9b8a88f75f15790baa0339750c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -162,6 +162,7 @@ #define NONBE_FIX_856_TCX_LTP_SYNTH_FILTER /* FhG: issue 856: correct filtering length for tcx-ltp synth filtering*/ #define NONBE_UNIFIED_DECODING_PATHS /* FhG: unify decoding paths */ #define NONBE_FIX_874_OMASA_BRSW_2TD /* Nokia: issue 874: Fixes the crashes with the long test vectors that prompted switching to TD*/ +#define NONBE_FIX_871_ACELP_CRASH_IN_OSBA /* FhG: isse 871: crash in ACELP core encoder with OSBA */ #define NONBE_FIX_225_MASA_EXT_REND /* Nokia: Resolve #225: Complete MASA external renderer implementation */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 7ed132c87b2ec8745260b72e9e9b46280b4bd219..d9e32229c83c7ae819e373f79a5d535519e1f7ee 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1363,7 +1363,12 @@ ivas_error ivas_init_decoder( } } - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + st_ivas->ivas_format +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -1516,7 +1521,12 @@ ivas_error ivas_init_decoder( } } - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + st_ivas->ivas_format +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 82ca41a271e6c45707ffb56459f6ce2c0b545101..88c545ad6adc1b1da091a83984a804983ef5bdc0 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -392,7 +392,12 @@ ivas_error ivas_sba_dec_reconfigure( ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); } - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) +#ifdef NONBE_FIX_871_ACELP_CRASH_IN_OSBA + , + st_ivas->ivas_format +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_osba_enc.c b/lib_enc/ivas_osba_enc.c index 83841795f7d28dfc73ce28d70c93c19c442155b5..675b89c6d67a42ac884755923b26923232b9987f 100644 --- a/lib_enc/ivas_osba_enc.c +++ b/lib_enc/ivas_osba_enc.c @@ -72,7 +72,7 @@ static void ivas_merge_sba_transports( { for ( j = 0; j < input_frame; j++ ) { - data_out_f[i][j] = data_in_f1[i][j] + data_in_f2[i][j]; + data_out_f[i][j] = ( data_in_f1[i][j] + data_in_f2[i][j] ); } }