Commit 0167cdea 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 3e71800d
Loading
Loading
Loading
Loading
+24 −17
Original line number Diff line number Diff line
@@ -1368,23 +1368,23 @@ void stereo_dft_dec_res_fx(
    /*Inverse MDCT*/
    TCX_MDCT_Inverse( res_buf, q_res, win, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );

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

    Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 );
    IF( !prev_bfi )
    {
        /*OLA*/
        /*overlapping parts*/
        Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 );

        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 */
            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] ); /* q_res_cod_mem_fx */
            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();
        }
        IF( q_shift != 0 )
        {
            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 = Q16;


        move16();
    }
    ELSE
@@ -1396,23 +1396,30 @@ 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 ) ) ),
                                            L_mult( hCPE->hStereoDft->win_8k_fx[i], win[i] ),
                                            sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); /* Q0 */
            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] ); /* Q16 */
            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 );
        }
    }

    Copy( win, out_16, L_FRAME8k ); /* Q0 */
    IF( q_shift != 0 )
    {
        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 = Q16;

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

    IF( hCPE->hCoreCoder[0]->core == ACELP_CORE )
    {
        /* bass post-filter */
        bass_psfilter_fx( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, out_16, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off,
                          hCPE->hCoreCoder[0]->stab_fac_fx, &hCPE->hStereoDft->stab_fac_smooth_res_fx, hCPE->hCoreCoder[0]->last_coder_type, 0, bpf_error_signal_8k_16 );
                          hCPE->hCoreCoder[0]->stab_fac_fx, &hCPE->hStereoDft->stab_fac_smooth_res_fx, hCPE->hCoreCoder[0]->last_coder_type, sub( q_shift, 1 ), bpf_error_signal_8k_16 );
        Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15 ); /* Q15 */
        res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf, q_res );

@@ -1430,7 +1437,7 @@ void stereo_dft_dec_res_fx(
            }
        }
#ifdef FIX_ISSUE_1237
        Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, 15 ); /* Q15 */
        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
@@ -1445,7 +1452,7 @@ void stereo_dft_dec_res_fx(
        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, 15 ); /* Q15 */
        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
@@ -1454,7 +1461,7 @@ void stereo_dft_dec_res_fx(
    {
        /* 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, 15 ); /* Q15 */
        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