Commit da660ef1 authored by vaclav's avatar vaclav
Browse files

Merge branch 'ENC_BUFFERS_SCALING' into 'main'

Simplify scaling of SHB buffers in core-encoder

See merge request !2752
parents bce43b38 4c4fc4f9
Loading
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -1359,11 +1359,20 @@ void stereo_tcx_init_dec_fx(

void stereo_icBWE_enc_fx(
    CPE_ENC_HANDLE hCPE,                                        /* i/o: CPE encoder structure                */
#ifdef REMOVE_SCALING_SHB_SPEECH
    const Word16 shb_speech_ref_fx16[],                         /* i  : SHB speech ref channel             Q0*/
    Word16 shb_speech_nonref_fx_16[],                           /* i/o: SHB speech non-ref channel         shb_speech_nonref_e*/
#else
    const Word32 shb_speech_ref_fx[],                           /* i  : SHB speech ref channel               */
    const Word16 shb_speech_ref_e,                              /* i  : SHB speech ref channel               */
    Word32 shb_speech_nonref_fx[],                              /* i/o: SHB speech non-ref channel           */
#endif
    Word16 shb_speech_nonref_e,                                 /* i/o: SHB speech non-ref channel           */
#ifdef REMOVE_SCALING_SHB_SPEECH
    const Word16 *voice_factors_fx                              /* i  : voicing factors                  Q15 */
#else
    const Word32 *voice_factors_fx                              /* i  : voicing factors                     Q31 */
#endif
);

void initMdctStereoDecData_fx(
@@ -6382,7 +6391,7 @@ UWord16 get_indice_st(

void stereo_mdct_core_enc_fx(
    CPE_ENC_HANDLE hCPE,                                        /* i/o: CPE encoder structure                   */
    Word16 new_samples[CPE_CHANNELS][L_INP],                    /* i  : new samples                           Q0*/
    Word16 new_samples[CPE_CHANNELS][L_INP],                    /* i  : new samples                       Qnew-1*/
    Word16 old_wsp[CPE_CHANNELS][L_WSP],                        /* i  : 12.8kHz weighted speech (for LTP      Qx*/
    Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k]              /* o  : floating pitch for each subframe      Q6*/
);
+2 −2
Original line number Diff line number Diff line
@@ -75,7 +75,6 @@
/*#define DISABLE_LIMITER*/

/* ################### Start MAINTENANCE switches ########################### */
#define FIX_2255_ISAR_RENDER_POSES                           /* VA: issue 2255: fix missing check in isar_render_poses() */

/* ################### Start BE switches ################################# */
/* only BE switches wrt wrt. TS 26.251 V3.0 */
@@ -85,6 +84,7 @@
#define FIX_1999_TEMPORARY_DISABLE_DIST_ATT_CHECK       /* Eri: Issue 1999: Range check on float values of distance attenuation, while the float values are not propagated to this function. The test is not correct, but configurable distance attenuation is not used in Characterization.*/
#define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR      /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */
#define NONBE_1122_KEEP_EVS_MODE_UNCHANGED              /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR.  */
#define FIX_2255_ISAR_RENDER_POSES                      /* VA: issue 2255: fix missing check in isar_render_poses() */
#define FIX_1904_HARM_GSC_ENC                           /* VA: #1904 Harmonization of EVS and IVAS GSC code */
#define FIX_1478_UNINIT_ON_BFI                          /* VA: Fix issue 1478 where a vector is partly un-initialized during bfi */
#define FIX_2318_CLANG_DECODER                          /* VA: basop issue 2318: Initialize command-line parameter arg.non_diegetic_pan_gain_fx */
@@ -114,6 +114,7 @@
#define FIX_2370_UNUSED_BUFFERS_CORE_ENC                /* VA: basop issue 2370: remove temporary input buffers in core-encoder  */
#define FIX_2376_FIX_USAN_PRE_PROC                      /* VA: basop issue 2376: Resolve "USAN: SEGV in ivas_compute_core_buffers_fx() */
#define FIX_2367_REMOVE_CODE_ICBWE                      /* VA: basop issue 2367: Remove IC-BWE obsolete code  */
#define REMOVE_SCALING_SHB_SPEECH                       /* VA: remove unnecessary scaling and 32-bit buffers from ivas_core_enc_fx() */

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

@@ -130,7 +131,6 @@

/* ##################### End NON-BE switches ########################### */


/* ################## End MAINTENANCE switches ######################### */

/* clang-format on */
+8 −4
Original line number Diff line number Diff line
@@ -10338,9 +10338,13 @@ void Copy_Scale_sig32(
void swb_pre_proc_ivas_fx(
    Encoder_State *st,      /* i/o: encoder state structure                  */
    Word16 *new_swb_speech, /* o  : original input signal at 32kHz - Q0      */
#ifndef REMOVE_SCALING_SHB_SPEECH
    Word32 *new_swb_speech_fx, /* o  : original input signal at 32kHz - Q - q_reImBuffer */
    Word16 *shb_speech,        /* o  : SHB target signal (6-14kHz) at 16kHz- Q(Q_shb_spch) */
#endif
    Word16 *shb_speech, /* o  : SHB target signal (6-14kHz) at 16kHz - Q0*/
#ifndef REMOVE_SCALING_SHB_SPEECH
    Word16 *Q_shb_spch,
#endif
    Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i  : real buffer Q - q_reImbuffer             */
    Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i  : imag buffer Q - q_reImbuffer             */
    Word16 q_reImBuffer,                                        /* i  : scale data of real and imag CLDFB buffers*/
+39 −8
Original line number Diff line number Diff line
@@ -87,12 +87,16 @@ ivas_error ivas_core_enc_fx(
    STEREO_ICBWE_ENC_HANDLE hStereoICBWE;
    STEREO_TD_ENC_DATA_HANDLE hStereoTD;
    Word16 voice_factors_fx[CPE_CHANNELS][NB_SUBFR16k]; /* Q15 */
#ifndef REMOVE_SCALING_SHB_SPEECH
    Word32 shb_speech_fx32[L_FRAME16k];
    Word32 *new_swb_speech_fx;
#endif
    Word16 *inp_fx[CPE_CHANNELS];
    Word16 *shb_speech_fx;
#ifndef REMOVE_SCALING_SHB_SPEECH
    Word16 Q_shb_spch;
    Word32 new_swb_speech_buffer_fx[L_FRAME48k + STEREO_DFT_OVL_MAX];
#endif
    Word16 new_inp_resamp16k_fx[CPE_CHANNELS][L_FRAME16k]; /* new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */
    Word16 *hb_speech_fx;
    Word32 bwe_exc_extended_fx[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; /* 2 * Q_new */
@@ -110,8 +114,9 @@ ivas_error ivas_core_enc_fx(
    Word16 max_num_indices_BWE;
    Word16 i, shift, Q_min;

#ifndef REMOVE_SCALING_SHB_SPEECH
    set32_fx( new_swb_speech_buffer_fx, 0, L_FRAME48k + STEREO_DFT_OVL_MAX );

#endif
    FOR( i = 0; i < CPE_CHANNELS; i++ )
    {
        set_zero_fx( bwe_exc_extended_fx[i], L_FRAME32k + NL_BUFF_OFFSET );
@@ -124,9 +129,10 @@ ivas_error ivas_core_enc_fx(
    error = IVAS_ERR_OK;
    move32();

#ifndef REMOVE_SCALING_SHB_SPEECH
    Q_shb_spch = 0;
    move16();

#endif
    /*------------------------------------------------------------------*
     * General initialization
     *-----------------------------------------------------------------*/
@@ -657,7 +663,6 @@ ivas_error ivas_core_enc_fx(
        st->q_old_inp = -1;
        move16();
#endif

        /*---------------------------------------------------------------------*
         * Postprocessing for ACELP/HQ core switching
         *---------------------------------------------------------------------*/
@@ -712,7 +717,9 @@ ivas_error ivas_core_enc_fx(
        }
#endif

#ifndef REMOVE_SCALING_SHB_SPEECH
        new_swb_speech_fx = new_swb_speech_buffer_fx + STEREO_DFT_OVL_MAX;
#endif
        new_swb_speech_fx_16 = new_swb_speech_buffer_fx_16 + STEREO_DFT_OVL_MAX;
        set16_fx( new_swb_speech_buffer_fx_16, 0, L_FRAME48k + STEREO_DFT_OVL_MAX );
        shb_speech_fx = new_inp_resamp16k_fx[n]; /* reuse existing buffer: shb_speech[L_FRAME16k] */
@@ -745,7 +752,11 @@ ivas_error ivas_core_enc_fx(
                st->cldfbSynTd->Q_cldfb_state = sub( q_re_im_buf[n], 1 );
            }

#ifdef REMOVE_SCALING_SHB_SPEECH
            swb_pre_proc_ivas_fx( st, new_swb_speech_fx_16, shb_speech_fx, realBuffer_fx[n], imagBuffer_fx[n], q_re_im_buf[n], hCPE );
#else
            swb_pre_proc_ivas_fx( st, new_swb_speech_fx_16, new_swb_speech_fx, shb_speech_fx, &Q_shb_spch, realBuffer_fx[n], imagBuffer_fx[n], q_re_im_buf[n], hCPE );
#endif

            st->cldfbSynTd->Q_cldfb_state = sub( q_re_im_buf[n], 1 );
        }
@@ -757,6 +768,7 @@ ivas_error ivas_core_enc_fx(
            }
        }

#ifndef REMOVE_SCALING_SHB_SPEECH
        Word16 Q_shb_spch_16 = Q_shb_spch;
        move16();
#ifdef FIX_2344_ALIGN_PREPROC
@@ -767,15 +779,17 @@ ivas_error ivas_core_enc_fx(
            shift = add( getScaleFactor16( shb_speech_fx, L_FRAME16k ), Q16 );
            Copy_Scale_sig_16_32_no_sat( shb_speech_fx, shb_speech_fx32, L_FRAME16k, shift ); // Q_shb_spch
            Q_shb_spch = add( Q_shb_spch, shift );

            IF( st->hBWE_FD )
#endif
            IF( st->hBWE_FD ) // VE: to be moved to the end of swb_pre_proc_ivas_fx()
            {
                shift = getScaleFactor16( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k );
                st->Q_old_wtda = add( st->Q_old_wtda, shift );
                move16();
                Scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, shift ); // st->Q_old_wtda
            }
#ifndef REMOVE_SCALING_SHB_SPEECH
        }
#endif

        /* SWB TBE encoder */
        test();
@@ -788,7 +802,11 @@ ivas_error ivas_core_enc_fx(
                Word16 Q_fb_exc;
                Word16 fb_exc_fx[L_FRAME16k];

#ifdef REMOVE_SCALING_SHB_SPEECH
                swb_tbe_enc_ivas_fx( st, hStereoICBWE, shb_speech_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], fb_exc_fx, &Q_fb_exc, Q_new[n], 0, st->voicing_fx, pitch_buf_fx[n] );
#else
                swb_tbe_enc_ivas_fx( st, hStereoICBWE, shb_speech_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], fb_exc_fx, &Q_fb_exc, Q_new[n], Q_shb_spch_16, st->voicing_fx, pitch_buf_fx[n] );
#endif

                IF( EQ_16( st->extl, FB_TBE ) )
                {
@@ -799,9 +817,15 @@ ivas_error ivas_core_enc_fx(
        }
        ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) )
        {
#ifndef REMOVE_SCALING_SHB_SPEECH
            Copy_Scale_sig_32_16( shb_speech_fx32, shb_speech_fx, L_FRAME16k, -Q16 ); // Q_shb_spch - 16
#endif
            /* SWB(FB) BWE encoder */
#ifdef REMOVE_SCALING_SHB_SPEECH
            swb_bwe_enc_ivas_fx( st, last_element_mode, old_inp_12k8_fx[n], old_inp_16k_fx[n], old_syn_12k8_16k_fx[n], new_swb_speech_fx_16, st->q_inp, shb_speech_fx, sub( Q_new[n], 1 ) );
#else
            swb_bwe_enc_ivas_fx( st, last_element_mode, old_inp_12k8_fx[n], old_inp_16k_fx[n], old_syn_12k8_16k_fx[n], new_swb_speech_fx_16, st->q_inp, shb_speech_fx, sub( Q_shb_spch, Q16 ), sub( Q_new[n], 1 ) );
#endif
        }

        Scale_sig( old_syn_12k8_16k_fx[n], L_FRAME16k, sub( Q1, Q_new[n] ) ); // Q0
@@ -825,9 +849,11 @@ ivas_error ivas_core_enc_fx(
        IF( st->hTdCngEnc != NULL && st->Opt_DTX_ON && ( GE_16( input_frame, L_FRAME32k ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) ) )
        {
            /* SHB DTX/CNG encoder */
#ifndef REMOVE_SCALING_SHB_SPEECH
            Copy_Scale_sig_32_16( shb_speech_fx32, shb_speech_fx, L_FRAME16k, negate( Q_shb_spch ) ); // Q0
#endif
#ifdef HARM_NON_LINEARITY
            swb_CNG_enc_fx( st, shb_speech_fx /* Unmodified */, old_syn_12k8_16k_fx[n] );
            swb_CNG_enc_fx( st, shb_speech_fx, old_syn_12k8_16k_fx[n] );
#else
            swb_CNG_enc_ivas_fx( st, shb_speech_fx /* Unmodified */, old_syn_12k8_16k_fx[n] );
#endif
@@ -846,19 +872,24 @@ ivas_error ivas_core_enc_fx(
        test();
        IF( n == 0 && GE_32( input_Fs, 32000 ) && hStereoICBWE != NULL )
        {
#ifndef FIX_2367_REMOVE_CODE_ICBWE
#ifdef FIX_2367_REMOVE_CODE_ICBWE
            Word16 q_new_swb_speech_buffer = st->q_inp;
#endif
            Word32 voice_factors_fx32[CPE_CHANNELS][NB_SUBFR16k];
            stereo_icBWE_preproc_fx( hCPE, input_frame, new_swb_speech_buffer_fx_16 /*tmp buffer*/, q_new_swb_speech_buffer );

            q_new_swb_speech_buffer = add( q_new_swb_speech_buffer, 16 );
            q_new_swb_speech_buffer = add( q_new_swb_speech_buffer, Q16 );
            Copy_Scale_sig_16_32_no_sat( new_swb_speech_buffer_fx_16, new_swb_speech_buffer_fx, L_FRAME48k + STEREO_DFT_OVL_MAX, Q16 ); // q_new_swb_speech_buffer+st->q_inp - 16 - > q_new_swb_speech_buffer+st->q_inp
            Copy_Scale_sig_16_32_no_sat( voice_factors_fx[0], voice_factors_fx32[0], NB_SUBFR16k, Q16 );                                // Q31

            stereo_icBWE_enc_fx( hCPE, shb_speech_fx32, sub( Q31, Q_shb_spch ), new_swb_speech_buffer_fx, sub( Q31, q_new_swb_speech_buffer ), voice_factors_fx32[0] );
#ifndef FIX_2367_REMOVE_CODE_ICBWE
#else
            stereo_icBWE_preproc_fx( hCPE, input_frame, new_swb_speech_buffer_fx_16 /*tmp buffer*/, st->q_inp );

            stereo_icBWE_enc_fx( hCPE, shb_speech_fx, new_swb_speech_buffer_fx_16, st->q_inp, voice_factors_fx[0] );
#endif
#ifndef FIX_2367_REMOVE_CODE_ICBWE
            IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) )
            {
                test();
+30 −7
Original line number Diff line number Diff line
@@ -605,7 +605,6 @@ static void icbwe_dft_stereo_param_fx(
    return;
}


/*-------------------------------------------------------------------*
 * stereo_icBWE_enc()
 *
@@ -614,11 +613,20 @@ static void icbwe_dft_stereo_param_fx(

void stereo_icBWE_enc_fx(
    CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure                */
    const Word32 shb_speech_ref_fx[], /* i  : SHB speech ref channel        Q31-shb_speech_ref_e*/
#ifdef REMOVE_SCALING_SHB_SPEECH
    const Word16 shb_speech_ref_fx16[], /* i  : SHB speech ref channel             Q0*/
    Word16 shb_speech_nonref_fx_16[],   /* i/o: SHB speech non-ref channel         shb_speech_nonref_e*/
#else
    const Word32 shb_speech_ref_fx[], /* i  : SHB speech ref channel               shb_speech_ref_e*/
    const Word16 shb_speech_ref_e,    /* i  : SHB speech ref channel               */
    Word32 shb_speech_nonref_fx[],    /* i/o: SHB speech non-ref channel           Q31-shb_speech_nonref_e*/
#endif
    Word16 shb_speech_nonref_e, /* i/o: SHB speech non-ref channel           */
#ifdef REMOVE_SCALING_SHB_SPEECH
    const Word16 *voice_factors_fx16 /* i  : voicing factors                     Q15 */
#else
    const Word32 *voice_factors_fx    /* i  : voicing factors                     Q31 */
#endif
)
{
    Word16 i, j, k, nbSubFr;
@@ -642,6 +650,21 @@ void stereo_icBWE_enc_fx(
    Word32 temp1_fx, temp2_fx;
    Word16 temp1_e, temp2_e, shb_frame_ref_e, shb_frame_nonref_e, gDes_e, tmp, exp;

#ifdef REMOVE_SCALING_SHB_SPEECH
    Word32 shb_speech_ref_fx[L_FRAME16k];
    Word16 shb_speech_ref_e;
    Word32 shb_speech_nonref_fx[L_FRAME48k + STEREO_DFT_OVL_MAX];
    Word32 voice_factors_fx[NB_SUBFR16k];

    shb_speech_ref_e = add( getScaleFactor16( shb_speech_ref_fx16, L_FRAME16k ), Q16 );
    Copy_Scale_sig_16_32_no_sat( shb_speech_ref_fx16, shb_speech_ref_fx, L_FRAME16k, shb_speech_ref_e );
    shb_speech_ref_e = Q31 - shb_speech_ref_e;

    shb_speech_nonref_e = Q15 - shb_speech_nonref_e;
    Copy_Scale_sig_16_32_no_sat( shb_speech_nonref_fx_16, shb_speech_nonref_fx, L_FRAME48k + STEREO_DFT_OVL_MAX, Q16 ); // q_new_swb_speech_buffer+st->q_inp - 16 - > q_new_swb_speech_buffer+st->q_inp
    Copy_Scale_sig_16_32_no_sat( voice_factors_fx16, voice_factors_fx, NB_SUBFR16k, Q16 );                              // Q31
#endif

    /* initialization */
    hStereoDft = hCPE->hStereoDft;
    hStereoICBWE = hCPE->hStereoICBWE;
Loading