Commit e32c5a0d authored by emerit's avatar emerit
Browse files

Merge branch '1202_basop_step_1_fix_crash_long_brir_2' into 'main-pc'

port MR 1202 to basop v2

See merge request !1380
parents 9ef227b4 33ee2cc4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -194,6 +194,7 @@
#define FIX_910_REMOVE_DUPLICATION_TD_REND              /* VA: issue 910: remove duplication of function ivas_td_binaural_renderer() */
#define FIX_940_DEBUGGING_VARIABLE                      /* Nokia: issue #940: remove debugging variable */
#define NONBE_FIX_931_IGF_STEREO_DEC_NOISE	                  /* FhG: issue #931: fix noise substitution in the stereo IGF decoder      */
#define FIX_CRASH_LONG_BRIR                /* Orange : port 1202 Fix crash when long BRIR is set */

/* #################### End BASOP porting switches ############################ */

+66 −0
Original line number Diff line number Diff line
@@ -1526,7 +1526,11 @@ ivas_error ivas_rend_openCrend(
)
{
    Word16 i, subframe_length;
#ifdef FIX_CRASH_LONG_BRIR
    Word32 max_total_ir_len;
#else
    Word16 max_total_ir_len;
#endif
    HRTFS_HANDLE hHrtf;
    CREND_HANDLE hCrend;
    ivas_error error;
@@ -1569,7 +1573,11 @@ ivas_error ivas_rend_openCrend(

        IF( hHrtf != NULL )
        {
#ifdef FIX_CRASH_LONG_BRIR
            max_total_ir_len = L_mult0( hHrtf->max_num_iterations, subframe_length );
#else
            max_total_ir_len = imult1616( hHrtf->max_num_iterations, subframe_length );
#endif

            FOR( i = 0; i < hHrtf->max_num_ir; i++ )
            {
@@ -1577,12 +1585,20 @@ ivas_error ivas_rend_openCrend(
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
#ifdef FIX_CRASH_LONG_BRIR
                set_zero2_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len );
#else
                set_zero_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len );
#endif
                IF( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL )
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
#ifdef FIX_CRASH_LONG_BRIR
                set_zero2_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len );
#else
                set_zero_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len );
#endif
            }

            FOR( i = 0; i < BINAURAL_CHANNELS; i++ )
@@ -1594,7 +1610,11 @@ ivas_error ivas_rend_openCrend(
                set_zero_fx( hCrend->prev_out_buffer_fx[i], subframe_length );
            }

#ifdef FIX_CRASH_LONG_BRIR
            max_total_ir_len = L_mult0( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length );
#else
            max_total_ir_len = imult1616( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length );
#endif

            IF( max_total_ir_len > 0 )
            {
@@ -1602,12 +1622,20 @@ ivas_error ivas_rend_openCrend(
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
#ifdef FIX_CRASH_LONG_BRIR
                set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx, max_total_ir_len );
#else
                set_zero_fx( hCrend->freq_buffer_re_diffuse_fx, max_total_ir_len );
#endif
                IF( ( hCrend->freq_buffer_im_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL )
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
#ifdef FIX_CRASH_LONG_BRIR
                set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx, max_total_ir_len );
#else
                set_zero_fx( hCrend->freq_buffer_im_diffuse_fx, max_total_ir_len );
#endif
            }
            ELSE
            {
@@ -1622,7 +1650,11 @@ ivas_error ivas_rend_openCrend(
                {
                    return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
                }
#ifdef FIX_CRASH_LONG_BRIR
                set_zero2_fx( hCrend->lfe_delay_line_fx, max_total_ir_len );
#else
                set_zero_fx( hCrend->lfe_delay_line_fx, max_total_ir_len );
#endif
            }
            ELSE
            {
@@ -1865,7 +1897,12 @@ static ivas_error ivas_rend_crendConvolver(
    Word16 i, j, k, m;
    Word16 subframe_length, idx_in;
    Word16 lfe_idx_in;
#ifdef FIX_CRASH_LONG_BRIR
    Word32 offset, offset_in, offset_diffuse;
    Word16 index_in;
#else
    Word16 offset, offset_in, offset_diffuse;
#endif
    Word16 nchan_in, nchan_out;
    const Word32 *pIn;
    Word32 *pFreq_buf_re, *pFreq_buf_im;
@@ -1911,8 +1948,13 @@ static ivas_error ivas_rend_crendConvolver(
        }
    }

#ifdef FIX_CRASH_LONG_BRIR
    offset = L_mult0( hCrend->delay_line_rw_index, subframe_length );                 /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */
    offset_diffuse = L_mult0( hCrend->diffuse_delay_line_rw_index, subframe_length ); /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */
#else
    offset = imult1616( hCrend->delay_line_rw_index, subframe_length );                 /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */
    offset_diffuse = imult1616( hCrend->diffuse_delay_line_rw_index, subframe_length ); /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */
#endif

    IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
    {
@@ -1969,10 +2011,17 @@ static ivas_error ivas_rend_crendConvolver(
                move16();
                FOR( m = 0; m < pCrend->hHrtfCrend->num_iterations[i][j]; m++ )
                {
#ifdef FIX_CRASH_LONG_BRIR
                    index_in = add( add( hCrend->delay_line_rw_index, sub( pCrend->hHrtfCrend->max_num_iterations, pCrend->hHrtfCrend->num_iterations[i][j] ) ), add( m, 1 ) );
                    index_in = index_in % ( pCrend->hHrtfCrend->max_num_iterations );
                    move16();
                    offset_in = L_mult0( index_in, subframe_length );
#else
                    offset_in = add( add( hCrend->delay_line_rw_index, sub( pCrend->hHrtfCrend->max_num_iterations, pCrend->hHrtfCrend->num_iterations[i][j] ) ), add( m, 1 ) );
                    offset_in = offset_in % ( pCrend->hHrtfCrend->max_num_iterations );
                    move16();
                    offset_in = imult1616( offset_in, subframe_length );
#endif
                    pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset_in];              // Qx
                    pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset_in];              // Qx
                    pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_re_fx[i][j][offset]; // Q29
@@ -1985,7 +2034,11 @@ static ivas_error ivas_rend_crendConvolver(
                        move32();
                        move32();
                    }
#ifdef FIX_CRASH_LONG_BRIR
                    offset = L_add( offset, k );
#else
                    offset = add( offset, k );
#endif
                }
                i = add( i, 1 );
            }
@@ -1995,10 +2048,17 @@ static ivas_error ivas_rend_crendConvolver(
        move16();
        FOR( m = 0; m < pCrend->hHrtfCrend->num_iterations_diffuse[j]; m++ )
        {
#ifdef FIX_CRASH_LONG_BRIR
            index_in = add( hCrend->diffuse_delay_line_rw_index, add( m, 1 ) );
            index_in = index_in % pCrend->hHrtfCrend->num_iterations_diffuse[0];
            move16();
            offset_diffuse = L_mult0( index_in, subframe_length );
#else
            offset_diffuse = add( hCrend->diffuse_delay_line_rw_index, add( m, 1 ) );
            offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0];
            move16();
            offset_diffuse = imult1616( offset_diffuse, subframe_length );
#endif
            pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse];         // Qx
            pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse];         // Qx
            pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re_fx[j][offset]; // Q31
@@ -2010,7 +2070,13 @@ static ivas_error ivas_rend_crendConvolver(
                move32();
                move32();
            }
#ifdef FIX_CRASH_LONG_BRIR
            offset = L_add( offset, k );
            move32();
#else
            offset = add( offset, k );
            move16();
#endif
        }

        ivas_imdft_fx( tmp_out_re, tmp_out_im, pOut, subframe_length );