From 204bcb4ccefae9ba1102eff7894092aa0ccf4c92 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 16 Jun 2025 17:37:32 +0200 Subject: [PATCH 1/4] port NONBE_FIX_1065_ISM_MD_HANDLE --- lib_com/ivas_prot.h | 10 +++++ lib_com/options.h | 1 + lib_dec/ivas_init_dec.c | 23 +++++++++-- lib_dec/ivas_ism_metadata_dec.c | 73 +++++++++++++++++++++++++++++++-- lib_dec/ivas_omasa_dec.c | 21 ++++++++++ 5 files changed, 121 insertions(+), 7 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0378ef226..e3be1ea13 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1001,10 +1001,20 @@ ivas_error ivas_ism_metadata_enc_create( ivas_error ivas_ism_metadata_dec_create( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + const int16_t n_ISms, /* i : number of separately coded objects */ +#else const int16_t n_ISms, /* i : number of objects */ +#endif int32_t element_brate_tmp[] /* o : element bitrate per object */ ); +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE +void ivas_ism_reset_metadata_handle_dec( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +); + +#endif ivas_error ivas_ism_enc( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ float *data[], /* i : input signal [channels][samples] */ diff --git a/lib_com/options.h b/lib_com/options.h index 94f061010..9d8ebbdc1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -210,6 +210,7 @@ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ +#define NONBE_FIX_1065_ISM_MD_HANDLE /* VA: issue 1065: Allocate only the necessary number of ISM MD decoder handles. */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index a9ec15a79..ec335cdad 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1243,7 +1243,11 @@ ivas_error ivas_init_decoder( } } +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nSCE, element_brate_tmp ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1574,11 +1578,24 @@ ivas_error ivas_init_decoder( } reset_indices_dec( st_ivas->hSCE[0]->hCoreCoder[0] ); - - if ( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + if ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { - return error; + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } } + else + { +#endif + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + } +#endif } else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index fd2d63029..6331b191d 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -642,6 +642,40 @@ ivas_error ivas_ism_metadata_dec( return IVAS_ERR_OK; } +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + +/*-------------------------------------------------------------------* + * ivas_ism_reset_metadata_handle_dec() + * + * Reset ISM decoder metadata handle + *-------------------------------------------------------------------*/ + +void ivas_ism_reset_metadata_handle_dec( + ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ +) +{ + hIsmMeta->last_ism_metadata_flag = 0; + hIsmMeta->position_angle.last_angle1_idx = 0; + hIsmMeta->position_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); + hIsmMeta->orientation_angle.last_angle1_idx = 0; + hIsmMeta->orientation_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); + hIsmMeta->last_radius_idx = 8; /* Init to radius 1.0 */ + + hIsmMeta->last_true_azimuth = 0; + hIsmMeta->last_true_elevation = 0; + hIsmMeta->last_azimuth = 0; + hIsmMeta->last_elevation = 0; + + hIsmMeta->ism_imp = -1; + hIsmMeta->ism_md_null_flag = 0; + hIsmMeta->ism_md_lowrate_flag = 0; + + ivas_ism_reset_metadata( hIsmMeta ); + + return; +} + +#endif /*------------------------------------------------------------------------- * ivas_ism_metadata_dec_create() @@ -650,8 +684,12 @@ ivas_error ivas_ism_metadata_dec( *-------------------------------------------------------------------------*/ ivas_error ivas_ism_metadata_dec_create( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t n_ISms, /* i : number of objects */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + const int16_t n_ISms, /* i : number of separately coded objects */ +#else + const int16_t n_ISms, /* i : number of objects */ +#endif int32_t element_brate_tmp[] /* o : element bitrate per object */ ) { @@ -659,13 +697,27 @@ ivas_error ivas_ism_metadata_dec_create( ivas_error error; /* allocate ISM metadata handles */ +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + for ( ch = 0; ch < n_ISms; ch++ ) +#else for ( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) +#endif { - if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + if ( st_ivas->hIsmMetaData[ch] == NULL ) /* note: the handle can be allocated in OMASA bitrate switching from ISM_MASA_MODE_xxx_ONE_OBJ to ISM_MASA_MODE_DISC mode for 'ch==0' */ { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); +#endif + if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); + } +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE } +#endif +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + ivas_ism_reset_metadata_handle_dec( st_ivas->hIsmMetaData[ch] ); +#else st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0; st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); @@ -683,8 +735,21 @@ ivas_error ivas_ism_metadata_dec_create( st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); +#endif } +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + /* sanity freeing - it can happen only in reconfiguration when a smaller number of handles than before is requested */ + for ( ; ch < MAX_NUM_OBJECTS; ch++ ) + { + if ( st_ivas->hIsmMetaData[ch] != NULL ) + { + free( st_ivas->hIsmMetaData[ch] ); + st_ivas->hIsmMetaData[ch] = NULL; + } + } + +#endif if ( element_brate_tmp != NULL ) { if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 766635ac4..00aceae15 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -155,7 +155,11 @@ ivas_error ivas_omasa_dec_config( void *data /* o : output synthesis signal */ ) { +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + int16_t k, sce_id, nSCE_old, nchan_hp20_old, numCldfbAnalyses_old, numCldfbSyntheses_old; +#else int16_t k, sce_id, nSCE_old, nchan_hp20_old, numCldfbAnalyses_old, numCldfbSyntheses_old, n_MD; +#endif int32_t ivas_total_brate, ism_total_brate, cpe_brate; ISM_MODE ism_mode_old; IVAS_FORMAT ivas_format_orig; @@ -247,6 +251,22 @@ ivas_error ivas_omasa_dec_config( if ( ism_mode_old != st_ivas->ism_mode ) { /* ISM MD reconfig. */ +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + if ( st_ivas->hIsmMetaData[0] == NULL ) + { + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + for ( k = 0; k < st_ivas->nchan_ism; k++ ) + { + ivas_ism_reset_metadata_handle_dec( st_ivas->hIsmMetaData[k] ); + } + } +#else n_MD = 0; if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) @@ -274,6 +294,7 @@ ivas_error ivas_omasa_dec_config( } ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); +#endif st_ivas->hCPE[0]->element_brate = ivas_total_brate - ism_total_brate; -- GitLab From ca285dd89276f4a8de41e5f5d3f1e4e54288f5a8 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 16 Jun 2025 18:27:28 +0200 Subject: [PATCH 2/4] port NONBE_FIX_1028_1DB_TCX_LEVEL_DROP --- lib_com/options.h | 1 + lib_dec/core_dec_init.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 9d8ebbdc1..061fcc0d4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -211,6 +211,7 @@ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1065_ISM_MD_HANDLE /* VA: issue 1065: Allocate only the necessary number of ISM MD decoder handles. */ +#define NONBE_FIX_1028_1DB_TCX_LEVEL_DROP /* VA: Harmonize the logic setting LP weighting factor between TCX encoder and TCX decoder */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index af1080de0..0f6d2d891 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -150,7 +150,11 @@ void open_decoder_LPD( { st->gamma = GAMMA16k; } +#ifdef NONBE_FIX_1028_1DB_TCX_LEVEL_DROP + else if ( st->element_mode > EVS_MONO && st->sr_core > INT_FS_16k ) +#else else if ( st->sr_core > INT_FS_16k && st->element_mode == IVAS_CPE_MDCT ) +#endif { st->gamma = GAMMA16k; } -- GitLab From 33710d37b7aeba49b2a06a8b622f49f1b3925ea2 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 16 Jun 2025 18:29:12 +0200 Subject: [PATCH 3/4] revert NONBE_FIX_1028_1DB_TCX_LEVEL_DROP --- lib_com/options.h | 1 - lib_dec/core_dec_init.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 061fcc0d4..9d8ebbdc1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -211,7 +211,6 @@ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1065_ISM_MD_HANDLE /* VA: issue 1065: Allocate only the necessary number of ISM MD decoder handles. */ -#define NONBE_FIX_1028_1DB_TCX_LEVEL_DROP /* VA: Harmonize the logic setting LP weighting factor between TCX encoder and TCX decoder */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index 0f6d2d891..af1080de0 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -150,11 +150,7 @@ void open_decoder_LPD( { st->gamma = GAMMA16k; } -#ifdef NONBE_FIX_1028_1DB_TCX_LEVEL_DROP - else if ( st->element_mode > EVS_MONO && st->sr_core > INT_FS_16k ) -#else else if ( st->sr_core > INT_FS_16k && st->element_mode == IVAS_CPE_MDCT ) -#endif { st->gamma = GAMMA16k; } -- GitLab From 0c2a4ffa583f04300206983c9005bbf6b51d21ed Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 4 Aug 2025 14:21:02 +0200 Subject: [PATCH 4/4] fix merge issue --- lib_dec/ivas_omasa_dec.c | 46 ++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index ea9701312..2fe0fa9c3 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -200,11 +200,7 @@ ivas_error ivas_omasa_dec_config( void *data /* o : output synthesis signal */ ) { -#ifdef NONBE_FIX_1065_ISM_MD_HANDLE - int16_t k, sce_id, nSCE_old, nchan_hp20_old, numCldfbAnalyses_old, numCldfbSyntheses_old; -#else int16_t k, sce_id, nSCE_old, nchan_hp20_old, numCldfbAnalyses_old, numCldfbSyntheses_old, n_MD; -#endif int32_t ivas_total_brate, ism_total_brate, cpe_brate; ISM_MODE ism_mode_old; IVAS_FORMAT ivas_format_orig; @@ -296,27 +292,27 @@ ivas_error ivas_omasa_dec_config( if ( ism_mode_old != st_ivas->ism_mode ) { /* ISM MD reconfig. */ -#ifdef NONBE_FIX_1065_ISM_MD_HANDLE - if ( st_ivas->hIsmMetaData[0] == NULL ) + n_MD = 0; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { - if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + /* the full number of hIsmMetaData are needed for EXT output */ +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + if ( st_ivas->hIsmMetaData[0] == NULL ) { - return error; + if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } } - } - else - { - for ( k = 0; k < st_ivas->nchan_ism; k++ ) + else { - ivas_ism_reset_metadata_handle_dec( st_ivas->hIsmMetaData[k] ); + for ( k = 0; k < st_ivas->nchan_ism; k++ ) + { + ivas_ism_reset_metadata_handle_dec( st_ivas->hIsmMetaData[k] ); + } } - } #else - n_MD = 0; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT - if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) - { - /* the full number of hIsmMetaData are needed for EXT output */ n_MD = st_ivas->nchan_ism; ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) @@ -325,6 +321,7 @@ ivas_error ivas_omasa_dec_config( } ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); +#endif } else { @@ -339,13 +336,21 @@ ivas_error ivas_omasa_dec_config( return error; } } +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + else + { + ivas_ism_reset_metadata_handle_dec( st_ivas->hIsmMetaData[0] ); + } +#endif } else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { n_MD = st_ivas->nchan_ism; - ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); +#ifndef NONBE_FIX_1065_ISM_MD_HANDLE + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); +#endif if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) { return error; @@ -380,7 +385,6 @@ ivas_error ivas_omasa_dec_config( } ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); -#endif #endif st_ivas->hCPE[0]->element_brate = ivas_total_brate - ism_total_brate; -- GitLab