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

bug fix

parent af079603
Loading
Loading
Loading
Loading
+84 −38
Original line number Diff line number Diff line
@@ -329,58 +329,69 @@ static ivas_error LoadBSplineBinaryITD(
)
{
    Word16 tmp;

#ifndef FIX_TDREND_HRTF_FILE_FORMAT
    Word16 i;
#endif
    if ( modelITD == NULL || f_hrtf == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

    fread( &modelITD->elevDim3, sizeof( Word16 ), 1, f_hrtf );
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    fread( &modelITD->elevDim3, sizeof( Word16 ), 1, f_hrtf );
    modelITD->elevKSeq_dyn_fx = (Word16 *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( Word16 ) );
#else
    modelITD->elevKSeq_dyn_fx = (Word32 *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( Word32 ) );
#endif
    if ( modelITD->elevKSeq_dyn_fx == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    fread( &modelITD->elevKSeq_e, 1, sizeof( Word16 ), f_hrtf );
#endif
    fread( modelITD->elevKSeq_dyn_fx, sizeof( Word16 ), modelITD->elevDim3 - 2, f_hrtf );

    fread( &modelITD->azimDim3, sizeof( int16_t ), 1, f_hrtf );
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->azimKSeq_dyn_fx = (Word16 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word16 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */
#else
    modelITD->azimKSeq_dyn_fx = (Word32 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word32 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */
#endif
    if ( modelITD->azimKSeq_dyn_fx == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    fread( &modelITD->azimKSeq_e, 1, sizeof( int16_t ), f_hrtf );
#endif
    fread( modelITD->azimKSeq_dyn_fx, sizeof( Word16 ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf );
#else
    fread( &modelITD->N, sizeof( Word16 ), 1, f_hrtf );
    fread( &modelITD->elevDim2, sizeof( Word16 ), 1, f_hrtf );
    fread( &modelITD->elevDim3, sizeof( Word16 ), 1, f_hrtf );

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

    modelITD->elevKSeq_dyn_fx = (Word32 *) malloc( sizeof( Word32 ) * ( modelITD->elevDim3 - 2 ) );
    FOR( i = 0; i < modelITD->elevDim3 - 2; i++ )
    {
        modelITD->elevKSeq_dyn_fx[i] = float_to_fix( elevKSeq_dyn_local[i], Q22 );
    }
    free( elevKSeq_dyn_local );

    fread( &modelITD->azimDim2, sizeof( Word16 ), 1, f_hrtf );
    fread( &modelITD->azimDim3, sizeof( Word16 ), 1, f_hrtf );

    float *azimKSeq_dyn_local = (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 */
    fread( azimKSeq_dyn_local, sizeof( float ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf );
    modelITD->azimKSeq_dyn_fx = (Word32 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word32 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */
    FOR( i = 0; i < ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ); i++ )
    {
        modelITD->azimKSeq_dyn_fx[i] = float_to_fix( azimKSeq_dyn_local[i], Q22 );
    }
    free( azimKSeq_dyn_local );
#endif

    fread( &tmp, sizeof( Word16 ), 1, f_hrtf );
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->W_dyn_fx = (Word16 *) malloc( tmp * sizeof( Word16 ) );
#else
    modelITD->W_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) );
#endif
    if ( modelITD->W_dyn_fx == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }

    fread( &modelITD->W_e, 1, sizeof( int16_t ), f_hrtf );
    fread( modelITD->W_dyn_fx, sizeof( Word16 ), tmp, f_hrtf );

    /* azimuth */
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->azimBsLen_dyn_fx = (int16_t *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( int16_t ) );
    if ( modelITD->azimBsLen_dyn_fx == NULL )
    {
@@ -393,26 +404,20 @@ static ivas_error LoadBSplineBinaryITD(
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
    fread( modelITD->azimBsStart_dyn_fx, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf );
#endif

    /* azimuth */
    fread( &tmp, sizeof( int16_t ), 1, f_hrtf );

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->azimBsShape_dyn_fx = (Word16 *) malloc( tmp * sizeof( Word16 ) );
#else
    modelITD->azimBsShape_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) );
#endif
    if ( modelITD->azimBsShape_dyn_fx == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    fread( &modelITD->azimBsShape_e, 1, sizeof( int16_t ), f_hrtf );
#endif
    fread( modelITD->azimBsShape_dyn_fx, sizeof( int16_t ), tmp, f_hrtf );
    fread( &modelITD->azimSegSamples, sizeof( int16_t ), 1, f_hrtf );

    /* elevation */
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->elevBsLen_dyn_fx = (int16_t *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( int16_t ) );
    if ( modelITD->elevBsLen_dyn_fx == NULL )
    {
@@ -425,26 +430,20 @@ static ivas_error LoadBSplineBinaryITD(
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
    fread( modelITD->elevBsStart_dyn_fx, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf );
#endif

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

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->elevBsShape_dyn_fx = (Word16 *) malloc( tmp * sizeof( Word16 ) );
#else
    modelITD->elevBsShape_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) );
#endif
    if ( modelITD->elevBsShape_dyn_fx == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    fread( &modelITD->elevBsShape_e, 1, sizeof( int16_t ), f_hrtf );
#endif

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

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    modelITD->elevKSeq_fx = (const Word16 *) modelITD->elevKSeq_dyn_fx;
    modelITD->azimKSeq_fx = (const Word16 *) modelITD->azimKSeq_dyn_fx;
    modelITD->W_fx = (const Word16 *) modelITD->W_dyn_fx;
@@ -455,12 +454,59 @@ static ivas_error LoadBSplineBinaryITD(
    modelITD->elevBsLen = modelITD->elevBsLen_dyn_fx;
    modelITD->elevBsStart = modelITD->elevBsStart_dyn_fx;
#else
    float *W_dyn_local = (float *) malloc( tmp * sizeof( float ) );
    fread( W_dyn_local, sizeof( float ), tmp, f_hrtf );

    modelITD->W_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) );
    f2me_buf( W_dyn_local, modelITD->W_dyn_fx, &modelITD->W_dyn_e, tmp );
    free( W_dyn_local );

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

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

    float *azimBsShape_dyn_local = (float *) malloc( tmp * sizeof( float ) );
    fread( azimBsShape_dyn_local, sizeof( float ), tmp, f_hrtf );

    modelITD->azimBsShape_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) );
    FOR( i = 0; i < tmp; i++ )
    {
        modelITD->azimBsShape_dyn_fx[i] = float_to_fix( azimBsShape_dyn_local[i], Q30 );
    }
    free( azimBsShape_dyn_local );

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

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

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

    float *elevBsShape_dyn_local = (float *) malloc( tmp * sizeof( float ) );
    fread( elevBsShape_dyn_local, sizeof( float ), tmp, f_hrtf );

    modelITD->elevBsShape_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) );
    FOR( i = 0; i < tmp; i++ )
    {
        modelITD->elevBsShape_dyn_fx[i] = float_to_fix( elevBsShape_dyn_local[i], Q30 );
    }
    free( elevBsShape_dyn_local );

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

    modelITD->elevKSeq_fx = (const Word32 *) modelITD->elevKSeq_dyn_fx;

    modelITD->azimKSeq_fx = (const Word32 *) modelITD->azimKSeq_dyn_fx;
    modelITD->W_fx = (const Word32 *) modelITD->W_dyn_fx;
    modelITD->W_fx = modelITD->W_dyn_fx;
    modelITD->W_e = modelITD->W_dyn_e;
    move16();
    modelITD->azimBsShape_fx = (const Word32 *) modelITD->azimBsShape_dyn_fx;
    modelITD->elevBsShape_fx = (const Word32 *) modelITD->elevBsShape_dyn_fx;
#endif

    return IVAS_ERR_OK;
}
/*-------------------------------------------------------------------*