Commit 50b7c11d authored by emerit's avatar emerit
Browse files

on going

parent e285923d
Loading
Loading
Loading
Loading
+6557 −6559

File changed.

Preview size limit exceeded, changes collapsed.

+0 −3
Original line number Diff line number Diff line
@@ -288,7 +288,6 @@ extern float CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS][24
extern float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][2474];



/********************** default HRIR reverb rom tables **********************/

/* Sample Rate = 48000 */
@@ -307,6 +306,4 @@ extern float defaultHRIR_coherence_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ];
extern float defaultHRIR_left_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ];
extern float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ];



#endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */
+141 −34
Original line number Diff line number Diff line
@@ -221,6 +221,7 @@ static ivas_error check_hrtf_binary_header(

static ivas_error read_hrtf_binary_header(
    ivas_hrtfs_header_t *hrtf_header,
    int16_t *is_fix_point,
    FILE *f_hrtf )
{
    /* HRTF Header                                                              */
@@ -229,8 +230,14 @@ static ivas_error read_hrtf_binary_header(
    /*      Sampling Frequency    (4 bytes)                                     */
    /*      Raw data size         (4 bytes)                                     */

    *is_fix_point = 0;
    if ( ( fread( &( hrtf_header->rend_type ), sizeof( int32_t ), 1, f_hrtf ) == 1 ) && ( fread( &( hrtf_header->input_cfg ), sizeof( int32_t ), 1, f_hrtf ) == 1 ) && ( fread( &( hrtf_header->frequency ), sizeof( int32_t ), 1, f_hrtf ) == 1 ) && ( fread( &( hrtf_header->data_size ), sizeof( int32_t ), 1, f_hrtf ) == 1 ) )
    {
        if ( hrtf_header->rend_type & 0x1000 )
        {
            *is_fix_point = 1;
            hrtf_header->rend_type = hrtf_header->rend_type - 0x1000;
        }
        return IVAS_ERR_OK;
    }

@@ -457,6 +464,7 @@ static ivas_error load_reverb_from_binary(
    int32_t hrtf_data_size_max;
    char *hrtf_data;
    int16_t lr_iac_len;
    int16_t is_fx = 0;

    if ( hHrtfStatistics == NULL )
    {
@@ -494,7 +502,7 @@ static ivas_error load_reverb_from_binary(

    for ( hrtf_id = 0; ( hrtf_id < hrtfs_file_header.nb_hrtf ) && ( !is_reverb ); hrtf_id++ )
    {
        if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK )
        if ( read_hrtf_binary_header( &hrtf_header, &is_fx, f_hrtf ) != IVAS_ERR_OK )
        {
            free( hrtf_data );
            return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "HRTF binary file not compliant (number of HRTF)" );
@@ -580,6 +588,7 @@ static ivas_error TDREND_MIX_LoadHRTF(
    ivas_hrtfs_header_t hrtf_header;
    int32_t hrtf_data_size_max;
    char *hrtf_data;
    int16_t is_fx = 0;

    header_check_result = IVAS_ERR_OK;

@@ -625,7 +634,7 @@ static ivas_error TDREND_MIX_LoadHRTF(

    for ( hrtf_id = 0; ( hrtf_id < hrtfs_file_header.nb_hrtf ) && ( !is_tdrend ); hrtf_id++ )
    {
        if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK )
        if ( read_hrtf_binary_header( &hrtf_header, &is_fx, f_hrtf ) != IVAS_ERR_OK )
        {
            return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "HRTF binary file not compliant (number of HRTF)" );
        }
@@ -1065,7 +1074,10 @@ static ivas_error create_HRTF_from_rawdata_fx(
    uint32_t mem_size, l;
    char *hrtf_data_rptr;
    float *pOut_to_bin_wptr;
    float *pOut_to_bin_wptr_ref;
    ivas_error error;
    Word16 factorQ;
    float maxDiff = 0, diff;

    if ( *hHRTF == NULL )
    {
@@ -1087,8 +1099,12 @@ static ivas_error create_HRTF_from_rawdata_fx(
    ( *hHRTF )->init_from_rom = 0;
    hrtf_data_rptr = hrtf_data;

    /* latency_s Q factor*/
    factorQ = *( (Word16 *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( Word16 );

    /* latency_s */
    ( *hHRTF )->latency_s = (float) ( *( (Word32 *) ( hrtf_data_rptr ) ) ) * powf( 2.f, -31.f );
    ( *hHRTF )->latency_s = (float) ( *( (Word32 *) ( hrtf_data_rptr ) ) ) * powf( 2.f, -1.f * (float) factorQ );
    hrtf_data_rptr += sizeof( Word32 );

    /* max_num_ir */
@@ -1138,6 +1154,7 @@ static ivas_error create_HRTF_from_rawdata_fx(

    if ( max_num_iterations_diffuse != 0 )
    {
        maxDiff = fabsf( ( *hHRTF )->latency_s - CRendBin_Combined_BRIR_latency_s );
        /* num_iterations_diffuse */
        for ( j = 0; j < BINAURAL_CHANNELS; j++ )
        {
@@ -1163,21 +1180,47 @@ static ivas_error create_HRTF_from_rawdata_fx(
    ( *hHRTF )->index_frequency_max_diffuse = *( (uint16_t *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( uint16_t );

    /* inv_diffuse_weight Q factor*/
    factorQ = *( (Word16 *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( Word16 );

    /* inv_diffuse_weight */
    for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ )
    {
        ( *hHRTF )->inv_diffuse_weight[0][i] = ( *( (Word16 *) ( hrtf_data_rptr ) ) ) * powf( 2.f, -15.f );
        hrtf_data_rptr += sizeof( Word16 );
        ( *hHRTF )->inv_diffuse_weight[0][i] = (float) ( *( (Word32 *) ( hrtf_data_rptr ) ) ) * powf( 2.f, -1.f * factorQ );
        hrtf_data_rptr += sizeof( Word32 );
        if ( max_num_iterations_diffuse != 0 )
        {
            diff = fabs( ( *hHRTF )->inv_diffuse_weight[0][i] - CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[0][i] );
            if ( maxDiff < diff )
            {
                maxDiff = diff;
            }
        }
    }
    /* inv_diffuse_weight Q factor*/
    factorQ = *( (Word16 *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( Word16 );

    for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ )
    {
        ( *hHRTF )->inv_diffuse_weight[1][i] = ( *( (Word16 *) ( hrtf_data_rptr ) ) ) * powf( 2.f, -15.f );
        hrtf_data_rptr += sizeof( Word16 );
        ( *hHRTF )->inv_diffuse_weight[1][i] = (float) ( *( (Word32 *) ( hrtf_data_rptr ) ) ) * powf( 2.f, -1.f * factorQ );
        hrtf_data_rptr += sizeof( Word32 );
        if ( max_num_iterations_diffuse != 0 )
        {
            diff = fabs( ( *hHRTF )->inv_diffuse_weight[1][i] - CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[1][i] );
            if ( maxDiff < diff )
            {
                maxDiff = diff;
            }
        }
    }

    /* max_total_num_fsamp_per_iteration */
    max_total_num_fsamp_per_iteration = *( (uint16_t *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( uint16_t );
    // factorQ = *( (Word16 *) ( hrtf_data_rptr ) );
    // hrtf_data_rptr += sizeof( Word16 );

    /* coeff_re (the size depends on pIndex_frequency_max) */
    for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ )
@@ -1193,17 +1236,30 @@ static ivas_error create_HRTF_from_rawdata_fx(
            memset( ( *hHRTF )->pOut_to_bin_re[i][j], 0x00, mem_size );

            pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_re[i][j];
            pOut_to_bin_wptr_ref = CRendBin_Combined_BRIR_coeff_re_48kHz[i][j];

            for ( k = 0; k < ( *hHRTF )->num_iterations[i][j]; k++ )
            {
                factorQ = *( (Word16 *) ( hrtf_data_rptr ) );
                hrtf_data_rptr += sizeof( Word16 );
                mem_size = ( *hHRTF )->pIndex_frequency_max[i][j][k] * sizeof( float );
                memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size );
                Word32 *ptW = (Word32 *) pOut_to_bin_wptr;
                for ( l = 0; l < ( *hHRTF )->pIndex_frequency_max[i][j][k]; l++ )
                {
                    pOut_to_bin_wptr[l] = (float) ptW[l] * powf( 2.f, -1.f * (float) factorQ );
                    if ( max_num_iterations_diffuse != 0 )
                    {
                        diff = fabs( pOut_to_bin_wptr[l] - pOut_to_bin_wptr_ref[l] );
                        if ( maxDiff < diff )
                        {
                            maxDiff = diff;
                        }
                    }
                }
                hrtf_data_rptr += mem_size;
                pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max[i][j][k];
            }
            for ( l = 0; l < mem_size; l++ )
            {
                Word32 *ptW = (Word32 *) &( *hHRTF )->pOut_to_bin_re[i][j][l];
                ( *hHRTF )->pOut_to_bin_re[i][j][l] = ptW[0] * powf( 2.f, -29.f );
                pOut_to_bin_wptr_ref += ( *hHRTF )->pIndex_frequency_max[i][j][k];
            }
        }
    }
@@ -1222,17 +1278,29 @@ static ivas_error create_HRTF_from_rawdata_fx(
            memset( ( *hHRTF )->pOut_to_bin_im[i][j], 0x00, mem_size );

            pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_im[i][j];
            pOut_to_bin_wptr_ref = CRendBin_Combined_BRIR_coeff_im_48kHz[i][j];
            for ( k = 0; k < ( *hHRTF )->num_iterations[i][j]; k++ )
            {
                factorQ = *( (Word16 *) ( hrtf_data_rptr ) );
                hrtf_data_rptr += sizeof( Word16 );
                mem_size = ( *hHRTF )->pIndex_frequency_max[i][j][k] * sizeof( float );
                memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size );
                Word32 *ptW = (Word32 *) pOut_to_bin_wptr;
                for ( l = 0; l < ( *hHRTF )->pIndex_frequency_max[i][j][k]; l++ )
                {
                    pOut_to_bin_wptr[l] = (float) ptW[l] * powf( 2.f, -1.f * (float) factorQ );
                    if ( max_num_iterations_diffuse != 0 )
                    {
                        diff = fabs( pOut_to_bin_wptr[l] - pOut_to_bin_wptr_ref[l] );
                        if ( maxDiff < diff )
                        {
                            maxDiff = diff;
                        }
                    }
                }
                hrtf_data_rptr += mem_size;
                pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max[i][j][k];
            }
            for ( l = 0; l < mem_size; l++ )
            {
                Word32 *ptW = (Word32 *) &( *hHRTF )->pOut_to_bin_im[i][j][l];
                ( *hHRTF )->pOut_to_bin_im[i][j][l] = ptW[0] * powf( 2.f, -29.f );
                pOut_to_bin_wptr_ref += ( *hHRTF )->pIndex_frequency_max[i][j][k];
            }
        }
    }
@@ -1255,17 +1323,30 @@ static ivas_error create_HRTF_from_rawdata_fx(
            memset( ( *hHRTF )->pOut_to_bin_diffuse_re[j], 0x00, mem_size );

            pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_diffuse_re[j];
            pOut_to_bin_wptr_ref = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j];

            for ( k = 0; k < ( *hHRTF )->num_iterations_diffuse[j]; k++ )
            {
                factorQ = *( (Word16 *) ( hrtf_data_rptr ) );
                hrtf_data_rptr += sizeof( Word16 );
                mem_size = ( *hHRTF )->pIndex_frequency_max_diffuse[j][k] * sizeof( float );
                memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size );
                Word32 *ptW = (Word32 *) pOut_to_bin_wptr;
                for ( l = 0; l < ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; l++ )
                {
                    pOut_to_bin_wptr[l] = (float) ptW[l] * powf( 2.f, -1.f * (float) factorQ );
                    if ( max_num_iterations_diffuse != 0 )
                    {
                        diff = fabs( pOut_to_bin_wptr[l] - pOut_to_bin_wptr_ref[l] );
                        if ( maxDiff < diff )
                        {
                            maxDiff = diff;
                        }
                    }
                }
                hrtf_data_rptr += mem_size;
                pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k];
            }
            for ( l = 0; l < mem_size; l++ )
            {
                Word32 *ptW = (Word32 *) &( *hHRTF )->pOut_to_bin_diffuse_re[j][l];
                ( *hHRTF )->pOut_to_bin_diffuse_re[j][l] = ptW[0] * powf( 2.f, -29.f );
                pOut_to_bin_wptr_ref += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k];
            }
        }

@@ -1281,17 +1362,29 @@ static ivas_error create_HRTF_from_rawdata_fx(
            memset( ( *hHRTF )->pOut_to_bin_diffuse_im[j], 0x00, mem_size );

            pOut_to_bin_wptr = ( *hHRTF )->pOut_to_bin_diffuse_im[j];
            pOut_to_bin_wptr_ref = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j];
            for ( k = 0; k < ( *hHRTF )->num_iterations_diffuse[j]; k++ )
            {
                factorQ = *( (Word16 *) ( hrtf_data_rptr ) );
                hrtf_data_rptr += sizeof( Word16 );
                mem_size = ( *hHRTF )->pIndex_frequency_max_diffuse[j][k] * sizeof( float );
                memcpy( pOut_to_bin_wptr, hrtf_data_rptr, mem_size );
                Word32 *ptW = (Word32 *) pOut_to_bin_wptr;
                for ( l = 0; l < ( *hHRTF )->pIndex_frequency_max_diffuse[j][k]; l++ )
                {
                    pOut_to_bin_wptr[l] = (float) ptW[l] * powf( 2.f, -1.f * (float) factorQ );
                    if ( max_num_iterations_diffuse != 0 )
                    {
                        diff = fabs( pOut_to_bin_wptr[l] - pOut_to_bin_wptr_ref[l] );
                        if ( maxDiff < diff )
                        {
                            maxDiff = diff;
                        }
                    }
                }
                hrtf_data_rptr += mem_size;
                pOut_to_bin_wptr += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k];
            }
            for ( l = 0; l < mem_size; l++ )
            {
                Word32 *ptW = (Word32 *) &( *hHRTF )->pOut_to_bin_diffuse_im[j][l];
                ( *hHRTF )->pOut_to_bin_diffuse_im[j][l] = ptW[0] * powf( 2.f, -29.f );
                pOut_to_bin_wptr_ref += ( *hHRTF )->pIndex_frequency_max_diffuse[j][k];
            }
        }
    }
@@ -1654,6 +1747,7 @@ ivas_error load_fastconv_HRTF_from_binary(
    ivas_hrtfs_file_header_t hrtfs_file_header;
    int16_t hrtf_id;
    int16_t asFastconv = 0;
    int16_t is_fx = 0;

    f_hrtf = hrtfReader->file;

@@ -1680,7 +1774,7 @@ ivas_error load_fastconv_HRTF_from_binary(
    /* Read & load */
    for ( hrtf_id = 0; hrtf_id < hrtfs_file_header.nb_hrtf; hrtf_id++ )
    {
        if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK )
        if ( read_hrtf_binary_header( &hrtf_header, &is_fx, f_hrtf ) != IVAS_ERR_OK )
        {
            free( hrtf_data );
            return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" );
@@ -1810,6 +1904,7 @@ ivas_error load_parambin_HRTF_from_binary(
    ivas_hrtfs_file_header_t hrtfs_file_header;
    int16_t hrtf_id;
    int16_t asParam = 0;
    int16_t is_fx = 0;

    f_hrtf = hrtfReader->file;

@@ -1838,7 +1933,7 @@ ivas_error load_parambin_HRTF_from_binary(

    for ( hrtf_id = 0; hrtf_id < hrtfs_file_header.nb_hrtf; hrtf_id++ )
    {
        if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK )
        if ( read_hrtf_binary_header( &hrtf_header, &is_fx, f_hrtf ) != IVAS_ERR_OK )
        {
            free( hrtf_data );
            return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" );
@@ -1897,6 +1992,7 @@ ivas_error create_SetOfHRTF_from_binary(
    ivas_error header_check_result;
    ivas_hrtfs_file_header_t hrtfs_file_header;
    int16_t hrtf_id;
    int16_t is_fx = 0;

    f_hrtf = hrtfReader->file;

@@ -1926,7 +2022,7 @@ ivas_error create_SetOfHRTF_from_binary(

    for ( hrtf_id = 0; hrtf_id < hrtfs_file_header.nb_hrtf; hrtf_id++ )
    {
        if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK )
        if ( read_hrtf_binary_header( &hrtf_header, &is_fx, f_hrtf ) != IVAS_ERR_OK )
        {
            free( hrtf_data );
            return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" );
@@ -1970,6 +2066,8 @@ ivas_error create_SetOfHRTF_from_binary(
        }

        if ( hHRTF != NULL )
        {
            if ( is_fx )
            {
                /* Create the HRTF reading the raw data from the binary file */
                if ( ( create_HRTF_from_rawdata_fx( hHRTF, hrtf_data ) ) != IVAS_ERR_OK )
@@ -1978,6 +2076,15 @@ ivas_error create_SetOfHRTF_from_binary(
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" );
                }
            }
            else
            {
                if ( ( create_HRTF_from_rawdata( hHRTF, hrtf_data ) ) != IVAS_ERR_OK )
                {
                    free( hrtf_data );
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" );
                }
            }
        }
    }

    free( hrtf_data );
+4 −3
Original line number Diff line number Diff line
@@ -707,6 +707,7 @@ char *create_hrtf_crend( HRTF_READER_RENDERER_TYPE rend_type, BINAURAL_INPUT_AUD
        // Get the HRTF header

        // Renderer type
        rend_type = rend_type + 0x1000;
        memcpy( mixerconv_hrtf_wptr, &( rend_type ), sizeof( int32_t ) );
        mixerconv_hrtf_wptr += sizeof( int32_t );

Loading