Commit 60d97669 authored by vaclav's avatar vaclav
Browse files

FIX_MDCT_STEREO_ENC_STACK

parent 0f9db72c
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -10333,6 +10333,25 @@ void ProcessStereoIGF_fx(
    const Word32 element_brate,                             /* i  : element bitrate                         */
    const Word16 mct_on );
#ifdef FIX_MDCT_STEREO_ENC_STACK
void ProcessStereoIGF_fx_64(
    STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,
    Encoder_State *sts[CPE_CHANNELS],                       /* i  : Encoder state                           */
    Word16 ms_mask[2][MAX_SFB],                             /* i  : bandwise MS mask                        */
    Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV],      /* i  : MDCT spectrum fir ITF                   */
    Word64 powerSpec64[CPE_CHANNELS][N_MAX],                /* i/o: MDCT^2 + MDST^2 spectrum, or estimate   */
    Word16 exp_powerSpec64[CPE_CHANNELS][NB_DIV],           /* i/o: exp of pPowerSpectrum_fx                */
    Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV],   /* i  : inverse power spectrum                  */
    Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx             */
    Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV],          /* i  : inverse spectrum                        */
    Word16 exp_inv_spectrum_fx[CPE_CHANNELS],               /* i/o: exp of inv_spectrum_fx                  */
    const Word16 frameno,                                   /* i  : flag indicating index of current subfr. */
    const Word16 sp_aud_decision0,                          /* i  : sp_aud_decision0                        */
    const Word32 element_brate,                             /* i  : element bitrate                         */
    const Word16 mct_on                                     /* i  : flag MCT mode                           */
);
#endif
void IGFEncApplyStereo_fx(
    STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,                /* i/o: MDCT stereo encoder structure           */
    Word16 ms_mask[2][MAX_SFB],                             /* i  : bandwise MS mask                        */
+15 −3
Original line number Diff line number Diff line
@@ -401,7 +401,12 @@ void stereo_mdct_core_enc_fx(
    /*--------------------------------------------------------------*
     * Power spectrum calculation
     *---------------------------------------------------------------*/

#ifdef FIX_MDCT_STEREO_ENC_STACK
    Word16 exp, shift1, shift2, norm;
#else
    Word16 length, exp, shift1, shift2, norm;
#endif
    Word32 mdct, mdst, imdct, imdst;

    FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
@@ -576,6 +581,7 @@ void stereo_mdct_core_enc_fx(
                IF( ( NE_16( hStereoMdct->mdct_stereo_mode[n], hStereoMdct->IGFStereoMode[n] ) || EQ_16( hStereoMdct->mdct_stereo_mode[n], SMDCT_BW_MS ) ) && !hStereoMdct->isSBAStereoMode )
                {
                    IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS];
#ifndef FIX_MDCT_STEREO_ENC_STACK
                    Word32 powerSpec_fx[CPE_CHANNELS][N_MAX], *p_powerSpec_fx[CPE_CHANNELS];
                    Word16 exp_powSpec[CPE_CHANNELS][N_MAX], *p_exp_powSpec[CPE_CHANNELS];
                    p_powerSpec_fx[0] = powerSpec_fx[0];
@@ -615,7 +621,7 @@ void stereo_mdct_core_enc_fx(
                            set16_fx( exp_powSpec[ch] + length, 0, sub( N_MAX, length ) );
                        }
                    }

#endif
                    hIGFEnc[0] = sts[0]->hIGFEnc;
                    hIGFEnc[1] = sts[1]->hIGFEnc;
                    hIGFEnc[0]->spec_be_igf_e = p_orig_spectrum_e[0];
@@ -623,9 +629,15 @@ void stereo_mdct_core_enc_fx(
                    move16();
                    move16();

#ifdef FIX_MDCT_STEREO_ENC_STACK
                    ProcessStereoIGF_fx_64( hStereoMdct, sts, ms_mask, orig_spectrum_fx, powerSpec64, exp_powerSpec64,
                                            powerSpecMsInv_fx, q_powerSpecMsInv_fx, inv_spectrum_fx, exp_inv_spectrum,
                                            n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 );
#else
                    ProcessStereoIGF_fx( hStereoMdct, sts, ms_mask, orig_spectrum_fx, sub( Q31, p_orig_spectrum_e[0] ), sub( Q31, p_orig_spectrum_e[1] ),
                                         p_powerSpec_fx, p_exp_powSpec, powerSpecMsInv_fx, q_powerSpecMsInv_fx, inv_spectrum_fx, exp_inv_spectrum,
                                         n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 );
#endif
                }
                ELSE
                {
@@ -676,7 +688,7 @@ 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 );
                        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, hCPE->hCoreCoder[0]->sp_aud_decision0 );
#else
                        L_subframeTCX = idiv1616( st->hTcxEnc->L_frameTCX, nSubframes ); /* Q0 */
                        Word16 q_spectrum;
@@ -758,7 +770,7 @@ 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 );
                        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, hCPE->hCoreCoder[0]->sp_aud_decision0 );
#else
                        Word16 q_spectrum;
                        L_subframeTCX = idiv1616( st->hTcxEnc->L_frameTCX, nSubframes ); /* Q0 */
+9 −8
Original line number Diff line number Diff line
@@ -1184,7 +1184,8 @@ void ProcessIGF_ivas_fx_64(
    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             */
    const Word16 frameno,           /* i  : flag indicating index of current subframe             */
    const Word16 sp_aud_decision0   /* i  : first stage switching decision                        */
);

#endif
+89 −16
Original line number Diff line number Diff line
@@ -4068,7 +4068,8 @@ void ProcessIGF_ivas_fx_64(
    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             */
    const Word16 frameno,           /* i  : flag indicating index of current subframe             */
    const Word16 sp_aud_decision0   /* i  : first stage switching decision                        */
)
{
    Word16 i, n1, nsub, length, norm;
@@ -4131,7 +4132,79 @@ void ProcessIGF_ivas_fx_64(

    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 );
    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, sp_aud_decision0, 0 );

    return;
}


/*---------------------------------------------------------------------*
 * ProcessStereoIGF_fx_64()
 *
 *
 *---------------------------------------------------------------------*/

void ProcessStereoIGF_fx_64(
    STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,
    Encoder_State *sts[CPE_CHANNELS],                       /* i  : Encoder state                           */
    Word16 ms_mask[2][MAX_SFB],                             /* i  : bandwise MS mask                        */
    Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV],      /* i  : MDCT spectrum fir ITF                   */
    Word64 powerSpec64[CPE_CHANNELS][N_MAX],                /* i/o: MDCT^2 + MDST^2 spectrum, or estimate   */
    Word16 exp_powerSpec64[CPE_CHANNELS][NB_DIV],           /* i/o: exp of pPowerSpectrum_fx                */
    Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV],   /* i  : inverse power spectrum                  */
    Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx             */
    Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV],          /* i  : inverse spectrum                        */
    Word16 exp_inv_spectrum_fx[CPE_CHANNELS],               /* i/o: exp of inv_spectrum_fx                  */
    const Word16 frameno,                                   /* i  : flag indicating index of current subfr. */
    const Word16 sp_aud_decision0,                          /* i  : sp_aud_decision0                        */
    const Word32 element_brate,                             /* i  : element bitrate                         */
    const Word16 mct_on                                     /* i  : flag MCT mode                           */
)
{
    Word16 ch, i, n1, nsub, length, shift1;
    Word32 powerSpec_fx[CPE_CHANNELS][N_MAX], *p_powerSpec_fx[CPE_CHANNELS];
    Word16 exp_powSpec[CPE_CHANNELS][N_MAX], *p_exp_powSpec[CPE_CHANNELS];

    p_powerSpec_fx[0] = powerSpec_fx[0];
    p_exp_powSpec[0] = exp_powSpec[0];
    p_powerSpec_fx[1] = powerSpec_fx[1];
    p_exp_powSpec[1] = exp_powSpec[1];

    /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */
    FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
    {
        n1, nsub = 1;
        length = sts[ch]->hTcxEnc->L_frameTCX;
        move16();
        move16();
        IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
        {
            length = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 );
            nsub = NB_DIV;
            move16();
        }
        IF( EQ_16( sts[ch]->last_core, ACELP_CORE ) )
        {
            length = add( length, shr( length, 2 ) );
        }
        FOR( n1 = 0; n1 < nsub; n1++ )
        {
            FOR( i = 0; i < length; i++ )
            {
                /* This doesn't result in saturation */
                shift1 = W_norm( powerSpec64[ch][i + n1 * length] );
                powerSpec_fx[ch][i + n1 * length] = W_extract_h( W_shl( powerSpec64[ch][i + n1 * length], shift1 ) ); // exp: exp
                move32();
                exp_powSpec[ch][i + n1 * length] = sub( exp_powerSpec64[ch][n1], shift1 );
            }
        }
        set32_fx( powerSpec_fx[ch] + length, 0, sub( N_MAX, length ) );
        set16_fx( exp_powSpec[ch] + length, 0, sub( N_MAX, length ) );
    }

    ProcessStereoIGF_fx( hStereoMdct, sts, ms_mask, pITFMDCTSpectrum_fx, sub( Q31, sts[0]->hIGFEnc->spec_be_igf_e ), sub( Q31, sts[1]->hIGFEnc->spec_be_igf_e ),
                         p_powerSpec_fx, p_exp_powSpec, pPowerSpectrumMsInv_fx, q_pPowerSpectrumMsInv_fx, inv_spectrum_fx, exp_inv_spectrum_fx,
                         frameno, sp_aud_decision0, element_brate, mct_on );

    return;
}