Commit 4a423f38 authored by emerit's avatar emerit
Browse files

merge with fix point td renderer

parent 3593e7c9
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -159,12 +159,15 @@
#define SPLIT_REND_POSE_CORRECTION_UNUSED_BITS

#define FIX_CREND_FIX_POINT_HRTF_FILE_FORMAT            /* Orange issue 1031 : fix point hrtf binary file format */
#define FIX_TDREND_HRTF_FILE_FORMAT                     /* Eri: fix point hrtf binary file format for TDREND */
#define FIX_1053_REVERB_RECONFIGURATION                 /* Philips: issue 1053: fix for dynamic switching of acoustic environment */
#define CONF_DISTATT                                    /* Eri: Make distance attenuation configurable */
#define FIX_1082_INSTRUM_FAILED_LC3PLUS                 /* VoiceAge: issue 1082: fix ambiguous syntax in LC3Plus code leading to fails of instrumented builds */
#define FIX_1052_EXT_OUTPUT                             /* VA: issue 1052: define EXT decoder output configuration for stereo and MC formats */ 


#define FIX_989_TD_REND_ROM                             /* Eri: Clean-up for TD renderer and completion of ROM generation tool */

/* #################### End BE switches ################################## */

/* #################### Start NON-BE switches ############################ */
+311 −0
Original line number Diff line number Diff line
@@ -256,7 +256,109 @@ static ivas_error read_hrtf_binary_header(
    return IVAS_ERR_END_OF_FILE;
}

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
/*-------------------------------------------------------------------*
 * LoadBSplineBinaryITD_fx()
 *
 * Loads the B Spline HR filter model ITD data from file.
 --------------------------------------------------------------------*/

static void LoadBSplineBinaryITD_fx(
    ModelParamsITD_t *modelITD, /* i/o: ITD model parameter structure */
    FILE *f_hrtf                /* i  : HR filter data file handle    */
)
{
    int16_t tmp, factor_Q;
    int16_t *v_tmp16;
    int16_t j;
    float q_scale;
    fread( &modelITD->N, sizeof( int16_t ), 1, f_hrtf );
    fread( &modelITD->elevDim2, sizeof( int16_t ), 1, f_hrtf );
    fread( &modelITD->elevDim3, sizeof( int16_t ), 1, f_hrtf );
    modelITD->elevKSeq_dyn = (float *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( float ) );


    v_tmp16 = (int16_t *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( int16_t ) );
    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( v_tmp16, sizeof( int16_t ), modelITD->elevDim3 - 2, f_hrtf );
    for ( j = 0; j < modelITD->elevDim3 - 2; j++ )
    {
        modelITD->elevKSeq_dyn[j] = ( (float) v_tmp16[j] ) * q_scale;
    }

    fread( &modelITD->azimDim2, sizeof( int16_t ), 1, f_hrtf );
    fread( &modelITD->azimDim3, sizeof( int16_t ), 1, f_hrtf );
    modelITD->azimKSeq_dyn = (float *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( float ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */

    v_tmp16 = (int16_t *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( int16_t ) );
    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( v_tmp16, sizeof( int16_t ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf );
    for ( j = 0; j < ( modelITD->azimDim3 + 1 ) / 2 - 2; j++ )
    {
        modelITD->azimKSeq_dyn[j] = ( (float) v_tmp16[j] ) * q_scale;
    }

    fread( &tmp, sizeof( int16_t ), 1, f_hrtf );
    modelITD->W_dyn = (float *) malloc( tmp * sizeof( float ) );

    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) );
    fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf );
    for ( j = 0; j < tmp; j++ )
    {
        modelITD->W_dyn[j] = ( (float) v_tmp16[j] ) * q_scale;
    }

    /* azimuth */
    fread( modelITD->azimBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf );
    fread( modelITD->azimBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf );

    fread( &tmp, sizeof( int16_t ), 1, f_hrtf );

    modelITD->azimBsShape_dyn = (float *) malloc( tmp * sizeof( float ) );

    v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) );
    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf );
    for ( j = 0; j < tmp; j++ )
    {
        modelITD->azimBsShape_dyn[j] = ( (float) v_tmp16[j] ) * q_scale;
    }

    fread( &modelITD->azimSegSamples, sizeof( int16_t ), 1, f_hrtf );

    /* elevation */
    fread( modelITD->elevBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf );
    fread( modelITD->elevBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf );

    fread( &tmp, sizeof( int16_t ), 1, f_hrtf );

    modelITD->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) );

    v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) );
    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf );
    for ( j = 0; j < tmp; j++ )
    {
        modelITD->elevBsShape_dyn[j] = ( (float) v_tmp16[j] ) * q_scale;
    }

    fread( &modelITD->elevSegSamples, sizeof( int16_t ), 1, f_hrtf );

    modelITD->elevKSeq = (const float *) modelITD->elevKSeq_dyn;
    modelITD->azimKSeq = (const float *) modelITD->azimKSeq_dyn;
    modelITD->W = (const float *) modelITD->W_dyn;
    modelITD->azimBsShape = (const float *) modelITD->azimBsShape_dyn;
    modelITD->elevBsShape = (const float *) modelITD->elevBsShape_dyn;

    return;
}
#endif
/*-------------------------------------------------------------------*
 * LoadBSplineBinaryITD()
 *
@@ -315,6 +417,204 @@ static void LoadBSplineBinaryITD(
    return;
}

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
/*-------------------------------------------------------------------*
 * LoadBSplineBinary_fx()
 *
 * Loads the B Spline HR filter model data from file.
 --------------------------------------------------------------------*/

static ivas_error LoadBSplineBinary_fx(
    IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */
    FILE *f_hrtf                      /* i  : HR filter data file handle          */
)
{
    ModelParams_t *model;
    int16_t i, tmp, factor_Q;
    int16_t *v_tmp16;
    int32_t j, tmp32;
    float q_scale;

    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( &tmp32, 1, sizeof( int32_t ), f_hrtf );
    HrFiltSet_p->latency_s = ( (float) tmp32 ) * q_scale;


    model = &( HrFiltSet_p->ModelParams );

    /* Set ROM flag for correct deallocation */
    model->modelROM = FALSE;

    fread( &model->UseItdModel, sizeof( int16_t ), 1, f_hrtf ); /* Indicates if ITD model is active */
    fread( &tmp, sizeof( int16_t ), 1, f_hrtf );

    switch ( tmp )
    {
        case 16:
            HrFiltSet_p->SampleRate = 16000;
            if ( HrFiltSet_p->ModelParams.UseItdModel )
            {
                HrFiltSet_p->ModelParamsITD.resamp_factor = RESAMPLE_FACTOR_16_48;
            }
            break;
        case 32:
            HrFiltSet_p->SampleRate = 32000;
            if ( HrFiltSet_p->ModelParams.UseItdModel )
            {
                HrFiltSet_p->ModelParamsITD.resamp_factor = RESAMPLE_FACTOR_32_48;
            }
            break;
        case 48:
            HrFiltSet_p->SampleRate = 48000;
            if ( HrFiltSet_p->ModelParams.UseItdModel )
            {
                HrFiltSet_p->ModelParamsITD.resamp_factor = 1.0f;
            }
            break;
        default:
            return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "Error: HR filter file had an unsupported sampling rate (%d kHz)", tmp );
    }

    fread( &model->SplineDegree, sizeof( int16_t ), 1, f_hrtf );
    fread( &model->K, sizeof( int16_t ), 1, f_hrtf );

    fread( &model->elevDim2, sizeof( int16_t ), 1, f_hrtf );
    fread( &model->elevDim3, sizeof( int16_t ), 1, f_hrtf );
    model->elevKSeq_dyn = (float *) malloc( ( model->elevDim3 - 2 ) * sizeof( float ) );

    v_tmp16 = (int16_t *) malloc( ( model->elevDim3 - 2 ) * sizeof( int16_t ) );
    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( v_tmp16, sizeof( int16_t ), model->elevDim3 - 2, f_hrtf );
    for ( j = 0; j < model->elevDim3 - 2; j++ )
    {
        model->elevKSeq_dyn[j] = ( (float) v_tmp16[j] * q_scale );
    }
    free( v_tmp16 );

    model->azimDim2_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) );
    model->azimDim3_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) );
    model->azim_start_idx_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) );

    model->azimKSeq = (float **) malloc( model->elevDim3 * sizeof( float * ) );
    for ( i = 0; i < model->elevDim3; i++ )
    {
        fread( &model->azimDim2_dyn[i], sizeof( int16_t ), 1, f_hrtf );
        fread( &model->azimDim3_dyn[i], sizeof( int16_t ), 1, f_hrtf );
        fread( &model->azim_start_idx_dyn[i], sizeof( int16_t ), 1, f_hrtf );
        model->azimKSeq[i] = (float *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( float ) );

        v_tmp16 = (int16_t *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( int16_t ) );
        fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
        q_scale = powf( 2.f, -1.f * (float) factor_Q );
        fread( v_tmp16, sizeof( int16_t ), ( model->azimDim3_dyn[i] + 1 ), f_hrtf );
        for ( j = 0; j < model->azimDim3_dyn[i] + 1; j++ )
        {
            model->azimKSeq[i][j] = ( (float) v_tmp16[j] * q_scale );
        }
        free( v_tmp16 );
    }
    fread( &model->AlphaN, sizeof( int16_t ), 1, f_hrtf );

    model->AlphaL_dyn = (float *) malloc( model->AlphaN * model->K * sizeof( float ) );

    v_tmp16 = (int16_t *) malloc( model->AlphaN * model->K * sizeof( int16_t ) );
    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( v_tmp16, sizeof( int16_t ), model->AlphaN * model->K, f_hrtf );
    for ( j = 0; j < model->AlphaN * model->K; j++ )
    {
        model->AlphaL_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale; // Q14
    }

    model->AlphaR_dyn = (float *) malloc( model->AlphaN * model->K * sizeof( float ) );

    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( v_tmp16, sizeof( int16_t ), model->AlphaN * model->K, f_hrtf );
    for ( j = 0; j < model->AlphaN * model->K; j++ )
    {
        model->AlphaR_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale; // Q14
    }

    /* azimuth */
    fread( &model->num_unique_azim_splines, sizeof( int16_t ), 1, f_hrtf );
    model->azimBsShape = (const float **) malloc( model->num_unique_azim_splines * sizeof( float * ) );
    model->azimBsShape_dyn = (float **) malloc( model->num_unique_azim_splines * sizeof( float * ) );
    model->azimSegSamples_dyn = (int16_t *) malloc( model->num_unique_azim_splines * sizeof( int16_t ) );

    for ( i = 0; i < model->num_unique_azim_splines; i++ )
    {
        fread( &tmp, sizeof( int16_t ), 1, f_hrtf );
        model->azimBsShape_dyn[i] = (float *) malloc( tmp * sizeof( float ) );
        fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
        q_scale = powf( 2.f, -1.f * (float) factor_Q );
        fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf );
        for ( j = 0; j < tmp; j++ )
        {
            model->azimBsShape_dyn[i][j] = ( (float) ( v_tmp16[j] ) ) * q_scale;
        }
        fread( &model->azimSegSamples_dyn[i], sizeof( int16_t ), 1, f_hrtf );
    }

    model->azimShapeIdx_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) );
    fread( model->azimShapeIdx_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf );
    model->azimShapeSampFactor_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) );
    fread( model->azimShapeSampFactor_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf );

    /* elevation */
    fread( model->elevBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf );
    fread( model->elevBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf );
    fread( &tmp, sizeof( int16_t ), 1, f_hrtf );
    model->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) );

    fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf );
    q_scale = powf( 2.f, -1.f * (float) factor_Q );
    fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf );
    for ( j = 0; j < tmp; j++ )
    {
        model->elevBsShape_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale;
    }

    fread( &model->elevSegSamples, sizeof( int16_t ), 1, f_hrtf );

    /* Set const pointers */
    model->AlphaL = (const float *) model->AlphaL_dyn;
    model->AlphaR = (const float *) model->AlphaR_dyn;
    model->EL = (const float *) model->EL_dyn;
    model->ER = (const float *) model->ER_dyn;
    model->elevBsShape = (const float *) model->elevBsShape_dyn;
    model->elevKSeq = (const float *) model->elevKSeq_dyn;
    model->azimDim2 = (const int16_t *) model->azimDim2_dyn;
    model->azimDim3 = (const int16_t *) model->azimDim3_dyn;
    model->azim_start_idx = (const int16_t *) model->azim_start_idx_dyn;
    model->azimSegSamples = (const int16_t *) model->azimSegSamples_dyn;
    model->azimShapeIdx = (const int16_t *) model->azimShapeIdx_dyn;
    model->azimShapeSampFactor = (const int16_t *) model->azimShapeSampFactor_dyn;

    for ( i = 0; i < model->num_unique_azim_splines; i++ )
    {
        model->azimBsShape[i] = (const float *) model->azimBsShape_dyn[i];
    }

    HRTF_model_precalc( model );
    HRTF_energy_sections_precalc( model );
    HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K;

    HrFiltSet_p->ModelEval.hrfModL = (float *) malloc( model->K * sizeof( float ) );
    HrFiltSet_p->ModelEval.hrfModR = (float *) malloc( model->K * sizeof( float ) );

    if ( HrFiltSet_p->ModelParams.UseItdModel )
    {
        LoadBSplineBinaryITD_fx( &HrFiltSet_p->ModelParamsITD, f_hrtf );
    }

    free( v_tmp16 );

    return IVAS_ERR_OK;
}
#endif

/*-------------------------------------------------------------------*
 * LoadBSplineBinary()
@@ -728,8 +1028,19 @@ static ivas_error TDREND_MIX_LoadHRTF(
        }
        else
        {
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
            if ( is_fx )
            {
                header_check_result = LoadBSplineBinary_fx( HrFiltSet_p, f_hrtf );
            }
            else
            {
                header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf );
            }
#else
            header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf );
#endif
        }
    }
    else
    {
+21 −0
Original line number Diff line number Diff line
@@ -821,6 +821,9 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size )
    FILE *input_td_bin_file = NULL;
    int32_t td_hrtf_header_size, td_hrtf_data_size;
    char *td_hrtf = NULL, *td_hrtf_wptr, *full_in_td_path = NULL;
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    int16_t is_fx;
#endif

    // left/right and coherences for late reverb table sizes

@@ -842,6 +845,13 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size )
#endif
    input_td_bin_file = fopen( full_in_td_path, "rb" );

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    if ( strstr( input_td_bin_file_name, "_fx" ) )
    {
        is_fx = 1;
    }
#endif

    if ( input_td_bin_file != NULL )
    {

@@ -875,7 +885,18 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size )
        // Get the HRTF header

        // Renderer type
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
        if ( is_fx == 1 )
        {
            *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD + DEFAULT_BIN_FILE_FX_FLAG;
        }
        else
        {
            *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD;
        }
#else
        *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD;
#endif
        td_hrtf_wptr += sizeof( int32_t );

        // Decoder output format
+14 −1
Original line number Diff line number Diff line
@@ -96,6 +96,19 @@ dataSpec.subjId = 'custom';
dataSpec.hrfInDir = hrir_file;
dataSpec.hrfOutDir = binary_path;
dataSpec.genRomFile = writeRomFileOutput;
dataSpec.fx = false;
dataSpec.float = true;
dataSpec.romOutDir = rom_path;
Mod_Hrf_Itd_Main(dataSpec);

dataSpec.dataBase = 'IVAS';
dataSpec.subjId = 'custom';
% specify HR filter directory
dataSpec.hrfInDir = hrir_file;
dataSpec.hrfOutDir = binary_path;
dataSpec.genRomFile = writeRomFileOutput;
dataSpec.fx = true;
dataSpec.float = false;
dataSpec.romOutDir = rom_path;
Mod_Hrf_Itd_Main(dataSpec);

+851 −113

File changed.

Preview size limit exceeded, changes collapsed.

Loading