Commit 44e748c8 authored by emerit's avatar emerit
Browse files

recude complexity

parent d2ebea12
Loading
Loading
Loading
Loading
+137 −37
Original line number Diff line number Diff line
@@ -69,6 +69,9 @@ ivas_error ivas_hrtf_init(
    hHrtf->max_num_iterations = 0;
    hHrtf->gain_lfe = 0;
    hHrtf->index_frequency_max_diffuse = 0;
#ifdef FIX_INV_DIFFUSE_WEIGHT
    hHrtf->same_inv_diffuse_weight = 1;
#endif

    for ( i = 0; i < MAX_INTERN_CHANNELS; i++ )
    {
@@ -1033,6 +1036,20 @@ static ivas_error ivas_rend_initCrend(
        }
    }

#ifdef FIX_INV_DIFFUSE_WEIGHT
    hHrtf->same_inv_diffuse_weight = 1;
    for ( i = 0; i < hHrtf->max_num_ir; i++ )
    {
        if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
        {
            if ( hHrtf->inv_diffuse_weight[0][i] != hHrtf->inv_diffuse_weight[0][i] )
            {
                hHrtf->same_inv_diffuse_weight = 0;
            }
        }
    }
#endif

    pCrend->hHrtfCrend = hHrtf;

    return IVAS_ERR_OK;
@@ -1496,30 +1513,55 @@ ivas_error ivas_rend_openCrend(
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
                if ( hHrtf->same_inv_diffuse_weight == 0 )
                {
                    if ( ( hCrend->freq_buffer_re_diffuse[1] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
                    {
                        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                    }
                }
                else
                {
                    hCrend->freq_buffer_re_diffuse[1] = NULL;
                }
#else
                if ( ( hCrend->freq_buffer_re_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
#endif
#ifdef FIX_INV_DIFFUSE_WEIGHT
                if ( hCrend->freq_buffer_re_diffuse[0] != NULL )
                {
#ifdef FIX_CRASH_LONG_BRIR
                    for ( j = 0; j < max_total_ir_len; j++ )
                    {
#ifdef FIX_INV_DIFFUSE_WEIGHT
                        hCrend->freq_buffer_re_diffuse[0][j] = 0.f;
                    hCrend->freq_buffer_re_diffuse[1][j] = 0.f;
                    }
#else
                    hCrend->freq_buffer_re_diffuse[j] = 0.f;
                    set_zero( hCrend->freq_buffer_re_diffuse[0], max_total_ir_len );
#endif
                }
                if ( hCrend->freq_buffer_re_diffuse[1] != NULL )
                {
#ifdef FIX_CRASH_LONG_BRIR
                    for ( j = 0; j < max_total_ir_len; j++ )
                    {
                        hCrend->freq_buffer_re_diffuse[1][j] = 0.f;
                    }
#else
#ifdef FIX_INV_DIFFUSE_WEIGHT
                set_zero( hCrend->freq_buffer_re_diffuse[0], max_total_ir_len );
                    set_zero( hCrend->freq_buffer_re_diffuse[1], max_total_ir_len );
#endif
                }
#else
#ifdef FIX_CRASH_LONG_BRIR
                if ( hCrend->freq_buffer_re_diffuse !NULL )
                {
                    for ( j = 0; j < max_total_ir_len; j++ )
                    {
                        hCrend->freq_buffer_re_diffuse[j] = 0.f;
                    }
                }
#else
                set_zero( hCrend->freq_buffer_re_diffuse, max_total_ir_len );
#endif
@@ -1529,30 +1571,55 @@ ivas_error ivas_rend_openCrend(
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
                if ( hHrtf->same_inv_diffuse_weight == 0 )
                {
                    if ( ( hCrend->freq_buffer_im_diffuse[1] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
                    {
                        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                    }
                }
                else
                {
                    hCrend->freq_buffer_im_diffuse[1] = NULL;
                }
#else
                if ( ( hCrend->freq_buffer_im_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
#endif
#ifdef FIX_INV_DIFFUSE_WEIGHT
                if ( hCrend->freq_buffer_im_diffuse[0] != NULL )
                {
#ifdef FIX_CRASH_LONG_BRIR
                    for ( j = 0; j < max_total_ir_len; j++ )
                    {
#ifdef FIX_INV_DIFFUSE_WEIGHT
                        hCrend->freq_buffer_im_diffuse[0][j] = 0.f;
                    hCrend->freq_buffer_im_diffuse[1][j] = 0.f;
                    }
#else
                    hCrend->freq_buffer_im_diffuse[j] = 0.f;
                    set_zero( hCrend->freq_buffer_im_diffuse[0], max_total_ir_len );
#endif
                }
                if ( hCrend->freq_buffer_im_diffuse[1] != NULL )
                {
#ifdef FIX_CRASH_LONG_BRIR
                    for ( j = 0; j < max_total_ir_len; j++ )
                    {
                        hCrend->freq_buffer_im_diffuse[1][j] = 0.f;
                    }
#else
#ifdef FIX_INV_DIFFUSE_WEIGHT
                set_zero( hCrend->freq_buffer_im_diffuse[0], max_total_ir_len );
                    set_zero( hCrend->freq_buffer_im_diffuse[1], max_total_ir_len );
#endif
                }
#else
#ifdef FIX_CRASH_LONG_BRIR
                if ( hCrend->freq_buffer_im_diffuse !NULL )
                {
                    for ( j = 0; j < max_total_ir_len; j++ )
                    {
                        hCrend->freq_buffer_im_diffuse[j] = 0.f;
                    }
                }
#else
                set_zero( hCrend->freq_buffer_im_diffuse, max_total_ir_len );
#endif
@@ -1909,8 +1976,11 @@ static ivas_error ivas_rend_crendConvolver(
#ifdef FIX_INV_DIFFUSE_WEIGHT
        set_zero( &hCrend->freq_buffer_re_diffuse[0][offset_diffuse], subframe_length );
        set_zero( &hCrend->freq_buffer_im_diffuse[0][offset_diffuse], subframe_length );
        if ( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 )
        {
            set_zero( &hCrend->freq_buffer_re_diffuse[1][offset_diffuse], subframe_length );
            set_zero( &hCrend->freq_buffer_im_diffuse[1][offset_diffuse], subframe_length );
        }
#else
        set_zero( &hCrend->freq_buffer_re_diffuse[offset_diffuse], subframe_length );
        set_zero( &hCrend->freq_buffer_im_diffuse[offset_diffuse], subframe_length );
@@ -1923,33 +1993,55 @@ static ivas_error ivas_rend_crendConvolver(
        pIn = &pcm_in[idx_in][i_ts * subframe_length];
        if ( idx_in != lfe_idx_in )
        {
#ifdef FIX_INV_DIFFUSE_WEIGHT
            if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
            {
#ifdef FIX_INV_DIFFUSE_WEIGHT
                if ( pCrend->hHrtfCrend->same_inv_diffuse_weight )
                {
                    pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse];
                    pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse];
                    pFreq_filt_re = &hCrend->freq_buffer_re[i][offset];
                    pFreq_filt_im = &hCrend->freq_buffer_im[i][offset];

                    for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ )
                    {
                        pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i];
                        pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i];
                    }
                }
                else
                {
                    pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse];
                    pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse];
                    pFreq_buf2_re = &hCrend->freq_buffer_re_diffuse[1][offset_diffuse];
                    pFreq_buf2_im = &hCrend->freq_buffer_im_diffuse[1][offset_diffuse];
#else
                pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse];
                pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse];
#endif
                    pFreq_filt_re = &hCrend->freq_buffer_re[i][offset];
                    pFreq_filt_im = &hCrend->freq_buffer_im[i][offset];

                    for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ )
                    {
#ifdef FIX_INV_DIFFUSE_WEIGHT
                        pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i];
                        pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i];
                        pFreq_buf2_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[1][i];
                        pFreq_buf2_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[1][i];
                    }
                }
            }
#else
            if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
            {
                pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse];
                pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse];
                pFreq_filt_re = &hCrend->freq_buffer_re[i][offset];
                pFreq_filt_im = &hCrend->freq_buffer_im[i][offset];

                for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ )
                {
                    pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[i];
                    pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[i];
#endif
                }
            }
#endif

            pFreq_buf_re = &hCrend->freq_buffer_re[i][offset];
            pFreq_buf_im = &hCrend->freq_buffer_im[i][offset];
@@ -1998,8 +2090,16 @@ static ivas_error ivas_rend_crendConvolver(
            offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0];
            offset_diffuse = offset_diffuse * subframe_length;
#ifdef FIX_INV_DIFFUSE_WEIGHT
            if ( pCrend->hHrtfCrend->same_inv_diffuse_weight )
            {
                pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse];
                pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse];
            }
            else
            {
                pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[j][offset_diffuse];
                pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[j][offset_diffuse];
            }
#else
            pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse];
            pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse];
+1 −0
Original line number Diff line number Diff line
@@ -1172,6 +1172,7 @@ typedef struct ivas_hrtfs_structure
    int16_t max_num_iterations;
#ifdef FIX_INV_DIFFUSE_WEIGHT
    float inv_diffuse_weight[BINAURAL_CHANNELS][MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */
    int16_t same_inv_diffuse_weight;
#else
    float inv_diffuse_weight[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */
#endif