Commit 13e3926d authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

fix for issue 672

The crash occurred due to inverse square root being
calculated with the denominator zero in function stereo_cng_compute_PScorr_fx().
zero check validation added to rectify the issue.
parent 0bdcf007
Loading
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -803,34 +803,34 @@ void stereo_cng_compute_PScorr_fx(
    }

    Word32 Var1 = Mpy_32_32( enrP_fx, enrS_fx ); // 2*( outputPptr_Q - 31 - guard_bits + outputSptr_Q - 31 - guard_bits )
    Word32 temp = L_add( Var1, 1 );              /*adding one in order to make temp non-zero*/
    Word16 q = 2 * ( outputPptr_Q - 31 - guard_bits + outputSptr_Q - 31 - guard_bits );
    Word16 exp = 31 - ( 2 * ( outputPptr_Q - 31 - guard_bits + outputSptr_Q - 31 - guard_bits ) );

    Word16 nrm = norm_l( Var1 );
    Word32 frac = L_shl( temp, nrm );
    Word16 exp = 31 - ( q + nrm );
    Word32 Var2 = Isqrt_lc( frac, &exp ); /*Q(31 - exp)*/

    Word32 Var3 = L_add( dotPS_fx, 1 ); /*adding one in order to make temp non-zero.  q = Q_outputSptr + Q_outputPptr - guard_bits*/
    IF( Var1 == 0 )
    {
        Var1 = 1;
    }

    Word32 Var2, Var3;
    Var2 = ISqrt32(Var1, &exp);
    Var3 = L_add( dotPS_fx, 1 ); /*adding one in order to make temp non-zero.  q = Q_outputSptr + Q_outputPptr - guard_bits*/
    c_PS_fx = Mpy_32_32( Var3, Var2 ); /* outputSptr_Q + outputPptr_Q - guard_bits - exp */
    Word16 c_PS_fx_Q = outputSptr_Q + outputPptr_Q - guard_bits - exp - 31;


    Word16 c_PS_fx_Q = outputSptr_Q + outputPptr_Q - guard_bits - exp - 31;
    Word32 a = 0, b = 0;
    a = Mpy_32_32( c_PS_fx, ONE_MINUS_STEREO_TD_PS_CORR_FILT_Q31 ); // Q(c_PS_fx_Q)
    Word16 a_q = 0, b_q = 0, ab_q = 0;

    a = Mpy_32_32( c_PS_fx, ONE_MINUS_STEREO_TD_PS_CORR_FILT_Q31 ); // Q(c_PS_fx_Q)
    a_q = c_PS_fx_Q;
    b = Mpy_32_32( STEREO_TD_PS_CORR_FILT_Q31, *c_PS_LT_fx ); // Q(Q_c_PS_LT_fx)
    b_q = Q_c_PS_LT_fx;

    if ( a_q > b_q )
    IF (GT_16( a_q , b_q) )
    {
        ab_q = a_q - b_q;
        *c_PS_LT_fx = L_add( L_shr( a, (Word16) ab_q ), b );
        Q_c_PS_LT_fx = b_q;
    }
    else if ( b_q < a_q )
    ELSE IF ( LT_16(b_q , a_q ))
    {
        ab_q = b_q - a_q;
        *c_PS_LT_fx = L_add( a, L_shr( b, (Word16) ab_q ) );