Commit 9147c5f0 authored by vaclav's avatar vaclav
Browse files

reduction of OMASA heap memory; under FIX_1161_REDUCE_OMASA_HEAP

parent f3dbf5db
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -175,6 +175,7 @@
#define FIX_1157_OBSOLETE_DMX_TABLE                     /* FhG: remove obsolte ParamMC DMX table ivas_param_mc_dmx_fac_CICP19_4tc[] */
#define FIX_1135_EXT_RENDERER_HANDLES                   /* VA: issue 1135: Memory usage reduction in external renderer: Allocate only handles that are really needed. */
#define FIX_1159_SPLIT_RENDERING_CONFIG                 /* VA: issue 1159: Execute split rendering config only for split rendering outputs. */
#define FIX_1161_REDUCE_OMASA_HEAP                      /* VA: reduction of OMASA heap memory */

/* #################### End BE switches ################################## */

+13 −0
Original line number Diff line number Diff line
@@ -1884,15 +1884,28 @@ ivas_error ivas_init_decoder(
            }

            /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */
#ifdef FIX_1161_REDUCE_OMASA_HEAP
            if ( ( error = ivas_omasa_render_objects_from_mix_open( st_ivas ) ) != IVAS_ERR_OK )
            {
                return error;
            }
#else
            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_render_objects_from_mix_open( st_ivas ) ) != IVAS_ERR_OK )
            {
                return error;
            }
#endif
            if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK )
            {
                return error;
+9 −0
Original line number Diff line number Diff line
@@ -368,7 +368,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++ )
    {
@@ -376,6 +383,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 )
@@ -401,6 +409,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;
}

+24 −0
Original line number Diff line number Diff line
@@ -394,10 +394,17 @@ ivas_error ivas_omasa_dec_config(
                }

                /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                if ( ( error = ivas_omasa_render_objects_from_mix_open( st_ivas ) ) != IVAS_ERR_OK )
                {
                    return error;
                }
#else
                if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK )
                {
                    return error;
                }
#endif
            }
            else
            {
@@ -421,6 +428,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_render_objects_from_mix_open( st_ivas ) ) != IVAS_ERR_OK )
                {
                    return error;
                }
#endif
                if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK )
                {
                    return error;
@@ -1031,7 +1044,18 @@ ivas_error ivas_omasa_render_objects_from_mix_open(
{
    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 );

+93 −1
Original line number Diff line number Diff line
@@ -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
@@ -209,6 +223,14 @@ void ivas_masa_enc_close(
        deleteCldfb( &( ( *hMasa )->data.cldfbAnaEnc[i] ) );
    }

#ifdef FIX_1161_REDUCE_OMASA_HEAP
    if ( ( *hMasa )->data.hOmasaData->hOmasaEnergy != NULL )
    {
        free( ( *hMasa )->data.hOmasaData->hOmasaEnergy );
        ( *hMasa )->data.hOmasaData->hOmasaEnergy = NULL;
    }

#endif
    if ( ( *hMasa )->data.hOmasaData != NULL )
    {
        free( ( *hMasa )->data.hOmasaData );
@@ -2645,7 +2667,11 @@ void ivas_merge_masa_metadata(

            /* Compute energies */
            eneBand = hMasa->data.energy[sf][band];
#ifdef FIX_1161_REDUCE_OMASA_HEAP
            energyMerged[sf][band] = eneBand + hMasa->data.hOmasaData->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 +2688,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 + hMasa->data.hOmasaData->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 +2712,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 */
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                dir_sum = 1.0f - total_diff_nrg / ( EPSILON + eneBand + hMasa->data.hOmasaData->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];

@@ -3408,7 +3443,11 @@ static void ivas_encode_masaism_metadata(
    {
        for ( sf = 0; sf < numSf; sf++ )
        {
#ifdef FIX_1161_REDUCE_OMASA_HEAP
            if ( sum_f( hOmasaData->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 +3469,28 @@ static void ivas_encode_masaism_metadata(

                for ( band = 0; band < omasa_nbands; band++ )
                {
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                    energy_ism += hOmasaData->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] += hOmasaData->hOmasaEnergy->energy_ism[sf][band] * hOmasaData->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
                    hOmasaData->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 +3507,18 @@ static void ivas_encode_masaism_metadata(
            }
            for ( sf = 0; sf < omasa_nblocks; sf++ )
            {
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                energy_ism += hOmasaData->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] += hOmasaData->hOmasaEnergy->energy_ism[sf][band] * hOmasaData->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 +3530,11 @@ static void ivas_encode_masaism_metadata(
            {
                for ( obj = 0; obj < nchan_ism; obj++ )
                {
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                    hOmasaData->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 +3556,11 @@ static void ivas_encode_masaism_metadata(

            for ( obj = 0; obj < nchan_ism; obj++ )
            {
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                hOmasaData->hOmasaEnergy->energy_ratio_ism[0][band][obj] = hOmasaData->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 +3570,11 @@ static void ivas_encode_masaism_metadata(
        {
            for ( band = 0; band < nbands_work; band++ )
            {
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                if ( hOmasaData->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 +3588,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 + hOmasaData->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 +3601,11 @@ static void ivas_encode_masaism_metadata(

                for ( obj = 0; obj < nchan_ism; obj++ )
                {
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                    hOmasaData->hOmasaEnergy->energy_ratio_ism[sf][band][obj] = hOmasaData->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 +3627,13 @@ static void ivas_encode_masaism_metadata(
            {
                for ( obj = 0; obj < nchan_ism; obj++ )
                {
#ifdef FIX_1161_REDUCE_OMASA_HEAP
                    assert( ( hOmasaData->hOmasaEnergy->energy_ratio_ism[sf][band][obj] >= 0 ) && ( hOmasaData->hOmasaEnergy->energy_ratio_ism[sf][band][obj] <= 1 ) );
                    ratio_ism[band][obj] = hOmasaData->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 +3657,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, hMasa->data.hOmasaData->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 +3736,11 @@ static void ivas_encode_masaism_metadata(
        }
    }

#ifdef FIX_1161_REDUCE_OMASA_HEAP
    calculate_nbits_meta( nchan_ism, hOmasaData->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++ )
Loading