Commit ec0998ee authored by Dominik Weckbecker's avatar Dominik Weckbecker 💬
Browse files

only allocate the larger DirAC buffers when in HO mode

parent f6916a5f
Loading
Loading
Loading
Loading
Loading
+66 −43
Original line number Diff line number Diff line
@@ -51,7 +51,12 @@
 * Local function prototypes
 *-----------------------------------------------------------------------*/

static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem );
static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem
#ifdef HODIRAC
                                        ,
                                        int16_t hodirac
#endif
);

static void ivas_dirac_free_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem );

@@ -879,7 +884,12 @@ ivas_error ivas_dirac_dec_config(
    {
        ivas_dirac_free_mem( &( hDirAC->stack_mem ) );
    }
    if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) ) ) != IVAS_ERR_OK )
    if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem )
#ifdef HODIRAC
										 ,
                                         st_ivas->sba_analysis_order > 1
#endif
	) ) != IVAS_ERR_OK )
    {
        return error;
    }
@@ -1326,9 +1336,18 @@ void ivas_dirac_dec_close(
static ivas_error ivas_dirac_alloc_mem(
    DIRAC_DEC_HANDLE hDirAC,
    const RENDERER_TYPE renderer_type,
    DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem )
    DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem 
#ifdef HODIRAC
	,
	int16_t hodirac
#endif
)
{
    int16_t num_freq_bands, num_freq_bands_diff, size;
#ifdef HODIRAC
    int16_t size_ho;
    int16_t size_pf;
#endif
    int16_t num_outputs_dir, num_outputs_diff;
    int16_t num_protos_dir;

@@ -1341,6 +1360,18 @@ static ivas_error ivas_dirac_alloc_mem(
    num_outputs_diff = hDirAC->num_outputs_diff;

    size = num_freq_bands * num_outputs_dir;
#ifdef HODIRAC
    if ( hodirac )
    {
        size_ho = size * DIRAC_HO_NUMSECTORS;
        size_pf = num_freq_bands * DIRAC_HO_NUMSECTORS;
    }
    else
    {
        size_ho = size;
        size_pf = num_freq_bands;
    }
#endif

    /* PSD related buffers */
    hDirAC_mem->cy_auto_dir_smooth = NULL;
@@ -1388,18 +1419,14 @@ static ivas_error ivas_dirac_alloc_mem(

    /* Target and smoothed nrg factors/gains */
#ifdef HODIRAC
    if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size * DIRAC_HO_NUMSECTORS ) ) == NULL )
    {
        return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
    }
    set_zero( hDirAC_mem->cy_cross_dir_smooth, size * DIRAC_HO_NUMSECTORS );
    if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL )
#else
    if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL )
#endif
    {
        return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
    }
    set_zero( hDirAC_mem->cy_cross_dir_smooth, size );
#endif

    if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD )
    {
@@ -1422,18 +1449,14 @@ static ivas_error ivas_dirac_alloc_mem(

    /*Responses (gains/factors)*/
#ifdef HODIRAC
    if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size * DIRAC_HO_NUMSECTORS ) ) == NULL )
    {
        return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
    }
    set_zero( hDirAC_mem->direct_responses, size * DIRAC_HO_NUMSECTORS );
    if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL )
#else
    if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size ) ) == NULL )
#endif
    {
        return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
    }
    set_zero( hDirAC_mem->direct_responses, size );
#endif


    hDirAC->h_output_synthesis_psd_state.direct_responses = hDirAC_mem->direct_responses;
@@ -1472,27 +1495,27 @@ static ivas_error ivas_dirac_alloc_mem(
    /* Gains/power factors*/
    hDirAC_mem->direct_power_factor = NULL;
    hDirAC_mem->diffuse_power_factor = NULL;
#ifdef HODIRAC
    if ( ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) ||
         ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) )
    {
        hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands * DIRAC_HO_NUMSECTORS );
        hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands * DIRAC_HO_NUMSECTORS );
    }
#else

    if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC )
    {
#ifdef HODIRAC
        if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL )
#else
        if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL )
#endif
        {
            return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
        }

#ifdef HODIRAC
        if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL )
#else
        if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL )
#endif
        {
            return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
        }
    }
#endif

    hDirAC->h_output_synthesis_psd_state.direct_power_factor = hDirAC_mem->direct_power_factor;
    hDirAC->h_output_synthesis_psd_state.diffuse_power_factor = hDirAC_mem->diffuse_power_factor;

+21 −8
Original line number Diff line number Diff line
@@ -1209,18 +1209,31 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(

/* store estimates for next synthesis block */
#ifdef HODIRAC
    if ( hodirac )
    {
        mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS );
#else
    mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir );
    }
    else
#endif
    {
        mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir );
    }

    mvr2r( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev, num_freq_bands_diff * num_channels_diff );

/* reset values */
#ifdef HODIRAC
    if ( hodirac )
    {
        set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS );
#else
    set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir );
    }
    else
#endif
    {
        set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir );
    }


    set_zero( h_dirac_output_synthesis_state.cy_auto_diff_smooth, num_freq_bands_diff * num_channels_diff );

    return;