Commit 36663f92 authored by YuichiKamiya's avatar YuichiKamiya
Browse files

Draft : Panasonic IVAS-Codec MS-TD Mode

parent 5fe5d9a9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -313,6 +313,7 @@
    <ClCompile Include="..\lib_dec\ivas_stereo_icbwe_dec.c" />
    <ClCompile Include="..\lib_dec\ivas_stereo_mdct_core_dec.c" />
    <ClCompile Include="..\lib_dec\ivas_stereo_mdct_stereo_dec.c" />
    <ClCompile Include="..\lib_dec\ivas_stereo_mstd_core_dec.c" />
    <ClCompile Include="..\lib_dec\ivas_stereo_switching_dec.c" />
    <ClCompile Include="..\lib_dec\ivas_stereo_td_dec.c" />
    <ClCompile Include="..\lib_dec\ivas_svd_dec.c" />
+1 −0
Original line number Diff line number Diff line
@@ -327,6 +327,7 @@
    <ClCompile Include="..\lib_enc\ivas_stereo_mdct_core_enc.c" />
    <ClCompile Include="..\lib_enc\ivas_stereo_mdct_igf_enc.c" />
    <ClCompile Include="..\lib_enc\ivas_stereo_mdct_stereo_enc.c" />
    <ClCompile Include="..\lib_enc\ivas_stereo_mstd_core_enc.c" />
    <ClCompile Include="..\lib_enc\ivas_stereo_switching_enc.c" />
    <ClCompile Include="..\lib_enc\ivas_stereo_td_analysis.c" />
    <ClCompile Include="..\lib_enc\ivas_stereo_td_enc.c" />
+74 −1
Original line number Diff line number Diff line
@@ -631,6 +631,36 @@ ivas_error config_acelp1(
        i++;
    }

#ifdef P_MSTD
    if ( element_mode == IVAS_CPE_MSTD )
    {
        if ( core_brate_inp == ACELP_28k30 )
        {
            i = 22;
            flag_hardcoded = 1;
        }
        if ( core_brate_inp == ACELP_28k50 )
        {
            i = 23;
            flag_hardcoded = 1;
        }
        if ( core_brate_inp == ACELP_29k50 )
        {
            i = 24;
            flag_hardcoded = 1;
        }
        else if ( core_brate_inp == ACELP_29k70 )
        {
            i = 25;
            flag_hardcoded = 1;
        }
        else
        {
            ;
        }
    }

#endif
    if ( element_mode == IVAS_CPE_TD && coder_type == AUDIO &&
         core_brate_inp <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */
    {
@@ -639,12 +669,20 @@ ivas_error config_acelp1(

    core_brate = brate_intermed_tbl[i];

#ifdef P_MSTD
    if ( ( element_mode > EVS_MONO && element_mode != IVAS_CPE_MSTD ) || ( element_mode == IVAS_CPE_MSTD && core_brate <= ACELP_16k40 ) )
#else
    if ( element_mode > EVS_MONO )
#endif
    {
        flag_hardcoded = 0; /* use automatic and flexible ACELP bit-budget allocation */
    }

#ifdef P_MSTD
    if ( core != ACELP_CORE && ( element_mode == EVS_MONO || element_mode == IVAS_CPE_MSTD ) ) /* needed for mode1 core switching in EVS mono */
#else
    if ( core != ACELP_CORE && element_mode == EVS_MONO ) /* needed for mode1 core switching in EVS mono */
#endif
    {
        flag_hardcoded = 1;
    }
@@ -664,7 +702,11 @@ ivas_error config_acelp1(
        }

        /* Subtract signaling bits */
#ifdef P_MSTD
        if ( enc_dec == DEC && idchan == 1 && ( element_mode > EVS_MONO && element_mode != IVAS_CPE_MSTD ) )
#else
        if ( enc_dec == DEC && idchan == 1 && element_mode > EVS_MONO )
#endif
        {
            bits -= TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS;

@@ -745,7 +787,11 @@ ivas_error config_acelp1(
            /* mid-LSF Q bit-budget */
            acelp_cfg->mid_lsf_bits = mid_LSF_bits_tbl[LSF_BIT_ALLOC_IDX( core_brate, coder_type )];

#ifdef P_MSTD
            if ( ( element_mode > EVS_MONO && element_mode != IVAS_CPE_MSTD ) && coder_type == AUDIO /*&& brate_intermed_tbl[i] < ACELP_9k60*/ )
#else
            if ( element_mode > EVS_MONO && coder_type == AUDIO /*&& brate_intermed_tbl[i] < ACELP_9k60*/ )
#endif
            {
                acelp_cfg->mid_lsf_bits = 5;
                /* primary channel: do nothing */
@@ -839,7 +885,11 @@ ivas_error config_acelp1(
     * LP filtering of the adaptive excitation
     *-----------------------------------------------------------------*/

#ifdef P_MSTD
    if ( idchan > 0 && ( element_mode > EVS_MONO && element_mode != IVAS_CPE_MSTD ) )
#else
    if ( idchan > 0 && element_mode > EVS_MONO )
#endif
    {
        acelp_cfg->ltf_mode = FULL_BAND;
    }
@@ -1085,7 +1135,11 @@ ivas_error config_acelp1(
        }

        /* algebraic codebook bit-budget */
#ifdef P_MSTD
        if ( flag_hardcoded || ( core_brate_inp >= MIN_BRATE_AVQ_EXC && coder_type != INACTIVE && total_brate != ACELP_31k30 ) || ( total_brate > MAX_GSC_INACTIVE_BRATE && coder_type == INACTIVE ) )
#else
        if ( flag_hardcoded || ( core_brate_inp >= MIN_BRATE_AVQ_EXC && coder_type != INACTIVE ) || ( total_brate > MAX_GSC_INACTIVE_BRATE && coder_type == INACTIVE ) )
#endif
        {
            for ( i = 0; i < nb_subfr; i++ )
            {
@@ -1172,7 +1226,11 @@ ivas_error config_acelp1(
        }

        /* AVQ codebook */
#ifdef P_MSTD
        if ( ( core_brate_inp >= MIN_BRATE_AVQ_EXC && coder_type != INACTIVE && total_brate != ACELP_31k30 ) || ( total_brate > MAX_GSC_INACTIVE_BRATE && coder_type == INACTIVE ) )
#else
        if ( ( core_brate_inp >= MIN_BRATE_AVQ_EXC && coder_type != INACTIVE ) || ( total_brate > MAX_GSC_INACTIVE_BRATE && coder_type == INACTIVE ) )
#endif
        {
            for ( i = 0; i < nb_subfr; i++ )
            {
@@ -1187,7 +1245,11 @@ ivas_error config_acelp1(
                bits -= G_AVQ_BITS;
            }

#ifdef P_MSTD
            if ( core_brate_inp >= MIN_BRATE_AVQ_EXC && core_brate_inp <= MAX_BRATE_AVQ_EXC_TD && coder_type == GENERIC && total_brate != ACELP_31k30 )
#else
            if ( core_brate_inp >= MIN_BRATE_AVQ_EXC && core_brate_inp <= MAX_BRATE_AVQ_EXC_TD && coder_type == GENERIC )
#endif
            {
                /* harm. flag ACELP AVQ */
                bits--;
@@ -1304,10 +1366,15 @@ ivas_error config_acelp1(
        {
            acelp_cfg->ubits = 0;
        }
#ifdef P_MSTD
        else if ( ( flag_hardcoded && core == ACELP_CORE && bits != 0 ) && ( coder_type != AUDIO ) )
#else
        else if ( flag_hardcoded && core == ACELP_CORE && bits != 0 )
#endif
        {
#ifdef DEBUGGING
            IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (int32_t) bits, frame );
/*            IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (int32_t) bits, frame ); */
			            IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d. %d-%d\n", (int32_t) bits, frame, coder_type, nb_subfr );
#endif
        }
        else if ( bits > 0 && !( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) )
@@ -1393,6 +1460,12 @@ ivas_error config_acelp1(
                    acelp_cfg->lsf_bits = 42;
                }
            }
#ifdef P_MSTD
            else if ( element_mode == IVAS_CPE_MSTD && coder_type == AUDIO )
            {
                acelp_cfg->ubits = 0;
            }
#endif
            else
            {
                acelp_cfg->ubits = bits;
+4 −0
Original line number Diff line number Diff line
@@ -2050,7 +2050,11 @@ ivas_error read_indices(
        }
        else
        {
#ifdef P_MSTD
            ;
#else
            st_ivas->element_mode_init = -1;
#endif
        }
    }
    else /* AMRWB or EVS */
+82 −0
Original line number Diff line number Diff line
@@ -119,7 +119,11 @@ enum{
#define ACTIVE_FRAME                    0xFF
#define SID_FRAME                       0xFA
#define ZERO_FRAME                      0xF0
#ifdef P_MSTD
#define FRAME_SIZE_NB                   14
#else
#define FRAME_SIZE_NB                   13
#endif

#define RATE_MODE_MAX                   2               /* Number of rate mode */
#define BANDWIDTH_MODE_MAX              2               /* Number of different bandwidth (NB/WB-FB) */
@@ -202,6 +206,13 @@ enum{
#define ACELP_32k                       32000           /* ACELP core layer at 32    kbps                                */
#define ACELP_48k                       48000           /* ACELP core layer at 48    kbps                                */
#define ACELP_64k                       64000           /* ACELP core layer at 64    kbps                                */
#ifdef P_MSTD
#define ACELP_31k30                     31300
#define ACELP_28k30                     28300
#define ACELP_28k50                     28500
#define ACELP_29k50                     29500
#define ACELP_29k70                     29700
#endif

#define HQ_16k40                        16400           /* HQ core at 16.4 kbps   */
#define HQ_13k20                        13200           /* HQ core at 13.2 kbps */
@@ -229,12 +240,21 @@ enum{
#define GSC_LRES_GAINQ_LIMIT            3000            /* Bitrate where the low resolution quantization starts for the GSC */
#define GSC_LRES_NB_NITS                10              /* Number of bits gained by using the low resolution quantization */

#ifdef P_MSTD
#define SIZE_BRATE_TBL                  12
#define SIZE_BRATE_INTERMED_TBL         26

#define BRATE2IDX( brate )              ( brate == ACELP_5k00 ? 0 : brate == ACELP_6k15 ? 1 : brate == ACELP_7k20 ? 2 : brate == ACELP_8k00 ? 3 : brate == ACELP_9k60 ? 4 : brate == ACELP_11k60 ? 5 : brate == ACELP_12k15 ? 6 : brate == ACELP_12k85 ? 7 : brate == ACELP_13k20 ? 8 : brate == ACELP_14k80 ? 9 : brate == ACELP_16k40 ? 10 : brate == ACELP_22k60 ? 11 : brate == ACELP_24k40 ? 12 : brate == ACELP_29k00 ? 13 : brate == ACELP_29k20 ? 14 : brate == ACELP_30k20 ? 15 : brate == ACELP_30k40 ? 16 : brate == ACELP_32k ? 17 : brate == ACELP_48k ? 18 : brate == ACELP_64k ? 19 : brate == HQ_96k ? 20 : brate == HQ_128k ? 21 : brate == ACELP_28k30 ? 22 : brate == ACELP_28k50 ? 23 : brate == ACELP_29k50 ? 24 : brate == ACELP_29k70 ? 25 : -1 )

#define BRATE2IDX16k( brate )           ( brate == ACELP_8k00 ? 0 : brate == ACELP_14k80 || brate == ACELP_16k40 ? 1 : brate == ACELP_22k60 ? 2 : brate == ACELP_24k40 ? 3 : brate == ACELP_29k00 ? 4 : brate == ACELP_29k20 ? 5 : brate == ACELP_30k20 ? 6 : brate == ACELP_30k40 ? 7 : brate == ACELP_32k ? 8 : brate == ACELP_48k ? 9 : brate == ACELP_64k ? 10 : brate == ACELP_28k30 ? 11 : brate == ACELP_28k50 ? 12 : brate == ACELP_29k50 ? 13 : brate == ACELP_29k70 ? 14 : -1 )
#else
#define SIZE_BRATE_TBL                  11
#define SIZE_BRATE_INTERMED_TBL         22

#define BRATE2IDX( brate )              ( brate == ACELP_5k00 ? 0 : brate == ACELP_6k15 ? 1 : brate == ACELP_7k20 ? 2 : brate == ACELP_8k00 ? 3 : brate == ACELP_9k60 ? 4 : brate == ACELP_11k60 ? 5 : brate == ACELP_12k15 ? 6 : brate == ACELP_12k85 ? 7 : brate == ACELP_13k20 ? 8 : brate == ACELP_14k80 ? 9 : brate == ACELP_16k40 ? 10 : brate == ACELP_22k60 ? 11 : brate == ACELP_24k40 ? 12 : brate == ACELP_29k00 ? 13 : brate == ACELP_29k20 ? 14 : brate == ACELP_30k20 ? 15 : brate == ACELP_30k40 ? 16 : brate == ACELP_32k ? 17 : brate == ACELP_48k ? 18 : brate == ACELP_64k ? 19 : brate == HQ_96k ? 20 : brate == HQ_128k ? 21 : -1 )

#define BRATE2IDX16k( brate )           ( brate == ACELP_8k00 ? 0 : brate == ACELP_14k80 || brate == ACELP_16k40 ? 1 : brate == ACELP_22k60 ? 2 : brate == ACELP_24k40 ? 3 : brate == ACELP_29k00 ? 4 : brate == ACELP_29k20 ? 5 : brate == ACELP_30k20 ? 6 : brate == ACELP_30k40 ? 7 : brate == ACELP_32k ? 8 : brate == ACELP_48k ? 9 : brate == ACELP_64k ? 10 : -1 )
#endif

/* Combine parameters into a single index (used to retrieve number of bits from bit allocation tables) */
#define LSF_BIT_ALLOC_IDX( brate, ctype ) ( 6 * BRATE2IDX( brate ) + ( ctype ) )
@@ -252,7 +272,11 @@ enum{
/* Combine coder_type, bandwidth, formant sharpening flag, and channel-aware flag into one indice */
#define SIG2IND( ctype, bw, sf, ca_rf ) ( ctype | ( bw << 3 ) | ( sf << 6 ) | ( ca_rf << 7 ) )

#ifdef P_MSTD
#define MAX_ACELP_SIG                   112
#else
#define MAX_ACELP_SIG                   100
#endif

/*----------------------------------------------------------------------------------*
 * Bitstream indices
@@ -913,8 +937,13 @@ enum

#define N_LTP_GAIN_MEMS                     4

#ifdef P_MSTD
#define N_TCX_STARTLINE_NOISE_WB            12
#define N_TCX_STARTLINE_NOISE_SWB           10
#else
#define N_TCX_STARTLINE_NOISE_WB            11
#define N_TCX_STARTLINE_NOISE_SWB           9
#endif

/*----------------------------------------------------------------------------------*
 * TNS constants
@@ -2221,5 +2250,58 @@ enum
    VOIP_RTPDUMP
};

#ifdef P_MSTD

#define MSTD_PRI_BPS (ACELP_31k30)
#define MSTD_SEC_BPS (ACELP_16k40)
#define MSTD_TCX_PRI_BPS (24000)
#define MSTD_TCX_SEC_BPS (23700)

/*----------------------------------------------------------------------------------*/
#define IVAS_MSTD_SIGNALING_NBITS_SWITCH (2)
#define IVAS_MSTD_SIGNALING_NBITS_MODE (2)
#define IVAS_MSTD_SIGNALING_NBITS_ADD (IVAS_MSTD_SIGNALING_NBITS_MODE+IVAS_MSTD_SIGNALING_NBITS_SWITCH)


#define SWITCH_MSTD (0)
#define SWITCH_MDCT (1)
#define SWITCH_TO_MDCT (2)
#define SWITCH_TO_MSTD (3)

#define SWITCH_ENC_MSTD (0)
#define SWITCH_ENC_MDCT (1)
#define SWITCH_ENC_TO_MDCT (2)
#define SWITCH_ENC_TO_MSTD1 (3)
#define SWITCH_ENC_TO_MSTD0 (4)


/* #define MSTD_NOVA_NS                           ( 5000000L )   */                /* mixing overlap length */
#define MSTD_TRANS_NUM                         ( 640 )
#define MSTD_NOVA_NS                           ( 5000000L )                   /* mixing overlap length */
#define MSTD_MSOVA_NS                          ( 1000000L )                   /* gain, itd mixing overlap length */
#define MSTD_UPMIX_DELAY (ACELP_LOOK_NS + DELAY_FIR_RESAMPL_NS + DELAY_BWE_TOTAL_NS)

#define MSTD_ITD_FITDELTA (4)
#define MSTD_ITD_FITMAX (3)
#define MSTD_ITD_FILTLENG (13)
#define MSTD_ITD_FILTHLENG (7)
#define MSTD_ITD_FILTDNUM (23)
#define MSTD_ITD_ETHRE  ( 40.0f )
#define MSTD_LRG_ETHRE    ( 40.0f )
#define MSTD_LRG_MAX      ( 1.1f )
#define MSTD_LRG_MIN      ( 0.9f )

#define MSTD_HOLD_CNT    ( 10 )
#define MSTD_HOLD_MAXCNT ( 20 )

/* #define MSTD_MODE_DET_THRE_HI      ( 0.812368973f ) */
#define MSTD_MODE_DET_THRE_HI      ( 0.90f )
#define MSTD_MODE_DET_THRE_LO      ( 0.50f )
#define MSTD_MODE_DET_THRE_MSTDBOOST      ( 0.80f )
#define MSTD_MODE_DET_BETHRE	( 0.20f )


#endif

/* clang-format on */
#endif /* CNST_H */
Loading