From a2d2cff6c4eca5962c6209f74f50c7b414e45673 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Sun, 3 Mar 2024 18:59:07 +0530 Subject: [PATCH] Add changes for stereo_dft_dec_read_BS --- lib_com/ivas_prot.h | 30 ++ lib_com/ivas_rom_com.c | 18 + lib_com/ivas_rom_com.h | 4 + lib_dec/ivas_cpe_dec_fx.c | 27 ++ lib_dec/ivas_stat_dec.h | 2 + lib_dec/ivas_stereo_dft_dec_fx.c | 741 +++++++++++++++++++++++++++++++ 6 files changed, 822 insertions(+) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index bbbd96deb..6d9163fb5 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1406,6 +1406,13 @@ void stereo_dft_quantize_res_gains( int16_t *ig, int16_t *ir ); +#ifdef IVAS_FLOAT_FIXED +void stereo_dft_dequantize_itd_fx( + Word16 *ind, + Word32 *out, + const Word32 output_Fs +); +#endif // IVAS_FLOAT_FIXED void stereo_dft_dequantize_itd( int16_t *ind, @@ -1428,6 +1435,14 @@ void stereo_dft_enc_sid_coh( int16_t *nb_bits, /* i/o: number of bits written */ float *cohBand /* i/o: Coherence per band */ ); +#ifdef IVAS_FLOAT_FIXED +void stereo_dft_dec_sid_coh_fx( + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 nbands, /* i : number of DFT stereo bands */ + Word16 *coh, /* i/o: coherence */ + Word16 *nb_bits /* i/o: number of bits read */ +); +#endif // IVAS_FLOAT_FIXED void stereo_dft_dec_sid_coh( Decoder_State *st, /* i/o: decoder state structure */ @@ -1559,6 +1574,21 @@ void bpf_pitch_coherence( Decoder_State *st, /* i/o: decoder state structure */ const float pitch_buf[] /* i : pitch for each subframe [0,1,2,3] */ ); +#ifdef IVAS_FLOAT_FIXED +void stereo_dft_dec_read_BS_fx( + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word32 element_brate, /* i : element bitrate */ + Word32 *total_brate, /* o : total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + const Word16 bwidth, /* i : bandwidth */ + const Word16 output_frame, /* i : output frame length */ + Word32 res_buf[STEREO_DFT_N_8k], /* o : residual buffer */ + Word16 *nb_bits, /* o : number of bits read */ + Word16 *coh, /* i/o: Coherence */ + const Word16 ivas_format /* i : ivas format */ +); +#endif // IVAS_FLOAT_FIXED void stereo_dft_dec_read_BS( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 86fa9f416..a125144c1 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -930,12 +930,30 @@ const float dft_cng_coh_pred[STEREO_DFT_N_COH_PRED][STEREO_DFT_COH_PRED_COEFFS] { 0.202543f, 0.048819f, 0.263407f, 0.023538f, 0.092021f, 0.395655f, 0.013064f, -0.011127f, 0.035466f, 0.976055f, 0.009968f, 0.162957f, 0.383185f, -0.365493f, 2.534677f}, { 1.393664f, -0.131401f, 0.989429f, 0.738330f, 0.683865f, 0.001677f, -0.225448f, -0.012158f, 1.084608f, -0.115464f, 0.022371f, -0.045560f, -0.336230f, 0.422742f, 0.499163f} }; +#ifdef IVAS_FLOAT_FIXED +const Word16 dft_cng_coh_pred_fx[STEREO_DFT_N_COH_PRED][STEREO_DFT_COH_PRED_COEFFS] /*Q-13*/= { + { 4926, -827, 10396, 696, 2285, 5488, 668, 1547, -1416, 2633, 76, -690, 2967, -3495, 6212 }, + { 7007, 3446, 3385, -76, -3274, 11352, 101, -125, 1281, 4238, 1312, -2487, 3913, -4593, 11326 }, + { 1659, 399, 2157, 192, 753, 3241, 107, -91, 290, 7995, 81, 1334, 3139, -2994, 20764 }, + { 11416, -1076, 8105, 6048, 5602, 13, -1846, -99, 8885, -945, 183, -373, -2754, 3463, 4089 } +}; +#endif // IVAS_FLOAT_FIXED const int16_t dft_cng_coh_u2i[9] = { 4, 5, 3, 6, 2, 7, 1, 8, 0 }; /* Coherence unary codeword -> residual codeword conversion table */ const int16_t dft_cng_coh_i2u[9] = { 8, 6, 4, 2, 0, 1, 3, 5, 7 }; /* Coherence residual codeword -> unary codeword conversion table */ const int16_t dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1] = { 15, 16, 17, 18 }; +#ifdef IVAS_FLOAT_FIXED +const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]/*Q-15*/ = +{ + { 3277/*0.1f*/, 19661/*0.6f*/ }, + { 3277/*0.1f*/, 19661/*0.6f*/ }, + { 3277/*0.1f*/, 22938/*0.7f*/ }, + { 3277/*0.1f*/, 29491/*0.9f*/ }, + { 6554/*0.2f*/, 29491/*0.9f*/ } +}; +#endif // IVAS_FLOAT_FIXED const float dft_cng_alpha_bits[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS] = { diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 584d92542..e2bc05fa6 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -166,6 +166,10 @@ extern const float dft_cng_coh_pred[][STEREO_DFT_COH_PRED_COEFFS]; extern const int16_t dft_cng_coh_u2i[9]; extern const int16_t dft_cng_coh_i2u[9]; extern const float dft_cng_alpha_bits[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]; +#ifdef IVAS_FLOAT_FIXED +extern const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]; +extern const Word16 dft_cng_coh_pred_fx[][STEREO_DFT_COH_PRED_COEFFS]; +#endif // IVAS_FLOAT_FIXED extern const int16_t dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1]; /*----------------------------------------------------------------------------------* diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index 79a7c789a..e64c0489c 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -288,7 +288,34 @@ ivas_error ivas_cpe_dec_fx( } } +#ifdef IVAS_FLOAT_FIXED +#if 1 + Word16 Q_coh = 13, Q_res_buf = 8; + // Q_res_buf = Q_factor_arrL( res_buf, STEREO_DFT_N_8k ); + floatToFixed_arr(hCPE->hStereoCng->coh, hCPE->hStereoCng->coh_fx, Q_coh, 14 ); + floatToFixed_arrL( res_buf, res_buf_fx, Q_res_buf, STEREO_DFT_N_8k ); + floatToFixed_arrL(hCPE->hStereoDft->side_gain, hCPE->hStereoDft->side_gain_fx, 31, 39 ); + floatToFixed_arrL(hCPE->hStereoDft->res_pred_gain, hCPE->hStereoDft->res_pred_gain_fx, 31, 39 ); + floatToFixed_arrL(hCPE->hStereoDft->itd, hCPE->hStereoDft->itd_fx, Q15, 3 ); + floatToFixed_arrL( hCPE->hStereoDft->gipd, hCPE->hStereoDft->gipd_fx, Q13, 3 ); + hCPE->hStereoDft->itd_xfade_target_fx = floatToFixed( hCPE->hStereoDft->itd_xfade_target, 15 ); + hCPE->hStereoDft->ipd_xfade_target_fx = floatToFixed( hCPE->hStereoDft->ipd_xfade_target, 13 ); + floatToFixed_arrL( &hCPE->hStereoDft->res_gains_ind[0][0], &hCPE->hStereoDft->res_gains_ind_fx[0][0], Q26, 2 * 26 ); +#endif + stereo_dft_dec_read_BS_fx( ivas_total_brate, hCPE->element_brate, &sts[0]->total_brate, sts[1], hCPE->hStereoDft, sts[0]->bwidth, output_frame, res_buf_fx, &nb_bits, hCPE->hStereoCng->coh_fx, st_ivas->ivas_format ); +#if 1 /*Fixed To Float changes*/ + fixedToFloat_arr( hCPE->hStereoCng->coh_fx, hCPE->hStereoCng->coh, Q_coh, 14 ); /*Q-13*/ + fixedToFloat_arrL( hCPE->hStereoDft->itd_fx, hCPE->hStereoDft->itd, Q15, 3 ); + fixedToFloat_arrL( hCPE->hStereoDft->gipd_fx, hCPE->hStereoDft->gipd, Q13, 3 ); + fixedToFloat_arrL( hCPE->hStereoDft->side_gain_fx, hCPE->hStereoDft->side_gain, 31, 39 ); + fixedToFloat_arrL( hCPE->hStereoDft->res_pred_gain_fx, hCPE->hStereoDft->res_pred_gain, 31, 39 ); + fixedToFloat_arrL( &hCPE->hStereoDft->res_gains_ind_fx[0][0], &hCPE->hStereoDft->res_gains_ind[0][0], Q26, 2 * 26 ); + hCPE->hStereoDft->res_global_gain = ( (float) hCPE->hStereoDft->res_global_gain_fx / ONE_IN_Q15 ); + fixedToFloat_arrL( res_buf_fx, res_buf, Q_res_buf, STEREO_DFT_N_8k ); +#endif +#else stereo_dft_dec_read_BS( ivas_total_brate, hCPE->element_brate, &sts[0]->total_brate, sts[1], hCPE->hStereoDft, sts[0]->bwidth, output_frame, res_buf, &nb_bits, hCPE->hStereoCng->coh, st_ivas->ivas_format ); +#endif } /* subtract metadata bitbudget */ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index f344a46d8..81021a248 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -215,6 +215,7 @@ typedef struct stereo_dft_dec_data_struct Word16 q_ip_mem; Word16 q_smoothed_nrg; Word16 q_DFT_past_DMX_fx[STEREO_DFT_PAST_MAX]; + Word32 res_global_gain_fx; #endif // IVAS_FLOAT_FIXED float res_cod_mem[STEREO_DFT_OVL_8k]; float buff_LBTCX_mem[NS2SA( 16000, STEREO_DFT32MS_OVL_NS )]; @@ -356,6 +357,7 @@ typedef struct stereo_dec_cng float cm[STEREO_DFT_BAND_MAX]; /* cm */ #ifdef IVAS_FLOAT_FIXED Word16 cm_fx[STEREO_DFT_BAND_MAX]; /* cm */ + Word16 coh_fx[STEREO_DFT_BAND_MAX + 1]; /* coherence */ #endif int16_t first_SID; /* first SID indicator */ int16_t first_SID_after_TD; /* first SID after TD-stereo indicator */ diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 1c7ab24ca..fdee91e7f 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -49,6 +49,7 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #include "basop_util.h" +#include "prot_fx1.h" #endif // IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* @@ -2156,6 +2157,40 @@ static void stereo_dft_compute_td_stefi_params_fx( } +#ifdef IVAS_FLOAT_FIXED +static void stereo_dft_dequantize_ipd_fx( + Word16 *ind, + Word32 *out_fx, + const Word16 N, + const Word16 bits ) +{ + Word16 i; + Word16 delta_fx; + IF( EQ_16( bits, 2 ) ) /* 2-bit phase quantization for the highest frequency band only */ + { + delta_fx = ( EVS_PI_FX ) >> 1; + } + ELSE IF( EQ_16( bits, 3 ) ) + { + delta_fx = ( EVS_PI_FX ) >> 2; + } + ELSE IF( EQ_16( bits, 4 ) ) + { + delta_fx = ( EVS_PI_FX ) >> 3; + } + ELSE + { + delta_fx = ( EVS_PI_FX ) >> 2; + assert( 0 ); + } + + FOR( i = 0; i < N; i++ ) + { + *out_fx = L_sub( L_mult0( ind[i], delta_fx ), ( EVS_PI_FX ) ); + } + return; +} +#endif // IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * stereo_dft_generate_res_pred_fx() * @@ -2853,4 +2888,710 @@ static void stereo_dft_adapt_sf_delay_fx( return; } +void stereo_dft_dec_sid_coh_fx( + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 nbands, /* i : number of DFT stereo bands */ + Word16 *coh_fx, /* i/o: coherence */ + Word16 *nb_bits /* i/o: number of bits read */ +) +{ + Word16 alpha_fx; + Word16 pred_fx; + Word16 pred_err_fx; + Word16 cohBandq_fx[STEREO_DFT_BAND_MAX]; + const Word16 *pptr_fx; + Word16 nr_of_sid_stereo_bits; + Word16 i; + Word16 alpha_index; + Word16 alpha_step; + Word16 coh_pred_index; + Word16 res_index; + Word16 bits_tmp; + Word16 b; + + nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + move16(); + /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */ + /* from the previous frame is used. */ + IF( GT_16( sub( sub( nr_of_sid_stereo_bits, *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ), 0 ) ) + { + /* Read coherence from bitstream */ + coh_pred_index = get_next_indice_fx( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index */ + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_PRED_NBITS ); + + alpha_index = get_next_indice_fx( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index */ + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS ); + + alpha_step = 0; + move16(); + FOR( i = 0; i < STEREO_DFT_N_COH_ALPHA_STEPS - 1; i++ ) + { + IF( GT_16( sub( nr_of_sid_stereo_bits, *nb_bits ), dft_cng_coh_alpha_start[i] ) ) + { + alpha_step = add( i, 1 ); + } + } + alpha_fx = dft_cng_alpha_bits_fx[alpha_step][alpha_index]; /*Q-15*/ + } + ELSE + { + alpha_fx = 0; + coh_pred_index = 0; + move16(); + move16(); + FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) + { + get_next_indice_fx( st, 1 ); + ( *nb_bits )++; + } + } + + pptr_fx = dft_cng_coh_pred_fx[coh_pred_index]; /*Q-13*/ + pred_fx = 3276; /*Q-13*/ + move16(); + move16(); + FOR( b = 0; b < nbands; b++ ) + { + /* Intra-frame prediction */ + + FOR( i = 0; i < b; i++ ) + { + pred_fx = add( pred_fx, mult( ( *pptr_fx++ ), shl( cohBandq_fx[i], 2 ) ) ); /*q-13*/ + } + /* Weighted intra/inter-frame prediction */ + pred_fx = add( mult( alpha_fx, pred_fx ), mult( sub( 32767, alpha_fx ), coh_fx[b] ) ); /*q-13*/ + + /* Read residual index from bitstream */ + IF( LT_16( *nb_bits, nr_of_sid_stereo_bits ) ) /* If the bit limit is reached, res_index = 0 is assumed for remaining indices */ + { + bits_tmp = read_GR0( &st->bit_stream[st->next_bit_pos], &res_index, 1 ); + *nb_bits = add( *nb_bits, bits_tmp ); + st->next_bit_pos = add( st->next_bit_pos, bits_tmp ); + } + ELSE + { + res_index = 0; + move16(); + } + + /* Reconstruct */ + res_index = dft_cng_coh_u2i[res_index]; + move16(); + pred_err_fx = shr( usdequant_fx( res_index, -13107 /*Q-15*/, 1638 /*Q-14*/ ), 2 ); + cohBandq_fx[b] = add( pred_fx, pred_err_fx ); /* Store for intra-frame prediction */ + IF( GT_16( cohBandq_fx[b], 8192 ) ) + { + cohBandq_fx[b] = 8192; + move16(); + } + ELSE IF( LT_16( cohBandq_fx[b], 0 ) ) + { + cohBandq_fx[b] = 0; + move16(); + } + coh_fx[b] = cohBandq_fx[b]; /* Update memory for next frame */ + pred_fx = 0; + move16(); + move16(); + } + + /* Remove padding bits */ + FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) + { + get_next_indice_fx( st, 1 ); + ( *nb_bits )++; + } + return; +} +void stereo_dft_dequantize_itd_fx( + Word16 *ind, + Word32 *out_fx, + const Word32 output_Fs ) +{ + Word16 itd; + Word16 mask; + mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1; + move16(); + itd = s_and( ind[0], mask ) + STEREO_DFT_ITD_MIN; + + IF( shr( ind[0], ( STEREO_DFT_ITD_NBITS - 1 ) ) ) + { + itd = imult1616( -1, itd ); + } + assert( ( ABSVAL( itd ) <= STEREO_DFT_ITD_MAX ) && ( ABSVAL( itd ) >= STEREO_DFT_ITD_MIN ) ); + + /*Convert back @ fs*/ + *out_fx = L_mult( itd, divide3232( output_Fs, STEREO_DFT_ITD_FS << 1 ) ); /*Q-15*/ + return; +} +/*------------------------------------------------------------------------- + * stereo_dft_dec_read_BS() + * + * Read bitstream + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_read_BS_fx( + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word32 element_brate, /* i : element bitrate */ + Word32 *total_brate, /* o : total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + const Word16 bwidth, /* i : bandwidth */ + const Word16 output_frame, /* i : output frame length */ + Word32 res_buf_fx[STEREO_DFT_N_8k], /* o : residual buffer */ + Word16 *nb_bits, /* o : number of bits read */ + Word16 *coh_fx, /* i/o: Coherence */ + const Word16 ivas_format /* i : ivas format */ +) +{ + Word32 sg_tmp_fx[STEREO_DFT_BAND_MAX]; + Word32 res_pred_gain_tmp_fx[STEREO_DFT_BAND_MAX]; + Word16 b, N_div, nbands; + Word16 NFFT_inner; + Word16 k, k_offset; + Word16 I; + Word16 max_bits; + UWord16 bit_stream_side[800]; /*Max bits per frame for 30kbps*/ + RangeUniDecState range_uni_dec_state; + ECSQ_instance ecsq_inst; + + /* needed for provisorial reordering of indices */ + Word16 ind1[STEREO_DFT_BAND_MAX]; + Word16 n_bits; + Word16 nb, ind1_ipd[STEREO_DFT_BAND_MAX], ind1_pred[STEREO_DFT_BAND_MAX]; + Word16 sign_flag; + Word16 itd_mode; + + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + k_offset = STEREO_DFT_OFFSET; + + move16(); + IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + IF( EQ_16( ivas_format, MASA_FORMAT ) ) + { + hStereoDft->frame_nodata = 0; + hStereoDft->frame_sid_nodata = 1; + hStereoDft->frame_sid = 1; + *nb_bits = 0; + } + ELSE + { + hStereoDft->frame_nodata = 0; + hStereoDft->frame_sid_nodata = 1; + hStereoDft->frame_sid = 1; + *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + } + move16(); + move16(); + move16(); + move16(); + } + ELSE IF( EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) + { + hStereoDft->frame_nodata = 1; + hStereoDft->frame_sid_nodata = 1; + hStereoDft->frame_sid = 0; + *nb_bits = 0; + *total_brate = 0; + hStereoDft->itd_fx[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target_fx; + hStereoDft->gipd_fx[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target_fx; + + move16(); + move16(); + move16(); + move16(); + move32(); + move32(); + move32(); + return; + } + ELSE + { + hStereoDft->frame_nodata = 0; + hStereoDft->frame_sid_nodata = 0; + hStereoDft->frame_sid = 0; + move16(); + move16(); + move16(); + + st->total_brate = L_mult0( *nb_bits, FRAMES_PER_SEC); + } + + hStereoDft->reverb_flag = 0; + + move16(); + /* reverse the bitstream */ + FOR( b = 0; b < *nb_bits; b++ ) + { + bit_stream_side[b] = st->bit_stream[-b]; + move16(); + } + + /* make sure the padding bits read ahead by the arithmetic coder (up to 16) or range coder (up to 32) have binary values */ + FOR( ; b < *nb_bits + 32; b++ ) + { + bit_stream_side[b] = 0; + move16(); + } + st->bit_stream = bit_stream_side; + + /*init*/ + max_bits = *nb_bits; + *nb_bits = 0; + N_div = STEREO_DFT_NBDIV; + + move16(); + move16(); + move16(); + IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + Copy32( hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, sg_tmp_fx, STEREO_DFT_BAND_MAX ); /*Q_31*/ + Copy32( hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, res_pred_gain_tmp_fx, STEREO_DFT_BAND_MAX ); /*Q_31*/ + } + + /* attackPresent always set to 0 in SID frames */ + IF( hStereoDft->frame_sid ) + { + hStereoDft->attackPresent = 0; + move16(); + } + ELSE + { + hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); + ( *nb_bits )++; + } + + /* read res_cod_mode from bitstream */ + IF( EQ_16( bwidth, WB ) && hStereoDft->hConfig->ada_wb_res_cod_mode ) + { + hStereoDft->res_cod_mode[k_offset] = get_next_indice_fx( st, 1 ); + ( *nb_bits )++; + } + + /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */ + IF( hStereoDft->frame_sid ) + { + NFFT_inner = mult( inner_frame_tbl[bwidth], divide1616( STEREO_DFT32MS_N_MAX, L_FRAME48k ) ); + } + ELSE + { + NFFT_inner = mult( inner_frame_tbl[st->bwidth], divide1616( STEREO_DFT32MS_N_MAX, L_FRAME48k ) ); + } + + /* Use coarse band partition in inactive frames */ + IF( hStereoDft->frame_sid ) + { + hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW; + hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; + move16(); + move16(); + hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); + + IF( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND ) + { + hStereoDft->band_limits[STEREO_DFT_COH_MAXBAND] = hStereoDft->band_limits[hStereoDft->nbands]; + hStereoDft->nbands = STEREO_DFT_COH_MAXBAND; + move16(); + move16(); + } + } + ELSE + { + hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); + move16(); + } + + hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; + move16(); + hStereoDft->res_cod_line_max = (Word16) L_shr( ( ( 1 << Q13 )/*0.5f Q-14*/ + L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); + hStereoDft->res_cod_line_max = shl(shr( hStereoDft->res_cod_line_max , 3 ),3); + hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + + + /*Copy config. for all DFT frames*/ + set16_fx( hStereoDft->band_res + k_offset + 1, hStereoDft->band_res[k_offset], N_div - 1 ); + set16_fx( hStereoDft->prm_res + k_offset + 1, hStereoDft->prm_res[k_offset], N_div - 1 ); + set16_fx( hStereoDft->res_pred_mode + k_offset + 1, hStereoDft->res_pred_mode[k_offset], N_div - 1 ); + set16_fx( hStereoDft->res_cod_mode + k_offset + 1, hStereoDft->res_cod_mode[k_offset], N_div - 1 ); + + /*------------------------------------------------------------------* + * Read DFT stereo parameters + *-----------------------------------------------------------------*/ + + /* Sent from the latest to the oldest */ + FOR( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] ) + { + /* reset parameters */ + set_zero_fx( hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + hStereoDft->gipd_fx[k + k_offset] = 0; + move32(); + set_zero_fx( hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + + IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) + { + /*------------------------------------------------------------------* + * read Side gains + *-----------------------------------------------------------------*/ + + /* side gain */ + /* get coding type */ + /* Do not read and decode side gain if a NO_DATA frame */ + IF( !hStereoDft->frame_nodata ) + { + n_bits = 0; + nb = st->next_bit_pos; + move16(); + move16(); + n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); + nb = add( nb, n_bits ); + + IF( EQ_16( hStereoDft->side_gain_flag_1, 0 ) ) + { + b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); + n_bits = add( n_bits, b ); + } + ELSE + { + IF( EQ_16( hStereoDft->side_gain_flag_1, 2 ) ) /* differential */ + { + b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 ); + n_bits = add( n_bits, b ); + FOR( b = 0; b < hStereoDft->nbands; b++ ) + { + ind1[b] = add( ind1[b], hStereoDft->side_gain_index_previous[b] ); + } + } + ELSE + { + FOR( b = 0; b < hStereoDft->nbands; b++ ) + { + ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS ); + nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS ); + n_bits = add( n_bits, STEREO_DFT_SIDEGAIN_NBITS ); + } + } + } + + FOR( b = 0; b < hStereoDft->nbands; b++ ) + { + hStereoDft->side_gain_index_previous[b] = ind1[b]; + move16(); + hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl( ind1[b], 26 ); + } + + st->next_bit_pos = add( st->next_bit_pos, n_bits ); + ( *nb_bits ) = add( ( *nb_bits ), n_bits ); + } + + /*------------------------------------------------------------------* + * read ITDs + *-----------------------------------------------------------------*/ + + IF( !hStereoDft->frame_sid_nodata ) + { + itd_mode = get_next_indice( st, STEREO_DFT_ITD_MODE_NBITS ); + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/ + + hStereoDft->itd_fx[k + k_offset] = 0; + move32(); + IF( itd_mode ) + { + ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); + stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + k + k_offset, st->output_Fs ); + } + } + ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) ) + { + itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/ + + hStereoDft->itd_fx[k + k_offset] = 0; + move32(); + IF( itd_mode ) + { + sign_flag = get_next_indice_fx( st, 1 ); + I = get_next_indice_fx( st, STEREO_DFT_SID_ITD_NBITS ); + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_SID_ITD_NBITS + 1 ); + I = shl( I, STEREO_DFT_SID_ITD_FAC ); + I = add( I, shl( sign_flag, 8 ) ); + stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + k + k_offset, st->output_Fs ); + } + } + + /*------------------------------------------------------------------* + * read IPDs + *-----------------------------------------------------------------*/ + + n_bits = 0; + move16(); + nb = st->next_bit_pos; + move16(); + + IF( !hStereoDft->frame_sid_nodata ) + { + /* Active frame */ + hStereoDft->no_ipd_flag = st->bit_stream[nb]; + move16(); + nb = add( nb, 1 ); + n_bits = add( n_bits, 1 ); + IF( EQ_16( hStereoDft->no_ipd_flag, 0 ) ) + { + ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); + nb = add( nb, STEREO_DFT_GIPD_NBITS ); + n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); + stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + ( k + k_offset ), 1, STEREO_DFT_GIPD_NBITS ); + } + } + ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) ) + { + /* SID frame, only read IPD only if enough bits left in bitstream */ + hStereoDft->no_ipd_flag = st->bit_stream[nb]; + move16(); + nb = add( nb, 1 ); + n_bits = add( n_bits, 1 ); + IF( EQ_16( hStereoDft->no_ipd_flag, 0 ) ) + { + ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); + nb = add( nb, STEREO_DFT_SID_GIPD_NBITS ); + n_bits = add( n_bits, STEREO_DFT_SID_GIPD_NBITS ); + stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + ( k + k_offset ), 1, STEREO_DFT_SID_GIPD_NBITS ); + } + } + ELSE + { + hStereoDft->no_ipd_flag = 1; + move16(); + } + + st->next_bit_pos = add( st->next_bit_pos, n_bits ); + ( *nb_bits ) = add( ( *nb_bits ), n_bits ); + + /*------------------------------------------------------------------* + * read Residual parameters + *-----------------------------------------------------------------*/ + + /* Residual prediction */ /* Switch it off if ITD detected */ + n_bits = 0; + nb = st->next_bit_pos; + move16(); + move16(); + + /* Not used in inactive frames */ + IF( !hStereoDft->frame_sid_nodata ) + { + IF( hStereoDft->res_pred_mode[k + k_offset] && EQ_16( hStereoDft->attackPresent, 0 ) ) + { + nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); + + hStereoDft->reverb_flag = 0; + hStereoDft->nbands_respred = nbands; + move16(); + move16(); + + /* Read bit for adaptive SF (WB/SWB & FB) */ + IF( EQ_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) + { + hStereoDft->reverb_flag = get_next_indice( st, STEREO_DFT_REVERB_MODE_NBITS ); + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_REVERB_MODE_NBITS ); + nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS ); + IF( hStereoDft->reverb_flag ) + { + nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST ); + } + } + + /* get coding type */ + b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 ); + nb = add( nb, b ); + n_bits = add( n_bits, b ); + + IF( EQ_16( hStereoDft->res_pred_flag_0, 0 ) ) + { + b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); + n_bits = add( n_bits, b ); + } + ELSE + { + IF( EQ_16( hStereoDft->res_pred_flag_0, 2 ) ) + { + b = read_BS_GR( st->bit_stream, nb, &ind1_pred[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, &hStereoDft->res_pred_flag_1 ); + + n_bits = add( n_bits, b ); + FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) + { + ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); + } + } + ELSE + { + FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) + { + ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); + nb = add( nb, STEREO_DFT_RES_GAINS_BITS ); + n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); + } + } + } + + FOR( b = 0; b < hStereoDft->res_pred_band_min; b++ ) + { + I = 0; + move16(); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + hStereoDft->res_pred_index_previous[b] = I; + move16(); + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; + move32(); + } + + FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) + { + I = ind1_pred[b]; + move16(); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + hStereoDft->res_pred_index_previous[b] = I; + move16(); + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl( I, 26 ); + } + + FOR( ; b < hStereoDft->nbands; b++ ) + { + I = 0; + move16(); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + move16(); + hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; + move32(); + } + } + ELSE + { + FOR( b = 0; b < hStereoDft->nbands; b++ ) + { + I = 0; + move16(); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + hStereoDft->res_pred_index_previous[b] = I; + move16(); + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl( I, 26 ); + } + } + + st->next_bit_pos = add( st->next_bit_pos, n_bits ); + ( *nb_bits ) = add( ( *nb_bits ), n_bits ); + } + ELSE + { + /* Dequantize sidegain if SID frame */ + IF( hStereoDft->frame_sid ) + { + FOR( b = 0; b < hStereoDft->nbands; b++ ) + { + I = 0; + move16(); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + } + } + } + } + } + + IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) + { + IF( NE_16( hStereoDft->side_gain_flag_1, 2 ) ) + { + hStereoDft->sg_mem_corrupt = 0; + move16(); + } + } + + IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft ); + + IF( hStereoDft->recovery_flg ) + { + Copy32( sg_tmp_fx, hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + Copy32( res_pred_gain_tmp_fx, hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + } + } + + /*----------------------------------------------------------------* + * Residual decoding: spectral lines + *----------------------------------------------------------------*/ + + /* Residual coding not used in inactive frames */ + IF( hStereoDft->res_cod_band_max > 0 && !hStereoDft->frame_sid_nodata ) + { + Word16 dec[STEREO_DFT_N_MAX_RES]; + + I = get_next_indice_fx( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS ); + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ); + + + push_wmops( "residual_decode" ); + IF( I != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO ) + { + ECSQ_init_instance_fx( &ecsq_inst, 0 /*dummy index*/, &range_uni_dec_state ); + + rc_uni_dec_init_fx( &range_uni_dec_state, bit_stream_side + *nb_bits, max_bits - *nb_bits ); + + hStereoDft->res_global_gain_fx = ECSQ_dequantize_gain_fx( I ); +#ifdef DUMPS_ENABLED + dbgwrite_txt( &hStereoDft->res_global_gain, 1, "fixed_res_global_gain.txt", NULL ); +#endif // DUMPS_ENABLED + + ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[k_offset], 1 ), 1 ); + + ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec ); + + n_bits = rc_uni_dec_virtual_finish_fx( &range_uni_dec_state ); + + + set_zero_fx( res_buf_fx, STEREO_DFT_N_8k ); + FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ ) + { + dec[c] = shl_sat( dec[c], 8 ); + } + + ECSQ_dequantize_vector_fx( dec, hStereoDft->res_global_gain_fx, hStereoDft->res_cod_line_max, res_buf_fx ); + +#ifdef DUMPS_ENABLED + dbgwrite_txt( res_buf, hStereoDft->res_cod_line_max, "fixed_res_buf.txt", NULL ); +#endif // DUMPS_ENABLED + } + ELSE + { + set16_fx( dec, 0, hStereoDft->res_cod_line_max ); + hStereoDft->res_global_gain_fx = 0; + n_bits = 0; + move32(); + move16(); + set_zero_fx( res_buf_fx, STEREO_DFT_N_8k ); + } + + ( *nb_bits ) = add( ( *nb_bits ), n_bits ); + pop_wmops(); + } + + IF( hStereoDft->frame_sid && !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) + { + stereo_dft_dec_sid_coh_fx( st, hStereoDft->nbands, coh_fx, nb_bits ); + } + + IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_16( ivas_format, MASA_FORMAT ) ) + { + *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ + } + { + *total_brate = L_sub( element_brate, L_mult0( *nb_bits, FRAMES_PER_SEC ) ); + } + return; +} + #endif \ No newline at end of file -- GitLab