From ed9485880c962fd000ac5a5611c9a495b4e5dfca Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Sun, 20 Oct 2024 17:29:06 +0530 Subject: [PATCH] Fix for 3GPP issue 941: Decoder crash for MASA1 at 64/80kbps with FER in tcx_windowing_synthesis_current_frame() --- lib_dec/core_dec_init_fx.c | 8 ++++++++ lib_dec/dec_tcx_fx.c | 8 ++++++-- lib_dec/er_dec_acelp_fx.c | 4 ++++ lib_dec/er_dec_tcx_fx.c | 8 ++++++++ lib_dec/ivas_mdct_core_dec.c | 8 ++++++-- 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index 51416a0ae..a3c76e23c 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -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; diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 1f0bb5d6a..53b688e72 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -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; diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index defb1970a..b093fb129 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -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 ); diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 48299ed32..4158368c6 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -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*/ diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 608fc9987..777d18f5c 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -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 ) ); -- GitLab