Commit 8ef87da1 authored by vaclav's avatar vaclav
Browse files

Merge branch '532-md-coding-in-ism-inactive-frames' into 'main'

[non-BE] MD coding in ISM inactive frames

See merge request !733
parents d7679ff9 8dc103b0
Loading
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -336,7 +336,12 @@ typedef enum

#define ISM_NB_BITS_METADATA_NOMINAL            ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */

#ifdef FIX_532_ISM_MD_INACTIVE
#define ISM_METADATA_MD_FLAG_BITS               1 /* flag to distinguish between NULL metadata and low-rate ISM_NO_META class */
#define ISM_METADATA_INACTIVE_FLAG_BITS         1 /* flag to signal whether MD are sent in low-rate inactive frame */
#else
#define ISM_METADATA_VAD_FLAG_BITS              1
#endif
#define ISM_METADATA_FLAG_BITS                  2

#define ISM_NO_META                             0
@@ -390,6 +395,9 @@ typedef enum
#define ISM_Q_STEP_LOW                          (ISM_Q_STEP * 2)
#define ISM_Q_STEP_BORDER_LOW                   (ISM_Q_STEP_BORDER * 2)

#ifdef FIX_532_ISM_MD_INACTIVE
#define BRATE_ISM_INACTIVE                      2450 /* CoreCoder bitrate in ISM inactive frames */
#endif

typedef enum 
{
@@ -406,8 +414,14 @@ enum
    IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS,
    IND_ISM_EXTENDED_NDP_FLAG, 
    IND_ISM_METADATA_FLAG,
#ifdef FIX_532_ISM_MD_INACTIVE
    IND_ISM_MD_NULL_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS,
    IND_ISM_MD_INACTIVE_FLAG = IND_ISM_MD_NULL_FLAG + MAX_NUM_OBJECTS,
    IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_MD_INACTIVE_FLAG + MAX_NUM_OBJECTS,
#else
    IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS,
    IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS,
#endif
    IND_ISM_SCE_ID_DTX,
    IND_ISM_DTX_COH_SCA,

+73 −5
Original line number Diff line number Diff line
@@ -49,10 +49,14 @@
 * Local constants
 *-----------------------------------------------------------------------*/

#ifdef FIX_532_ISM_MD_INACTIVE
#define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC )
#else
#define FRMS_PER_SECOND ( 1000000000 / FRAME_SIZE_NS )

#define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM inactive frames */
#define BITS_ISM_INACTIVE  ( BRATE_ISM_INACTIVE / FRMS_PER_SECOND )
#endif

#define BETA_ISM_LOW_IMP    0.6f
#define BETA_ISM_MEDIUM_IMP 0.8f
@@ -74,7 +78,11 @@ static void bitbudget_to_brate(

    for ( i = 0; i < N; i++ )
    {
#ifdef FIX_532_ISM_MD_INACTIVE
        y[i] = FRAMES_PER_SEC * x[i];
#else
        y[i] = FRMS_PER_SECOND * x[i];
#endif
    }

    return;
@@ -93,7 +101,11 @@ ivas_error ivas_ism_config(
    const int16_t nchan_ism,                  /* i  : number of objects              */
    ISM_METADATA_HANDLE hIsmMeta[],           /* i/o: ISM metadata handles           */
    const int16_t ism_extended_metadata_flag, /* i  : extended metadata flag         */
#ifdef FIX_532_ISM_MD_INACTIVE
    const int16_t null_metadata_flag[MAX_NUM_OBJECTS], /* i  : NULL MD flag                   */
#else
    const int16_t localVAD[MAX_NUM_OBJECTS], /* i  : local VAD flag                 */
#endif
    const int16_t ism_imp[],   /* i  : ISM importance flags           */
    int32_t element_brate[],   /* o  : element bitrate per object     */
    int32_t total_brate[],     /* o  : total bitrate per object       */
@@ -120,12 +132,20 @@ ivas_error ivas_ism_config(
    {
        for ( ch = 0; ch < n_ISms; ch++ )
        {
#ifdef FIX_532_ISM_MD_INACTIVE
            ism_metadata_flag_global |= ism_imp[ch];
#else
            ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
#endif
        }
    }

    /* decision about bitrates per channel - constant during the session (at one ivas_total_brate) */
#ifdef FIX_532_ISM_MD_INACTIVE
    bits_ism = (int16_t) ( ism_total_brate / FRAMES_PER_SEC );
#else
    bits_ism = (int16_t) ( ism_total_brate / FRMS_PER_SECOND );
#endif
    set_s( bits_element, bits_ism / n_ISms, n_ISms );
    bits_element[n_ISms - 1] += bits_ism % n_ISms;
    bitbudget_to_brate( bits_element, element_brate, n_ISms );
@@ -146,10 +166,26 @@ ivas_error ivas_ism_config(

        for ( ch = 0; ch < n_ISms; ch++ )
        {
#ifdef FIX_532_ISM_MD_INACTIVE
            if ( null_metadata_flag[ch] )
            {
                nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS;
                nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS;
            }
            else
            {
                if ( ism_imp[ch] == ISM_NO_META )
                {
                    nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS;
                    nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS;
                }
            }
#else
            if ( hIsmMeta[ch]->ism_metadata_flag == 0 )
            {
                nb_bits_metadata[0] += ISM_METADATA_VAD_FLAG_BITS;
            }
#endif
        }
    }

@@ -175,7 +211,11 @@ ivas_error ivas_ism_config(
        diff = 0;
        for ( ch = 0; ch < n_ISms; ch++ )
        {
#ifdef FIX_532_ISM_MD_INACTIVE
            if ( ism_imp[ch] == ISM_NO_META )
#else
            if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 )
#endif
            {
                diff += bits_CoreCoder[ch] - BITS_ISM_INACTIVE;
                bits_CoreCoder[ch] = BITS_ISM_INACTIVE;
@@ -212,18 +252,34 @@ ivas_error ivas_ism_config(
        {
            int16_t limit;

#ifdef FIX_532_ISM_MD_INACTIVE
            limit = MIN_BRATE_SWB_BWE / FRAMES_PER_SEC;
#else
            limit = MIN_BRATE_SWB_BWE / FRMS_PER_SECOND;
#endif
            if ( element_brate[ch] < MIN_BRATE_SWB_STEREO ) /* replicate function set_bw() -> check the coded audio band-width */
            {
#ifdef FIX_532_ISM_MD_INACTIVE
                limit = MIN_BRATE_WB_BWE / FRAMES_PER_SEC;
#else
                limit = MIN_BRATE_WB_BWE / FRMS_PER_SECOND;
#endif
            }
            else if ( element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */
            {
                /*limit = SCE_CORE_16k_LOW_LIMIT;*/
#ifdef FIX_532_ISM_MD_INACTIVE
                limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRAMES_PER_SEC;
#else
                limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRMS_PER_SECOND;
#endif
            }

#ifdef FIX_532_ISM_MD_INACTIVE
            if ( ism_imp[ch] == ISM_NO_META )
#else
            if ( ism_imp[ch] == ISM_NO_META && localVAD[ch] == 0 )
#endif
            {
                tmp = BITS_ISM_INACTIVE;
            }
@@ -270,10 +326,18 @@ ivas_error ivas_ism_config(
        diff = 0;
        for ( ch = 0; ch < n_ISms; ch++ )
        {
#ifdef FIX_532_ISM_MD_INACTIVE
            limit_high = IVAS_512k / FRAMES_PER_SEC;
#else
            limit_high = IVAS_512k / FRMS_PER_SECOND;
#endif
            if ( element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */
            {
#ifdef FIX_532_ISM_MD_INACTIVE
                limit_high = ACELP_12k8_HIGH_LIMIT / FRAMES_PER_SEC;
#else
                limit_high = ACELP_12k8_HIGH_LIMIT / FRMS_PER_SECOND;
#endif
            }

            tmp = (int16_t) min( bits_CoreCoder[ch], limit_high );
@@ -316,7 +380,11 @@ ivas_error ivas_ism_config(
    if ( nb_bits_metadata != NULL )
    {
        int32_t tmpL;
#ifdef FIX_532_ISM_MD_INACTIVE
        tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRAMES_PER_SEC;
#else
        tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRMS_PER_SECOND;
#endif
        if ( sum_l( element_brate, n_ISms ) != tmpL )
        {
            return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\nError: Mismatch in ISM bit-budget distribution. Exiting!\n" );
+4 −0
Original line number Diff line number Diff line
@@ -873,7 +873,11 @@ ivas_error ivas_ism_config(
    const int16_t nchan_ism,                                    /* i  : number of objects                           */
    ISM_METADATA_HANDLE hIsmMeta[],                             /* i/o: ISM metadata handles                        */
    const int16_t ism_extended_metadata_flag,                   /* i  : extended metadata flag                      */
#ifdef FIX_532_ISM_MD_INACTIVE
    const int16_t null_metadata_flag[MAX_NUM_OBJECTS],          /* i  : NULL MD flag                                */
#else
    const int16_t localVAD[MAX_NUM_OBJECTS],                    /* i  : local VAD flag                              */
#endif
    const int16_t ism_imp[],                                    /* i  : ISM importance flags                        */
    int32_t element_brate[],                                    /* o  : element bitrate per object                  */
    int32_t total_brate[],                                      /* o  : total bitrate per object                    */
+2 −0
Original line number Diff line number Diff line
@@ -183,6 +183,8 @@
#define ISM_25k6_HZ_CORE                                /* VA: issue 540: 1ISM 48 kbps - change ACELP/TCX 16 kHz core to TCX only 25.6 kHz core */
#define FIX_528_ISM_MD_FILE_TOO_SHORT                   /* VA: issue 528: ISM Metadata file too short  */

#define FIX_532_ISM_MD_INACTIVE                         /* VA: issue 532: improve MD coding in ISM inactive frames */

/* ################## End DEVELOPMENT switches ######################### */
/* clang-format on */

+57 −2
Original line number Diff line number Diff line
@@ -168,7 +168,12 @@ ivas_error ivas_ism_metadata_dec(
    uint16_t i, bstr_meta[MAX_BITS_METADATA], *bstr_orig;
    ISM_METADATA_HANDLE hIsmMetaData;
    int16_t nchan_transport_prev, ism_metadata_flag_global;
#ifdef FIX_532_ISM_MD_INACTIVE
    int16_t null_metadata_flag[MAX_NUM_OBJECTS];
    int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS];
#else
    int16_t localVAD[MAX_NUM_OBJECTS];
#endif
    int16_t ism_imp[MAX_NUM_OBJECTS];
    int16_t nbands, nblocks;
    int16_t md_diff_flag[MAX_NUM_OBJECTS];
@@ -176,7 +181,6 @@ ivas_error ivas_ism_metadata_dec(

    push_wmops( "ism_meta_dec" );


    /* initialization */
    st0 = hSCE[0]->hCoreCoder[0];
    ism_metadata_flag_global = 0;
@@ -188,6 +192,10 @@ ivas_error ivas_ism_metadata_dec(
    st0->next_bit_pos = 0;
    ism_extmeta_bitstream = 0;
    non_diegetic_flag_global = 0;
#ifdef FIX_532_ISM_MD_INACTIVE
    set_s( null_metadata_flag, 0, nchan_ism );
    set_s( lowrate_metadata_flag, 0, nchan_ism );
#endif

    /* reverse the bitstream for easier reading of indices */
    for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ )
@@ -233,6 +241,7 @@ ivas_error ivas_ism_metadata_dec(
                non_diegetic_flag_global = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS );
            }
        }

        /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */
        if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */
        {
@@ -249,7 +258,7 @@ ivas_error ivas_ism_metadata_dec(
            }
        }

        /* Read ISM present flags (one per object) */
        /* Read ISM metadata flags (one per object) */
        for ( ch = 0; ch < *nchan_transport; ch++ )
        {
            ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS );
@@ -272,6 +281,39 @@ ivas_error ivas_ism_metadata_dec(
            ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
        }

#ifdef FIX_532_ISM_MD_INACTIVE
        /* read ISM_NO_META class signalling */
        if ( ism_mode == ISM_MODE_DISC )
        {
            for ( ch = 0; ch < *nchan_transport; ch++ )
            {
                if ( ism_imp[ch] == ISM_NO_META )
                {
                    /* low-rate ISM_NO_META frame */
                    null_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS );
                }
            }

            for ( ch = 0; ch < *nchan_transport; ch++ )
            {
                if ( ism_imp[ch] == ISM_NO_META )
                {
                    if ( null_metadata_flag[ch] )
                    {
                        /* read the true ISM class */
                        ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS );
                    }
                    else
                    {
                        /* read presence of MD in low-rate ISM_NO_META frame flag */
                        lowrate_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS );

                        ism_metadata_flag_global |= lowrate_metadata_flag[ch];
                    }
                }
            }
        }
#else
        /* read VAD flag */
        for ( ch = 0; ch < *nchan_transport; ch++ )
        {
@@ -284,6 +326,7 @@ ivas_error ivas_ism_metadata_dec(
                localVAD[ch] = 1;
            }
        }
#endif

        if ( ism_metadata_flag_global )
        {
@@ -310,7 +353,11 @@ ivas_error ivas_ism_metadata_dec(
                flag_abs_orientation = 0;
                flag_abs_radius = 0;

#ifdef FIX_532_ISM_MD_INACTIVE
                if ( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] )
#else
                if ( hIsmMeta[ch]->ism_metadata_flag )
#endif
                {
                    if ( non_diegetic_flag_global )
                    {
@@ -478,7 +525,11 @@ ivas_error ivas_ism_metadata_dec(

    if ( !bfi )
    {
#ifdef FIX_532_ISM_MD_INACTIVE
        if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK )
#else
        if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK )
#endif
        {
            return error;
        }
@@ -490,7 +541,11 @@ ivas_error ivas_ism_metadata_dec(
            hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0;
            if ( ism_mode == ISM_MODE_DISC )
            {
#ifdef FIX_532_ISM_MD_INACTIVE
                if ( ism_imp[ch] == ISM_NO_META )
#else
                if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global )
#endif
                {
                    hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1;
                }
Loading