Commit 936e8bcc authored by Arash Azizi's avatar Arash Azizi
Browse files

Merge branch 'main' into basop-2446-harmonize-functions-con_tcx_fx-and-con_tcx_ivas_fx

parents d0c00f48 66d508d1
Loading
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1593,6 +1593,9 @@ typedef enum
#define DEG_360_IN_Q22                          ( 360 << Q22 )              /* Q22 */
#define DEG_180_IN_Q22                          ( 180 << Q22 )              /* Q22 */
#define DEG_90_IN_Q22                           ( 90 << Q22 )               /* Q22 */
#ifdef FIX_2235_TD_RENDERER_WORD16
#define DEG_90_IN_Q8                            ( 90 << Q8 )                /* Q8  */
#endif
#define ONE_BY_360_Q31                          ( 5965232 )                 /* Q31 */
#define ONE_BY_360_Q15                          ( 91 )                      /* Q15 */
#define ONE_BY_180_Q31                          ( 11930465 )                /* Q31 */
+1 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@
#define FIX_1990_SANITIZER_IN_REVERB_LOAD               /* Nokia: Fix issue part of issue 1990 by introducing missing free of structure - keep until #2059 is addressed */
#define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR      /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */
#define NONBE_1122_KEEP_EVS_MODE_UNCHANGED              /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR.  */
#define FIX_2235_TD_RENDERER_WORD16                     /* Eri: Use Word16 in TD renderer without converting to Word32*/
#define HARMONIZE_TBE2                                  /* VA: basop issue 2399: Remove duplicated code: TBE, step 2 */
#define HARMONIZE_2427_GETPLC                           /* FhG: basop issue : 2427 Harmonizing getPLCDecision functions:*/
#define HARM_FD_BWE                                     /* VA: harmonize core-coder FD BWE function duplications */
+82 −0
Original line number Diff line number Diff line
@@ -175,11 +175,19 @@ ivas_error ivas_HRTF_CRend_binary_open_fx(
}


#ifdef FIX_2235_TD_RENDERER_WORD16
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int16()
 *
 * Allocate buffer with dynamic length for HRTF binary handle
 *-----------------------------------------------------------------------*/
#else
/*-----------------------------------------------------------------------*
 * ivas_HRTF_CRend_binary_open_buffers_int16()
 *
 * Allocate buffer with dynamic length for HRTF binary Crend handle
 *-----------------------------------------------------------------------*/
#endif
ivas_error ivas_HRTF_binary_open_buffers_int16(
    Word16 **buffer,       /* o  : buffer to allocate      */
    const UWord32 mem_size /* i  : size of buffer          */
@@ -195,11 +203,19 @@ ivas_error ivas_HRTF_binary_open_buffers_int16(
    return IVAS_ERR_OK;
}

#ifdef FIX_2235_TD_RENDERER_WORD16
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_uint16()
 *
 * Allocate buffer with dynamic length for HRTF binary handle
 *-----------------------------------------------------------------------*/
#else
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_uint16()
 *
 * Allocate buffer with dynamic length for HRTF binary Crend handle
 *-----------------------------------------------------------------------*/
#endif
ivas_error ivas_HRTF_binary_open_buffers_uint16(
    UWord16 **buffer,       /* o  : buffer to allocate      */
    const uint32_t mem_size /* i  : size of buffer          */
@@ -215,11 +231,19 @@ ivas_error ivas_HRTF_binary_open_buffers_uint16(
    return IVAS_ERR_OK;
}

#ifdef FIX_2235_TD_RENDERER_WORD16
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int32()
 *
 * Allocate buffer with dynamic length for HRTF binary handle
 *-----------------------------------------------------------------------*/
#else
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int32()
 *
 * Allocate buffer with dynamic length for HRTF binary Crend handle
 *-----------------------------------------------------------------------*/
#endif
ivas_error ivas_HRTF_binary_open_buffers_int32(
    Word32 **buffer,        /* o  : buffer to allocate      */
    const uint32_t mem_size /* i  : size of buffer          */
@@ -235,11 +259,19 @@ ivas_error ivas_HRTF_binary_open_buffers_int32(
    return IVAS_ERR_OK;
}

#ifdef FIX_2235_TD_RENDERER_WORD16
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int32_ptr()
 *
 * Allocate buffer with dynamic length for HRTF binary handle
 *-----------------------------------------------------------------------*/
#else
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int32_ptr()
 *
 * Allocate buffer with dynamic length for HRTF binary Crend handle
 *-----------------------------------------------------------------------*/
#endif
ivas_error ivas_HRTF_binary_open_buffers_int32_ptr(
    Word32 ***buffer,       /* o  : buffer to allocate      */
    const uint32_t mem_size /* i  : size of buffer          */
@@ -255,11 +287,61 @@ ivas_error ivas_HRTF_binary_open_buffers_int32_ptr(
    return IVAS_ERR_OK;
}

#ifdef FIX_2235_TD_RENDERER_WORD16
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int16_ptr_const()
 *
 * Allocate buffer with dynamic length for HRTF binary handle
 *-----------------------------------------------------------------------*/
ivas_error ivas_HRTF_binary_open_buffers_int16_ptr_const(
    const Word16 ***buffer, /* o  : buffer to allocate      */
    const uint32_t mem_size /* i  : size of buffer          */
)
{
    *buffer = (const Word16 **) malloc( mem_size );

    if ( *buffer == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary data\n" );
    }

    return IVAS_ERR_OK;
}

/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int16_ptr()
 *
 * Allocate buffer with dynamic length for HRTF binary handle
 *-----------------------------------------------------------------------*/
ivas_error ivas_HRTF_binary_open_buffers_int16_ptr(
    Word16 ***buffer,       /* o  : buffer to allocate      */
    const uint32_t mem_size /* i  : size of buffer          */
)
{
    *buffer = (Word16 **) malloc( mem_size );

    if ( *buffer == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary data\n" );
    }

    return IVAS_ERR_OK;
}
#endif

#ifdef FIX_2235_TD_RENDERER_WORD16
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int32_ptr_const()
 *
 * Allocate buffer with dynamic length for HRTF binary handle
 *-----------------------------------------------------------------------*/
#else
/*-----------------------------------------------------------------------*
 * ivas_HRTF_binary_open_buffers_int32_ptr_const()
 *
 * Allocate buffer with dynamic length for HRTF binary Crend handle
 *-----------------------------------------------------------------------*/
#endif
ivas_error ivas_HRTF_binary_open_buffers_int32_ptr_const(
    const Word32 ***buffer, /* o  : buffer to allocate      */
    const uint32_t mem_size /* i  : size of buffer          */
+130 −12
Original line number Diff line number Diff line
@@ -44,8 +44,14 @@
 * Local function prototypes
 *---------------------------------------------------------------------*/


#ifdef FIX_2235_TD_RENDERER_WORD16
static void getPeriodicBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *AzIdx, const Word16 NumBFs, const Word32 t_fx, Word16 *num_az_idx, const Word16 knot_interval_fx, const Word16 azimKSeq_0_fx, const Word16 azimSegSamples, const Word16 *azimBsShape_fx, const Word16 subSampFactor );
static void getStandardBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *NzIdx, Word16 *num_idx, const Word16 NumBFs, const Word32 t_fx, const Word16 *KSeq_fx, const Word16 KSeq_Q_fx, const Word16 SegSamples, const Word16 *BsLen, const Word16 *BsStart, const Word16 *BsShape_fx );
#else
static void getPeriodicBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *AzIdx, const Word16 NumBFs, const Word32 t_fx, Word16 *num_az_idx, const Word32 knot_interval_fx, const Word32 azimKSeq_0_fx, const Word16 azimSegSamples, const Word32 *azimBsShape_fx, const Word16 subSampFactor );
static void getStandardBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *NzIdx, Word16 *num_idx, const Word16 NumBFs, const Word32 t_fx, const Word32 *KSeq_fx, const Word16 SegSamples, const Word16 *BsLen, const Word16 *BsStart, const Word32 *BsShape_fx );
#endif
static void GenerateFilter_fx( const Word32 elev, Word32 azim, ModelParams_t *model, ModelEval_t *modelEval );
static void GenerateITD_fx( const Word32 elev, Word32 azim, ModelParamsITD_t *model, ModelEval_t *modelEval );
static void SkipSmallest_ValueIndex_fx( Word16 *use_inds, const ValueIndex_t *VI, const Word16 N, const Word16 n_smallest );
@@ -204,19 +210,30 @@ static void GenerateFilter_fx(
    Word16 num_az_idx[HRTF_MODEL_BSPLINE_NUM_COEFFS];
    Word16 num_ev_idx;
    Word16 BM_idx[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ];
#ifdef FIX_2235_TD_RENDERER_WORD16
    Word16 knot_interval; /* Q6 */
#else
    Word32 knot_interval;
#endif
    Word32 ETotL, ETotR, ESynL, ESynR;
    Word16 ETotL_e, ETotR_e, ESynL_e, ESynR_e;
    Word32 ScaleL, ScaleR;
    Word16 ScaleL_e, ScaleR_e;
    Word16 iSec;
#ifndef FIX_2235_TD_RENDERER_WORD16
    Word16 tmp_e;
#endif
    Word32 tmp32;
    Word16 BMEnergiesR_e, BMEnergiesL_e;
    Word16 tmp_hrfModR_e, tmp_hrfModL_e;

#ifdef FIX_2235_TD_RENDERER_WORD16
    getStandardBSplineSampVec_fx( modelEval->elevBfVec_fx, EvIdx, &num_ev_idx, model->elevDim3, elev, model->elevKSeq_fx, Q8,
                                  model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx );
#else
    getStandardBSplineSampVec_fx( modelEval->elevBfVec_fx, EvIdx, &num_ev_idx, model->elevDim3, elev, model->elevKSeq_fx,
                                  model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx );
#endif

    FOR( p = 0; p < num_ev_idx; p++ )
    {
@@ -246,13 +263,23 @@ static void GenerateFilter_fx(
            k = EvIdx[p];
            move16();

#ifdef FIX_2235_TD_RENDERER_WORD16
            knot_interval = sub( model->azimKSeq_fx[k][1], model->azimKSeq_fx[k][0] ); /* Q6 */
#else
            knot_interval = L_deposit_h( BASOP_Util_Divide3216_Scale( L_sub( model->azimKSeq_fx[k][model->azimDim3[k]], model->azimKSeq_fx[k][0] ), model->azimDim3[k], &tmp_e ) );
            tmp_e = add( tmp_e, 9 - 15 );
            knot_interval = L_shr( knot_interval, sub( 9, tmp_e ) ); // variable Q to Q22
#endif

#ifdef FIX_2235_TD_RENDERER_WORD16
            getPeriodicBSplineSampVec_fx( modelEval->azimBfVec_fx[p], AzIdx[p], model->azimDim3[k], azim, &num_az_idx[p],
                                          knot_interval, model->azimKSeq_fx[k][0], model->azimSegSamples[model->azimShapeIdx[k]],
                                          model->azimBsShape_fx[model->azimShapeIdx[k]], model->azimShapeSampFactor[k] );
#else
            getPeriodicBSplineSampVec_fx( modelEval->azimBfVec_fx[p], AzIdx[p], model->azimDim3[k], azim, &num_az_idx[p],
                                          knot_interval, model->azimKSeq_fx[k][0], model->azimSegSamples[model->azimShapeIdx[k]],
                                          model->azimBsShape_fx[model->azimShapeIdx[k]], model->azimShapeSampFactor[k] );
#endif
        }
    }

@@ -357,8 +384,13 @@ static void GenerateFilter_fx(

            FOR( i = 0; i < p; i++ )
            {
#ifdef FIX_2235_TD_RENDERER_WORD16
                temp1 = W_add( temp1, Mpy_32_16_1( modelEval->BM_fx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], model->AlphaL_fx[BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i] + ( model->AlphaN * k )] ) ); // add(model->AlphaL_e, 1)
                temp2 = W_add( temp2, Mpy_32_16_1( modelEval->BM_fx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], model->AlphaR_fx[BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i] + ( model->AlphaN * k )] ) ); // add(model->AlphaR_e, 1)
#else
                temp1 = W_add( temp1, Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], model->AlphaL_fx[BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i] + ( model->AlphaN * k )] ) ); // add(model->AlphaL_e, 1)
                temp2 = W_add( temp2, Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], model->AlphaR_fx[BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i] + ( model->AlphaN * k )] ) ); // add(model->AlphaR_e, 1)
#endif
            }

            tmp_hrfModL_e = W_norm( temp1 );
@@ -445,8 +477,13 @@ static void GenerateITD_fx(

    IF( NE_32( L_abs( elev_fx ), DEG_90_IN_Q22 ) )
    {
#ifdef FIX_2235_TD_RENDERER_WORD16
        getStandardBSplineSampVec_fx( modelEval->elevBfVecITD_fx, EvIdx, &num_ev_idx, model->elevDim3, elev_fx, model->elevKSeq_fx, Q8,
                                      model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx );
#else
        getStandardBSplineSampVec_fx( modelEval->elevBfVecITD_fx, EvIdx, &num_ev_idx, model->elevDim3, elev_fx, model->elevKSeq_fx,
                                      model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx );
#endif

        azim_itd_fx = azim_fx;
        move32();
@@ -455,8 +492,13 @@ static void GenerateITD_fx(
            /* Flip spline functions around 180 deg */
            azim_itd_fx = L_sub( DEG_360_IN_Q22, azim_fx ); // Q22
        }
#ifdef FIX_2235_TD_RENDERER_WORD16
        getStandardBSplineSampVec_fx( modelEval->azimBfVecITD_fx, AzIdx, &num_az_idx, shr( add( model->azimDim3, 1 ), 1 ), azim_itd_fx, model->azimKSeq_fx, Q7,
                                      model->azimSegSamples, model->azimBsLen, model->azimBsStart, model->azimBsShape_fx );
#else
        getStandardBSplineSampVec_fx( modelEval->azimBfVecITD_fx, AzIdx, &num_az_idx, shr( add( model->azimDim3, 1 ), 1 ), azim_itd_fx, model->azimKSeq_fx,
                                      model->azimSegSamples, model->azimBsLen, model->azimBsStart, model->azimBsShape_fx );
#endif
        IF( GT_32( azim_fx, DEG_180_IN_Q22 ) )
        {
            /* Flip spline functions around 180 deg */
@@ -492,7 +534,11 @@ static void GenerateITD_fx(
    /* Compute BM_ITD */
    elev_offset = 0;
    move16();
#ifdef FIX_2235_TD_RENDERER_WORD16
    if ( EQ_16( model->elevKSeq_fx[0], -DEG_90_IN_Q8 ) )
#else
    if ( EQ_32( model->elevKSeq_fx[0], -DEG_90_IN_Q22 ) )
#endif
    {
        elev_offset = sub( 1, model->azimDim3 );
    }
@@ -504,7 +550,11 @@ static void GenerateITD_fx(
        test();
        test();
        test();
#ifdef FIX_2235_TD_RENDERER_WORD16
        IF( EvIdx[p] == 0 && EQ_16( model->elevKSeq_fx[EvIdx[p]], -DEG_90_IN_Q8 ) )
#else
        IF( EvIdx[p] == 0 && EQ_32( model->elevKSeq_fx[EvIdx[p]], -DEG_90_IN_Q22 ) )
#endif
        {
            modelEval->BM_ITD_fx[qp] = modelEval->elevBfVecITD_fx[p]; // Q30
            move32();
@@ -512,7 +562,11 @@ static void GenerateITD_fx(
            move16();
            qp = add( qp, 1 );
        }
#ifdef FIX_2235_TD_RENDERER_WORD16
        ELSE IF( EQ_16( EvIdx[p], sub( model->elevDim3, 1 ) ) && EQ_16( model->elevKSeq_fx[sub( EvIdx[p], 2 )], DEG_90_IN_Q8 ) )
#else
        ELSE IF( EQ_16( EvIdx[p], sub( model->elevDim3, 1 ) ) && EQ_32( model->elevKSeq_fx[sub( EvIdx[p], 2 )], DEG_90_IN_Q22 ) )
#endif
        {
            /* NB: -2 in if() condition above as number of knot points is numBF-2 */
            modelEval->BM_ITD_fx[qp] = modelEval->elevBfVecITD_fx[p]; // Q30
@@ -537,7 +591,11 @@ static void GenerateITD_fx(

    /* Compute ITD */
    AlphaN = add( imult1616( model->elevDim3, model->azimDim3 ), elev_offset );
#ifdef FIX_2235_TD_RENDERER_WORD16
    if ( EQ_16( model->elevKSeq_fx[sub( model->elevDim3, 3 )], DEG_90_IN_Q8 ) ) /* Constant azimuth basis function */
#else
    if ( EQ_32( model->elevKSeq_fx[sub( model->elevDim3, 3 )], DEG_90_IN_Q22 ) ) /* Constant azimuth basis function */
#endif
    {
        AlphaN = sub( AlphaN, sub( model->azimDim3, 1 ) );
    }
@@ -550,7 +608,11 @@ static void GenerateITD_fx(
    {
        index = BM_idx[i];
        move32();
#ifdef FIX_2235_TD_RENDERER_WORD16
        temp = W_add( temp, Mpy_32_16_1( modelEval->BM_ITD_fx[i], model->W_fx[index] ) );
#else
        temp = W_add( temp, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ) );
#endif
    }
    itdMod_e = W_norm( temp );
    itdMod_e = sub( itdMod_e, 32 );
@@ -590,10 +652,19 @@ static void getPeriodicBSplineSampVec_fx(
    const Word16 NumBFs, /* i  : the number of basis functions = third index of Bf.    */
    const Word32 t_fx,   /* i  : azimuth                                           Q22 */
    Word16 *num_az_idx,  /* o  : Number of azimuth indices                             */
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 knot_interval_fx, /* i  : The knot interval                                  Q6 */
    const Word16 azimKSeq_0_fx,    /* i  : Knot sequence                                      Q6 */
#else
    const Word32 knot_interval_fx, /* i  : The knot interval                                 Q22 */
    const Word32 azimKSeq_0_fx,    /* i  : Knot sequence                                     Q22 */
#endif
    const Word16 azimSegSamples, /* i  : Samples per segment                                   */
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 *azimBsShape_fx, /* i  : Basis shape                                       Q15 */
#else
    const Word32 *azimBsShape_fx,  /* i  : Basis shape                                       Q30 */
#endif
    const Word16 subSampFactor /* i  : Subsampling factor                                    */
)
{
@@ -617,9 +688,17 @@ static void getPeriodicBSplineSampVec_fx(
    }
    ELSE
    {
#ifdef FIX_2235_TD_RENDERER_WORD16
        tmp32 = L_deposit_h( BASOP_Util_Divide1616_Scale( knot_interval_fx, SegSamples, &tmp_e1 ) );
#else
        tmp32 = L_deposit_h( BASOP_Util_Divide3216_Scale( knot_interval_fx, SegSamples, &tmp_e1 ) );
#endif
        tmp_e1 = add( tmp_e1, 9 - 15 );
#ifdef FIX_2235_TD_RENDERER_WORD16
        tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, L_shl( L_deposit_l( azimKSeq_0_fx ), Q22 - Q6 ) ), tmp32, &tmp_e2 ) );
#else
        tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, azimKSeq_0_fx ), tmp32, &tmp_e2 ) );
#endif
        tmp_e2 = add( tmp_e2, sub( 9, tmp_e1 ) );
        tmp32 = L_shr( tmp32, sub( 9, tmp_e2 ) ); // Q22 (assuming tmp32 will be in range of Q22)
        d0 = extract_l( round_hrFilt_fx( tmp32, Q22 ) );
@@ -646,8 +725,13 @@ static void getPeriodicBSplineSampVec_fx(
    {
        d = sub( d0, imult1616( ( sub( add( i, nI ), 1 ) ), SegSamples ) ); /* offset of knot_interval */
        d = sub( d0, imult1616( sub( add( i, nI ), 1 ), SegSamples ) );
#ifdef FIX_2235_TD_RENDERER_WORD16
        BfVec_fx[i] = L_shl( L_deposit_l( azimBsShape_fx[i_mult( abs_s( d ), subSampFactor )] ), Q30 - Q15 );
#else
        BfVec_fx[i] = azimBsShape_fx[i_mult( abs_s( d ), subSampFactor )];
#endif
        move32();

        AzIdx[i] = add( nI, i ) % NumBFs;
        move16();
    }
@@ -667,27 +751,53 @@ static void getStandardBSplineSampVec_fx(
    Word16 *num_idx,     /* i/o: number of non-zero indices                             */
    const Word16 NumBFs, /* i  : the number of basis functions = third index of Bf      */
    const Word32 t_fx,   /* i  : estimation point                                   Q22 */
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 *KSeq_fx,  /* i  : knot sequence including multiplicities             Q KSeq_Q_fx */
    const Word16 KSeq_Q_fx, /* i  : Q-value of knot sequence                           */
#else
    const Word32 *KSeq_fx,   /* i  : knot sequence including multiplicities             Q22 */
#endif
    const Word16 SegSamples, /* i  : samples per segment                                    */
    const Word16 *BsLen,     /* i  : lengths of basis shapes                                */
    const Word16 *BsStart,   /* i  : start of basis shapes                                  */
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 *BsShape_fx /* i  : basis shapes                                      Q15 */
#else
    const Word32 *BsShape_fx /* i  : basis shapes                                       Q30 */
#endif
)
{
    Word16 i, nI;
#ifdef FIX_2235_TD_RENDERER_WORD16
    Word16 knot_interval_fx;
#else
    Word32 knot_interval_fx;
#endif
    Word16 d0, d, shape_idx, start_idx;
    Word16 tmp_e1, tmp_e2, tmp_e3;
    Word32 tmp32;

    /* assuming triple knot at the first knot */
#ifdef FIX_2235_TD_RENDERER_WORD16
    knot_interval_fx = shl( sub( KSeq_fx[1], KSeq_fx[0] ), Q6 - KSeq_Q_fx ); /* Variable Q -> Q6 */
    tmp_e1 = 9;
#else
    knot_interval_fx = L_deposit_h( BASOP_Util_Divide3216_Scale( L_sub( KSeq_fx[NumBFs - 3], KSeq_fx[0] ), sub( NumBFs, 3 ), &tmp_e1 ) );
    tmp_e1 = add( tmp_e1, 9 - 15 );
#endif

    /* index of closest sample point */
#ifdef FIX_2235_TD_RENDERER_WORD16
    tmp32 = L_deposit_h( BASOP_Util_Divide1616_Scale( knot_interval_fx, SegSamples, &tmp_e2 ) );
#else
    tmp32 = L_deposit_h( BASOP_Util_Divide3216_Scale( knot_interval_fx, SegSamples, &tmp_e2 ) );
#endif
    tmp_e2 = add( tmp_e2, sub( tmp_e1, 15 ) );
#ifdef FIX_2235_TD_RENDERER_WORD16
    tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, L_shl( L_deposit_l( KSeq_fx[0] ), sub( 22, KSeq_Q_fx ) ) ), tmp32, &tmp_e3 ) );
#else
    tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, KSeq_fx[0] ), tmp32, &tmp_e3 ) );
#endif
    tmp_e3 = add( tmp_e3, sub( 9, tmp_e2 ) );
    tmp32 = L_shr( tmp32, sub( 9, tmp_e3 ) ); // Q22 (assuming tmp32 will be in range of Q22)
    d0 = extract_l( round_hrFilt_fx( tmp32, 22 ) );
@@ -722,8 +832,13 @@ static void getStandardBSplineSampVec_fx(
        {
            d = sub( shl( sub( BsLen[shape_idx], 1 ), 1 ), d );
        }
#ifdef FIX_2235_TD_RENDERER_WORD16
        assert( d >= 0 && d < BsLen[shape_idx] );
        BfVec_fx[i] = L_shl( L_deposit_l( BsShape_fx[add( BsStart[shape_idx], d )] ), Q30 - Q15 ); /* Q30 */
#else
        BfVec_fx[i] = BsShape_fx[add( BsStart[shape_idx], abs_s( d ) )]; /*TT, verify if abs is needed */
        move32();
#endif
        NzIdx[i] = add( nI, i );
        move16();
    }
@@ -777,12 +892,15 @@ void BSplineModelEvalDealloc_fx(

    IF( model->modelROM )
    {
#ifndef FIX_2235_TD_RENDERER_WORD16
        FOR( i = 0; i < model->num_unique_azim_splines; i++ )
        {
            free( model->azimBsShape_dyn_fx[i] );
        }
        free( model->azimBsShape_dyn_fx );
#endif
        free( (void *) model->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 < model->elevDim3; i++ )
        {
            free( model->azimKSeq_fx[i] );
+109 −1

File changed.

Preview size limit exceeded, changes collapsed.

Loading