Commit 5b53afc9 authored by TYAGIRIS's avatar TYAGIRIS
Browse files

entropy coder changes, clean up, fixes

parent 2905c1f3
Loading
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -79,10 +79,6 @@ typedef enum

#define IVAS_FORMAT_SIGNALING_NBITS             2                           /* number of bits for signaling the IVAS format */
#define IVAS_FORMAT_SIGNALING_NBITS_SBA         ( IVAS_FORMAT_SIGNALING_NBITS + 1 )
#ifdef ARITH_HUFF_CODER_CHANGES
//#define IVAS_SBA_SIGNALING_OVERHEAD             IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS + AGC_SIGNALLING_BITS + SPAR_NUM_CODING_STRAT_BITS
#define IVAS_SBA_SIGNALING_OVERHEAD             600
#endif 


/*----------------------------------------------------------------------------------*
@@ -995,6 +991,7 @@ typedef enum
#define AGC_EMAX                                0
#ifdef ARITH_HUFF_CODER_CHANGES
#define AGC_SIGNALLING_BITS                     1
#define IVAS_SPAR_ARITH_OVERSHOOT_BITS               (16)
#endif

/* Common SPAR metadata constants */
@@ -1656,6 +1653,7 @@ typedef enum
#define IVAS_16K_12BANDS_ACTIVE_BANDS           10

#define SPAR_DIRAC_SPLIT_START_BAND             8 
#define DIRAC_TO_SPAR_HBR_PRED_CHS                     (FOA_CHANNELS - 1)
#define SPAR_DTX_BANDS                          2
#define DIRAC_DTX_BANDS                         2
#define SPAR_DIRAC_DTX_BANDS                    ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS )
+73 −1
Original line number Diff line number Diff line
@@ -289,6 +289,70 @@ void ivas_dirac_config_bands(
    return;
}

#ifdef ARITH_HUFF_CODER_CHANGES
void ivas_get_dirac_sba_max_md_bits(
    const int32_t sba_total_brate,
    int16_t *bits_frame_nominal,
    int16_t *metadata_max_bits,
    int16_t *qmetadata_max_bit_req,
    int16_t nbands )
{
    if ( sba_total_brate <= IVAS_13k2 )
    {
        *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC;
        *metadata_max_bits = 70;
    }
    else if ( sba_total_brate <= IVAS_16k4 )
    {
        *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC;
        *metadata_max_bits = 80;
    }
    else if ( sba_total_brate <= IVAS_24k4 )
    {
        *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC;
        *metadata_max_bits = 103;
    }
    else if ( sba_total_brate <= IVAS_32k )
    {
        *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC;
        *metadata_max_bits = 214;
    }
    else if ( sba_total_brate <= IVAS_48k )
    {
        *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC;
        *metadata_max_bits = 240;
    }
    else if ( sba_total_brate <= IVAS_64k )
    {
        *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC;
        *metadata_max_bits = 200;
    }
    else if ( sba_total_brate <= IVAS_80k )
    {
        *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC;
        *metadata_max_bits = 200;
    }
    else if ( sba_total_brate <= IVAS_96k )
    {
        *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC;
        *metadata_max_bits = 200;
    }
    else if ( sba_total_brate <= IVAS_128k )
    {
        *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC;
        *metadata_max_bits = 250;
    }
    else
    {
        *bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC );
        *metadata_max_bits = MAX16B; /* no limit */
    }
    *metadata_max_bits = (int16_t) ceilf( (float) *metadata_max_bits * nbands / 5 );
    *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1;

    return;
}
#endif

/*-------------------------------------------------------------------------
 * ivas_dirac_sba_config()
@@ -358,7 +422,14 @@ ivas_error ivas_dirac_sba_config(
        {
            return error;
        }

#ifdef ARITH_HUFF_CODER_CHANGES
        ivas_get_dirac_sba_max_md_bits(
            sba_total_brate,
            &hQMetaData->bits_frame_nominal,
            &hQMetaData->metadata_max_bits,
            &hQMetaData->qmetadata_max_bit_req,
            hQMetaData->q_direction[0].cfg.nbands );
#else
        if ( sba_total_brate <= IVAS_13k2 )
        {
            hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC;
@@ -412,6 +483,7 @@ ivas_error ivas_dirac_sba_config(

        hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 );
        hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1;
#endif

        return error;
    }
+22 −6
Original line number Diff line number Diff line
@@ -114,6 +114,10 @@ ivas_error ivas_spar_md_enc_init
ivas_error ivas_sba_enc_reconfigure( 
    Encoder_Struct *st_ivas                                     /* i/o: IVAS encoder structure                  */
);
#ifdef ARITH_HUFF_CODER_CHANGES
int16_t ivas_sba_get_max_md_bits(
    Encoder_Struct *st_ivas );
#endif

void destroy_sce_enc(
    SCE_ENC_HANDLE hSCE                                         /* i/o: SCE encoder structure                   */
@@ -3361,6 +3365,15 @@ void ivas_dirac_config_bands(
    IVAS_FB_MIXER_HANDLE hFbMdft
);

#ifdef ARITH_HUFF_CODER_CHANGES
void ivas_get_dirac_sba_max_md_bits(
    const int32_t sba_total_brate,
    int16_t *bits_frame_nominal,
    int16_t *metadata_max_bits,
    int16_t *qmetadata_max_bit_req,
    int16_t nbands );
#endif

ivas_error ivas_dirac_sba_config(
    IVAS_QMETADATA_HANDLE hQMetaData,                           /* i/o: q_metadata handle                                    */
    int16_t *nchan_transport,                                   /* o  : number of transport channel needed for MASA format   */
@@ -4007,8 +4020,9 @@ void ivas_spar_set_bitrate_config(
    const int16_t num_bands                                     /* i  : number of bands                         */
#ifdef ARITH_HUFF_CODER_CHANGES
    ,
    const int16_t enc_flag
   ,const int16_t Opt_PCA_ON
    const int16_t enc_flag,
    const int16_t pca_flag,
    const int16_t agc_flag
#endif
);

@@ -4096,9 +4110,6 @@ ivas_error ivas_spar_md_enc_process(
    const int16_t dtx_vad,
    const int16_t nchan_inp,
    const int16_t sba_order                                     /* i  : Ambisonic (SBA) order                   */
#ifdef ARITH_HUFF_CODER_CHANGES
  , int16_t max_md_bit_dirac
#endif
);

void ivas_compute_spar_params(
@@ -4449,7 +4460,12 @@ int16_t ivas_get_bits_to_encode(
void ivas_huffman_encode( ivas_huffman_cfg_t *huff_cfg, int16_t in, int16_t *hcode, int16_t *hlen );
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 );
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 );
void ivas_arith_encode_cmplx_cell_array(ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff 
#ifdef ARITH_HUFF_CODER_CHANGES
int16_t ivas_arith_encode_cmplx_cell_array(
#else
void ivas_arith_encode_cmplx_cell_array(
#endif
ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff 
#ifdef ARITH_HUFF_CODER_CHANGES
  , int32_t wc_strat_arith
#endif
+0 −1
Original line number Diff line number Diff line
@@ -318,7 +318,6 @@ extern const float McMASA_LFEGain_vectors[64];
extern const float ism_azimuth_borders[4];
extern const float ism_elevation_borders[4];


/*----------------------------------------------------------------------------------*
 * Param ISM ROM tables
 *----------------------------------------------------------------------------------*/
+44 −35
Original line number Diff line number Diff line
@@ -2097,7 +2097,8 @@ void ivas_spar_set_bitrate_config(
#ifdef ARITH_HUFF_CODER_CHANGES
    ,
    const int16_t enc_flag,
    const int16_t Opt_PCA_ON
    const int16_t pca_flag,
    const int16_t agc_flag
#endif
)
{
@@ -2106,11 +2107,11 @@ void ivas_spar_set_bitrate_config(
    int16_t sba_order;
    int16_t md_coding_bits_header;
#ifdef ARITH_HUFF_CODER_CHANGES
    int16_t bits_PR, bits_C, bits_P = 0;
    int16_t wc_coarse_strat = 0;
    int16_t n_input, n_dmx, n_dec = 0;
    int16_t table_idx_val, quant_strat = 0;
    int32_t table_cal_wc = 0;
    int16_t agc_bits, pca_bits, num_PR_bits_dirac_bands;
    int16_t bits_PR, bits_C, bits_P;
    int16_t wc_coarse_strat;
    int16_t n_input, n_dmx, n_dec;
    int16_t quant_strat;
#endif
    pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport;

@@ -2160,12 +2161,8 @@ void ivas_spar_set_bitrate_config(
#ifdef ARITH_HUFF_CODER_CHANGES
    if ( enc_flag )
    {
       /*calculate the worst case strat vlaue*/
        table_idx_val = ivas_get_spar_table_idx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
        if ( ( ivas_spar_br_table_consts[table_idx].q_lvls[2][0] == 1 &&
               ivas_spar_br_table_consts[table_idx].q_lvls[2][1] == 1 &&
               ivas_spar_br_table_consts[table_idx].q_lvls[2][2] == 1 &&
               ivas_spar_br_table_consts[table_idx].q_lvls[2][3] == 1 ) )
        /*calculate the actual worst case bits*/
        if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT )
        {
            quant_strat = QUANT_STRAT_0;
        }
@@ -2173,46 +2170,58 @@ void ivas_spar_set_bitrate_config(
        {
            quant_strat = QUANT_STRAT_2;
        }
        /*worst case table calculated value*/
        for ( i = 0; i < ivas_spar_br_table_consts[table_idx_val].nchan_transport; i++ )
        {
            table_cal_wc += ivas_spar_br_table_consts[table_idx_val].core_brs[i][1];
        }
        table_cal_wc = ( ivas_total_brate - table_cal_wc ) / FRAMES_PER_SEC;

        num_PR_bits_dirac_bands = num_bands - SPAR_DIRAC_SPLIT_START_BAND;
        num_PR_bits_dirac_bands = max( 0, num_PR_bits_dirac_bands );
        num_PR_bits_dirac_bands *= DIRAC_TO_SPAR_HBR_PRED_CHS;

        n_input = ivas_sba_get_nchan_metadata( sba_order );
        n_dmx = ivas_spar_br_table_consts[table_idx_val].nchan_transport;
        n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport;
        n_dec = n_input - n_dmx;
        bits_PR = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][0] ) ) * ( n_input - 1 );
        bits_C = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][1] ) ) * ( ( n_dmx - 1 ) * n_dec );
        bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx_val].q_lvls[quant_strat][2] ) ) * ( n_dec );
        bits_PR = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) );
        num_PR_bits_dirac_bands *= bits_PR;
        bits_PR = bits_PR * ( n_input - 1 );
        bits_C = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) ) * ( ( n_dmx - 1 ) * n_dec );
        bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) ) * ( n_dec );
        wc_coarse_strat = bits_PR + bits_C + bits_P;
        wc_coarse_strat = ( ( wc_coarse_strat * IVAS_MAX_NUM_BANDS ) * FRAMES_PER_SEC + ( IVAS_SBA_SIGNALING_OVERHEAD ) ) / FRAMES_PER_SEC;
        pSpar_md_cfg->max_md_bits_sba = wc_coarse_strat;
        wc_coarse_strat *= num_bands;
        wc_coarse_strat -= num_PR_bits_dirac_bands;
        wc_coarse_strat += md_coding_bits_header;

        if ( Opt_PCA_ON )
        if ( pSpar_md_cfg->max_bits_per_blk < wc_coarse_strat )
        {
            pSpar_md_cfg->PCA_val = 1 + IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1;
            assert( 0 );
        }
        else

        if ( agc_flag )
        {
            if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER )
            if ( pSpar_md_cfg->nchan_transport == 1 )
            {
                pSpar_md_cfg->PCA_val = 1;
                agc_bits = AGC_BITS_PER_CH;
            }
            else
            {
                pSpar_md_cfg->PCA_val = 0;
                agc_bits = AGC_BITS_PER_CH * pSpar_md_cfg->nchan_transport + AGC_SIGNALLING_BITS;
            }
        }
        else
        {
            agc_bits = AGC_SIGNALLING_BITS;
        }
        if ( wc_coarse_strat > table_cal_wc )

        if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER )
        {
            assert( 0 );
            pca_bits = 1;
            if ( pca_flag )
            {
                pca_bits += IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1;
            }
        if ( pSpar_md_cfg->max_bits_per_blk - md_coding_bits_header < wc_coarse_strat )
        }
        else
        {
            // assert( 0 );
            pca_bits = 0;
        }
        pSpar_md_cfg->max_md_bits_spar = pSpar_md_cfg->max_bits_per_blk + agc_bits + pca_bits;
    }
#endif
    return;
Loading