Commit 20a2f450 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

High MLD fixes and LTV crash fixes

[x] ltv-Multi-channel 7_1_4 bitrate switching from 24.4 kbps to 256 kbps, 48kHz in, 32kHz out, STEREO out, FER at 5%
[x] [stv-Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, STEREO out] MLD fix
[x] ltv-Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, HOA3 out crash fix
parent f84edeba
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -839,7 +839,7 @@ int main(
        exit( -1 );
    }
#else
    IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK )
    if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) );
        exit( -1 );
+132 −0
Original line number Diff line number Diff line
@@ -2599,6 +2599,138 @@ void SynthesisSTFT(
        Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 );
    }
}

#ifdef IVAS_FLOAT_FIXED
void SynthesisSTFT_ivas_fx(
    Word32 *fftBuffer,        /* i    : pointer to FFT bins */
    Word16 fftBufferExp,      /* i    : exponent of FFT bins */
    Word16 *timeDomainOutput, /* o    : pointer to time domain signal */
    Word16 *olapBuffer,       /* i/o  : pointer to overlap buffer */
    const PWord16 *olapWin,   /* i    : pointer to overlap window */
    Word16 tcx_transition,
    HANDLE_FD_CNG_COM hFdCngCom, /* i/o  : pointer to FD_CNG structure containing all buffers and variables */
    Word16 gen_exc,
    Word16 *Q_new,
    const Word16 element_mode, /* i  : element mode */
    const Word16 nchan_out     /* i  : number of output channels */
)
{
    Word16 i, len, scale, tmp;
    Word16 len2, len3, len4;
    Word16 buf[M + 1 + L_FRAME16k];


    /* Perform IFFT */
    scale = 0;
    move16();
    BASOP_rfft( fftBuffer, hFdCngCom->fftlen, &scale, 1 );
    fftBufferExp = add( fftBufferExp, scale );
    hFdCngCom->fftBuffer_exp = fftBufferExp;
    move16();

    fftBufferExp = add( fftBufferExp, hFdCngCom->fftlenShift );

    /* Perform overlap-add */
    /* Handle overlap in P/S domain for stereo */
    IF( ( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) && EQ_16( nchan_out, 2 ) )
    {
        Copy( olapBuffer + 3 * hFdCngCom->frameSize / 4 - ( M + 1 ), buf, hFdCngCom->frameSize + M + 1 );
        set16_fx( olapBuffer, 0, hFdCngCom->fftlen );
    }
    ELSE
    {
        Copy( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize );
        set16_fx( olapBuffer + hFdCngCom->frameSize, 0, hFdCngCom->frameSize );
    }
    len2 = shr( hFdCngCom->fftlen, 2 );
    len4 = shr( hFdCngCom->fftlen, 3 );
    len3 = add( len2, len4 );
    len = add( hFdCngCom->frameSize, len4 );
    IF( tcx_transition )
    {
        FOR( i = 0; i < len; i++ )
        {
            olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) );
            move16();
        }
    }
    ELSE
    {
        FOR( i = 0; i < len4; i++ )
        {
            olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) );
            move16();
            olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) );
            move16();
        }
        FOR( i = len3; i < len; i++ )
        {
            olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) );
        }
    }

    FOR( i = 0; i < len4; i++ )
    {
        olapBuffer[i + 5 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 5 * len4], fftBufferExp - 15 ) ), olapWin[i].v.re );
        move16();
        olapBuffer[i + 6 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 6 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.im );
        move16();
    }

    len = add( len, len2 );
    FOR( i = len; i < hFdCngCom->fftlen; i++ )
    {
        olapBuffer[i] = 0;
        move16();
    }

    /* Get time-domain signal */
    FOR( i = 0; i < hFdCngCom->frameSize; i++ )
    {
        timeDomainOutput[i] = mult_r( olapBuffer[i + len4], hFdCngCom->fftlenFac );
        move16();
    }
    /* Generate excitation */
#ifdef IVAS_CODE_CNG_COM
    PME()
    if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 )
    {
        for ( i = 0; i < hFdCngCom->frameSize / 2; i++ )
        {
            buf[i + ( M + 1 )] += olapBuffer[i + hFdCngCom->frameSize / 4];
        }
        v_multc( buf, (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize );
    }
    else
#endif
    {
        FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ )
        {
            buf[i] = mult_r( olapBuffer[i + len4 - M - 1], hFdCngCom->fftlenFac );
            move16();
        }
        tmp = buf[0];
    }
    IF( EQ_16( gen_exc, 1 ) )
    {
        Word16 s = getScaleFactor16( buf + 1, M + hFdCngCom->frameSize );
        if ( GT_16( *Q_new, s ) )
        {
            *Q_new = s;
            move16();
        }

        E_UTIL_f_preemph2( *Q_new - 1, buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp );
        Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 );
    }
    IF( EQ_16( gen_exc, 2 ) )
    {
        *Q_new = E_UTIL_f_preemph3( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp, 1 );
        Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 );
    }
}
#endif

#ifdef IVAS_CODE_CNG_COM
/*-------------------------------------------------------------------
 * SynthesisSTFT_dirac()
+14 −0
Original line number Diff line number Diff line
@@ -4861,6 +4861,20 @@ void SynthesisSTFT(
    const Word16 nchan_out     /* i  : number of output channels */
);

void SynthesisSTFT_ivas_fx(
    Word32 *fftBuffer,        /* i    : pointer to FFT bins */
    Word16 fftBufferExp,      /* i    : exponent of FFT bins */
    Word16 *timeDomainOutput, /* o    : pointer to time domain signal */
    Word16 *olapBuffer,       /* i/o  : pointer to overlap buffer */
    const PWord16 *olapWin,   /* i    : pointer to overlap window */
    Word16 tcx_transition,
    HANDLE_FD_CNG_COM hFdCngCom, /* i/o  : pointer to FD_CNG structure containing all buffers and variables */
    Word16 gen_exc,
    Word16 *Q_new,
    const Word16 element_mode, /* i  : element mode */
    const Word16 nchan_out     /* i  : number of output channels */
);

void mhvals(
    const Word16 d,
    Word16 *m /*, float * h*/
+2 −2
Original line number Diff line number Diff line
@@ -4032,7 +4032,7 @@ void generate_comfort_noise_dec_ivas_fx(
    }

    /* Perform STFT synthesis */
    SynthesisSTFT( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn,
    SynthesisSTFT_ivas_fx( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn,
                           tcx_transition, hFdCngCom, gen_exc, Q_new, st->element_mode, nchan_out );
    scale_sig32( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ), sub( fftBuffer_exp, hFdCngCom->fftBuffer_exp ) );

+1 −1
Original line number Diff line number Diff line
@@ -1887,7 +1887,7 @@ Word16 computeMixingMatrices_fx(
    Cr_p_fx = Cr_fx;
    Cy_p_fx = Cy_fx;
    Cy_tilde_p_fx = mat_mult_buffer2_fx;
    exp = s_max( Cy_fx_e, mat_mult_buffer2_e );
    exp = add( s_max( Cy_fx_e, mat_mult_buffer2_e ), 1 ); /* Guard bit */
    FOR( i = 0; i < lengthCy * lengthCy; i++ )
    {
        Cy_fx[i] = L_shr( Cy_p_fx[i], exp - Cy_fx_e );
Loading