Commit bbafd943 authored by emerit's avatar emerit
Browse files

fix td renderer sanitizer issue when using 16 bit rom tables

parent 7f8689a7
Loading
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3478,7 +3478,11 @@ void ivas_destroy_dec_fx(
    {
        ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd );
    }
#ifdef FIX_CREND_SIMPLIFY_CODE
    IF( st_ivas->hHrtfTD != NULL )
#else
    ELSE IF( st_ivas->hHrtfTD != NULL )
#endif
    {
        BSplineModelEvalDealloc_fx( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval );
        ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD );
+39 −0
Original line number Diff line number Diff line
@@ -188,6 +188,45 @@ void TDREND_MIX_Dealloc_fx(
            }
        }

#ifdef USE_TDREND_16BIT_ROM
        if ( hBinRendererTd->HrFiltSet_p->ModelParams.UseItdModel )
        {
            free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.elevKSeq_dyn_fx );
            free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.azimKSeq_dyn_fx );
            free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.W_dyn_fx );
            free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.azimBsShape_dyn_fx );
            free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.elevBsShape_dyn_fx );
        }
        free( hBinRendererTd->HrFiltSet_p->ModelParams.elevKSeq_dyn_fx );
#ifndef FIX_989_TD_REND_ROM
        free( hBinRendererTd->HrFiltSet_p->ModelParams.azimDim2_dyn );
#endif
        free( hBinRendererTd->HrFiltSet_p->ModelParams.AlphaL_dyn_fx );
        free( hBinRendererTd->HrFiltSet_p->ModelParams.AlphaR_dyn_fx );

        free( hBinRendererTd->HrFiltSet_p->ModelParams.elevBsShape_dyn_fx );

        for ( i = 0; i < hBinRendererTd->HrFiltSet_p->ModelParams.num_unique_azim_splines; i++ )
        {
            free( hBinRendererTd->HrFiltSet_p->ModelParams.azimBsShape_dyn_fx[i] );
        }
        free( hBinRendererTd->HrFiltSet_p->ModelParams.azimBsShape_dyn_fx );

        free( (void *) hBinRendererTd->HrFiltSet_p->ModelParams.azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */
        for ( i = 0; i < hBinRendererTd->HrFiltSet_p->ModelParams.elevDim3; i++ )
        {
            free( hBinRendererTd->HrFiltSet_p->ModelParams.azimKSeq_fx[i] );
        }
        free( hBinRendererTd->HrFiltSet_p->ModelParams.azimKSeq_fx );

        free( hBinRendererTd->HrFiltSet_p->ModelParams.EL_dyn_fx );
        free( hBinRendererTd->HrFiltSet_p->ModelParams.ER_dyn_fx );

        free( hBinRendererTd->HrFiltSet_p->ModelEval.hrfModL_fx );
        free( hBinRendererTd->HrFiltSet_p->ModelEval.hrfModR_fx );

#endif

        IF( EQ_16( hBinRendererTd->HrFiltSet_p->ModelParams.modelROM, 1 ) )
        {
            free( hBinRendererTd->HrFiltSet_p );
+8 −0
Original line number Diff line number Diff line
@@ -1085,12 +1085,18 @@ typedef struct
    /* Pointers for allocation of dynamic memory  */
    Word32 *AlphaL_dyn_fx;
    Word32 *AlphaR_dyn_fx;
#ifndef FIX_CREND_SIMPLIFY_CODE
    Word16 AlphaL_dyn_e;
    Word16 AlphaR_dyn_e;
#endif
    Word32 *EL_dyn_fx;
#ifndef FIX_CREND_SIMPLIFY_CODE
    Word16 EL_dyn_e;
#endif
    Word32 *ER_dyn_fx;
#ifndef FIX_CREND_SIMPLIFY_CODE
    Word16 ER_dyn_e;
#endif
    Word32 *elevBsShape_dyn_fx;
    Word32 *elevKSeq_dyn_fx;
#ifdef FIX_989_TD_REND_ROM
@@ -1151,7 +1157,9 @@ typedef struct
    Word32 *elevKSeq_dyn_fx;
    Word32 *azimKSeq_dyn_fx;
    Word32 *W_dyn_fx;
#ifndef FIX_CREND_SIMPLIFY_CODE
    Word16 W_dyn_e;
#endif
    Word32 *azimBsShape_dyn_fx;
    Word32 *elevBsShape_dyn_fx;
#ifdef FIX_989_TD_REND_ROM
+28 −43
Original line number Diff line number Diff line
@@ -342,7 +342,7 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
    fread( v_tmp16, sizeof( Word16 ), modelITD->elevDim3 - 2, f_hrtf );
    for ( j = 0; j < modelITD->elevDim3 - 2; j++ )
    {
        modelITD->elevKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q22, factor_Q ) );
        modelITD->elevKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q );
    }
    free( v_tmp16 );

@@ -357,7 +357,7 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
    fread( v_tmp16, sizeof( Word16 ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf );
    for ( j = 0; j < ( modelITD->azimDim3 + 1 ) / 2 - 2; j++ )
    {
        modelITD->azimKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q22, factor_Q ) );
        modelITD->azimKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q );
    }
    free( v_tmp16 );

@@ -374,12 +374,12 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
    modelITD->W_dyn_e = sub( Q15, factor_Q );
    modelITD->W_e = Q15 - factor_Q;
    //    modelITD->W_dyn_e = 6; /* force to 6 to be corrected  */
    fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf );
    for ( j = 0; j < tmp; j++ )
    {
        modelITD->W_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q25, factor_Q ) );
        modelITD->W_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q25 - factor_Q );
    }
    free( v_tmp16 );

@@ -408,7 +408,7 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
    fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf );
    for ( j = 0; j < tmp; j++ )
    {
        modelITD->azimBsShape_dyn_fx[j] = L_shl_r( v_tmp16[j], sub( Q30, factor_Q ) );
        modelITD->azimBsShape_dyn_fx[j] = L_shl_r( v_tmp16[j], Q30 - factor_Q );
    }
    free( v_tmp16 );

@@ -444,7 +444,7 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
    fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf );
    for ( j = 0; j < tmp; j++ )
    {
        modelITD->elevBsShape_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q30, factor_Q ) );
        modelITD->elevBsShape_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q );
    }
    free( v_tmp16 );
    fread( &modelITD->elevSegSamples, sizeof( Word16 ), 1, f_hrtf );
@@ -452,7 +452,6 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
    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_e = modelITD->W_dyn_e;
    modelITD->azimBsShape_fx = (const Word32 *) modelITD->azimBsShape_dyn_fx;
    modelITD->elevBsShape_fx = (const Word32 *) modelITD->elevBsShape_dyn_fx;
    modelITD->azimBsLen = (const Word16 *) modelITD->azimBsLen_dyn_fx;
@@ -586,11 +585,11 @@ static ivas_error TDREND_LoadBSplineBinary(

    fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf );
#ifdef USE_TDREND_16BIT_ROM
    HrFiltSet_p->latency_s_Q_fx = sub( Q31, factor_Q );
    HrFiltSet_p->latency_s_Q_fx = Q31 - factor_Q;
    fread( &HrFiltSet_p->latency_s_fx, 1, sizeof( Word32 ), f_hrtf );
#else
    fread( &tmp32, 1, sizeof( Word32 ), f_hrtf );
    HrFiltSet_p->latency_s_fx = L_shr_r( Mpy_32_32_r( tmp32, 1000000000 ), sub( Q31, factor_Q ) );
    HrFiltSet_p->latency_s_fx = L_shr_r( Mpy_32_32_r( tmp32, 1000000000 ), Q31 -  factor_Q ) );
#endif
    model = &( HrFiltSet_p->ModelParams );

@@ -640,7 +639,7 @@ static ivas_error TDREND_LoadBSplineBinary(
    fread( v_tmp16, sizeof( Word16 ), model->elevDim3 - 2, f_hrtf );
    for ( j = 0; j < model->elevDim3 - 2; j++ )
    {
        model->elevKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q22, factor_Q ) );
        model->elevKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q );
    }
    free( v_tmp16 );
    model->azimDim3_dyn = (Word16 *) malloc( model->elevDim3 * sizeof( Word16 ) );
@@ -666,7 +665,7 @@ static ivas_error TDREND_LoadBSplineBinary(
        fread( v_tmp16, sizeof( Word16 ), ( model->azimDim3_dyn[i] + 1 ), f_hrtf );
        for ( j = 0; j < model->azimDim3_dyn[i] + 1; j++ )
        {
            model->azimKSeq_fx[i][j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q22, factor_Q ) );
            model->azimKSeq_fx[i][j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q );
        }
        free( v_tmp16 );
    }
@@ -681,14 +680,14 @@ static ivas_error TDREND_LoadBSplineBinary(
    }
    fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf );

    model->AlphaL_dyn_e = sub( Q15, factor_Q );
    model->AlphaL_e = Q15 - factor_Q;
    //    model->AlphaL_dyn_e = 1; /* force to 6 to be corrected  */
    model->AlphaR_dyn_e = model->AlphaL_dyn_e;
    model->AlphaR_e = model->AlphaL_e;

    fread( v_tmp16, sizeof( Word16 ), model->AlphaN * model->K, f_hrtf );
    for ( j = 0; j < model->AlphaN * model->K; j++ )
    {
        model->AlphaL_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q30, factor_Q ) );
        model->AlphaL_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q );
    }
    model->AlphaR_dyn_fx = (Word32 *) malloc( model->AlphaN * model->K * sizeof( Word32 ) );
    if ( model->AlphaR_dyn_fx == NULL )
@@ -699,7 +698,7 @@ static ivas_error TDREND_LoadBSplineBinary(
    fread( v_tmp16, sizeof( Word16 ), model->AlphaN * model->K, f_hrtf );
    for ( j = 0; j < model->AlphaN * model->K; j++ )
    {
        model->AlphaR_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q30, factor_Q ) );
        model->AlphaR_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q );
    }

    free( v_tmp16 );
@@ -732,7 +731,7 @@ static ivas_error TDREND_LoadBSplineBinary(
        fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf );
        for ( j = 0; j < tmp; j++ )
        {
            model->azimBsShape_dyn_fx[i][j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q30, factor_Q ) );
            model->azimBsShape_dyn_fx[i][j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q );
        }
        fread( &model->azimSegSamples_dyn[i], sizeof( Word16 ), 1, f_hrtf );
        free( v_tmp16 );
@@ -777,7 +776,7 @@ static ivas_error TDREND_LoadBSplineBinary(
    fread( v_tmp16, sizeof( Word16 ), tmp, f_hrtf );
    for ( j = 0; j < tmp; j++ )
    {
        model->elevBsShape_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), sub( Q30, factor_Q ) );
        model->elevBsShape_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q30 - factor_Q );
    }
    free( v_tmp16 );

@@ -790,8 +789,8 @@ static ivas_error TDREND_LoadBSplineBinary(
    }
    fread( &factor_Q, 1, sizeof( Word16 ), f_hrtf );

    model->EL_dyn_e = sub( Q31, factor_Q );
    model->ER_dyn_e = model->EL_dyn_e;
    model->EL_e = Q31 - factor_Q;
    model->ER_e = model->EL_e;

    fread( (Word32 *) model->EL_dyn_fx, sizeof( Word32 ), model->AlphaN * HRTF_MODEL_N_SECTIONS, f_hrtf );

@@ -804,17 +803,9 @@ static ivas_error TDREND_LoadBSplineBinary(

    /* Set const pointers */
    model->AlphaL_fx = (const Word32 *) model->AlphaL_dyn_fx;
    model->AlphaL_e = model->AlphaL_dyn_e;
    move16();
    model->AlphaR_fx = (const Word32 *) model->AlphaR_dyn_fx;
    model->AlphaR_e = model->AlphaR_dyn_e;
    move16();
    model->EL_fx = (const Word32 *) model->EL_dyn_fx;
    model->EL_e = model->EL_dyn_e;
    move16();
    model->ER_fx = (const Word32 *) model->ER_dyn_fx;
    model->ER_e = model->ER_dyn_e;
    move16();
    model->elevBsLen = (const Word16 *) model->elevBsLen_dyn;
    model->elevBsStart = (const Word16 *) model->elevBsStart_dyn;
    model->elevBsShape_fx = (const Word32 *) model->elevBsShape_dyn_fx;
@@ -1574,6 +1565,7 @@ void destroy_td_hrtf(
#ifdef USE_TDREND_16BIT_ROM
    else
    {
#ifdef USE_TDREND_16BIT_ROM
        if ( ( *hHrtf )->ModelParams.UseItdModel )
        {
            free( ( *hHrtf )->ModelParamsITD.elevKSeq_dyn_fx );
@@ -1581,23 +1573,14 @@ void destroy_td_hrtf(
            free( ( *hHrtf )->ModelParamsITD.W_dyn_fx );
            free( ( *hHrtf )->ModelParamsITD.azimBsShape_dyn_fx );
            free( ( *hHrtf )->ModelParamsITD.elevBsShape_dyn_fx );
#ifdef FIX_989_TD_REND_ROM
            free( ( *hHrtf )->ModelParamsITD.elevBsLen_dyn_fx );
            free( ( *hHrtf )->ModelParamsITD.elevBsStart_dyn_fx );
#endif
        }
        free( ( *hHrtf )->ModelParams.elevKSeq_dyn_fx );
        free( ( *hHrtf )->ModelParams.azim_start_idx_dyn );
#ifndef FIX_989_TD_REND_ROM
        free( ( *hHrtf )->ModelParams.azimDim2_dyn );
#endif
        free( ( *hHrtf )->ModelParams.AlphaL_dyn_fx );
        free( ( *hHrtf )->ModelParams.AlphaR_dyn_fx );

#ifdef FIX_989_TD_REND_ROM
        free( ( *hHrtf )->ModelParams.elevBsLen_dyn );
        free( ( *hHrtf )->ModelParams.elevBsStart_dyn );
#endif
        free( ( *hHrtf )->ModelParams.elevBsShape_dyn_fx );

        for ( i = 0; i < ( *hHrtf )->ModelParams.num_unique_azim_splines; i++ )
@@ -1618,6 +1601,8 @@ void destroy_td_hrtf(

        free( ( *hHrtf )->ModelEval.hrfModL_fx );
        free( ( *hHrtf )->ModelEval.hrfModR_fx );

#endif
    }
#endif

@@ -1656,7 +1641,7 @@ static ivas_error create_Crend_HRTF_from_rawdata(
    hrtf_data_rptr = hrtf_data;

    /* latency_s Q factor*/
    ( *hHRTF )->factor_Q_latency_s_fx = sub( Q31, *( (Word16 *) ( hrtf_data_rptr ) ) );
    ( *hHRTF )->factor_Q_latency_s_fx = Q31 - *( (Word16 *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( Word16 );
    /* latency_s */
    ( *hHRTF )->latency_s_fx = ( *( (Word32 *) ( hrtf_data_rptr ) ) );
@@ -1736,7 +1721,7 @@ static ivas_error create_Crend_HRTF_from_rawdata(
    hrtf_data_rptr += sizeof( uint16_t );

    /* inv_diffuse_weight Q factor*/
    ( *hHRTF )->factor_Q_inv_diffuse_weight = sub( Q15, *( (Word16 *) ( hrtf_data_rptr ) ) );
    ( *hHRTF )->factor_Q_inv_diffuse_weight = Q15 - *( (Word16 *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( Word16 );

    /* inv_diffuse_weight */
@@ -1754,7 +1739,7 @@ static ivas_error create_Crend_HRTF_from_rawdata(
    /* max_total_num_fsamp_per_iteration */
    max_total_num_fsamp_per_iteration = *( (Word32 *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( Word32 );
    ( *hHRTF )->factor_Q_pOut_to_bin = sub( Q15, *( (Word16 *) ( hrtf_data_rptr ) ) );
    ( *hHRTF )->factor_Q_pOut_to_bin = Q15 - *( (Word16 *) ( hrtf_data_rptr ) );
    hrtf_data_rptr += sizeof( Word16 );

    mem_size_buf = max_total_num_fsamp_per_iteration * sizeof( Word16 );
@@ -1928,10 +1913,10 @@ static ivas_error create_fastconv_HRTF_from_rawdata(

    ( *hHRTF )->ntaps = ntaps;
#ifdef USE_FASTCONV_PARAMBIN_16BIT_ROM
    ( *hHRTF )->FASTCONV_latency_s_Q_fx = sub( Q31, factorQ );
    ( *hHRTF )->FASTCONV_latency_s_Q_fx = Q31 - factorQ;
    ( *hHRTF )->FASTCONV_latency_s_fx = latency_s;
#else
    ( *hHRTF )->FASTCONV_latency_s_fx = L_shr_r( Mpy_32_32_r( latency_s, 1000000000 ), sub( Q31, factorQ ) );
    ( *hHRTF )->FASTCONV_latency_s_fx = L_shr_r( Mpy_32_32_r( latency_s, 1000000000 ), Q31 -  factorQ ) );
    ;
#endif
    ( *hHRTF )->n_channels = nbchan;
@@ -2077,7 +2062,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata(
        ptW16 = (Word16 *) hrtf_data_rptr;
        for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ )
        {
            ( *hHRTF )->fastconvReverberationEneCorrections_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), sub( Q31, factorQ ) );
            ( *hHRTF )->fastconvReverberationEneCorrections_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), Q31 - factorQ );
            hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( Word16 );
        }
    }
@@ -2179,7 +2164,7 @@ static ivas_error create_parambin_HRTF_from_rawdata(
    ptW16 = (int16_t *) hrtf_data_rptr;
    for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ )
    {
        ( *hHRTF )->parametricReverberationEneCorrections_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), sub( Q31, factorQ ) );
        ( *hHRTF )->parametricReverberationEneCorrections_fx[j] = L_shl_r( L_deposit_l( ptW16[j] ), Q31 - factorQ );
    }
    hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( int16_t );