Commit 77a2b7ae authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '1237-possible-wrong-usage-of-copy_scale_sig_16_32' into 'main'

[allow regression] replace problematic scaling Copy_Scale_sig_16_32 with the...

See merge request !1040
parents fdf22c85 7419e423
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -136,4 +136,6 @@
#define FIX_1010_OPT_SEC_SINGLE_RESCALE         /* FhG: SVD complexity optimizations (non-be) */
#define NONBE_1211_DTX_BR_SWITCHING             /* VA: port float issue 1211: fix crash in MASA DTX bitrate switching */
#define FIX_1189_GSC_IVAS_OMASA                 /* VA: Fix for issue 1189: Bitstream desynchornization due to reading/writing of the GSC_IVAS_mode parameter */
#define FIX_ISSUE_1237                          /* VA: replacement of Copy_Scale_sig_16_32_DEPREC() that are doing 16 bits left shift by Copy_Scale_sig_16_32_no_sat() */
#define FIX_ISSUE_1237_KEEP_EVS_BE              /* VA: Fix to keep EVS bitexactness to 26.444 */
#endif
+1 −1
Original line number Diff line number Diff line
@@ -10005,7 +10005,7 @@ void Scale_sig32(
    const Word16 exp0 /* i  : exponent: x = round(x << exp)   Qx ?exp  */
);
void Copy_Scale_sig_16_32(
void Copy_Scale_sig_16_32_DEPREC(
    const Word16 x[], /* i  : signal to scale i             Qx        */
    Word32 y[],       /* o  : scaled signal output            Qx        */
    const Word16 lg,  /* i  : size of x[]                     Q0        */
+11 −1
Original line number Diff line number Diff line
@@ -750,7 +750,7 @@ void Copy_Scale_sig(
 *
 * Up/down scale a 16 bits vector x and move it into y
 *-------------------------------------------------------------------*/
void Copy_Scale_sig_16_32(
void Copy_Scale_sig_16_32_DEPREC(
    const Word16 x[], /* i  : signal to scale input           Qx        */
    Word32 y[],       /* o  : scaled signal output            Qx        */
    const Word16 lg,  /* i  : size of x[]                     Q0        */
@@ -784,6 +784,16 @@ void Copy_Scale_sig_16_32(
        }
        return;
    }
#ifdef FIX_ISSUE_1237
#ifdef DEBUGGING
    if ( exp0 >= 16 )
    {
        printf( "Issue in Copy_Scale_sig_16_32_DEPREC\n" );
    }
#else
    assert( exp0 < 16 );
#endif
#endif
    tmp = shl_o( 1, exp0, &Overflow );
    FOR( i = 0; i < lg; i++ )
    {
+43 −11
Original line number Diff line number Diff line
@@ -1590,8 +1590,12 @@ static void ivas_spec_ana_fx(
        test();
        IF( n > 0 && *pPlocs == 0 ) /* Very 1st peak position possible to have a peak at 0/DC index position. */
        {
            Copy_Scale_sig_16_32( &xfp[*pPlocs], xfp_32, 3, Q16 );                  // Q + 16
            acc = L_deposit_h( *pPlocs );                                           // Q16
#ifdef FIX_ISSUE_1237
            Copy_Scale_sig_16_32_no_sat( &xfp[*pPlocs], xfp_32, 3, Q16 ); // Q + 16
#else
            Copy_Scale_sig_16_32_DEPREC( &xfp[*pPlocs], xfp_32, 3, Q16 );           // Q + 16
#endif
            acc = L_deposit_h( *pPlocs );                                           // Q16                     //VA2ITTIAM -> this and the lines below need to be checked
            *pPlocsi++ = L_add( acc, L_shl( imax_pos_fx( xfp_32 ) /* Q15 */, 1 ) ); // Q16
            move32();
            pPlocs++;
@@ -1601,8 +1605,12 @@ static void ivas_spec_ana_fx(
        test();
        IF( n > 0 && EQ_16( *pPlocs, 1 ) ) /* Also 2nd peak position uses DC which makes jacobsen unsuitable. */
        {
            Copy_Scale_sig_16_32( &xfp[*pPlocs - 1], xfp_32, 3, Q16 );              // Q + 16
            acc = L_deposit_h( sub( *pPlocs, 1 ) );                                 // Q16
#ifdef FIX_ISSUE_1237
            Copy_Scale_sig_16_32_no_sat( &xfp[*pPlocs - 1], xfp_32, 3, Q16 ); // Q + 16
#else
            Copy_Scale_sig_16_32_DEPREC( &xfp[*pPlocs - 1], xfp_32, 3, Q16 );       // Q + 16
#endif
            acc = L_deposit_h( sub( *pPlocs, 1 ) );                                 // Q16                      // VA2ITTIAM -> this and the lines below need to be checked
            *pPlocsi++ = L_add( acc, L_shl( imax_pos_fx( xfp_32 ) /* Q15 */, 1 ) ); // Q16
            move32();
            currPlocs = *pPlocs++; // Q16
@@ -1647,8 +1655,12 @@ static void ivas_spec_ana_fx(

            IF( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2  which makes jacobsen less suitable. */
            {
                Copy_Scale_sig_16_32( &xfp[currPlocs - 1], xfp_32, 3, Q16 );            // Q + 16
                acc = L_deposit_h( sub( currPlocs, 1 ) );                               // Q16
#ifdef FIX_ISSUE_1237
                Copy_Scale_sig_16_32_no_sat( &xfp[currPlocs - 1], xfp_32, 3, Q16 ); // Q + 16
#else
                Copy_Scale_sig_16_32_DEPREC( &xfp[currPlocs - 1], xfp_32, 3, Q16 ); // Q + 16
#endif
                acc = L_deposit_h( sub( currPlocs, 1 ) );                               // Q16          // VA2ITTIAM -> this and the lines below need to be checked
                *pPlocsi++ = L_add( acc, L_shl( imax_pos_fx( xfp_32 ) /* Q15 */, 1 ) ); // Q16
                move32();
                currPlocs = *pPlocs++; // Q16
@@ -1661,8 +1673,12 @@ static void ivas_spec_ana_fx(
             * whould point */
            IF( n > 0 ) /* fs/2 which makes special case . */
            {
                Copy_Scale_sig_16_32( &xfp[currPlocs - 2], xfp_32, 3, Q16 );            // Q + 16
                acc = L_deposit_h( sub( currPlocs, 2 ) );                               // Q16
#ifdef FIX_ISSUE_1237
                Copy_Scale_sig_16_32_no_sat( &xfp[currPlocs - 2], xfp_32, 3, Q16 ); // Q + 16
#else
                Copy_Scale_sig_16_32_DEPREC( &xfp[currPlocs - 2], xfp_32, 3, Q16 ); // Q + 16
#endif
                acc = L_deposit_h( sub( currPlocs, 2 ) );                               // Q16       // VA2ITTIAM -> this and the lines below need to be checked
                *pPlocsi++ = L_add( acc, L_shl( imax_pos_fx( xfp_32 ) /* Q15 */, 1 ) ); // Q16
                move32();
                currPlocs = *pPlocs++; // Q16
@@ -3989,7 +4005,11 @@ static void ivas_fec_ecu_dft_fx(
    tmp = Exp16Array( *Nfft, Tfr16 );
    *exp = add( tmp, add( 2, norm_s( *Nfft ) ) );
    move16();
    Copy_Scale_sig_16_32( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */
#ifdef FIX_ISSUE_1237
    Copy_Scale_sig_16_32_no_sat( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */
#else
    Copy_Scale_sig_16_32_DEPREC( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */
#endif
    *exp = s_min( *exp, 15 );

    DoRTFTn_fx( Tfr32, Tfi32, *Nfft );
@@ -4105,8 +4125,20 @@ static void fec_ecu_dft_fx(
    tmp = Exp16Array( *Nfft, Tfr16 );
    *exp = add( tmp, add( 2, norm_s( *Nfft ) ) );
    move16();
    Copy_Scale_sig_16_32( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */

#ifdef FIX_ISSUE_1237
    {
#ifdef FIX_ISSUE_1237_KEEP_EVS_BE
        Word16 loctmp = *exp;
        move16();
        loctmp = s_min( 15, loctmp );
        Copy_Scale_sig_16_32_DEPREC( Tfr16, Tfr32, *Nfft, loctmp ); /*Qin+exp; */ /*Even with limiting loctmp, if Copy_Scale_sig_16_32_no_sat() is used, can lead to 1 difference */
#else
        Copy_Scale_sig_16_32_no_sat( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */
#endif
    }
#else
    Copy_Scale_sig_16_32_DEPREC( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */
#endif
    DoRTFTn_fx( Tfr32, Tfi32, *Nfft );
    N_LP = shr( *Nfft, 1 );

+21 −9
Original line number Diff line number Diff line
@@ -1735,12 +1735,12 @@ ivas_error acelp_core_dec_ivas_fx(
            pImagSave_fx[i] = imagBufferSave_fx[i];
        }
#ifndef MSAN_FIX
        Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1
        Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1
#endif
        IF( st->p_bpf_noise_buf_32 )
        {
#ifdef MSAN_FIX
            Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1
            Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1
#endif
            Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame );
            Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11
@@ -1772,9 +1772,13 @@ ivas_error acelp_core_dec_ivas_fx(
        q_bpf_error_signal = Q6;
        move16();
#ifdef MSAN_FIX
        Copy_Scale_sig_16_32( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6
#ifdef FIX_ISSUE_1237
        Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6
#else
        Copy_Scale_sig_16_32( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, q_bpf_error_signal - st->Q_syn ); // Q6
        Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6
#endif
#else
        Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, q_bpf_error_signal - st->Q_syn ); // Q6
#endif
        FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
        {
@@ -1999,7 +2003,11 @@ ivas_error acelp_core_dec_ivas_fx(
        // Get Q-factor
        q_bpf_error_signal = Q6;
        move16();
        Copy_Scale_sig_16_32( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6
#ifdef FIX_ISSUE_1237
        Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6
#else
        Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6
#endif
        FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
        {
            Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0
@@ -2066,7 +2074,7 @@ ivas_error acelp_core_dec_ivas_fx(
        move16();
        IF( st->p_bpf_noise_buf_32 )
        {
            Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1
            Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1
            Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame );

            Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11
@@ -2112,9 +2120,9 @@ ivas_error acelp_core_dec_ivas_fx(
                         psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2, st->hBWE_zero->delay_syn_hf_fx, &st->hBWE_zero->memExp1,
                         st->hBWE_zero->mem_hp_interp_fx, st->extl, st->CNG_mode );
#ifdef MSAN_FIX
            Copy_Scale_sig_16_32( synth_fx16, synth_fx, output_frame, 0 );
            Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 );
#else
            Copy_Scale_sig_16_32( synth_fx16, synth_fx, L_FRAME48k, 0 );
            Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, L_FRAME48k, 0 );
#endif
        }
        ELSE
@@ -2157,7 +2165,11 @@ ivas_error acelp_core_dec_ivas_fx(
        test();
        IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) )
        {
            Copy_Scale_sig_16_32( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc
#ifdef FIX_ISSUE_1237
            Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc
#else
            Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc
#endif
            non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame );
            Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc
        }
Loading