Commit 7aecf813 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch 'entropy-coder-changes' into 'main'

Entropy coder changes and windows_ola changes

See merge request !10
parents b3b26071 1e29947f
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+231 −74
Original line number Diff line number Diff line
@@ -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));
        }
    }

@@ -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;
@@ -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;
        }
    }

@@ -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;
}
@@ -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()
 *
@@ -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()
 *
@@ -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;
@@ -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;
        }
@@ -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 );
@@ -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 );
@@ -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 );
+4 −1
Original line number Diff line number Diff line
@@ -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
+1 −2
Original line number Diff line number Diff line
@@ -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"
@@ -12,7 +11,6 @@

#ifdef IVAS_FLOAT_FIXED
#include "prot_fx2.h"
#endif

/*-------------------------------------------------------------------*
 * Local constants
@@ -904,3 +902,4 @@ static void cheb2poly_fx(

    return;
}
#endif
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
@@ -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