Commit 0f9db72c authored by vaclav's avatar vaclav
Browse files

FIX_MDCT_STEREO_ENC_STACK

parent 837325f1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@
#define HARMONIZE_ACELP_ENC                             /* VA: basop issue 2400: Remove duplicated main ACELP encoder function */
#define FIX_2392_MSAN_DESTROY_DEC                       /* VA: basop issue 2392: fix MSAN in ivas_destroy_dec_fx() */
#define FIX_FLOAT_1522_LTV_MSAN_QMETADATA_ENC_EC3       /* Nokia: float issue 1522: fix uninit MSAN in EC3 of qmetadata encoding */
#define FIX_MDCT_STEREO_ENC_STACK                       /* VA: basop issue 2428: Move IGF temporary buffers out of the highest stack */

/* #################### End BE switches ################################## */

+12 −1
Original line number Diff line number Diff line
@@ -629,6 +629,7 @@ void stereo_mdct_core_enc_fx(
                }
                ELSE
                {
#ifndef FIX_MDCT_STEREO_ENC_STACK
                    Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent
                    Word16 exp_powerSpec[CPE_CHANNELS][N_MAX];
                    {
@@ -665,6 +666,7 @@ void stereo_mdct_core_enc_fx(
                            set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX, length ) );
                        }
                    }
#endif
                    FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
                    {
                        st = sts[ch];
@@ -673,6 +675,9 @@ void stereo_mdct_core_enc_fx(
                        {
                            st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
                        }
#ifdef FIX_MDCT_STEREO_ENC_STACK
                        ProcessIGF_ivas_fx_64( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], p_orig_spectrum_e[ch], powerSpec64[ch], exp_powerSpec64[ch], n );
#else
                        L_subframeTCX = idiv1616( st->hTcxEnc->L_frameTCX, nSubframes ); /* Q0 */
                        Word16 q_spectrum;
                        q_spectrum = sub( Q31, p_orig_spectrum_e[ch] );
@@ -685,12 +690,14 @@ void stereo_mdct_core_enc_fx(

                        Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */
                        ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 );
#endif
                    }
                }
            }
        }
        ELSE
        {
#ifndef FIX_MDCT_STEREO_ENC_STACK
            Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent
            Word16 exp_powerSpec[CPE_CHANNELS][N_MAX + L_MDCT_OVLP_MAX];
            {
@@ -727,6 +734,7 @@ void stereo_mdct_core_enc_fx(
                    set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX + L_MDCT_OVLP_MAX, length ) );
                }
            }
#endif
            FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
            {
                st = sts[ch];
@@ -749,6 +757,9 @@ void stereo_mdct_core_enc_fx(
                {
                    FOR( n = 0; n < nSubframes; n++ )
                    {
#ifdef FIX_MDCT_STEREO_ENC_STACK
                        ProcessIGF_ivas_fx_64( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], p_orig_spectrum_e[ch], powerSpec64[ch], exp_powerSpec64[ch], n );
#else
                        Word16 q_spectrum;
                        L_subframeTCX = idiv1616( st->hTcxEnc->L_frameTCX, nSubframes ); /* Q0 */
                        q_spectrum = sub( Q31, p_orig_spectrum_e[ch] );
@@ -760,8 +771,8 @@ void stereo_mdct_core_enc_fx(
                        q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] );

                        Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */

                        ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 );
#endif
                    }
                }
            }
+13 −0
Original line number Diff line number Diff line
@@ -1175,6 +1175,19 @@ void ProcessIGF_ivas_fx(
    const Word16 vad_hover_flag     /* i  : VAD hangover flag                                       */
);

#ifdef FIX_MDCT_STEREO_ENC_STACK
void ProcessIGF_ivas_fx_64(
    Encoder_State *st,                /* i/o: Encoder state                                         */
    const Word16 powerSpec_len,       /* i  : length of pPowerSpectrum buffer                       */
    Word32 *pMDCTSpectrum,            /* i  : MDCT spectrum (*q_spectrum)                           */
    Word32 *pITFMDCTSpectrum,         /* i  : MDCT spectrum fir ITF                                 */
    const Word16 q_ITFMDCTSpectrum,   /* i  : Q of MDCT spectrum fir ITF                            */
    const Word64 *pPowerSpectrum64,   /* i  : MDCT^2 + MDST^2 spectrum, or estimate (*q_powerSpec)  */
    const Word16 *exp_powerSpec64,    /* i  : Q of power spectrum                                   */
    const Word16 frameno              /* i  : flag indicating index of current subframe             */
);

#endif
void ProcessIGF_fx(
    IGF_ENC_INSTANCE_HANDLE const hInstance, /**< in: instance handle of IGF Encoder */
    Encoder_State *st,                       /**< in: Encoder state */
+88 −4
Original line number Diff line number Diff line
@@ -4052,3 +4052,87 @@ void ProcessStereoIGF_fx(
    }
    return;
}

#ifdef FIX_MDCT_STEREO_ENC_STACK
/*---------------------------------------------------------------------*
 * ProcessIGF_ivas_fx_64()
 *
 *
 *---------------------------------------------------------------------*/

void ProcessIGF_ivas_fx_64(
    Encoder_State *st,                /* i/o: Encoder state                                         */
    const Word16 powerSpec_len,       /* i  : length of pPowerSpectrum buffer                       */
    Word32 *pMDCTSpectrum,            /* i  : MDCT spectrum (*q_spectrum)                           */
    Word32 *pITFMDCTSpectrum,         /* i  : MDCT spectrum fir ITF                                 */
    const Word16 q_ITFMDCTSpectrum,   /* i  : Q of MDCT spectrum fir ITF                            */
    const Word64 *pPowerSpectrum64,   /* i  : MDCT^2 + MDST^2 spectrum, or estimate (*q_powerSpec)  */
    const Word16 *exp_powerSpec64,    /* i/o: Q of power spectrum                                   */
    const Word16 frameno              /* i  : flag indicating index of current subframe             */
)
{
    Word16 i, n1, nsub, length, norm;
    Word16 nSubframes, L_subframeTCX;
    Word16 q_spectrum;
    Word32 powerSpec_fx[N_MAX]; // each value has a different exponent
    Word16 exp_powerSpec[N_MAX];

    IF ( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) )
    {
        nSubframes = 1;
        move16();
        L_subframeTCX = st->hTcxEnc->L_frameTCX;
        move16();
    }
    ELSE
    {
        nSubframes = NB_DIV;
        move16();
        L_subframeTCX = shr( st->hTcxEnc->L_frameTCX, 1 );
    }

    nsub = 1;
    length = st->hTcxEnc->L_frameTCX;
    move16();
    move16();
    IF( NE_16( st->hTcxEnc->tcxMode, TCX_20 ) )
    {
        length = shr( st->hTcxEnc->L_frameTCX, 1 );
        nsub = NB_DIV;
        move16();
    }
    IF( EQ_16( st->last_core, ACELP_CORE ) )
    {
        length = add( length, shr( length, 2 ) );
    }

    /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */
    FOR( n1 = 0; n1 < nsub; n1++ )
    {
        FOR( i = 0; i < length; i++ )
        {
            norm = W_norm( pPowerSpectrum64[i + n1 * length] );
            powerSpec_fx[i + n1 * length] = W_extract_h( W_shl( pPowerSpectrum64[i + n1 * length], norm ) ); // exp = exp_powerSpec64[ch][n1]-norm
            exp_powerSpec[i + n1 * length] = sub( exp_powerSpec64[n1], norm );
            move32();
            move16();
        }
    }
    set32_fx( powerSpec_fx + length, 0, sub( N_MAX, length ) );
    set16_fx( exp_powerSpec + length, 0, sub( N_MAX, length ) );
   
    q_spectrum = sub( Q31, q_ITFMDCTSpectrum );
    IF( st->hIGFEnc )
    {
        q_spectrum = s_min( q_spectrum, sub( Q31, st->hIGFEnc->spec_be_igf_e ) );
    }

    q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[frameno] );

    Scale_sig32( pITFMDCTSpectrum, st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, q_ITFMDCTSpectrum ) ) ); /* q_spectrum */
    
    ProcessIGF_ivas_fx( st, powerSpec_len, pMDCTSpectrum, &q_spectrum, pITFMDCTSpectrum, q_spectrum, &powerSpec_fx[frameno * L_subframeTCX], &exp_powerSpec[frameno * L_subframeTCX], st->core == TCX_20_CORE, frameno, st->sp_aud_decision0, 0 );

    return;
}
#endif