From 864bb2a8cb72478173a5c7191d80ebedbb38fa2e Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 19 Aug 2025 13:24:07 +0200 Subject: [PATCH] port MR --- lib_com/ivas_prot.h | 4 ++ lib_com/options.h | 1 + lib_dec/ivas_init_dec.c | 20 +++++++ lib_dec/ivas_ism_renderer.c | 13 +++- lib_dec/ivas_masa_dec.c | 4 ++ lib_dec/ivas_omasa_dec.c | 41 +++++++++++++ lib_dec/ivas_stat_dec.h | 2 + lib_enc/ivas_masa_enc.c | 115 +++++++++++++++++++++++++++++++++++- lib_enc/ivas_omasa_enc.c | 54 +++++++++++++++++ lib_enc/ivas_stat_enc.h | 16 ++++- 10 files changed, 266 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 40e1eb23c..6a7fc8804 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5801,7 +5801,11 @@ void ivas_omasa_combine_separate_ism_with_masa( const int16_t output_frame /* i : output frame length per channel */ ); +#ifdef FIX_1161_REDUCE_OMASA_HEAP +ivas_error ivas_omasa_objects_delay_open( +#else ivas_error ivas_omasa_render_objects_from_mix_open( +#endif Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 9bf81d6e7..5b3259d44 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,6 +164,7 @@ #define FIX_1053_REVERB_RECONFIGURATION /* Philips: issue 1053: fix for dynamic switching of acoustic environment */ #define NONBE_FIX_ISM_XOVER_BR /* FhG: issue 1072: select OSBA coding method depending on number of object and bitrate */ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nok: issue 1497 - porting OMASA EXT MR */ +#define FIX_1161_REDUCE_OMASA_HEAP /* VA: reduction of OMASA heap memory */ #define CONF_DISTATT /* Eri: Make distance attenuation configurable */ #define FIX_1052_EXT_OUTPUT /* VA: issue 1052: define EXT decoder output configuration for stereo and MC formats */ #define NONBE_1215_FIX_JBM_MAX_SCALING /* FhG: issue 1215: Fix assert hit in a specific VoIP decoder config. Caused by integer overflow in max scaling calculation. */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b85eaf083..257190e90 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2004,16 +2004,31 @@ ivas_error ivas_init_decoder( } } +#ifdef FIX_1161_REDUCE_OMASA_HEAP + /* Allocate memory for delay buffer within 'hMasaIsmData' */ + if ( ( error = ivas_omasa_objects_delay_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#else /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif } if ( st_ivas->renderer_type == RENDERER_DIRAC && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) { /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( ( error = ivas_omasa_objects_delay_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -2023,7 +2038,12 @@ ivas_error ivas_init_decoder( if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( ( error = ivas_omasa_objects_delay_open( st_ivas ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_omasa_render_objects_from_mix_open( st_ivas ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 13efffa52..19338aa72 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -348,7 +348,7 @@ void ivas_ism_get_stereo_gains( /*-------------------------------------------------------------------------* - * ivas_masa_oism_separate_object_renderer_open() + * ivas_omasa_separate_object_renderer_open() * * Open structures, reserve memory, and init values. *-------------------------------------------------------------------------*/ @@ -373,7 +373,15 @@ ivas_error ivas_omasa_separate_object_renderer_open( init_interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ); interpolator_length = init_interpolator_length; + +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( ( st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM renderer interpolator \n" ) ); + } +#else st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length ); +#endif for ( i = 0; i < interpolator_length; i++ ) { @@ -381,6 +389,7 @@ ivas_error ivas_omasa_separate_object_renderer_open( } st_ivas->hIsmRendererData->interpolator_length = interpolator_length; +#ifndef FIX_1161_REDUCE_OMASA_HEAP st_ivas->hMasaIsmData->delayBuffer_size = (int16_t) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) @@ -405,7 +414,7 @@ ivas_error ivas_omasa_separate_object_renderer_open( } set_zero( st_ivas->hMasaIsmData->delayBuffer[i], st_ivas->hMasaIsmData->delayBuffer_size ); } - +#endif return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 625a15b96..408318a34 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -909,7 +909,11 @@ static ivas_error ivas_masa_dec_config( for ( i = 0; i < st_ivas->hQMetaData->no_directions; i++ ) { st_ivas->hQMetaData->q_direction[i].cfg.nbands = hMasa->config.numCodingBands; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + st_ivas->hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; +#else st_ivas->hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : 4; +#endif if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) { diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 8ea139fa8..6777981bf 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -429,11 +429,19 @@ ivas_error ivas_omasa_dec_config( } } +#ifdef FIX_1161_REDUCE_OMASA_HEAP + /* Allocate memory for delay buffer within 'hMasaIsmData' */ + if ( ( error = ivas_omasa_objects_delay_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#else /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif } else { @@ -457,6 +465,13 @@ ivas_error ivas_omasa_dec_config( if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( ( error = ivas_omasa_objects_delay_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -483,7 +498,11 @@ ivas_error ivas_omasa_dec_config( DIRAC_CONFIG_FLAG common_rend_config_flag = st_ivas->hSpatParamRendCom == NULL ? DIRAC_OPEN : DIRAC_RECONFIGURE; /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( ( error = ivas_omasa_objects_delay_open( st_ivas ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_omasa_render_objects_from_mix_open( st_ivas ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1060,6 +1079,16 @@ void ivas_omasa_combine_separate_ism_with_masa( return; } + +#ifdef FIX_1161_REDUCE_OMASA_HEAP +/*-------------------------------------------------------------------------* + * ivas_omasa_objects_delay_open() + * + * Open structures, reserve memory, and init values for dela buffers of objects. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_objects_delay_open( +#else /*-------------------------------------------------------------------------* * ivas_omasa_render_objects_from_mix_open() * @@ -1067,12 +1096,24 @@ void ivas_omasa_combine_separate_ism_with_masa( *-------------------------------------------------------------------------*/ ivas_error ivas_omasa_render_objects_from_mix_open( +#endif Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { int16_t i; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + st_ivas->hMasaIsmData->delayBuffer_nchan = 1; + } + else + { + st_ivas->hMasaIsmData->delayBuffer_nchan = st_ivas->nchan_ism; + } +#else st_ivas->hMasaIsmData->delayBuffer_nchan = 1; +#endif st_ivas->hMasaIsmData->delayBuffer_size = (int16_t) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ae12ff552..c084ac2ce 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -894,6 +894,7 @@ typedef struct ivas_masa_ism_ext_data_structure float masa_render_proto_energy[CLDFB_NO_CHANNELS_MAX]; float masa_render_target_energy[CLDFB_NO_CHANNELS_MAX]; float masa_render_masa_to_total[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR][CLDFB_NO_CHANNELS_MAX]; + } MASA_ISM_EXT_DATA, *MASA_ISM_EXT_DATA_HANDLE; #endif @@ -930,6 +931,7 @@ typedef struct ivas_masa_ism_data_structure #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_ISM_EXT_DATA_HANDLE hExtData; #endif + } MASA_ISM_DATA, *MASA_ISM_DATA_HANDLE; diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index ea4ddd05c..164c2d5d4 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -174,6 +174,20 @@ ivas_error ivas_masa_enc_open( hOmasaData->lp_noise_CPE = -1; hOmasaData->omasa_stereo_sw_cnt = OMASA_STEREO_SW_CNT_MAX; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + if ( ( hOmasaData->hOmasaEnergy = (OMASA_ENCODER_ENERGY_HANDLE) malloc( sizeof( OMASA_ENCODER_ENERGY_STATE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA energy handle\n" ) ); + } + } + else + { + hOmasaData->hOmasaEnergy = NULL; + } +#endif + hMasa->data.hOmasaData = hOmasaData; } else @@ -211,6 +225,14 @@ void ivas_masa_enc_close( if ( ( *hMasa )->data.hOmasaData != NULL ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( ( *hMasa )->data.hOmasaData->hOmasaEnergy != NULL ) + { + free( ( *hMasa )->data.hOmasaData->hOmasaEnergy ); + ( *hMasa )->data.hOmasaData->hOmasaEnergy = NULL; + } + +#endif free( ( *hMasa )->data.hOmasaData ); ( *hMasa )->data.hOmasaData = NULL; } @@ -860,7 +882,11 @@ ivas_error ivas_masa_enc_config( for ( i = 0; i < hQMetaData->no_directions; i++ ) { hQMetaData->q_direction[i].cfg.nbands = hMasa->config.numCodingBands; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; +#else hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : 4; +#endif if ( ivas_format == MC_FORMAT ) { @@ -1373,7 +1399,11 @@ static void move_metadata_to_qmetadata( numCodingBands = hMasa->config.numCodingBands; numDirections = hMasa->config.numberOfDirections; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + numSf = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; +#else numSf = hMasa->config.joinedSubframes == TRUE ? 1 : 4; +#endif hMeta = &( hMasa->masaMetadata ); for ( dir = 0; dir < numDirections; dir++ ) @@ -2670,9 +2700,17 @@ void ivas_merge_masa_metadata( float eneBand; float energyMerged[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy = hMasa->data.hOmasaData->hOmasaEnergy; +#endif + numCodingBands = hMasa->config.numCodingBands; numDirections = hMasa->config.numberOfDirections; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + numSf = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; +#else numSf = hMasa->config.joinedSubframes == TRUE ? 1 : 4; +#endif hMeta = &( hMasa->masaMetadata ); for ( sf = 0; sf < numSf; sf++ ) @@ -2693,7 +2731,11 @@ void ivas_merge_masa_metadata( /* Compute energies */ eneBand = hMasa->data.energy[sf][band]; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + energyMerged[sf][band] = eneBand + hOmasaEnergy->energy_ism[sf][band]; +#else energyMerged[sf][band] = eneBand + hMasa->data.hOmasaData->energy_ism[sf][band]; +#endif /* Compute weights */ energyTimesRatioMASA[0] = eneBand * hMeta->directional_meta[0].energy_ratio[sf][band]; @@ -2710,7 +2752,11 @@ void ivas_merge_masa_metadata( total_diff_nrg = eneBand * hMeta->common_meta.diffuse_to_total_ratio[sf][band]; /* criterion is mean of ISM ratio and new ratio */ +#ifdef FIX_1161_REDUCE_OMASA_HEAP + energyTimesRatioISM = ( hOMasaMeta->directional_meta[0].energy_ratio[sf][band] + ( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hOmasaEnergy->energy_ism[sf][band] ) ) ) / 2.0f * hOmasaEnergy->energy_ism[sf][band]; +#else energyTimesRatioISM = ( hOMasaMeta->directional_meta[0].energy_ratio[sf][band] + ( 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] ) ) ) / 2.0f * hMasa->data.hOmasaData->energy_ism[sf][band]; +#endif /* Determine combined metadata based on the weights */ merge_dest = -1; @@ -2730,8 +2776,13 @@ void ivas_merge_masa_metadata( { hMeta->directional_meta[merge_dest].azimuth[sf][band] = hOMasaMeta->directional_meta[0].azimuth[sf][band]; hMeta->directional_meta[merge_dest].elevation[sf][band] = hOMasaMeta->directional_meta[0].elevation[sf][band]; + /* limit with the earlier direct-energy ratio */ - dir_sum = 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] ); /* new dir ratio */ +#ifdef FIX_1161_REDUCE_OMASA_HEAP + dir_sum = 1.0f - total_diff_nrg / ( EPSILON + eneBand + hOmasaEnergy->energy_ism[sf][band] ); /* new dir ratio */ +#else + dir_sum = 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->energy_ism[sf][band] ); /* new dir ratio */ +#endif hMeta->directional_meta[merge_dest].energy_ratio[sf][band] = min( dir_sum, hOMasaMeta->directional_meta[0].energy_ratio[sf][band] ); /* clip with original ISM dir */ hMeta->common_meta.diffuse_to_total_ratio[sf][band] = 1.0f - hMeta->directional_meta[merge_dest].energy_ratio[sf][band]; @@ -3446,6 +3497,9 @@ static void ivas_encode_masaism_metadata( int16_t tmp, rotate; int16_t n_ism_tmp, i; OMASA_ENCODER_DATA_HANDLE hOmasaData = hMasa->data.hOmasaData; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy = hOmasaData->hOmasaEnergy; +#endif int16_t nbands_work; /* use the values from hQMetaData */ @@ -3456,7 +3510,11 @@ static void ivas_encode_masaism_metadata( { for ( sf = 0; sf < numSf; sf++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( sum_f( hOmasaEnergy->energy_ism[sf], omasa_nbands ) == 0.0f ) +#else if ( sum_f( hOmasaData->energy_ism[sf], omasa_nbands ) == 0.0f ) +#endif { hOmasaData->masa_to_total_energy_ratio[sf][0] = 1.0f; } @@ -3478,16 +3536,29 @@ static void ivas_encode_masaism_metadata( for ( band = 0; band < omasa_nbands; band++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + energy_ism += hOmasaEnergy->energy_ism[sf][band]; +#else energy_ism += hOmasaData->energy_ism[sf][band]; +#endif + for ( obj = 0; obj < nchan_ism; obj++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + energy_ism_ind[obj] += hOmasaEnergy->energy_ism[sf][band] * hOmasaEnergy->energy_ratio_ism[sf][band][obj]; +#else energy_ism_ind[obj] += hOmasaData->energy_ism[sf][band] * hOmasaData->energy_ratio_ism[sf][band][obj]; +#endif } } for ( obj = 0; obj < nchan_ism; obj++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaEnergy->energy_ratio_ism[sf][0][obj] = energy_ism_ind[obj] / energy_ism; +#else hOmasaData->energy_ratio_ism[sf][0][obj] = energy_ism_ind[obj] / energy_ism; +#endif } hOmasaData->masa_to_total_energy_ratio[sf][0] = eneBand / ( eneBand + energy_ism + EPSILON ); } @@ -3504,10 +3575,18 @@ static void ivas_encode_masaism_metadata( } for ( sf = 0; sf < omasa_nblocks; sf++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + energy_ism += hOmasaEnergy->energy_ism[sf][band]; +#else energy_ism += hOmasaData->energy_ism[sf][band]; +#endif for ( obj = 0; obj < nchan_ism; obj++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + energy_ism_ind[obj] += hOmasaEnergy->energy_ism[sf][band] * hOmasaEnergy->energy_ratio_ism[sf][band][obj]; +#else energy_ism_ind[obj] += hOmasaData->energy_ism[sf][band] * hOmasaData->energy_ratio_ism[sf][band][obj]; +#endif } } @@ -3519,7 +3598,11 @@ static void ivas_encode_masaism_metadata( { for ( obj = 0; obj < nchan_ism; obj++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaEnergy->energy_ratio_ism[0][band][obj] = energy_ism_ind[obj] / energy_ism; +#else hOmasaData->energy_ratio_ism[0][band][obj] = energy_ism_ind[obj] / energy_ism; +#endif } brange[0] = hMasa->data.band_mapping[band]; brange[1] = hMasa->data.band_mapping[band + 1]; @@ -3541,7 +3624,11 @@ static void ivas_encode_masaism_metadata( for ( obj = 0; obj < nchan_ism; obj++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaEnergy->energy_ratio_ism[0][band][obj] = hOmasaEnergy->energy_ratio_ism[0][nbands_work - 1][obj]; +#else hOmasaData->energy_ratio_ism[0][band][obj] = hOmasaData->energy_ratio_ism[0][nbands_work - 1][obj]; +#endif } } } @@ -3551,7 +3638,11 @@ static void ivas_encode_masaism_metadata( { for ( band = 0; band < nbands_work; band++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + if ( hOmasaEnergy->energy_ism[sf][band] == 0.0f ) +#else if ( hOmasaData->energy_ism[sf][band] == 0.0f ) +#endif { hOmasaData->masa_to_total_energy_ratio[sf][band] = 1.0f; } @@ -3565,7 +3656,11 @@ static void ivas_encode_masaism_metadata( { eneBand += hMasa->data.energy[sf][bin]; } +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaData->masa_to_total_energy_ratio[sf][band] = eneBand / ( eneBand + hOmasaEnergy->energy_ism[sf][band] + EPSILON ); +#else hOmasaData->masa_to_total_energy_ratio[sf][band] = eneBand / ( eneBand + hOmasaData->energy_ism[sf][band] + EPSILON ); +#endif } } for ( band = nbands_work; band < numCodingBands; band++ ) @@ -3574,7 +3669,11 @@ static void ivas_encode_masaism_metadata( for ( obj = 0; obj < nchan_ism; obj++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaEnergy->energy_ratio_ism[sf][band][obj] = hOmasaEnergy->energy_ratio_ism[sf][nbands_work - 1][obj]; +#else hOmasaData->energy_ratio_ism[sf][band][obj] = hOmasaData->energy_ratio_ism[sf][nbands_work - 1][obj]; +#endif } } } @@ -3596,8 +3695,13 @@ static void ivas_encode_masaism_metadata( { for ( obj = 0; obj < nchan_ism; obj++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + assert( ( hOmasaEnergy->energy_ratio_ism[sf][band][obj] >= 0 ) && ( hOmasaEnergy->energy_ratio_ism[sf][band][obj] <= 1 ) ); + ratio_ism[band][obj] = hOmasaEnergy->energy_ratio_ism[sf][band][obj]; +#else assert( ( hOmasaData->energy_ratio_ism[sf][band][obj] >= 0 ) && ( hOmasaData->energy_ratio_ism[sf][band][obj] <= 1 ) ); ratio_ism[band][obj] = hOmasaData->energy_ratio_ism[sf][band][obj]; +#endif } /* Quantize ISM ratios */ @@ -3621,7 +3725,11 @@ static void ivas_encode_masaism_metadata( } /* reconstructed values */ +#ifdef FIX_1161_REDUCE_OMASA_HEAP + reconstruct_ism_ratios( ratio_ism_idx[band], nchan_ism, step, hOmasaEnergy->q_energy_ratio_ism[sf][band] ); +#else reconstruct_ism_ratios( ratio_ism_idx[band], nchan_ism, step, hMasa->data.hOmasaData->q_energy_ratio_ism[sf][band] ); +#endif } if ( ( nchan_ism > 2 ) && ( idx_separated_object == nchan_ism - 1 ) ) @@ -3696,7 +3804,12 @@ static void ivas_encode_masaism_metadata( } } + +#ifdef FIX_1161_REDUCE_OMASA_HEAP + calculate_nbits_meta( nchan_ism, hOmasaEnergy->q_energy_ratio_ism, hOmasaData->masa_to_total_energy_ratio, numSf, numCodingBands, bits_ism, idx_separated_object, ism_imp ); +#else calculate_nbits_meta( nchan_ism, hOmasaData->q_energy_ratio_ism, hOmasaData->masa_to_total_energy_ratio, numSf, numCodingBands, bits_ism, idx_separated_object, ism_imp ); +#endif /* quantize directions */ for ( obj = 0; obj < nchan_ism; obj++ ) diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 2421144a8..399ad301b 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -276,6 +276,7 @@ ivas_error ivas_omasa_enc_config( ivas_write_format( st_ivas ); + /* OMASA encoder handle */ if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->hOMasa == NULL ) { if ( ( error = ivas_omasa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) @@ -289,6 +290,22 @@ ivas_error ivas_omasa_enc_config( st_ivas->hOMasa = NULL; } +#ifdef FIX_1161_REDUCE_OMASA_HEAP + /* OMASA energy handle */ + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->hMasa->data.hOmasaData->hOmasaEnergy == NULL ) + { + if ( ( st_ivas->hMasa->data.hOmasaData->hOmasaEnergy = (OMASA_ENCODER_ENERGY_HANDLE) malloc( sizeof( OMASA_ENCODER_ENERGY_STATE ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA energy handle\n" ) ); + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->hMasa->data.hOmasaData->hOmasaEnergy != NULL ) + { + free( st_ivas->hMasa->data.hOmasaData->hOmasaEnergy ); + st_ivas->hMasa->data.hOmasaData->hOmasaEnergy = NULL; + } + +#endif st_ivas->hCPE[0]->element_brate = ivas_total_brate - ism_total_brate; if ( ivas_total_brate - ism_total_brate >= MIN_BRATE_MDCT_STEREO ) @@ -822,6 +839,9 @@ static void ivas_omasa_param_est_enc( float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; float norm_tmp; int16_t mrange[2], brange[2]; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy = hOmasaData->hOmasaEnergy; +#endif num_freq_bins = hOMasa->cldfbAnaEnc[0]->no_channels; num_freq_bands = hOMasa->nbands; @@ -853,7 +873,11 @@ static void ivas_omasa_param_est_enc( hOMasa->direction_vector_m[2][block_m_idx][band_m_idx] = 0.0f; } +#ifdef FIX_1161_REDUCE_OMASA_HEAP + set_zero( hOmasaEnergy->energy_ism[block_m_idx], num_freq_bands ); +#else set_zero( hOmasaData->energy_ism[block_m_idx], num_freq_bands ); +#endif for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { @@ -871,7 +895,11 @@ static void ivas_omasa_param_est_enc( { for ( k = 0; k < nchan_ism; k++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaEnergy->energy_ism[block_m_idx][i] += Chnl_RealBuffer[k][j] * Chnl_RealBuffer[k][j] + Chnl_ImagBuffer[k][j] * Chnl_ImagBuffer[k][j]; +#else hOmasaData->energy_ism[block_m_idx][i] += Chnl_RealBuffer[k][j] * Chnl_RealBuffer[k][j] + Chnl_ImagBuffer[k][j] * Chnl_ImagBuffer[k][j]; +#endif } } } @@ -999,6 +1027,9 @@ static void ivas_omasa_energy_and_ratio_est( int16_t mrange[2], brange[2]; float tftile_energy; float ism_ratio_sum; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy = hOmasaData->hOmasaEnergy; +#endif num_freq_bands = hOMasa->nbands; l_ts = input_frame / CLDFB_NO_COL_MAX; @@ -1012,9 +1043,18 @@ static void ivas_omasa_energy_and_ratio_est( /* Reset variable */ for ( i = 0; i < hOMasa->nbands; i++ ) { + +#ifdef FIX_1161_REDUCE_OMASA_HEAP + set_zero( hOmasaEnergy->energy_ratio_ism[block_m_idx][i], nchan_ism ); +#else set_zero( hOmasaData->energy_ratio_ism[block_m_idx][i], nchan_ism ); +#endif } +#ifdef FIX_1161_REDUCE_OMASA_HEAP + set_zero( hOmasaEnergy->energy_ism[block_m_idx], num_freq_bands ); +#else set_zero( hOmasaData->energy_ism[block_m_idx], num_freq_bands ); +#endif /* Compute CLDFB */ for ( ts = mrange[0]; ts < mrange[1]; ts++ ) @@ -1034,8 +1074,13 @@ static void ivas_omasa_energy_and_ratio_est( for ( k = 0; k < nchan_ism; k++ ) { tftile_energy = Chnl_RealBuffer[k][j] * Chnl_RealBuffer[k][j] + Chnl_ImagBuffer[k][j] * Chnl_ImagBuffer[k][j]; +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaEnergy->energy_ism[block_m_idx][i] += tftile_energy; + hOmasaEnergy->energy_ratio_ism[block_m_idx][i][k] += tftile_energy; +#else hOmasaData->energy_ism[block_m_idx][i] += tftile_energy; hOmasaData->energy_ratio_ism[block_m_idx][i][k] += tftile_energy; +#endif } } } @@ -1047,8 +1092,13 @@ static void ivas_omasa_energy_and_ratio_est( ism_ratio_sum = 0.0f; for ( j = 0; j < nchan_ism; j++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaEnergy->energy_ratio_ism[block_m_idx][i][j] /= ( hOmasaEnergy->energy_ism[block_m_idx][i] + EPSILON ); + ism_ratio_sum += hOmasaEnergy->energy_ratio_ism[block_m_idx][i][j]; +#else hOmasaData->energy_ratio_ism[block_m_idx][i][j] /= ( hOmasaData->energy_ism[block_m_idx][i] + EPSILON ); ism_ratio_sum += hOmasaData->energy_ratio_ism[block_m_idx][i][j]; +#endif } if ( ism_ratio_sum == 0.0f ) @@ -1056,7 +1106,11 @@ static void ivas_omasa_energy_and_ratio_est( float temp_ism_ratio = 1.0f / ( (float) nchan_ism ); for ( j = 0; j < nchan_ism; j++ ) { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + hOmasaEnergy->energy_ratio_ism[block_m_idx][i][j] = temp_ism_ratio; +#else hOmasaData->energy_ratio_ism[block_m_idx][i][j] = temp_ism_ratio; +#endif } } } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 7359a8aef..4778c2eee 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -798,12 +798,26 @@ typedef struct ivas_omasa_enc_state_structure } OMASA_ENC_STATE, *OMASA_ENC_HANDLE; +#ifdef FIX_1161_REDUCE_OMASA_HEAP +typedef struct ivas_omasa_encoder_energy_struct +{ + float energy_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; + float q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; -typedef struct ivas_omasa_encoder_one_data_struct +} OMASA_ENCODER_ENERGY_STATE, *OMASA_ENCODER_ENERGY_HANDLE; + +#endif + +typedef struct ivas_omasa_encoder_data_struct { +#ifdef FIX_1161_REDUCE_OMASA_HEAP + OMASA_ENCODER_ENERGY_HANDLE hOmasaEnergy; +#else float energy_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; float q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; +#endif float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float lp_noise_CPE; /* LP filtered total noise estimation */ int16_t omasa_stereo_sw_cnt; -- GitLab