Commit ff56c65d authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Fix for crash due to hrtf file reading

parent 2c7a0d77
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3841,7 +3841,7 @@ static ivas_error ivas_binaural_reverb_open_fx(
        /* Note: the resulted length is very sensitive to the precision of the constants below (e.g. 1.45 vs. 1.45f) */
        //hReverb->loopBufLength[bin] = (int16_t) ( 1.45 * (int16_t) ( revTimes[bin] * 150.0 ) + 1 );
        Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 23 ), 23 );
        L_tmp_BufLength = L_add( Mpy_32_32( 1556925644 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q22 );
        L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q22 );
        hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 22 );
        hReverb->loopBufLength[bin] = min( hReverb->loopBufLength[bin], hReverb->loopBufLengthMax[bin] );

+68 −1
Original line number Diff line number Diff line
@@ -1766,7 +1766,7 @@ ivas_error load_fastconv_HRTF_from_binary(
 *
 *
 *---------------------------------------------------------------------*/

#ifdef IVAS_FLOAT_FIXED
static ivas_error create_parambin_HRTF_from_rawdata(
    HRTFS_PARAMBIN_HANDLE *hHRTF, /* i/o: Parametric binauralizer HRTF handle */
    char *hrtf_data               /* i  : pointer to binary file */
@@ -1820,16 +1820,83 @@ static ivas_error create_parambin_HRTF_from_rawdata(

    memcpy( ( *hHRTF )->parametricReverberationTimes, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) );
    hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float );
    /*adding conversion as file reading is done in float*/
    floatToFixed_arrL( ( *hHRTF )->parametricReverberationTimes, ( *hHRTF )->parametricReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX );

    memcpy( ( *hHRTF )->parametricReverberationEneCorrections, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) );
    hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float );
    /*adding conversion as file reading is done in float*/
    floatToFixed_arrL( ( *hHRTF )->parametricReverberationEneCorrections, ( *hHRTF )->parametricReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX );

    memcpy( ( *hHRTF )->parametricEarlyPartEneCorrection, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) );
    hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float );

    return IVAS_ERR_OK;
}
#else
static ivas_error create_parambin_HRTF_from_rawdata(
    HRTFS_PARAMBIN_HANDLE *hHRTF, /* i/o: Parametric binauralizer HRTF handle */
    char *hrtf_data               /* i  : pointer to binary file */
)
{
    int16_t i, j;
    char *hrtf_data_rptr;
    uint32_t data_size_tmp;

    hrtf_data_rptr = hrtf_data;

    /* HRTF_SH_CHANNELS */
    if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) )
    {
        return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" );
    }
    hrtf_data_rptr += sizeof( uint16_t );

    /* HRTF_NUM_BINS */
    if ( HRTF_NUM_BINS != *( (uint16_t *) ( hrtf_data_rptr ) ) )
    {
        return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_NUM_BINS)" );
    }
    hrtf_data_rptr += sizeof( uint16_t );

    /* HRTF */
    data_size_tmp = HRTF_NUM_BINS * sizeof( float );
    for ( i = 0; i < BINAURAL_CHANNELS; i++ )
    {
        for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
        {
            memcpy( ( *hHRTF )->hrtfShCoeffsRe[i][j], hrtf_data_rptr, data_size_tmp );
            hrtf_data_rptr += data_size_tmp;
        }
    }
    for ( i = 0; i < BINAURAL_CHANNELS; i++ )
    {
        for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
        {
            memcpy( ( *hHRTF )->hrtfShCoeffsIm[i][j], hrtf_data_rptr, data_size_tmp );
            hrtf_data_rptr += data_size_tmp;
        }
    }

    /* Reverb Parameters */
    if ( CLDFB_NO_CHANNELS_MAX != *( (uint16_t *) ( hrtf_data_rptr ) ) )
    {
        return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (CLDFB_NO_CHANNELS_MAX)" );
    }
    hrtf_data_rptr += sizeof( uint16_t );

    memcpy( ( *hHRTF )->parametricReverberationTimes, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) );
    hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float );

    memcpy( ( *hHRTF )->parametricReverberationEneCorrections, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) );
    hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float );

    memcpy( ( *hHRTF )->parametricEarlyPartEneCorrection, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) );
    hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float );

    return IVAS_ERR_OK;
}
#endif

/*---------------------------------------------------------------------*
 * load_parambin_HRTF_from_binary()