Commit 39299c3e authored by kinuthia's avatar kinuthia
Browse files

Add fixpoint for td renderer

parent 28c5839b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -157,6 +157,7 @@
/*#define SPLIT_REND_WITH_HEAD_ROT  */                  /* Dlb,FhG: Split Rendering contributions 21 and 35 */

#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_1033_MEMORY_LEAK_OMASA                      /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */
#define FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI      /* FhG: move setting of pointers for parameter decoding so they are skipped in lost frames when they are not needed */
#define FIX_1043_JBM_MD_BUFFER                          /* VA: issue 1043: JBM MD handle allocation is avoided in non-JBM EXT operations */
+12 −0
Original line number Diff line number Diff line
@@ -512,7 +512,11 @@ static ivas_error DefaultBSplineModel(
    modelITD->elevBsStart[2] = 11;
    modelITD->elevBsStart[3] = 21;

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->elevKSeq = (const float *) defaultHRIR_rom_ITD_elevKSeq;
#else
    modelITD->elevKSeq = defaultHRIR_rom_ITD_elevKSeq;
#endif

    modelITD->azimBsLen[0] = 11;
    modelITD->azimBsLen[1] = 21;
@@ -525,14 +529,22 @@ static ivas_error DefaultBSplineModel(

    modelITD->azimSegSamples = 10;

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->azimKSeq = (const float *) defaultHRIR_rom_ITD_azimKSeq;
#else
    modelITD->azimKSeq = defaultHRIR_rom_ITD_azimKSeq;
#endif
    modelITD->W = (const float *) defaultHRIR_rom_ITD_W;
    modelITD->azimBsShape = (const float *) defaultHRIR_rom_ITD_azimBsShape;
    modelITD->elevBsShape = (const float *) defaultHRIR_rom_ITD_elevBsShape;

    HRTF_model_precalc( model );

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    HrFiltSet_p->latency_s = (const float) defaultHRIR_rom_latency_s;
#else
    HrFiltSet_p->latency_s = defaultHRIR_rom_latency_s;
#endif
    HrFiltSet_p->SampleRate = output_Fs;
    HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K;

+10052 −10051

File changed.

Preview size limit exceeded, changes collapsed.

+4 −4
Original line number Diff line number Diff line
@@ -46,14 +46,14 @@
 * TD Binaural rendering related ROM tables
 *------------------------------------------------------------------------*/
/* TD renderer default HRIR model */
extern const float defaultHRIR_rom_latency_s;
extern const uint32_t defaultHRIR_rom_latency_s;
extern const int16_t defaultHRIR_rom_azimDim2[15];
extern const int16_t defaultHRIR_rom_azimDim3[15];
extern const int16_t defaultHRIR_rom_azim_start_idx[15];
extern const int16_t defaultHRIR_rom_azimSegSamples[1];
extern const int16_t defaultHRIR_rom_azimShapeIdx[15];
extern const int16_t defaultHRIR_rom_azimShapeSampFactor[15];
extern const float defaultHRIR_rom_elevKSeq[13];
extern const uint32_t defaultHRIR_rom_elevKSeq[13];
extern const uint32_t defaultHRIR_rom_AlphaL48[470 * 128];
extern const uint32_t defaultHRIR_rom_AlphaR48[470 * 128];
extern const uint32_t defaultHRIR_rom_AlphaL32[470 * 86];
@@ -70,7 +70,7 @@ extern const uint32_t defaultHRIR_rom_elevBsShape[36];
extern const uint32_t defaultHRIR_rom_azimBsShape[21];
extern const uint32_t defaultHRIR_rom_ITD_W[658];
extern const uint32_t defaultHRIR_rom_ITD_azimBsShape[84];
extern const float defaultHRIR_rom_ITD_azimKSeq[19];
extern const uint32_t defaultHRIR_rom_ITD_azimKSeq[19];
extern const uint32_t defaultHRIR_rom_ITD_elevBsShape[28];
extern const float defaultHRIR_rom_ITD_elevKSeq[16];
extern const uint32_t defaultHRIR_rom_ITD_elevKSeq[16];
#endif
+315 −2
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()
 *
@@ -269,6 +371,7 @@ static void LoadBSplineBinaryITD(
)
{
    int16_t tmp;

    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 );
@@ -292,7 +395,6 @@ static void LoadBSplineBinaryITD(

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

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

    /* elevation */
@@ -315,6 +417,205 @@ 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()
@@ -331,7 +632,6 @@ static ivas_error LoadBSplineBinary(
    int16_t i, tmp;

    fread( &HrFiltSet_p->latency_s, sizeof( float ), 1, f_hrtf );

    model = &( HrFiltSet_p->ModelParams );

    /* Set ROM flag for correct deallocation */
@@ -377,6 +677,7 @@ static ivas_error LoadBSplineBinary(
    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++ )
    {
@@ -399,6 +700,7 @@ static ivas_error LoadBSplineBinary(
    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 );
@@ -728,8 +1030,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
    {
Loading