Loading lib_com/cnst.h +1 −0 Original line number Diff line number Diff line Loading @@ -1248,6 +1248,7 @@ enum #define WINDECAY16 410 #define N16_CORE_SW 90 #define N_ZERO_8 45 #define N_ZERO_BY_FS 9216 /* == N_ZERO_MDCT_NS / FRAME_SIZE_NS in Q15 */ #define SWITCH_OVERLAP_8k 15 /* == NS2SA(8000, SWITCH_GAP_LENGTH_NS) - NS2SA(8000, 10000000.0f - N_ZERO_MDCT_NS) */ #define SWITCH_GAP_LENGTH_8k 50 Loading lib_com/ivas_entropy_coder_common.c +231 −74 Original line number Diff line number Diff line Loading @@ -46,22 +46,22 @@ *-----------------------------------------------------------------------------------------*/ void ivas_wrap_arround( int16_t *pArr, const int16_t min_val, const int16_t max_val, const int16_t length ) Word16 *pArr, const Word16 min_val, const Word16 max_val, const Word16 length ) { int16_t i; Word16 i; for ( i = 0; i < length; i++ ) FOR ( i = 0; i < length; i++ ) { if ( pArr[i] < min_val ) IF ( LT_16(pArr[i], min_val) ) { pArr[i] = max_val - min_val + pArr[i] + 1; pArr[i] = add(sub(max_val, min_val), add( pArr[i], 1)); } if ( pArr[i] > max_val ) IF ( GT_16(pArr[i], max_val) ) { pArr[i] = min_val + pArr[i] - max_val - 1; pArr[i] = sub(add(min_val, pArr[i]), add(max_val, 1)); } } Loading @@ -76,17 +76,17 @@ void ivas_wrap_arround( *-----------------------------------------------------------------------------------------*/ void ivas_get_cum_freq_model( const int16_t *pFreq_model, const int16_t length, int16_t *pCum_freq_model ) const Word16 *pFreq_model, const Word16 length, Word16 *pCum_freq_model ) { int16_t i; Word16 i; pCum_freq_model[length] = 0; for ( i = length; i > 0; i-- ) FOR ( i = length; i > 0; i-- ) { pCum_freq_model[i - 1] = pCum_freq_model[i] + pFreq_model[i]; pCum_freq_model[i - 1] = add(pCum_freq_model[i], pFreq_model[i]); } return; Loading @@ -99,51 +99,51 @@ void ivas_get_cum_freq_model( * Map the ivas_arith_pred_r_consts and ivas_huff_pred_r_consts tables *-----------------------------------------------------------------------------------------*/ int16_t ivas_map_num_pred_r_to_idx( const int16_t num_quant_points_pred_r, const int16_t active_w_flag ) Word16 ivas_map_num_pred_r_to_idx( const Word16 num_quant_points_pred_r, const Word16 active_w_flag ) { int16_t pred_r_to_idx = -1; if ( active_w_flag == 0 ) Word16 pred_r_to_idx = -1; IF ( EQ_16(active_w_flag, 0) ) { switch ( num_quant_points_pred_r ) SWITCH ( num_quant_points_pred_r ) { case 1: pred_r_to_idx = PRED_Q_1; break; BREAK; case 7: pred_r_to_idx = PRED_Q_7; break; BREAK; case 15: pred_r_to_idx = PRED_Q_15; break; BREAK; case 21: pred_r_to_idx = PRED_Q_21; break; BREAK; case 31: pred_r_to_idx = PRED_Q_31; break; BREAK; default: assert( !"Forbidden value for prediction quantization strategy index" ); break; BREAK; } } else ELSE { switch ( num_quant_points_pred_r ) SWITCH ( num_quant_points_pred_r ) { case 7: pred_r_to_idx = PRED_Q_7_ACTIVE_W; break; BREAK; case 15: pred_r_to_idx = PRED_Q_15_ACTIVE_W; break; BREAK; case 21: pred_r_to_idx = PRED_Q_21_ACTIVE_W; break; BREAK; default: assert( !"Forbidden value for prediction quantization strategy index" ); break; BREAK; } } Loading @@ -157,27 +157,27 @@ int16_t ivas_map_num_pred_r_to_idx( * Map the ivas_arith_drct_r_consts and ivas_huff_drct_r_consts tables *-----------------------------------------------------------------------------------------*/ int16_t ivas_map_num_drct_r_to_idx( const int16_t num_quant_points_drct_r ) Word16 ivas_map_num_drct_r_to_idx( const Word16 num_quant_points_drct_r ) { int16_t drct_r_to_idx = -1; switch ( num_quant_points_drct_r ) Word16 drct_r_to_idx = -1; SWITCH ( num_quant_points_drct_r ) { case 1: drct_r_to_idx = DRCT_Q_1; break; BREAK; case 7: drct_r_to_idx = DRCT_Q_7; break; BREAK; case 9: drct_r_to_idx = DRCT_Q_9; break; BREAK; case 11: drct_r_to_idx = DRCT_Q_11; break; BREAK; default: assert( !"Forbidden value for DRCT quantization strategy index" ); break; BREAK; } return drct_r_to_idx; } Loading @@ -189,39 +189,40 @@ int16_t ivas_map_num_drct_r_to_idx( * Map the ivas_arith_decd_r_consts and ivas_huff_decd_r_consts tables *-----------------------------------------------------------------------------------------*/ int16_t ivas_map_num_decd_r_to_idx( const int16_t num_quant_points_decd_r ) Word16 ivas_map_num_decd_r_to_idx( const Word16 num_quant_points_decd_r ) { int16_t decd_r_to_idx = -1; switch ( num_quant_points_decd_r ) Word16 decd_r_to_idx = -1; SWITCH ( num_quant_points_decd_r ) { case 1: decd_r_to_idx = DECD_Q_1; break; BREAK; case 3: decd_r_to_idx = DECD_Q_3; break; BREAK; case 5: decd_r_to_idx = DECD_Q_5; break; BREAK; case 7: decd_r_to_idx = DECD_Q_7; break; BREAK; case 9: decd_r_to_idx = DECD_Q_9; break; BREAK; case 11: decd_r_to_idx = DECD_Q_11; break; BREAK; default: assert( !"Forbidden value for DECD quantization strategy index" ); break; BREAK; } return decd_r_to_idx; } #ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------------------------- - * * Function ivas_spar_arith_com_init() * Loading Loading @@ -328,8 +329,151 @@ static void ivas_spar_arith_com_init( return; } #else /*---------------------------------------------------------------------------------------- - * * Function ivas_spar_arith_com_init_fx() * * arith coder init *---------------------------------------------------------------------------------------- - */ static void ivas_spar_arith_com_init_fx( ivas_arith_t *pArith, const ivas_freq_models_t *pFreq_models, ivas_arith_t *pArith_diff, const Word16 q_levels, const Word16 enc_dec ) { Word16 i, j; Word16 sum, log2_int, log2_frac; Word32 tmp32, log2_int32, L_tmp2; pArith->vals = pFreq_models->vals; pArith->range = q_levels; pArith->num_models = pFreq_models->num_models; pArith->dyn_model_bits = ivas_get_bits_to_encode( pArith->num_models - 1 ); pArith->pFreq_model = pFreq_models->freq_model[0]; ivas_get_cum_freq_model( pArith->pFreq_model, pArith->range, pArith->cum_freq[0] ); FOR ( i = 0; i < pArith->num_models - 1; i++ ) { pArith->pAlt_freq_models[i] = pFreq_models->freq_model[i + 1]; ivas_get_cum_freq_model( pArith->pAlt_freq_models[i], pArith->range, pArith->cum_freq[i + 1] ); } IF ( EQ_16(enc_dec, ENC) ) { sum = 0; FOR ( i = 1; i < pArith->range + 1; i++ ) { sum = add(sum, pArith->pFreq_model[i]); } log2_int = norm_s(sum); tmp32 = L_deposit_h( shl( sum, log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp2 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ FOR ( i = 1; i < pArith->range + 1; i++ ) { Word32 L_tmp1; log2_int = norm_s(pArith->pFreq_model[i]); tmp32 = L_deposit_h( shl( pArith->pFreq_model[i], log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp1 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ pArith->saved_dist_arr[0][i - 1] = L_sub(L_tmp1, L_tmp2); } FOR ( j = 0; j < pArith->num_models - 1; j++ ) { sum = 0; FOR ( i = 1; i < pArith->range + 1; i++ ) { sum = add(sum, pArith->pAlt_freq_models[j][i]); } log2_int = norm_s(sum); tmp32 = L_deposit_h( shl( sum, log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp2 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ FOR ( i = 1; i < pArith->range + 1; i++ ) { Word32 L_tmp1; log2_int = norm_s(pArith->pAlt_freq_models[j][i]); tmp32 = L_deposit_h( shl( pArith->pAlt_freq_models[j][i], log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp1 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ pArith->saved_dist_arr[j + 1][i - 1] = L_sub(L_tmp1, L_tmp2); } } } pArith_diff->vals = pFreq_models->diff_vals; pArith_diff->range = q_levels; pArith_diff->num_models = pFreq_models->diff_num_models; pArith_diff->dyn_model_bits = ivas_get_bits_to_encode( pArith_diff->num_models - 1 ); pArith_diff->pFreq_model = pFreq_models->diff_freq_model[0]; ivas_get_cum_freq_model( pArith_diff->pFreq_model, pArith_diff->range, pArith_diff->cum_freq[0] ); FOR ( i = 0; i < pArith_diff->num_models - 1; i++ ) { pArith_diff->pAlt_freq_models[i] = pFreq_models->diff_freq_model[i + 1]; ivas_get_cum_freq_model( pArith_diff->pAlt_freq_models[i], pArith_diff->range, pArith_diff->cum_freq[i + 1] ); } IF ( EQ_16(enc_dec, ENC) ) { sum = 0; FOR ( i = 1; i < pArith_diff->range + 1; i++ ) { sum = add(sum, pArith_diff->pFreq_model[i]); } log2_int = norm_s(sum); tmp32 = L_deposit_h( shl( sum, log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp2 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ FOR ( i = 1; i < pArith_diff->range + 1; i++ ) { Word32 L_tmp1; log2_int = norm_s(pArith_diff->pFreq_model[i]); tmp32 = L_deposit_h( shl( pArith_diff->pFreq_model[i], log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp1 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ pArith_diff->saved_dist_arr[0][i - 1] = L_sub(L_tmp1, L_tmp2); } FOR ( j = 0; j < pArith_diff->num_models - 1; j++ ) { sum = 0; FOR ( i = 1; i < pArith_diff->range + 1; i++ ) { sum = add(sum, pArith_diff->pAlt_freq_models[j][i]); } log2_int = norm_s(sum); tmp32 = L_deposit_h( shl( sum, log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp2 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ FOR ( i = 1; i < pArith_diff->range + 1; i++ ) { Word32 L_tmp1; log2_int = norm_s(pArith_diff->pAlt_freq_models[j][i]); tmp32 = L_deposit_h( shl( pArith_diff->pAlt_freq_models[j][i], log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp1 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ pArith_diff->saved_dist_arr[j + 1][i - 1] = L_sub(L_tmp1, L_tmp2); } } } return; } #endif /*-----------------------------------------------------------------------------------------* * Function ivas_spar_arith_coeffs_com_init() * Loading @@ -339,28 +483,41 @@ static void ivas_spar_arith_com_init( void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ) const Word16 table_idx, const Word16 enc_dec ) { int16_t i, pred_r_index, drct_r_index, decd_r_index; int16_t num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; Word16 i, pred_r_index, drct_r_index, decd_r_index; Word16 num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; for ( i = 0; i < MAX_QUANT_STRATS; i++ ) FOR ( i = 0; i < MAX_QUANT_STRATS; i++ ) { num_quant_points_pred_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; /* 0: pred_r */ pred_r_index = ivas_map_num_pred_r_to_idx( num_quant_points_pred_r, ivas_spar_br_table_consts[table_idx].active_w ); #ifdef IVAS_FLOAT_FIXED ivas_spar_arith_com_init_fx( &pArith_coeffs->pred_arith_re[i], &ivas_arith_pred_r_consts[pred_r_index], &pArith_coeffs->pred_arith_re_diff[i], pSpar_cfg->quant_strat[i].PR.q_levels[0], enc_dec ); #else ivas_spar_arith_com_init( &pArith_coeffs->pred_arith_re[i], &ivas_arith_pred_r_consts[pred_r_index], &pArith_coeffs->pred_arith_re_diff[i], pSpar_cfg->quant_strat[i].PR.q_levels[0], enc_dec ); #endif num_quant_points_drct_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; /* 1: drct_r */ drct_r_index = ivas_map_num_drct_r_to_idx( num_quant_points_drct_r ); #ifdef IVAS_FLOAT_FIXED ivas_spar_arith_com_init_fx( &pArith_coeffs->drct_arith_re[i], &ivas_arith_drct_r_consts[drct_r_index], &pArith_coeffs->drct_arith_re_diff[i], pSpar_cfg->quant_strat[i].C.q_levels[0], enc_dec ); #else ivas_spar_arith_com_init( &pArith_coeffs->drct_arith_re[i], &ivas_arith_drct_r_consts[drct_r_index], &pArith_coeffs->drct_arith_re_diff[i], pSpar_cfg->quant_strat[i].C.q_levels[0], enc_dec ); #endif num_quant_points_decd_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; /* 2: decd_r */ decd_r_index = ivas_map_num_decd_r_to_idx( num_quant_points_decd_r ); #ifdef IVAS_FLOAT_FIXED ivas_spar_arith_com_init_fx( &pArith_coeffs->decd_arith_re[i], &ivas_arith_decd_r_consts[decd_r_index], &pArith_coeffs->decd_arith_re_diff[i], pSpar_cfg->quant_strat[i].P_r.q_levels[0], enc_dec ); #else ivas_spar_arith_com_init( &pArith_coeffs->decd_arith_re[i], &ivas_arith_decd_r_consts[decd_r_index], &pArith_coeffs->decd_arith_re_diff[i], pSpar_cfg->quant_strat[i].P_r.q_levels[0], enc_dec ); #endif } return; Loading @@ -376,22 +533,22 @@ void ivas_spar_arith_coeffs_com_init( static void ivas_huffman_dec_init_min_max_len( ivas_huffman_cfg_t *p_huff_cfg ) { int16_t i, code_len; const int16_t *codebook; Word16 i, code_len; const Word16 *codebook; codebook = p_huff_cfg->codebook; p_huff_cfg->min_len = p_huff_cfg->sym_len; p_huff_cfg->max_len = 0; for ( i = 0; i < p_huff_cfg->sym_len; i++ ) FOR ( i = 0; i < p_huff_cfg->sym_len; i++ ) { code_len = codebook[1]; if ( p_huff_cfg->min_len > code_len ) IF ( GT_16(p_huff_cfg->min_len, code_len) ) { p_huff_cfg->min_len = code_len; } if ( p_huff_cfg->max_len < code_len ) IF ( LT_16(p_huff_cfg->max_len, code_len) ) { p_huff_cfg->max_len = code_len; } Loading @@ -411,20 +568,20 @@ static void ivas_huffman_dec_init_min_max_len( void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ) const Word16 table_idx, const Word16 enc_dec ) { int16_t i, pred_r_index, drct_r_index, decd_r_index; int16_t num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; Word16 i, pred_r_index, drct_r_index, decd_r_index; Word16 num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; ivas_huffman_cfg_t *p_huff_cfg; for ( i = 0; i < MAX_QUANT_STRATS; i++ ) FOR ( i = 0; i < MAX_QUANT_STRATS; i++ ) { p_huff_cfg = &pHuff_coeffs->pred_huff_re[i]; num_quant_points_pred_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; /* 0: pred_r */ pred_r_index = ivas_map_num_pred_r_to_idx( num_quant_points_pred_r, 0 ); p_huff_cfg->codebook = &ivas_huff_pred_r_consts[pred_r_index].code_book[0][0]; if ( enc_dec == DEC ) IF ( EQ_16(enc_dec, DEC) ) { p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].PR.q_levels[0]; ivas_huffman_dec_init_min_max_len( p_huff_cfg ); Loading @@ -434,7 +591,7 @@ void ivas_spar_huff_coeffs_com_init( num_quant_points_drct_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; /* 1: drct_r */ drct_r_index = ivas_map_num_drct_r_to_idx( num_quant_points_drct_r ); p_huff_cfg->codebook = &ivas_huff_drct_r_consts[drct_r_index].code_book[0][0]; if ( enc_dec == DEC ) IF ( EQ_16(enc_dec, DEC) ) { p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].C.q_levels[0]; ivas_huffman_dec_init_min_max_len( p_huff_cfg ); Loading @@ -444,7 +601,7 @@ void ivas_spar_huff_coeffs_com_init( num_quant_points_decd_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; /* 2: decd_r */ decd_r_index = ivas_map_num_decd_r_to_idx( num_quant_points_decd_r ); p_huff_cfg->codebook = &ivas_huff_decd_r_consts[decd_r_index].code_book[0][0]; if ( enc_dec == DEC ) IF ( EQ_16(enc_dec, DEC) ) { p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].P_r.q_levels[0]; ivas_huffman_dec_init_min_max_len( p_huff_cfg ); Loading lib_com/ivas_stat_com.h +4 −1 Original line number Diff line number Diff line Loading @@ -291,8 +291,11 @@ typedef struct ivas_arith_t int16_t cum_freq[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; int16_t range; int16_t num_models; #ifdef IVAS_FLOAT_FIXED Word32 saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; #else float saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; #endif } ivas_arith_t; typedef struct ivas_arith_coeffs_t Loading lib_com/lsp_conv_poly_fx.c +1 −2 Original line number Diff line number Diff line Loading @@ -2,7 +2,6 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include <stdint.h> #include "options.h" #include "cnst.h" Loading @@ -12,7 +11,6 @@ #ifdef IVAS_FLOAT_FIXED #include "prot_fx2.h" #endif /*-------------------------------------------------------------------* * Local constants Loading Loading @@ -904,3 +902,4 @@ static void cheb2poly_fx( return; } #endif No newline at end of file lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,7 @@ #define NONBE_FIX_849_OMASA_BFI_CRASH /* VA: issue 849: fix OMASA 2TC and FEC crashes */ #define IVAS_FLOAT_FIXED //#define DUMPS_ENABLED /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ Loading Loading
lib_com/cnst.h +1 −0 Original line number Diff line number Diff line Loading @@ -1248,6 +1248,7 @@ enum #define WINDECAY16 410 #define N16_CORE_SW 90 #define N_ZERO_8 45 #define N_ZERO_BY_FS 9216 /* == N_ZERO_MDCT_NS / FRAME_SIZE_NS in Q15 */ #define SWITCH_OVERLAP_8k 15 /* == NS2SA(8000, SWITCH_GAP_LENGTH_NS) - NS2SA(8000, 10000000.0f - N_ZERO_MDCT_NS) */ #define SWITCH_GAP_LENGTH_8k 50 Loading
lib_com/ivas_entropy_coder_common.c +231 −74 Original line number Diff line number Diff line Loading @@ -46,22 +46,22 @@ *-----------------------------------------------------------------------------------------*/ void ivas_wrap_arround( int16_t *pArr, const int16_t min_val, const int16_t max_val, const int16_t length ) Word16 *pArr, const Word16 min_val, const Word16 max_val, const Word16 length ) { int16_t i; Word16 i; for ( i = 0; i < length; i++ ) FOR ( i = 0; i < length; i++ ) { if ( pArr[i] < min_val ) IF ( LT_16(pArr[i], min_val) ) { pArr[i] = max_val - min_val + pArr[i] + 1; pArr[i] = add(sub(max_val, min_val), add( pArr[i], 1)); } if ( pArr[i] > max_val ) IF ( GT_16(pArr[i], max_val) ) { pArr[i] = min_val + pArr[i] - max_val - 1; pArr[i] = sub(add(min_val, pArr[i]), add(max_val, 1)); } } Loading @@ -76,17 +76,17 @@ void ivas_wrap_arround( *-----------------------------------------------------------------------------------------*/ void ivas_get_cum_freq_model( const int16_t *pFreq_model, const int16_t length, int16_t *pCum_freq_model ) const Word16 *pFreq_model, const Word16 length, Word16 *pCum_freq_model ) { int16_t i; Word16 i; pCum_freq_model[length] = 0; for ( i = length; i > 0; i-- ) FOR ( i = length; i > 0; i-- ) { pCum_freq_model[i - 1] = pCum_freq_model[i] + pFreq_model[i]; pCum_freq_model[i - 1] = add(pCum_freq_model[i], pFreq_model[i]); } return; Loading @@ -99,51 +99,51 @@ void ivas_get_cum_freq_model( * Map the ivas_arith_pred_r_consts and ivas_huff_pred_r_consts tables *-----------------------------------------------------------------------------------------*/ int16_t ivas_map_num_pred_r_to_idx( const int16_t num_quant_points_pred_r, const int16_t active_w_flag ) Word16 ivas_map_num_pred_r_to_idx( const Word16 num_quant_points_pred_r, const Word16 active_w_flag ) { int16_t pred_r_to_idx = -1; if ( active_w_flag == 0 ) Word16 pred_r_to_idx = -1; IF ( EQ_16(active_w_flag, 0) ) { switch ( num_quant_points_pred_r ) SWITCH ( num_quant_points_pred_r ) { case 1: pred_r_to_idx = PRED_Q_1; break; BREAK; case 7: pred_r_to_idx = PRED_Q_7; break; BREAK; case 15: pred_r_to_idx = PRED_Q_15; break; BREAK; case 21: pred_r_to_idx = PRED_Q_21; break; BREAK; case 31: pred_r_to_idx = PRED_Q_31; break; BREAK; default: assert( !"Forbidden value for prediction quantization strategy index" ); break; BREAK; } } else ELSE { switch ( num_quant_points_pred_r ) SWITCH ( num_quant_points_pred_r ) { case 7: pred_r_to_idx = PRED_Q_7_ACTIVE_W; break; BREAK; case 15: pred_r_to_idx = PRED_Q_15_ACTIVE_W; break; BREAK; case 21: pred_r_to_idx = PRED_Q_21_ACTIVE_W; break; BREAK; default: assert( !"Forbidden value for prediction quantization strategy index" ); break; BREAK; } } Loading @@ -157,27 +157,27 @@ int16_t ivas_map_num_pred_r_to_idx( * Map the ivas_arith_drct_r_consts and ivas_huff_drct_r_consts tables *-----------------------------------------------------------------------------------------*/ int16_t ivas_map_num_drct_r_to_idx( const int16_t num_quant_points_drct_r ) Word16 ivas_map_num_drct_r_to_idx( const Word16 num_quant_points_drct_r ) { int16_t drct_r_to_idx = -1; switch ( num_quant_points_drct_r ) Word16 drct_r_to_idx = -1; SWITCH ( num_quant_points_drct_r ) { case 1: drct_r_to_idx = DRCT_Q_1; break; BREAK; case 7: drct_r_to_idx = DRCT_Q_7; break; BREAK; case 9: drct_r_to_idx = DRCT_Q_9; break; BREAK; case 11: drct_r_to_idx = DRCT_Q_11; break; BREAK; default: assert( !"Forbidden value for DRCT quantization strategy index" ); break; BREAK; } return drct_r_to_idx; } Loading @@ -189,39 +189,40 @@ int16_t ivas_map_num_drct_r_to_idx( * Map the ivas_arith_decd_r_consts and ivas_huff_decd_r_consts tables *-----------------------------------------------------------------------------------------*/ int16_t ivas_map_num_decd_r_to_idx( const int16_t num_quant_points_decd_r ) Word16 ivas_map_num_decd_r_to_idx( const Word16 num_quant_points_decd_r ) { int16_t decd_r_to_idx = -1; switch ( num_quant_points_decd_r ) Word16 decd_r_to_idx = -1; SWITCH ( num_quant_points_decd_r ) { case 1: decd_r_to_idx = DECD_Q_1; break; BREAK; case 3: decd_r_to_idx = DECD_Q_3; break; BREAK; case 5: decd_r_to_idx = DECD_Q_5; break; BREAK; case 7: decd_r_to_idx = DECD_Q_7; break; BREAK; case 9: decd_r_to_idx = DECD_Q_9; break; BREAK; case 11: decd_r_to_idx = DECD_Q_11; break; BREAK; default: assert( !"Forbidden value for DECD quantization strategy index" ); break; BREAK; } return decd_r_to_idx; } #ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------------------------- - * * Function ivas_spar_arith_com_init() * Loading Loading @@ -328,8 +329,151 @@ static void ivas_spar_arith_com_init( return; } #else /*---------------------------------------------------------------------------------------- - * * Function ivas_spar_arith_com_init_fx() * * arith coder init *---------------------------------------------------------------------------------------- - */ static void ivas_spar_arith_com_init_fx( ivas_arith_t *pArith, const ivas_freq_models_t *pFreq_models, ivas_arith_t *pArith_diff, const Word16 q_levels, const Word16 enc_dec ) { Word16 i, j; Word16 sum, log2_int, log2_frac; Word32 tmp32, log2_int32, L_tmp2; pArith->vals = pFreq_models->vals; pArith->range = q_levels; pArith->num_models = pFreq_models->num_models; pArith->dyn_model_bits = ivas_get_bits_to_encode( pArith->num_models - 1 ); pArith->pFreq_model = pFreq_models->freq_model[0]; ivas_get_cum_freq_model( pArith->pFreq_model, pArith->range, pArith->cum_freq[0] ); FOR ( i = 0; i < pArith->num_models - 1; i++ ) { pArith->pAlt_freq_models[i] = pFreq_models->freq_model[i + 1]; ivas_get_cum_freq_model( pArith->pAlt_freq_models[i], pArith->range, pArith->cum_freq[i + 1] ); } IF ( EQ_16(enc_dec, ENC) ) { sum = 0; FOR ( i = 1; i < pArith->range + 1; i++ ) { sum = add(sum, pArith->pFreq_model[i]); } log2_int = norm_s(sum); tmp32 = L_deposit_h( shl( sum, log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp2 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ FOR ( i = 1; i < pArith->range + 1; i++ ) { Word32 L_tmp1; log2_int = norm_s(pArith->pFreq_model[i]); tmp32 = L_deposit_h( shl( pArith->pFreq_model[i], log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp1 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ pArith->saved_dist_arr[0][i - 1] = L_sub(L_tmp1, L_tmp2); } FOR ( j = 0; j < pArith->num_models - 1; j++ ) { sum = 0; FOR ( i = 1; i < pArith->range + 1; i++ ) { sum = add(sum, pArith->pAlt_freq_models[j][i]); } log2_int = norm_s(sum); tmp32 = L_deposit_h( shl( sum, log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp2 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ FOR ( i = 1; i < pArith->range + 1; i++ ) { Word32 L_tmp1; log2_int = norm_s(pArith->pAlt_freq_models[j][i]); tmp32 = L_deposit_h( shl( pArith->pAlt_freq_models[j][i], log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp1 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ pArith->saved_dist_arr[j + 1][i - 1] = L_sub(L_tmp1, L_tmp2); } } } pArith_diff->vals = pFreq_models->diff_vals; pArith_diff->range = q_levels; pArith_diff->num_models = pFreq_models->diff_num_models; pArith_diff->dyn_model_bits = ivas_get_bits_to_encode( pArith_diff->num_models - 1 ); pArith_diff->pFreq_model = pFreq_models->diff_freq_model[0]; ivas_get_cum_freq_model( pArith_diff->pFreq_model, pArith_diff->range, pArith_diff->cum_freq[0] ); FOR ( i = 0; i < pArith_diff->num_models - 1; i++ ) { pArith_diff->pAlt_freq_models[i] = pFreq_models->diff_freq_model[i + 1]; ivas_get_cum_freq_model( pArith_diff->pAlt_freq_models[i], pArith_diff->range, pArith_diff->cum_freq[i + 1] ); } IF ( EQ_16(enc_dec, ENC) ) { sum = 0; FOR ( i = 1; i < pArith_diff->range + 1; i++ ) { sum = add(sum, pArith_diff->pFreq_model[i]); } log2_int = norm_s(sum); tmp32 = L_deposit_h( shl( sum, log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp2 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ FOR ( i = 1; i < pArith_diff->range + 1; i++ ) { Word32 L_tmp1; log2_int = norm_s(pArith_diff->pFreq_model[i]); tmp32 = L_deposit_h( shl( pArith_diff->pFreq_model[i], log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp1 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ pArith_diff->saved_dist_arr[0][i - 1] = L_sub(L_tmp1, L_tmp2); } FOR ( j = 0; j < pArith_diff->num_models - 1; j++ ) { sum = 0; FOR ( i = 1; i < pArith_diff->range + 1; i++ ) { sum = add(sum, pArith_diff->pAlt_freq_models[j][i]); } log2_int = norm_s(sum); tmp32 = L_deposit_h( shl( sum, log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp2 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ FOR ( i = 1; i < pArith_diff->range + 1; i++ ) { Word32 L_tmp1; log2_int = norm_s(pArith_diff->pAlt_freq_models[j][i]); tmp32 = L_deposit_h( shl( pArith_diff->pAlt_freq_models[j][i], log2_int ) ); log2_frac = Log2_norm_lc(tmp32); log2_int32 = L_shl((Word32)sub(sub(30,log2_int),16), 15); L_tmp1 = L_add(log2_int32, (Word32)log2_frac); /* Q15 */ pArith_diff->saved_dist_arr[j + 1][i - 1] = L_sub(L_tmp1, L_tmp2); } } } return; } #endif /*-----------------------------------------------------------------------------------------* * Function ivas_spar_arith_coeffs_com_init() * Loading @@ -339,28 +483,41 @@ static void ivas_spar_arith_com_init( void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ) const Word16 table_idx, const Word16 enc_dec ) { int16_t i, pred_r_index, drct_r_index, decd_r_index; int16_t num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; Word16 i, pred_r_index, drct_r_index, decd_r_index; Word16 num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; for ( i = 0; i < MAX_QUANT_STRATS; i++ ) FOR ( i = 0; i < MAX_QUANT_STRATS; i++ ) { num_quant_points_pred_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; /* 0: pred_r */ pred_r_index = ivas_map_num_pred_r_to_idx( num_quant_points_pred_r, ivas_spar_br_table_consts[table_idx].active_w ); #ifdef IVAS_FLOAT_FIXED ivas_spar_arith_com_init_fx( &pArith_coeffs->pred_arith_re[i], &ivas_arith_pred_r_consts[pred_r_index], &pArith_coeffs->pred_arith_re_diff[i], pSpar_cfg->quant_strat[i].PR.q_levels[0], enc_dec ); #else ivas_spar_arith_com_init( &pArith_coeffs->pred_arith_re[i], &ivas_arith_pred_r_consts[pred_r_index], &pArith_coeffs->pred_arith_re_diff[i], pSpar_cfg->quant_strat[i].PR.q_levels[0], enc_dec ); #endif num_quant_points_drct_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; /* 1: drct_r */ drct_r_index = ivas_map_num_drct_r_to_idx( num_quant_points_drct_r ); #ifdef IVAS_FLOAT_FIXED ivas_spar_arith_com_init_fx( &pArith_coeffs->drct_arith_re[i], &ivas_arith_drct_r_consts[drct_r_index], &pArith_coeffs->drct_arith_re_diff[i], pSpar_cfg->quant_strat[i].C.q_levels[0], enc_dec ); #else ivas_spar_arith_com_init( &pArith_coeffs->drct_arith_re[i], &ivas_arith_drct_r_consts[drct_r_index], &pArith_coeffs->drct_arith_re_diff[i], pSpar_cfg->quant_strat[i].C.q_levels[0], enc_dec ); #endif num_quant_points_decd_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; /* 2: decd_r */ decd_r_index = ivas_map_num_decd_r_to_idx( num_quant_points_decd_r ); #ifdef IVAS_FLOAT_FIXED ivas_spar_arith_com_init_fx( &pArith_coeffs->decd_arith_re[i], &ivas_arith_decd_r_consts[decd_r_index], &pArith_coeffs->decd_arith_re_diff[i], pSpar_cfg->quant_strat[i].P_r.q_levels[0], enc_dec ); #else ivas_spar_arith_com_init( &pArith_coeffs->decd_arith_re[i], &ivas_arith_decd_r_consts[decd_r_index], &pArith_coeffs->decd_arith_re_diff[i], pSpar_cfg->quant_strat[i].P_r.q_levels[0], enc_dec ); #endif } return; Loading @@ -376,22 +533,22 @@ void ivas_spar_arith_coeffs_com_init( static void ivas_huffman_dec_init_min_max_len( ivas_huffman_cfg_t *p_huff_cfg ) { int16_t i, code_len; const int16_t *codebook; Word16 i, code_len; const Word16 *codebook; codebook = p_huff_cfg->codebook; p_huff_cfg->min_len = p_huff_cfg->sym_len; p_huff_cfg->max_len = 0; for ( i = 0; i < p_huff_cfg->sym_len; i++ ) FOR ( i = 0; i < p_huff_cfg->sym_len; i++ ) { code_len = codebook[1]; if ( p_huff_cfg->min_len > code_len ) IF ( GT_16(p_huff_cfg->min_len, code_len) ) { p_huff_cfg->min_len = code_len; } if ( p_huff_cfg->max_len < code_len ) IF ( LT_16(p_huff_cfg->max_len, code_len) ) { p_huff_cfg->max_len = code_len; } Loading @@ -411,20 +568,20 @@ static void ivas_huffman_dec_init_min_max_len( void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ) const Word16 table_idx, const Word16 enc_dec ) { int16_t i, pred_r_index, drct_r_index, decd_r_index; int16_t num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; Word16 i, pred_r_index, drct_r_index, decd_r_index; Word16 num_quant_points_pred_r, num_quant_points_drct_r, num_quant_points_decd_r; ivas_huffman_cfg_t *p_huff_cfg; for ( i = 0; i < MAX_QUANT_STRATS; i++ ) FOR ( i = 0; i < MAX_QUANT_STRATS; i++ ) { p_huff_cfg = &pHuff_coeffs->pred_huff_re[i]; num_quant_points_pred_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][0]; /* 0: pred_r */ pred_r_index = ivas_map_num_pred_r_to_idx( num_quant_points_pred_r, 0 ); p_huff_cfg->codebook = &ivas_huff_pred_r_consts[pred_r_index].code_book[0][0]; if ( enc_dec == DEC ) IF ( EQ_16(enc_dec, DEC) ) { p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].PR.q_levels[0]; ivas_huffman_dec_init_min_max_len( p_huff_cfg ); Loading @@ -434,7 +591,7 @@ void ivas_spar_huff_coeffs_com_init( num_quant_points_drct_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][1]; /* 1: drct_r */ drct_r_index = ivas_map_num_drct_r_to_idx( num_quant_points_drct_r ); p_huff_cfg->codebook = &ivas_huff_drct_r_consts[drct_r_index].code_book[0][0]; if ( enc_dec == DEC ) IF ( EQ_16(enc_dec, DEC) ) { p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].C.q_levels[0]; ivas_huffman_dec_init_min_max_len( p_huff_cfg ); Loading @@ -444,7 +601,7 @@ void ivas_spar_huff_coeffs_com_init( num_quant_points_decd_r = ivas_spar_br_table_consts[table_idx].q_lvls[i][2]; /* 2: decd_r */ decd_r_index = ivas_map_num_decd_r_to_idx( num_quant_points_decd_r ); p_huff_cfg->codebook = &ivas_huff_decd_r_consts[decd_r_index].code_book[0][0]; if ( enc_dec == DEC ) IF ( EQ_16(enc_dec, DEC) ) { p_huff_cfg->sym_len = pSpar_cfg->quant_strat[i].P_r.q_levels[0]; ivas_huffman_dec_init_min_max_len( p_huff_cfg ); Loading
lib_com/ivas_stat_com.h +4 −1 Original line number Diff line number Diff line Loading @@ -291,8 +291,11 @@ typedef struct ivas_arith_t int16_t cum_freq[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; int16_t range; int16_t num_models; #ifdef IVAS_FLOAT_FIXED Word32 saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; #else float saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; #endif } ivas_arith_t; typedef struct ivas_arith_coeffs_t Loading
lib_com/lsp_conv_poly_fx.c +1 −2 Original line number Diff line number Diff line Loading @@ -2,7 +2,6 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include <stdint.h> #include "options.h" #include "cnst.h" Loading @@ -12,7 +11,6 @@ #ifdef IVAS_FLOAT_FIXED #include "prot_fx2.h" #endif /*-------------------------------------------------------------------* * Local constants Loading Loading @@ -904,3 +902,4 @@ static void cheb2poly_fx( return; } #endif No newline at end of file
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,7 @@ #define NONBE_FIX_849_OMASA_BFI_CRASH /* VA: issue 849: fix OMASA 2TC and FEC crashes */ #define IVAS_FLOAT_FIXED //#define DUMPS_ENABLED /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ Loading