Commit 91660ef3 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh Committed by Manuel Jander
Browse files

Fix for 3GPP issue 1345: Decoder crash for Stereo at 32kbps in stereo_dft_dec_res_fx()

Link #1345
parent 74fcdac2
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -1340,7 +1340,7 @@ void stereo_dft_dec_res_fx(

    scale_sig( win, L_FRAME8k + STEREO_DFT_OVL_8k, -1 );

    Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q15 );
    Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 );
    IF( !prev_bfi )
    {
        /*OLA*/
@@ -1348,9 +1348,9 @@ void stereo_dft_dec_res_fx(

        FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
        {
            win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
            win[i] = extract_h( L_add( L_shr( hCPE->hStereoDft->res_cod_mem_fx[i], 1 ), L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
            move16();
            hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* -1 +15 +1 */
            hCPE->hStereoDft->res_cod_mem_fx[i] = L_shl( L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ), 1 ); /* -1 +15 +1 +1 */
            move32();
        }

@@ -1366,11 +1366,11 @@ void stereo_dft_dec_res_fx(
        move16();
        FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
        {
            win[i] = extract_h( Madd_32_16( Mpy_32_16_1( hCPE->hStereoDft->res_cod_mem_fx[i], sub( MAX_16, mult( fac, fac ) ) ),
            win[i] = extract_h( Madd_32_16( Mpy_32_16_1( L_shr( hCPE->hStereoDft->res_cod_mem_fx[i], 1 ), sub( MAX_16, mult( fac, fac ) ) ),
                                            L_shl( L_mult( hCPE->hStereoDft->win_8k_fx[i], win[i] ), q_shift ),
                                            sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); /* Q(q_shift -1) */
            move16();
            hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* Q15 */
            hCPE->hStereoDft->res_cod_mem_fx[i] = L_shl( L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ), 1 ); /* Q16 */
            move32();
            fac = add( fac, step );
        }
@@ -1381,7 +1381,7 @@ void stereo_dft_dec_res_fx(
        v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k );
    }

    hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
    hCPE->hStereoDft->q_res_cod_mem_fx = Q16;

    Copy( win, out_16, L_FRAME8k ); /* Q(q_shift -1 ) */

@@ -1406,7 +1406,11 @@ void stereo_dft_dec_res_fx(
                move32();
            }
        }
#ifdef FIX_ISSUE_1237
        Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
#else
        Copy_Scale_sig_16_32_DEPREC( out_16, output, L_FRAME8k, 16 ); /* Q16 */
#endif
        IF( res_bpf_flag )
        {
            v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k );
@@ -1417,12 +1421,20 @@ void stereo_dft_dec_res_fx(
        set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
        hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0;
        move16();
#ifdef FIX_ISSUE_1237
        Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
#else
        Copy_Scale_sig_16_32_DEPREC( out_16, output, L_FRAME8k, 16 ); /* Q16 */
#endif
    }
    ELSE
    {
        /* This step is needed to ensure output is properly populated with scaled values in all cases*/
#ifdef FIX_ISSUE_1237
        Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
#else
        Copy_Scale_sig_16_32_DEPREC( out_16, output, L_FRAME8k, 16 ); /* Q16 */
#endif
    }

    return;