From 7c904518cb9b37d35ad92dc0d47d725e6fae6cb0 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 15 Apr 2024 17:16:08 +0200 Subject: [PATCH 1/3] issue 1065: Allocate only the necessary number of ISM MD decoder handles; under NONBE_FIX_1065_ISM_MD_HANDLE --- lib_com/ivas_prot.h | 10 +++++ lib_com/options.h | 1 + lib_dec/ivas_init_dec.c | 22 +++++++++- lib_dec/ivas_ism_metadata_dec.c | 72 ++++++++++++++++++++++++++++++--- lib_dec/ivas_omasa_dec.c | 13 ++++++ 5 files changed, 110 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 757db691e9..7a8ebafe55 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -981,10 +981,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 0799f2bf16..7fa90e4753 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -176,6 +176,7 @@ #define NON_BE_FIX_1048_THRESHOLD_COH_BASOP /* Nokia: Fix 1048 replace comparison with 0 with comparison to threshold, to align with BASOP*/ #define NONBE_FIX_1054_NEGATIVE_LVQ_INDEX /* Nokia: issue 1054: Input to decode_comb in deindex_lvq_SHB should be positive */ #define NONBE_FIX_1063_DIV_BY_ZERO_SUMNRG /* VoiceAge: issue 1063: division by zero for angle_rot feature in the UNCLR classifier */ +#define NONBE_FIX_1065_ISM_MD_HANDLE /* VA: issue 1065: Allocate only the necessary number of ISM MD decoder handles. */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 4fb2f78a2e..d91be7e640 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1336,7 +1336,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; } @@ -1670,10 +1674,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 a6f145d6b5..0cd6bcd7c5 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,22 +684,40 @@ 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 */ - int32_t element_brate_tmp[] /* o : element bitrate per object */ + 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 */ ) { int16_t ch; ivas_error error; - /* allocate ISM metadata handles */ +/* 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,7 +735,15 @@ 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 + for ( ; ch < MAX_NUM_OBJECTS; ch++ ) + { + st_ivas->hIsmMetaData[ch] = NULL; } +#endif if ( element_brate_tmp != NULL ) { diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 7004538730..432eb6f272 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -300,6 +300,12 @@ ivas_error ivas_omasa_dec_config( if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { /* the full number of hIsmMetaData are needed for EXT output */ +#ifdef NONBE_FIX_1065_ISM_MD_HANDLE + for ( k = 0; k < st_ivas->nchan_ism; k++ ) + { + ivas_ism_reset_metadata_handle_dec( st_ivas->hIsmMetaData[k] ); + } +#else n_MD = st_ivas->nchan_ism; ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); @@ -309,6 +315,7 @@ ivas_error ivas_omasa_dec_config( } ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); +#endif } else { @@ -323,6 +330,12 @@ 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 ) { -- GitLab From a77e2ce1b6cb1bf7a71d23f324f1f5ff845c500f Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 Apr 2024 08:55:47 +0200 Subject: [PATCH 2/3] fix OMASA switching from NONE to DISC mode in EXT output; within NONBE_FIX_1065_ISM_MD_HANDLE --- lib_dec/ivas_omasa_dec.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 432eb6f272..1a77ad510f 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -301,9 +301,19 @@ ivas_error ivas_omasa_dec_config( { /* the full number of hIsmMetaData are needed for EXT output */ #ifdef NONBE_FIX_1065_ISM_MD_HANDLE - for ( k = 0; k < st_ivas->nchan_ism; k++ ) + if ( st_ivas->hIsmMetaData[0] == NULL ) { - ivas_ism_reset_metadata_handle_dec( st_ivas->hIsmMetaData[k] ); + 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 = st_ivas->nchan_ism; @@ -341,8 +351,9 @@ ivas_error ivas_omasa_dec_config( { n_MD = st_ivas->nchan_ism; +#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; -- GitLab From b488aafdb9c0bce21c651ca6aa79518f2c6d70de Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 17 Apr 2024 11:04:21 +0200 Subject: [PATCH 3/3] fix: adding the freeing of possibly non-NULL entries --- lib_dec/ivas_ism_metadata_dec.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 0cd6bcd7c5..bd7a906e20 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -739,9 +739,14 @@ ivas_error ivas_ism_metadata_dec_create( } #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++ ) { - st_ivas->hIsmMetaData[ch] = NULL; + if ( st_ivas->hIsmMetaData[ch] != NULL ) + { + free( st_ivas->hIsmMetaData[ch] ); + st_ivas->hIsmMetaData[ch] = NULL; + } } #endif -- GitLab