Commit a994b8b3 authored by emerit's avatar emerit
Browse files

Merge branch 'ivas-float-update' into 1963_ref_portFltMR-1568-1471-1690

parents b459e67f d19f0003
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -526,6 +526,9 @@ enum
#define L_FRAME_MAX                         L_FRAME48k                          /* Max 20ms frame size @48kHz              */
#define L_FRAME_PLUS                        1200                                /* Max frame size (long TCX frame)            */
#define L_MDCT_OVLP_MAX                     NS2SA( 48000, ACELP_LOOK_NS )       /* = Max mdct overlap */
#ifdef FIX_1320_STACK_CPE_DECODER
#define L_FRAME_PLUS_INTERNAL               800                                 /* Max frame size (long TCX frame) at maximum internal sampling rate */
#endif
#define N_TCX10_MAX                         480                                 /* Max size of TCX10 MDCT spectrum */
#define BITS_TEC                            1                                   /* number of bits for TEC */
#define BITS_TFA                            1                                   /* number of bits for TTF */
+1 −0
Original line number Diff line number Diff line
@@ -163,6 +163,7 @@
#ifdef FIX_CREND_SIMPLIFY_CODE
#define FIX_989_TD_REND_ROM                             /* Eri: Clean-up for TD renderer and completion of ROM generation tool */
#endif
#define FIX_1320_STACK_CPE_DECODER                      /* VA: issue 1320: Optimize the stack memory consumption in the CPE decoder */
#define NONBE_1328_FIX_NON_LINEARITY                    /* VA: Fix possible issue when computing bwe_exc_extended and previous frame were almost 0  */
#define FIX_1319_STACK_SBA_DECODER                      /* VA: issue 1319: Optimize the definition of buffer lengths in the SBA decoder */
/* #################### End BASOP porting switches ############################ */
+8 −0
Original line number Diff line number Diff line
@@ -71,7 +71,11 @@ void decoder_LPD(
{
    int16_t *prm;
    int16_t param_lpc[NPRM_LPC_NEW];
#ifdef FIX_1320_STACK_CPE_DECODER
    float synth_buf[OLD_SYNTH_INTERNAL_DEC + L_FRAME_PLUS_INTERNAL + M];
#else
    float synth_buf[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M];
#endif
    float *synth;
    float synth_bufFB[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M];
    float *synthFB;
@@ -124,7 +128,11 @@ void decoder_LPD(
    synthFB = synth_bufFB + st->hTcxDec->old_synth_lenFB;
    mvr2r( st->hTcxDec->old_synth, synth_buf, st->hTcxDec->old_synth_len );
    mvr2r( st->hTcxDec->old_synthFB, synth_bufFB, st->hTcxDec->old_synth_lenFB );
#ifdef FIX_1320_STACK_CPE_DECODER
    set_zero( synth, L_FRAME_PLUS_INTERNAL + M );
#else
    set_zero( synth, L_FRAME_PLUS + M );
#endif
    set_zero( synthFB, L_FRAME_PLUS + M );


+30 −3
Original line number Diff line number Diff line
@@ -75,7 +75,12 @@ ivas_error ivas_core_dec(
    float synth[CPE_CHANNELS][L_FRAME48k];
    float tmp_buffer[L_FRAME48k];
    int16_t tmps, incr;
#ifdef FIX_1320_STACK_CPE_DECODER
    float *bwe_exc_extended[CPE_CHANNELS] = { NULL, NULL };
    int16_t flag_bwe_bws;
#else
    float bwe_exc_extended[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET];
#endif
    float voice_factors[CPE_CHANNELS][NB_SUBFR16k];
    int16_t core_switching_flag[CPE_CHANNELS];
    float old_syn_12k8_16k[CPE_CHANNELS][L_FRAME16k];
@@ -200,6 +205,9 @@ ivas_error ivas_core_dec(

        set_f( voice_factors[n], 0.f, NB_SUBFR16k );
        set_f( hb_synth[n], 0.0f, L_FRAME48k );
#ifdef FIX_1320_STACK_CPE_DECODER
        bwe_exc_extended[n] = hb_synth[n]; /* note: reuse the buffer */
#endif

        /*------------------------------------------------------------------*
         * Decision matrix (selection of technologies)
@@ -510,6 +518,10 @@ ivas_error ivas_core_dec(
         * SWB(FB) BWE decoding
         *---------------------------------------------------------------------*/

#ifdef FIX_1320_STACK_CPE_DECODER
        flag_bwe_bws = ( output_Fs >= 32000 && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && st->bfi == 0 );

#endif
        if ( st->extl == SWB_TBE || st->extl == FB_TBE || ( st->coder_type != AUDIO && st->coder_type != INACTIVE && st->core_brate >= SID_2k40 && st->core == ACELP_CORE && !st->con_tcx && output_Fs >= 32000 && st->bwidth > NB && st->bws_cnt > 0 ) )
        {
            /* SWB TBE decoder */
@@ -521,12 +533,24 @@ ivas_error ivas_core_dec(
                fb_tbe_dec( st, tmp_buffer /*fb_exc*/, hb_synth[n], tmp_buffer /*fb_synth_ref*/, output_frame );
            }
        }
#ifdef FIX_1320_STACK_CPE_DECODER
        else if ( st->extl == SWB_BWE || st->extl == FB_BWE || flag_bwe_bws )
#else
        else if ( st->extl == SWB_BWE || st->extl == FB_BWE || ( output_Fs >= 32000 && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( st->nelp_mode_dec == 1 && st->bfi == 1 ) ) )
#endif
        {
            /* SWB BWE decoder */
            swb_bwe_dec( st, output[n], synth[n], hb_synth[n], use_cldfb_for_dft, output_frame );
        }

#ifdef FIX_1320_STACK_CPE_DECODER
        if ( ( st->core == ACELP_CORE && ( st->extl == -1 || st->extl == SWB_CNG ) ) && flag_bwe_bws == 0 )
        {
            set_f( hb_synth[n], 0.0f, L_FRAME48k );
        }

#endif

        /*---------------------------------------------------------------------*
         * FEC - recovery after lost HQ core (smoothing of the BWE component)
         *---------------------------------------------------------------------*/
@@ -560,6 +584,7 @@ ivas_error ivas_core_dec(
            stereo_icBWE_dec( hCPE, hb_synth[0], hb_synth[1], tmp_buffer /*fb_synth_ref*/, voice_factors[0], output_frame );
        }

#ifndef FIX_1320_STACK_CPE_DECODER
        if ( st->element_mode == EVS_MONO )
        {
            /*----------------------------------------------------------------*
@@ -575,7 +600,7 @@ ivas_error ivas_core_dec(
                st->hPlcInfo->Pitch = 0;
            }
        }

#endif
        /*----------------------------------------------------------------*
         * Transition and synchronization of BWE components
         *----------------------------------------------------------------*/
@@ -590,6 +615,7 @@ ivas_error ivas_core_dec(
            }
            else
            {
#ifndef FIX_1320_STACK_CPE_DECODER
                if ( st->extl == SWB_BWE_HIGHRATE || st->extl == FB_BWE_HIGHRATE )
                {
                    /* HR SWB BWE on top of ACELP@16kHz */
@@ -597,9 +623,12 @@ ivas_error ivas_core_dec(
                }
                else
                {
#endif
                    /* TBE on top of ACELP@16kHz */
                    tmps = NS2SA( output_Fs, MAX_DELAY_TBE_NS - DELAY_SWB_TBE_16k_NS );
#ifndef FIX_1320_STACK_CPE_DECODER
                }
#endif
            }

            /* Smooth transitions when switching between different technologies */
@@ -733,11 +762,9 @@ ivas_error ivas_core_dec(

    } /* n_channels loop */


#ifdef DEBUG_MODE_INFO
    output_debug_mode_info_dec( sts, n_channels, output_frame, pitch_buf );
#endif

    pop_wmops();
    return error;
}
+88 −0
Original line number Diff line number Diff line
@@ -54,6 +54,10 @@ static void read_stereo_mode_and_bwidth( CPE_DEC_HANDLE hCPE, const Decoder_Stru

static void stereo_mode_combined_format_dec( const Decoder_Struct *st_ivas, CPE_DEC_HANDLE hCPE );

#ifdef FIX_1320_STACK_CPE_DECODER
static ivas_error stereo_dft_dec_main( CPE_DEC_HANDLE hCPE, const int32_t ivas_total_brate, const int16_t n_channels, float *p_res_buf, float *output[], float outputHB[][L_FRAME48k], const int16_t output_frame );
#endif


/*--------------------------------------------------------------------------*
 * ivas_cpe_dec()
@@ -74,7 +78,11 @@ ivas_error ivas_cpe_dec(
    int16_t last_bwidth;
    int16_t tdm_ratio_idx;
    float outputHB[CPE_CHANNELS][L_FRAME48k]; /* 'float' buffer for output HB synthesis, both channels */
#ifdef FIX_1320_STACK_CPE_DECODER
    float *res_buf = NULL;
#else
    float res_buf[STEREO_DFT_N_8k];
#endif
    CPE_DEC_HANDLE hCPE;
    STEREO_DFT_CONFIG_DATA_HANDLE hConfigDft;
    Decoder_State **sts;
@@ -265,6 +273,11 @@ ivas_error ivas_cpe_dec(
            }
            else
            {

#ifdef FIX_1320_STACK_CPE_DECODER
                res_buf = outputHB[0]; /* note: temporarily reused buffer */

#endif
                if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT )
                {
                    nb_bits -= nb_bits_metadata;
@@ -447,6 +460,12 @@ ivas_error ivas_cpe_dec(

    if ( hCPE->element_mode == IVAS_CPE_DFT && !( hCPE->nchan_out == 1 && hConfigDft->res_cod_mode == STEREO_DFT_RES_COD_OFF ) )
    {
#ifdef FIX_1320_STACK_CPE_DECODER
        if ( ( error = stereo_dft_dec_main( hCPE, ivas_total_brate, n_channels, res_buf, output, outputHB, output_frame ) ) != IVAS_ERR_OK )
        {
            return error;
        }
#else
        float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX];

        /* core decoder */
@@ -481,6 +500,7 @@ ivas_error ivas_cpe_dec(
        {
            stereo_dft_dec_synthesize( hCPE, DFT, n, output[n], output_frame );
        }
#endif
    }
    else if ( hCPE->element_mode == IVAS_CPE_TD )
    {
@@ -605,6 +625,74 @@ ivas_error ivas_cpe_dec(
    return error;
}

#ifdef FIX_1320_STACK_CPE_DECODER

/*-------------------------------------------------------------------------
 * stereo_dft_dec_main()
 *
 * DFT decoder main function
 *-------------------------------------------------------------------------*/

static ivas_error stereo_dft_dec_main(
    CPE_DEC_HANDLE hCPE,            /* i/o: CPE decoder structure               */
    const int32_t ivas_total_brate, /* i  : IVAS total bitrate                  */
    const int16_t n_channels,       /* i  : number of channels to be decoded    */
    float *p_res_buf,               /* i  : DFT stereo residual S signal        */
    float *output[],                /* o  : output synthesis signal             */
    float outputHB[][L_FRAME48k],   /* o  : output HB synthesis signal          */
    const int16_t output_frame      /* i  : output frame length per channel     */
)
{
    float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX];
    int16_t n;
    Decoder_State *st0;
    ivas_error error;

    st0 = hCPE->hCoreCoder[0];

    /* copy from temporary buffer */
    if ( hCPE->hStereoDft->res_cod_band_max > 0 && !st0->bfi )
    {
        mvr2r( p_res_buf, DFT[1], STEREO_DFT_N_8k );
    }

    /* core decoder */
    if ( ( error = ivas_core_dec( NULL, NULL, hCPE, NULL, n_channels, output, outputHB, DFT, 0 ) ) != IVAS_ERR_OK )
    {
        return error;
    }

    /* DFT Stereo residual decoding */
    if ( hCPE->hStereoDft->res_cod_band_max > 0 && !st0->bfi )
    {
        stereo_dft_dec_res( hCPE, DFT[1] /*res_buf*/, output[1] );

        stereo_dft_dec_analyze( hCPE, output[1], DFT, 1, L_FRAME8k, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0 );
    }

    /* DFT stereo CNG */
    stereo_dtf_cng( hCPE, ivas_total_brate, DFT, output_frame );

    /* decoding */
    if ( hCPE->nchan_out == 1 )
    {
        stereo_dft_unify_dmx( hCPE->hStereoDft, st0, DFT, hCPE->input_mem[1], hCPE->hStereoCng->prev_sid_nodata );
    }
    else
    {
        stereo_dft_dec( hCPE->hStereoDft, st0, DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
    }

    /* synthesis iFFT */
    for ( n = 0; n < hCPE->nchan_out; n++ )
    {
        stereo_dft_dec_synthesize( hCPE, DFT, n, output[n], output_frame );
    }

    return IVAS_ERR_OK;
}

#endif

/*-------------------------------------------------------------------------
 * create_cpe_dec()
Loading