Commit 604eace3 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Fix for 3GPP issue 1385: Decoder crash for Stereo at 32 kbps FER in ivas_cpe_dec_fx()

Link #1385
parent 503045da
Loading
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -729,8 +729,8 @@ ivas_error ivas_cpe_dec_fx(
            hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft;
            move16();
            stereo_dft_unify_dmx_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng->prev_sid_nodata );
            scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q16, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q16
            hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
            scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15
            hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
            move16();
        }
        ELSE
@@ -754,8 +754,8 @@ ivas_error ivas_cpe_dec_fx(
                move16();
            }
            stereo_dft_dec_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
            scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q16, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q16
            hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
            scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15
            hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
            move16();
        }

+8 −8
Original line number Diff line number Diff line
@@ -146,7 +146,7 @@ void stereo_dft_dec_reset_fx(
    set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB );
    hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode];
    set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
    hStereoDft->q_res_cod_mem_fx = Q16;
    hStereoDft->q_res_cod_mem_fx = Q15;
    move16();

    hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
@@ -1357,7 +1357,7 @@ void stereo_dft_dec_res_fx(
    IF( EQ_16( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1], STEREO_DFT_RES_COD_OFF ) )
    {
        set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
        hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
        hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
        move16();
        set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) );
        set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
@@ -1370,7 +1370,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, Q16 );
    Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q15 );
    IF( !prev_bfi )
    {
        /*OLA*/
@@ -1378,9 +1378,9 @@ void stereo_dft_dec_res_fx(

        FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
        {
            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)*/
            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)*/
            move16();
            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 */
            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 */
            move32();
        }

@@ -1396,11 +1396,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( L_shr( hCPE->hStereoDft->res_cod_mem_fx[i], 1 ), sub( MAX_16, mult( fac, fac ) ) ),
            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_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_shl( L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ), 1 ); /* Q16 */
            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 */
            move32();
            fac = add( fac, step );
        }
@@ -1411,7 +1411,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 = Q16;
    hCPE->hStereoDft->q_res_cod_mem_fx = Q15;

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

+1 −1
Original line number Diff line number Diff line
@@ -1841,7 +1841,7 @@ void stereo_switching_dec(

        /* reset residual coding / ESF (secondary channel) */
        set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
        hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
        hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
        move16();

        set32_fx( hCPE->input_mem_fx[1], 0, NS2SA_FX2( sts[0]->output_Fs, STEREO_DFT32MS_OVL_NS ) );