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

Merge branch '3gpp_issue_941_fix' into 'main'

Fix for 3GPP issue 941: Decoder crash for MASA1 at 64/80kbps with FER [allow regression]

See merge request !684
parents fda12905 ed948588
Loading
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -490,11 +490,15 @@ void open_decoder_LPD_fx(
                lerp( hHQ_core->old_out_fx, hHQ_core->old_out_LB_fx, st->L_frame, hTcxDec->L_frameTCX );

                Copy( hHQ_core->old_out_fx + nz, hTcxDec->syn_Overl_TDACFB, shr( hTcxDec->L_frameTCX, 1 ) ); /* exp(exp_old_out) */
                hTcxDec->Q_syn_Overl_TDACFB = hHQ_core->Q_old_wtda;
                move16();
                nz = NS2SA_FX2( st->sr_core, N_ZERO_MDCT_NS );
                move16();
                Copy( hHQ_core->old_out_LB_fx + nz, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ) ); /* hHQ_core->q_old_outLB_fx */
                hHQ_core->Q_old_wtda_LB = hHQ_core->Q_old_wtda;
                move16();
                hTcxDec->Q_syn_Overl_TDAC = hHQ_core->Q_old_wtda_LB;
                move16();
            }
#else
            PMT( "acelp_plc_mdct_transition is missing" )
@@ -1210,11 +1214,15 @@ void acelp_plc_mdct_transition_fx(

        lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, st->hTcxDec->L_frameTCX );
        Copy( st->hHQ_core->old_out_fx + nz, st->hTcxDec->syn_Overl_TDACFB, shr( st->hTcxDec->L_frameTCX, 1 ) ); /* exp_old_out */
        st->hTcxDec->Q_syn_Overl_TDACFB = st->hHQ_core->Q_old_wtda;
        move16();

        nz = NS2SA_FX2( st->sr_core, N_ZERO_MDCT_NS );
        Copy( st->hHQ_core->old_out_LB_fx + nz, st->hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ) ); /* exp_old_out */
        st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->Q_old_wtda;
        move16();
        st->hTcxDec->Q_syn_Overl_TDAC = st->hHQ_core->Q_old_wtda_LB;
        move16();
    }

    return;
+6 −2
Original line number Diff line number Diff line
@@ -3842,8 +3842,12 @@ void decoder_tcx_ivas_fx(
    }

    /* Scaling down buffers for decoder_tcx_imdct_fx*/
    Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, 1 );                              // Scaling to Q_syn
    Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, 1 );                                 // Scaling to Q_syn
    Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // Scaling to Q_syn
    st->hTcxDec->Q_syn_Overl_TDACFB = st->Q_syn;
    move16();
    Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDAC ) ); // Scaling to Q_syn
    st->hTcxDec->Q_syn_Overl_TDAC = st->Q_syn;
    move16();
    Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, negate( st->hHQ_core->Q_old_wtda ) );       // Scaling to Q_syn
    Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, negate( st->hHQ_core->Q_old_wtda_LB ) ); // Scaling to Q_syn
    st->hHQ_core->Q_old_wtda = 0;
+4 −0
Original line number Diff line number Diff line
@@ -1101,6 +1101,8 @@ void con_acelp_fx(

    /* save last half frame if next frame is TCX */
    bufferCopyFx( syn + st->L_frame, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ );
    hTcxDec->Q_syn_Overl_TDAC = add( st->Q_syn, -1 );
    move16();
    Copy( syn + sub( st->L_frame, M + 1 ), st->syn, 1 + M );

    /* update old_Aq */
@@ -1179,6 +1181,8 @@ void con_acelp_fx(

    /* update memory for full band */
    lerp( hTcxDec->syn_Overl_TDAC, hTcxDec->syn_Overl_TDACFB, shr( hTcxDec->L_frameTCX, 1 ), shr( st->L_frame, 1 ) );
    st->hTcxDec->Q_syn_Overl_TDACFB = st->hTcxDec->Q_syn_Overl_TDAC;
    move16();
    lerp( hTcxDec->syn_Overl, hTcxDec->syn_OverlFB, shr( hTcxDec->L_frameTCX, 1 ), shr( st->L_frame, 1 ) );
    lerp( hHQ_core->old_out_LB_fx, hHQ_core->old_out_fx, hTcxDec->L_frameTCX, st->L_frame );

+8 −0
Original line number Diff line number Diff line
@@ -1092,6 +1092,8 @@ void con_tcx_fx(

    /* create aliasing and windowing need for transition to TCX10/5 */
    bufferCopyFx( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ), Q_syn, 0, -1, 0 );
    hTcxDec->Q_syn_Overl_TDACFB = add( st->Q_syn, sub( st->Q_syn, -1 ) );
    move16();

    FOR( i = 0; i < W12; i++ )
    {
@@ -1146,6 +1148,8 @@ void con_tcx_fx(
    Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) );
    lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
    lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
    hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB;
    move16();
    lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame );

    st->old_enr_LP = Enr_1_Az_fx( A_local, L_SUBFR ); /*Q3*/
@@ -2100,6 +2104,8 @@ void con_tcx_ivas_fx(

    /* create aliasing and windowing need for transition to TCX10/5 */
    bufferCopyFx( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ), Q_syn, 0, -1, 0 );
    hTcxDec->Q_syn_Overl_TDACFB = add( Q_syn, sub( Q_syn, -1 ) );
    move16();

    FOR( i = 0; i < W12; i++ )
    {
@@ -2148,6 +2154,8 @@ void con_tcx_ivas_fx(
    Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) );
    lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
    lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
    hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB;
    move16();
    lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame );

    st->old_enr_LP = Enr_1_Az_fx( A_local, L_SUBFR ); /*Q3*/
+6 −2
Original line number Diff line number Diff line
@@ -2052,8 +2052,8 @@ void ivas_mdct_core_reconstruct_fx(
        set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M );
        IF( st->core != ACELP_CORE )
        {
            Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, sub( -1, st->Q_syn ) ) );
            Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, sub( -1, st->Q_syn ) ) );
            Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) );
            Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDAC ) );
            Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, sub( -1, st->Q_syn ) ) );
            Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) );
            Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) );
@@ -2116,7 +2116,11 @@ void ivas_mdct_core_reconstruct_fx(
                st->Q_syn = add( q_win, sf );
            }
            Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), q_win ) );
            st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn );
            move16();
            Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) );
            st->hTcxDec->Q_syn_Overl_TDAC = sub( -1, st->Q_syn );
            move16();
            Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) );
#ifdef MSAN_FIX
            Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) );