Commit f60f52bb authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch 'fix_issue_673' into 'main'

Fixed the crash happening in L_lerp_fx function due to overflow in L_sub basop

See merge request !84
parents b2d5a248 6f248478
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1504,7 +1504,7 @@ void resampleCldfb_ivas(
    /*low complexity-resampling only stored previous samples that are needed for next frame modulation */
    lerp_flt( hs->cldfb_state, hs->cldfb_state, timeOffset, timeOffsetold );
#ifdef IVAS_FLOAT_FIXED
    L_lerp_fx( hs->cldfb_state_fx, hs->cldfb_state_fx, timeOffset, timeOffsetold );
    L_lerp_fx_q11( hs->cldfb_state_fx, hs->cldfb_state_fx, timeOffset, timeOffsetold );
#endif

    return;
+1 −1
Original line number Diff line number Diff line
@@ -612,7 +612,7 @@ void updateBuffersForDmxMdctStereo_fx(
void stereo_cng_compute_PScorr_fx(
    Word32 output_fx0[], /*  i  : Output signal                          */
    Word32 output_fx1[], /*  i  : Output signal                          */
    Word16 output_Q,
    Word16 *output_Q,
    Word32 *c_PS_LT_fx, /* i/o: Correlation                             */
    Word16 Q_c_PS_LT_fx,
    const Word16 L_frame_0, /* i  : L_frame channel 0                       */
+52 −1
Original line number Diff line number Diff line
@@ -392,7 +392,58 @@ static void L_lerp_proc_fx( const Word32 *f_fx, Word32 *f_out_fx, const Word16 b
 *                                                             *
 *                                                             *
 *-------------------------------------------------------------*/
void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize )

void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize, Word16 *q )
{
    Word16 tmpNewSize;
    Word16 guard_bits = s_max(find_guarded_bits_fx(bufferNewSize / bufferOldSize), find_guarded_bits_fx(bufferOldSize / bufferNewSize)) + 1;
    q -= guard_bits;

    FOR(Word16 ind = 0; ind < bufferNewSize; ind++) f[ind] = L_shr(f[ind], guard_bits);
    FOR(Word16 ind = 0; ind < bufferNewSize; ind++) f_out[ind] = L_shr(f_out[ind], guard_bits);

    IF ( 128 * bufferNewSize > bufferOldSize * 507 )
    {
        tmpNewSize = bufferOldSize * 2;
        WHILE ( bufferNewSize > bufferOldSize )
        {
            IF ( 128 * bufferNewSize <= 507 * bufferOldSize )
            {
                tmpNewSize = bufferNewSize;
            }

            L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize );

            f = f_out;
            bufferOldSize = tmpNewSize;
            tmpNewSize *= 2;
        }
    }
    ELSE IF ( 128 * bufferOldSize > bufferNewSize * 507 )
    {
        tmpNewSize = bufferOldSize / 2;
        WHILE ( bufferNewSize < bufferOldSize )
        {
            IF ( 128 * bufferOldSize <= 507 * bufferNewSize )
            {
                tmpNewSize = bufferNewSize;
            }

            L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize );

            f = f_out;
            bufferOldSize = tmpNewSize;
            tmpNewSize /= 2;
        }
    }
    ELSE
    {
        L_lerp_proc_fx( f, f_out, bufferNewSize, bufferOldSize );
    }

    return;
}
void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize )
{
    Word16 tmpNewSize;

+3 −1
Original line number Diff line number Diff line
@@ -2100,7 +2100,9 @@ void synth_mem_updt2(
//lerp.c
void lerp(Word16 *f, Word16 *f_out, Word16 bufferNewSize, Word16 bufferOldSize);

void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize );
void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize );

void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize, Word16 *q );

//index_pvq_opt.c

+1 −1
Original line number Diff line number Diff line
@@ -601,7 +601,7 @@ ivas_error ivas_core_dec(
        }
        Word32 c_PS_LT_fx = float_to_fix(hCPE->hStereoCng->c_PS_LT, Q_c_PS_LT);

        stereo_cng_compute_PScorr_fx(output_fx[0], output_fx[1], Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame); 
        stereo_cng_compute_PScorr_fx(output_fx[0], output_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame); 

        hCPE->hStereoCng->c_PS_LT = fix_to_float( c_PS_LT_fx, Q_c_PS_LT );
#ifdef DUMPS_ENABLED
Loading