diff --git a/lib_com/options.h b/lib_com/options.h index f00d747592bbf5c693d4fb71ed4704bb6ec56bc1..48ee9c3a48ce759307e3f7109b5a1ade59622279 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -205,6 +205,7 @@ #define NONBE_FIX_778_TNS_UNFIED_STEREO_MSAN /* FhG: Issue 778: MSAN error due to uninitialized TNS configuration */ #define NONBE_FIX_797_OMASA_INACTIVE_SEP_OBJ /* VA: issue 797: fix of crash when the separated object is inactive and the MASA metadata is using very few bits */ +#define NONBE_FIX_798_OSBA_MC_DEC_CRASH /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 1bdbdec2856b4d2c46b394329a30bf0b2d5c929f..a56c2d221633d9e5e11a61368fe1031c38698ac6 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2215,7 +2215,11 @@ ivas_error ivas_init_decoder( if ( !st_ivas->hDecoderConfig->Opt_5ms ) { +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) +#else for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas ); n++ ) +#endif { /* note: these are intra-frame heap memories */ if ( ( st_ivas->p_output_f[n] = (float *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( float ) ) ) == NULL ) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 82b8e8332a0c2a478b49d620b0ecf080f94ec37f..d422e1c5531b6b9d56e9fc27253bc65e7b4a4418 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -81,7 +81,11 @@ static ivas_error ivas_ism_bitrate_switching_dec( st_ivas->ism_mode = last_ism_mode; ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ism_mode = ism_mode; +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#else nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas ); +#endif if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) { @@ -354,7 +358,11 @@ static ivas_error ivas_ism_bitrate_switching_dec( if ( !st_ivas->hDecoderConfig->Opt_5ms ) { +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#else nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas ); +#endif if ( nchan_out_buff > nchan_out_buff_old ) { diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index ed002ccc660c063ef6719cdf1aad22d2820d2bfa..7cce9f9b9cd31adc18b0ddfa6945adcc36c509ca 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -483,7 +483,11 @@ void ivas_mc_paramupmix_dec( } } +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + for ( ch = first_empty_channel; ch < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); ch++ ) +#else for ( ch = first_empty_channel; ch < ivas_get_nchan_buffers_dec( st_ivas ); ch++ ) +#endif { set_f( output_f[ch], 0.0f, output_frame ); } diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index ec95599c03203df994ff2639ba3919e9a1e70373..f631869b35d55c9a692f4724fa72fffa10ccbec5 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -180,7 +180,12 @@ ivas_error ivas_omasa_dec_config( ivas_format_orig = st_ivas->ivas_format; st_ivas->ivas_format = st_ivas->last_ivas_format; ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#else nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas ); +#endif + st_ivas->ivas_format = ivas_format_orig; nSCE_old = st_ivas->nSCE; @@ -413,7 +418,11 @@ ivas_error ivas_omasa_dec_config( if ( !st_ivas->hDecoderConfig->Opt_5ms ) { +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#else nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas ); +#endif if ( nchan_out_buff > nchan_out_buff_old ) { diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index 20c457c707adae797787a8706d269a6f4b337453..80a252dbd8900ea0250a800da1afb0630c35cf67 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -402,7 +402,11 @@ ivas_error ivas_osba_render( sba_ch_idx = 0; } +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + for ( n = 0; n < max( nchan_out, nchan_ism ); n++ ) +#else for ( n = 0; n < nchan_out; n++ ) +#endif { p_tmp_ism_out[n] = &tmp_ism_out[n][0]; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 8895ebf0cb8eca372a7680192ca02988f6ca7569..e1a58a6a8ed0abd2004955c24b939e4e36b4f979 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -112,6 +112,9 @@ ivas_error ivas_sba_dec_reconfigure( int32_t last_ivas_total_brate; int16_t num_channels, num_md_sub_frames; int16_t ch, nchan_out_buff, nchan_out_buff_old; +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + int16_t sba_analysis_order_old; +#endif DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; ISM_MODE ism_mode_old; @@ -122,6 +125,9 @@ ivas_error ivas_sba_dec_reconfigure( hDecoderConfig = st_ivas->hDecoderConfig; ivas_total_brate = hDecoderConfig->ivas_total_brate; last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + sba_analysis_order_old = ivas_sba_get_analysis_order( last_ivas_total_brate, st_ivas->sba_order ); +#endif /*-----------------------------------------------------------------* * Set SBA high-level parameters @@ -150,7 +156,11 @@ ivas_error ivas_sba_dec_reconfigure( nCPE_old = st_ivas->nCPE; nchan_transport_old = st_ivas->nchan_transport; sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag; +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas, sba_analysis_order_old, last_ivas_total_brate ); +#else nchan_out_buff_old = ivas_get_nchan_buffers_dec( st_ivas ); +#endif st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); @@ -572,7 +582,11 @@ ivas_error ivas_sba_dec_reconfigure( if ( !st_ivas->hDecoderConfig->Opt_5ms ) { +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#else nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas ); +#endif if ( nchan_out_buff > nchan_out_buff_old ) { diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 17812eabf7b949bb91b34e55579db40586377ea2..30bfdfe5ccc84ee99dde27119a18ce04588e3205 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -501,7 +501,11 @@ ivas_error ivas_sba_upmixer_renderer( sba_ch_idx = st_ivas->nchan_ism; } +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + for ( ch = 0; ch < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) - sba_ch_idx; ch++ ) +#else for ( ch = 0; ch < ivas_get_nchan_buffers_dec( st_ivas ) - sba_ch_idx; ch++ ) +#endif { output_f[ch] = output[ch]; } diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index 7dceb4a293247899c37aa8ed9b77647aecafe9d8..3d57a7f2199d4cf3677521fe78ea3b0a26b9c5cc 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -36,6 +36,9 @@ #include "prot.h" #include "ivas_prot_rend.h" #include "ivas_rom_com.h" +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH +#include "ivas_prot.h" +#endif #ifdef DEBUGGING #include "debug.h" #include @@ -264,6 +267,11 @@ void ivas_output_init( /*! r: number of decoder buffers */ int16_t ivas_get_nchan_buffers_dec( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + , + const int16_t sba_analysis_order, /* i : SBA order evaluated in DirAC/SPAR encoder */ + const int32_t ivas_total_brate /* i : total IVAS bitrate */ +#endif ) { int16_t nchan_out_buff; @@ -297,6 +305,10 @@ int16_t ivas_get_nchan_buffers_dec( } else if ( st_ivas->ivas_format == SBA_FORMAT ) { +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + int16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate ); +#endif nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) @@ -308,6 +320,9 @@ int16_t ivas_get_nchan_buffers_dec( nchan_out_buff = max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); } +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + nchan_out_buff = max( nchan_out_buff, nchan_internal ); +#endif } else if ( st_ivas->ivas_format == MASA_FORMAT ) { @@ -339,6 +354,10 @@ int16_t ivas_get_nchan_buffers_dec( } else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) { +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + int16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate ); +#endif nchan_out_buff = st_ivas->nchan_ism + st_ivas->nchan_transport; if ( st_ivas->hMCT != NULL ) @@ -368,7 +387,9 @@ int16_t ivas_get_nchan_buffers_dec( { nchan_out_buff = st_ivas->hDecoderConfig->nchan_out + st_ivas->nchan_ism; /*take into account sba_ch_idx' in ivas_dec() */ } - +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + nchan_out_buff = max( nchan_out_buff, nchan_internal + st_ivas->nchan_ism ); +#endif nchan_out_buff = min( nchan_out_buff, MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); } else if ( st_ivas->ivas_format == MC_FORMAT ) diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index b79319ed1f8730bacd62691413e307ad1ff65ace..70285ac0f3776daba1e7865422f6357fca25efb6 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -73,6 +73,11 @@ void ivas_output_init( /*! r: number of decoder buffers */ int16_t ivas_get_nchan_buffers_dec( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_798_OSBA_MC_DEC_CRASH + , + const int16_t sba_analysis_order, /* i : SBA order evaluated in DirAC/SPAR encoder */ + const int32_t ivas_total_brate /* i : total IVAS bitrate */ +#endif );