diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index da1f94daed5a69eaa5f80a59373a24e12a5611e9..10d35eab496e8108ad45c19810a012bdb07bf12a 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5784,7 +5784,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 f76010a86c55f525f6fd7172cbfdb5f00c6516b4..02e3d0df8e53062fa6dcfc4d5a60c875cbd5c4f2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -182,6 +182,7 @@ #define FIX_1158_FASTCONV_REVERB_HRTF /* Philips: issue 1158: Rendering with FastConv to BINAURAL_ROOM_REVERB uses BRIR convolution instead of HRTF */ #define FIX_1166_TDREND_DIV0 /* FhG,Eri: issue 1166: potential divide by zero in TD Renderer */ #define FIX_835_PARAMMC_BUFFER_VALUES /* FhG: BASOP issue 835: wide range of buffer values for cx in ParamMC */ +#define FIX_1161_REDUCE_OMASA_HEAP /* VA: reduction of OMASA heap memory */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 3930c3b2c1ce17a8fde3c3b81fce7a620cc517c5..edd3ed644e8f3425cacc207c792fe5ff5bedb4b1 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1898,17 +1898,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; @@ -1918,7 +1932,11 @@ 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 ae6e4523137882bfa65a821847b20815ce7c2530..daefbfbdccb484dec6dcabcccc5406385853a294 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -354,7 +354,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. *-------------------------------------------------------------------------*/ @@ -379,7 +379,14 @@ 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++ ) { @@ -387,6 +394,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 ) @@ -412,6 +420,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 436517639dd6c8ae14c11e8cacda9395099caae8..c18369d1f675d18e8eb762e61f1e2db7ed5befb7 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -869,7 +869,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 8164c2aa656d8a5c586ebdc4cc0ea77ddf71f3c2..c38f9bc174b1c29eb3687224815f76b760cc68ae 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -445,11 +445,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 { @@ -473,6 +481,12 @@ 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; @@ -499,7 +513,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; } @@ -1102,6 +1120,15 @@ void ivas_omasa_combine_separate_ism_with_masa( } +#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() * @@ -1109,12 +1136,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_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 54691e864e63e6cc5b2af98591b2616953961814..480838848f6907a2bce6879f027239437d37c114 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; } @@ -816,7 +838,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 ) { @@ -1329,7 +1355,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++ ) @@ -2621,10 +2651,17 @@ void ivas_merge_masa_metadata( float total_diff_nrg; 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++ ) @@ -2645,7 +2682,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]; @@ -2662,7 +2703,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 * hMasa->data.hOmasaData->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; @@ -2682,8 +2727,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]; @@ -3398,6 +3448,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 */ @@ -3408,7 +3461,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; } @@ -3430,16 +3487,28 @@ 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 ); } @@ -3456,10 +3525,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 } } @@ -3471,7 +3548,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]; @@ -3493,7 +3574,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 } } } @@ -3503,7 +3588,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; } @@ -3517,7 +3606,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++ ) @@ -3526,7 +3619,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 } } } @@ -3548,8 +3645,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 */ @@ -3573,7 +3675,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 ) ) @@ -3648,7 +3754,11 @@ 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 b9bb5981cd6be64318e93e7693de4a5e040b75fc..4e184d59a5de505bf34f9617161b5778d101a2af 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,17 @@ 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 +1073,14 @@ 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 3962ac055f232389b780a957c227cd5a3bd203be..f0284ff7882568f3d1242f71e0e79b0a6378447d 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -794,12 +794,25 @@ 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;