diff --git a/lib_com/gs_bitallocation.c b/lib_com/gs_bitallocation.c index b1e8dbf4abc2c2f6e38a924f4f934bd88a99a4c1..48abe96335946404aafaae714aa16c905522f18d 100644 --- a/lib_com/gs_bitallocation.c +++ b/lib_com/gs_bitallocation.c @@ -46,14 +46,12 @@ #include "ivas_prot.h" #include "wmc_auto.h" + +#ifdef NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING /*-------------------------------------------------------------------* - * Local function prototypes + * Local constants *-------------------------------------------------------------------*/ -static float Find_bit_frac( const int16_t nb_band, const int16_t remaining_bits ); - -static void reajust_bits( float *bits_per_bands, const int16_t st_band, const int16_t end_band, const int16_t sum_bit_in, const int16_t bit_bdgt_in ); -#ifdef NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING #define Q15_0_33 10922 /* 0.33 */ #define Q18_0_1 26214 /* 0.1 */ #define Q18_0_50 131072 /* 0.50 */ @@ -72,9 +70,24 @@ static void reajust_bits( float *bits_per_bands, const int16_t st_band, const in #define Q31_0_02 42949673 /* 0.02 */ #define Q31_0_17 365072220 /* 0.17 */ #define Q31_0_23 493921239 /* 0.23 */ + +#endif + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static float Find_bit_frac( const int16_t nb_band, const int16_t remaining_bits ); + +static void reajust_bits( float *bits_per_bands, const int16_t st_band, const int16_t end_band, const int16_t sum_bit_in, const int16_t bit_bdgt_in ); + +#ifdef NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING static Word16 Find_norm_inv( const Word32 ToDivide, Word16 *e_div ); + static Word16 Find_bit_alloc_IVAS_int( const Word32 core_brate, const Word16 GSC_IVAS_mode, const Word16 Diff_len, const Word16 nb_tot_bands, const Word16 L_frame, Word16 *bit, Word16 *max_ener_band, float *ener_vec, float *bits_per_bands ); + static Word16 maximum_fx( const Word16 *vec_fx, const Word16 lvec_fx, Word16 *max_fx ); + #endif /*-------------------------------------------------------------------* @@ -398,7 +411,7 @@ void bands_and_bit_alloc( } } #else - nb_tot_bands = Find_bit_alloc_IVAS_int( core_brate, GSC_IVAS_mode, Diff_len, nb_tot_bands, L_frame, bit, max_ener_band, ener_vec, bits_per_bands ); + nb_tot_bands = (int16_t) Find_bit_alloc_IVAS_int( (Word32) core_brate, (Word16) GSC_IVAS_mode, (Word16) Diff_len, (Word16) nb_tot_bands, (Word16) L_frame, (Word16 *) bit, (Word16 *) max_ener_band, ener_vec, bits_per_bands ); nb_bands = nb_tot_bands; #endif } @@ -962,43 +975,50 @@ static float Find_bit_frac( return ( var_out ); } + #ifdef NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING -static Word16 Find_bit_alloc_IVAS_int( /*o: Number of band to encode */ - const Word32 core_brate, /* i : core bit rate */ - const Word16 GSC_IVAS_mode, /* i : GSC IVAS mode */ - const Word16 Diff_len, /* i : Length of the difference signal (before pure spectral)*/ - const Word16 nb_tot_bands_in, /* i : total number of band */ - const Word16 L_frame, /* i : frame length */ - Word16 *bit, /* i/o: Number of bit allowed for frequency quantization */ - Word16 *max_ener_band, /* i/o: Energy based sorted order */ - float *ener_vec_io, /* i/o: Energy per band order */ - float *bits_per_bands_o /* o : Number of bit allowed per allowed sub-band Q3 */ +/*-------------------------------------------------------------------* + * Find_bit_alloc_IVAS_int() + * + * + *-------------------------------------------------------------------*/ + +/*! r: Number of bands to encode */ +static Word16 Find_bit_alloc_IVAS_int( + const Word32 core_brate, /* i : core bit rate */ + const Word16 GSC_IVAS_mode, /* i : GSC IVAS mode */ + const Word16 Diff_len, /* i : Length of the difference signal (before pure spectral)*/ + const Word16 nb_tot_bands_in, /* i : total number of band */ + const Word16 L_frame, /* i : frame length */ + Word16 *bit, /* i/o: Number of bit allowed for frequency quantization */ + Word16 *max_ener_band, /* i/o: Energy based sorted order */ + float *ener_vec_io, /* i/o: Energy per band order */ + float *bits_per_bands_o /* o : Number of bit allowed per allowed sub-band Q3 */ ) { Word32 mp, mb, nb_bands_adj, bit_adj; Word16 nb_pulse_per_band[MBANDS_GN_BITALLOC16k]; - Word32 SWB_bit_budget; // Q0 -> Q18 + Word32 SWB_bit_budget; /* Q0 -> Q18 */ Word16 i, j, nb_bands_max, st_band, nb_tot_bands_loc, etmp; Word32 sum_bit /*Q18*/, bit_fracf /*Q18*/; Word16 d_tmp, e_div, tmp16, ener_vec[MBANDS_GN_BITALLOC16k]; Word32 Ltmp, etmp_32fx, bits_per_bands[MBANDS_GN_BITALLOC16k]; - - SWB_bit_budget = *bit; // Q0 + SWB_bit_budget = *bit; /* Q0 */ st_band = 5; nb_bands_max = nb_tot_bands_in; - for ( i = 0; i < MBANDS_GN; i++ ) { - ener_vec[i] = (short) ( ener_vec_io[i] ); /* Q12 -> Q12 */ + ener_vec[i] = (Word16) ( ener_vec_io[i] ); /* Q12 -> Q12 */ } + if ( L_frame == L_FRAME16k ) { for ( i = MBANDS_GN; i < MBANDS_GN_BITALLOC16k; i++ ) { - ener_vec[i] = (short) ( ener_vec_io[i] * 4096.0 + 0.5f ); /* Q0 -> Q12 */ + ener_vec[i] = (Word16) ( ener_vec_io[i] * 4096.0 + 0.5f ); /* Q0 -> Q12 */ } } @@ -1020,12 +1040,14 @@ static Word16 Find_bit_alloc_IVAS_int( /*o: Number { nb_bands_max -= 6; } + if ( GSC_IVAS_mode == 2 ) { /* bit_fracf += 0.1f; */ bit_fracf += Q18_0_1; /* Q18*/ nb_bands_max -= 1; } + if ( GSC_IVAS_mode == 3 ) { /* bit_fracf -= 0.1f; */ @@ -1041,12 +1063,12 @@ static Word16 Find_bit_alloc_IVAS_int( /*o: Number if ( GSC_IVAS_mode == 1 && core_brate < GSC_L_RATE_STG ) { /* nb_bands_adj = 0.0125f * SWB_bit_budget - 0.75f;*/ - nb_bands_adj = L_sub( Mpy_32_32( Q31_0_0125, L_shl( SWB_bit_budget, 18 ) ), Q18_0_75 ); // Q18 + nb_bands_adj = L_sub( Mpy_32_32( Q31_0_0125, L_shl( SWB_bit_budget, 18 ) ), Q18_0_75 ); /* Q18 */ } else if ( GSC_IVAS_mode != 2 && core_brate > GSC_H_RATE_STG ) { /*nb_bands_adj = 0.02f * SWB_bit_budget - 1.2f;*/ - nb_bands_adj = L_sub( Mpy_32_32( Q31_0_02, L_shl( SWB_bit_budget, 18 ) ), Q18_1_2 ); // Q18 + nb_bands_adj = L_sub( Mpy_32_32( Q31_0_02, L_shl( SWB_bit_budget, 18 ) ), Q18_1_2 ); /* Q18 */ } /*nb_bands_max = (int16_t)(nb_bands_max * nb_bands_adj + 0.5f);*/ @@ -1135,10 +1157,10 @@ static Word16 Find_bit_alloc_IVAS_int( /*o: Number max_ener_band[j] = i; ener_vec[i] = MIN16B; } + /* Recompute the final bit distribution for HF */ IF( nb_tot_bands_loc > st_band ) { - /* This is not bit exact because of the precision lost */ /* mb = ( SWB_bit_budget * 2 / ( nb_tot_bands_loc - st_band ) ) - mp; */ d_tmp = Find_norm_inv( L_deposit_h( sub( nb_tot_bands_loc, st_band ) ), &e_div ); mb = L_sub( L_shr( Mpy_32_16_1( L_shl( SWB_bit_budget, 1 ), d_tmp ), e_div ), mp ); /* Q18 */ @@ -1155,9 +1177,10 @@ static Word16 Find_bit_alloc_IVAS_int( /*o: Number bits_per_bands[max_ener_band[j]] = mb; } mb -= bit_fracf; - SWB_bit_budget -= bits_per_bands[max_ener_band[j]]; // Q18 + SWB_bit_budget -= bits_per_bands[max_ener_band[j]]; /* Q18 */ } } + /* Series of verification in case bit allocated != the budget */ if ( SWB_bit_budget > 0 ) { @@ -1191,7 +1214,6 @@ static Word16 Find_bit_alloc_IVAS_int( /*o: Number bits_per_bands[i] = Q18_112; j = add( j, add( i, 1 ) ); } - /* safety check for overage bit reallocation */ /* else if (bits_per_bands[i] + sum_bit / 3 > 112) */ else if ( L_add( bits_per_bands[i], Mpy_32_16_1( sum_bit, Q15_0_33 ) ) > Q18_112 ) @@ -1210,33 +1232,55 @@ static Word16 Find_bit_alloc_IVAS_int( /*o: Number bits_per_bands[i] = L_add( bits_per_bands[i], sum_bit ); } } + for ( i = 0; i < MBANDS_GN_BITALLOC16k; i++ ) { bits_per_bands_o[i] = (float) bits_per_bands[i] / 262144.0f; /* Q18 -> float */ } + return nb_tot_bands_loc; } -static Word16 Find_norm_inv( const Word32 ToDivide, Word16 *e_div ) /* Find normalized 1 / ToDivide */ + +/*-------------------------------------------------------------------* + * Find_norm_inv() + * + * Find normalized 1 / ToDivide + *-------------------------------------------------------------------*/ + +static Word16 Find_norm_inv( + const Word32 ToDivide, + Word16 *e_div ) { Word16 d_tmp, e_tmp; + e_tmp = norm_l( ToDivide ); d_tmp = round_fx( L_shl( ToDivide, e_tmp ) ); d_tmp = div_s( 16384, d_tmp ); /* 1.0 in Q14, dividend is normalize so >= 16384 as required for the division */ *e_div = sub( 14, e_tmp ); move16(); + return d_tmp; } -static Word16 maximum_fx( /* o : index of the maximum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word16 *max_fx /* o : maximum value in the input vector */ + + +/*-------------------------------------------------------------------* + * maximum_fx() + * + * + *-------------------------------------------------------------------*/ + +/*! r: index of the maximum value in the input vector */ +static Word16 maximum_fx( + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word16 *max_fx /* o : maximum value in the input vector */ ) { Word16 j, ind; Word16 tmp; - ind = 0; + ind = 0; tmp = vec_fx[0]; for ( j = 1; j < lvec_fx; j++ )