Commit cd76cbd5 authored by Lauros Pajunen's avatar Lauros Pajunen
Browse files

Updates to OMASA coding and processing addressing quality issues at 48k and 128k 3-4 objects

parent aabaaa86
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1984,7 +1984,11 @@ ivas_error preview_indices(
            {
                st_ivas->ism_mode = ivas_omasa_ism_mode_select( total_brate, st_ivas->nchan_ism );

#ifdef OMASA_UPDATES
                if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
#else
                if ( st_ivas->ism_mode == ISM_MASA_MODE_ONE_OBJ )
#endif
                {
                    st_ivas->nchan_transport = 0;
                }
+11 −2
Original line number Diff line number Diff line
@@ -307,7 +307,7 @@ typedef enum
#define ISM_METADATA_VAD_FLAG_BITS              1
#define ISM_METADATA_FLAG_BITS                  2

#ifdef OMASA_BRATE
#ifdef MASA_AND_OBJECTS 
#define ISM_INACTIVE_IMP                        0 /* == ISM_NO_META */
#endif
#define ISM_NO_META                             0
@@ -315,7 +315,7 @@ typedef enum
#define ISM_MEDIUM_IMP                          2
#define ISM_HIGH_IMP                            3

#ifdef OMASA_BRATE
#ifdef MASA_AND_OBJECTS 
#define BRATE_ISM_INACTIVE                      2450 /* CoreCoder bitrate in ISM no meta / inactive frames */
#define BITS_ISM_INACTIVE                       ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC )
#endif
@@ -361,7 +361,12 @@ typedef enum
#ifdef MASA_AND_OBJECTS
    ,
    ISM_MASA_MODE_PARAM,                       /* parametric ISM mode for combined MASA ISM format          */
#ifdef OMASA_UPDATES
    ISM_MASA_MODE_MASA_ONE_OBJ,                /* MASA ISM mode when one object is encoded separately and remainder using MASA parameters */
    ISM_MASA_MODE_PARAM_ONE_OBJ,               /* MASA ISM mode when one object is encoded separately and remainder using parametric object model */
#else
    ISM_MASA_MODE_ONE_OBJ,                     /* MASA ISM mode when one object is encoded separarately     */
#endif
    ISM_MASA_MODE_DISC                         /* MASA ISM mode when all objects are encoded separarately   */
#endif
} ISM_MODE;
@@ -624,7 +629,11 @@ enum
    IND_STEREO_DFT_SIDEGAIN_FLAG,

    IND_STEREO_DFT_SIDEGAINS,
    #ifdef OMASA_UPDATES
        IND_STEREO_DFT_ITD_MODE = IND_STEREO_DFT_SIDEGAINS + 4 * STEREO_DFT_BAND_MAX + 120,
    #else
    IND_STEREO_DFT_ITD_MODE = IND_STEREO_DFT_SIDEGAINS + 4 * STEREO_DFT_BAND_MAX + 72,
    #endif
    
    IND_STEREO_DFT_ITD_HUFF,
    IND_STEREO_DFT_ITD_NEG,
+7 −15
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@

#define FRMS_PER_SECOND ( 1000000000 / FRAME_SIZE_NS )

#ifndef OMASA_BRATE
#ifndef MASA_AND_OBJECTS
#define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISm inactive frames */
#define BITS_ISM_INACTIVE  ( BRATE_ISM_INACTIVE / FRMS_PER_SECOND )
#endif
@@ -65,7 +65,7 @@
 * Convert bit-budget to bitrate
 *-------------------------------------------------------------------*/

#ifdef OMASA_BRATE
#ifdef MASA_AND_OBJECTS
void bitbudget_to_brate(
#else
static void bitbudget_to_brate(
@@ -142,7 +142,7 @@ ivas_error ivas_ism_config(
        }
    }

#ifdef OMASA_BRATE
#ifdef MASA_AND_OBJECTS
    /* decision about bitrates per channel */
    if ( combined_format_flag )
    {
@@ -185,17 +185,7 @@ ivas_error ivas_ism_config(
    /* count ISm common signaling bits */
    if ( hIsmMeta != NULL )
    {
#ifdef MASA_AND_OBJECTS
        nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS;
        if ( combined_format_flag == 0 )
        {
            /* the  bits for writing the number of objects are counted here for pure ISM modes */
            nb_bits_metadata[0] += num_obj;
        }
#else
        nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + num_obj;
#endif

        for ( ch = 0; ch < n_ISms; ch++ )
        {
            if ( hIsmMeta[ch]->ism_metadata_flag == 0 )
@@ -362,7 +352,7 @@ ivas_error ivas_ism_config(
            }
        }

#ifdef OMASA_BRATE
#ifdef MASA_AND_OBJECTS
        if ( combined_format_flag == 1 )
        {
            if ( diff > 0 )
@@ -390,12 +380,13 @@ ivas_error ivas_ism_config(
        bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms );
    }


#ifdef DEBUGGING
    if ( nb_bits_metadata != NULL )
    {
        int32_t tmpL;
        tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRMS_PER_SECOND;
#ifdef OMASA_BRATE
#ifdef MASA_AND_OBJECTS 
        if ( ism_total_brate != tmpL )
#else
        if ( sum_l( element_brate, n_ISms ) != tmpL )
@@ -403,6 +394,7 @@ ivas_error ivas_ism_config(
        {
            return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\nError: Mismatch in ISm bit-budget distribution. Exiting!\n" );
        }

    }
#endif

+13 −2
Original line number Diff line number Diff line
@@ -96,7 +96,11 @@ void ivas_masa_set_elements(
            if ( ivas_total_brate > MIN_BRATE_MDCT_STEREO )
            {
                *element_mode = IVAS_CPE_MDCT;
#ifdef OMASA_UPDATES
                if ( ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) && ( ivas_total_brate - ism_total_brate < MIN_BRATE_MDCT_STEREO ) )
#else
                if ( ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_ONE_OBJ ) && ( ivas_total_brate - ism_total_brate < MIN_BRATE_MDCT_STEREO ) )
#endif
                {
                    *element_mode = IVAS_CPE_DFT;
                }
@@ -115,7 +119,11 @@ void ivas_masa_set_elements(
        }
        hQMetaData->bits_frame_nominal = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC );
#ifdef MASA_AND_OBJECTS
#ifdef OMASA_UPDATES
        if ( ivas_format == MASA_ISM_FORMAT && ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_DISC ) )
#else
        if ( ivas_format == MASA_ISM_FORMAT && ( ism_mode == ISM_MASA_MODE_ONE_OBJ || ism_mode == ISM_MASA_MODE_DISC ) )
#endif
        {
            hQMetaData->bits_frame_nominal -= (int16_t) ( ism_total_brate / FRAMES_PER_SEC );
        }
@@ -494,12 +502,11 @@ void reconstruct_ism_ratios(
    }

    q_energy_ratio_ism[nchan_ism - 1] = 1.0f - sum;
#ifdef REDUCE_OMASA_META_BITS

    if ( q_energy_ratio_ism[nchan_ism - 1] < 0 )
    {
        q_energy_ratio_ism[nchan_ism - 1] = 0.0f;
    }
#endif

    return;
}
@@ -605,7 +612,11 @@ int32_t calculate_cpe_brate_MASA_ISM(
        k++;
    }

#ifdef OMASA_UPDATES
    if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
#else
    if ( ism_mode == ISM_MASA_MODE_ONE_OBJ )
#endif
    {
        cpe_brate = ivas_total_brate - sep_object_brate[k - 2][0]; /* take data from the first column */
    }
+80 −27
Original line number Diff line number Diff line
@@ -35,16 +35,13 @@
#include "ivas_cnst.h"
#include "ivas_prot.h"
#include "prot.h"
#ifdef REDUCE_OMASA_META_BITS
#include "ivas_rom_com.h"
#include <math.h>
#endif
#ifdef DEBUGGING
#include "debug.h"
#endif

#ifdef MASA_AND_OBJECTS
#ifdef OMASA_BRATE
/*---------------------------------------------------------------
 * Local constants
 *---------------------------------------------------------------*/
@@ -61,8 +58,7 @@
#define GAMMA_ISM_MEDIUM_IMP3 1.15f
#define GAMMA_ISM_HIGH_IMP3   1.3f

#ifdef TUNING_DISC_3_4obj
#ifdef FIX_4OBJ_128
#ifdef OMASA_UPDATES
#define GAMMA_ISM_LOW_IMP4    0.8f
#define GAMMA_ISM_MEDIUM_IMP4 1.0f
#define GAMMA_ISM_HIGH_IMP4   1.2f
@@ -71,8 +67,8 @@
#define GAMMA_ISM_MEDIUM_IMP4 0.8f
#define GAMMA_ISM_HIGH_IMP4   1.0f
#endif
#endif
#endif



/*---------------------------------------------------------------
 * ivas_omasa_ism_mode_select()
@@ -108,7 +104,11 @@ ISM_MODE ivas_omasa_ism_mode_select(
            }
            else if ( ivas_total_brate >= IVAS_32k )
            {
#ifdef OMASA_UPDATES
                ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ;
#else
                ism_mode = ISM_MASA_MODE_ONE_OBJ;
#endif
            }
            else
            {
@@ -116,36 +116,49 @@ ISM_MODE ivas_omasa_ism_mode_select(
            }
            break;
        case 3:
#ifdef TUNING_DISC_3_4obj
            if ( ivas_total_brate >= IVAS_96k )
#else
            if ( ivas_total_brate >= IVAS_128k )
#endif
            {
                ism_mode = ISM_MASA_MODE_DISC;
            }
            else if ( ivas_total_brate >= IVAS_64k )
            {
#ifdef OMASA_UPDATES
                ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ;
#else
                ism_mode = ISM_MASA_MODE_ONE_OBJ;
#endif
            }
#ifdef OMASA_UPDATES
            else if ( ivas_total_brate >= IVAS_32k )
            {
                ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ;
            }
#else
            else if ( ivas_total_brate >= IVAS_48k )
            {
                ism_mode = ISM_MASA_MODE_PARAM;
            }
#endif
            else
            {
                ism_mode = ISM_MODE_NONE;
            }
            break;
        case 4:
#ifdef TUNING_DISC_3_4obj
            if ( ivas_total_brate >= IVAS_128k )
#else
            if ( ivas_total_brate >= IVAS_160k )
#endif
            {
                ism_mode = ISM_MASA_MODE_DISC;
            }
#ifdef OMASA_UPDATES
            else if ( ivas_total_brate >= IVAS_64k )
            {
                ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ;
            }
            else if ( ivas_total_brate >= IVAS_32k )
            {
                ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ;
            }
#else
            else if ( ivas_total_brate >= IVAS_64k )
            {
                ism_mode = ISM_MASA_MODE_ONE_OBJ;
@@ -154,6 +167,7 @@ ISM_MODE ivas_omasa_ism_mode_select(
            {
                ism_mode = ISM_MASA_MODE_PARAM;
            }
#endif
            else
            {
                ism_mode = ISM_MODE_NONE;
@@ -165,7 +179,7 @@ ISM_MODE ivas_omasa_ism_mode_select(
}


#ifdef OMASA_BRATE

/*---------------------------------------------------------------
 * ivas_interformat_brate()
 *
@@ -178,7 +192,7 @@ int32_t ivas_interformat_brate(
    const int16_t nchan_ism,     /* i  : number of ISM channels */
    const int32_t element_brate, /* i  : element bitrate        */
    const int16_t ism_imp        /* i  : ISM importance flag    */
#ifdef FIX_4OBJ_128
#ifdef OMASA_UPDATES
    ,
    const int16_t limit_flag /* i  : flag to limit the bitrate increase */
#endif
@@ -195,17 +209,16 @@ int32_t ivas_interformat_brate(
    }
    else
    {
#ifdef TUNING_DISC_3_4obj
        if ( ism_mode == ISM_MASA_MODE_DISC && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate == 20000 ) ) ) /* this condition corresponds to the ivas_total_brate = 96000 and 3 objects */
        if ( ism_mode == ISM_MASA_MODE_DISC && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate <= 24000 ) 
            || ( nchan_ism == 2 && element_brate <= 11000 ) ) ) /* for border case in DISC mode */
        {

#ifdef FIX_4OBJ_128
            if ( limit_flag && ( nchan_ism == 4 && element_brate == 24000 ) )
#ifdef OMASA_UPDATES
            if ( (limit_flag == 1) && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate == 20000 ) || ( nchan_ism == 2 && element_brate <= 11000 ) ) )
            {
                return element_brate;
            }
#endif

            if ( ism_imp == ISM_LOW_IMP )
            {
                nBits = (int16_t) ( nBits * GAMMA_ISM_LOW_IMP4 );
@@ -213,15 +226,26 @@ int32_t ivas_interformat_brate(
            else if ( ism_imp == ISM_MEDIUM_IMP )
            {
                nBits = (int16_t) ( nBits * GAMMA_ISM_MEDIUM_IMP4 );
                if ( limit_flag == -1 )
                {
                    nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 );
                }
            }
            else /* ISM_HIGH_IMP */
            {
                nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 );
                if ( limit_flag == -1 )
                {
                    nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 );
                }
            }
        }
        else
#endif
#ifdef OMASA_UPDATES
            if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ||
#else
            if ( ism_mode == ISM_MASA_MODE_ONE_OBJ ||
#endif
                 ( ism_mode == ISM_MASA_MODE_DISC && element_brate == 9600 ) /* this condition corresponds to the ivas_total_brate = 24400 and 1 object */
            )
        {
@@ -319,9 +343,8 @@ void ivas_combined_format_brate_sanity(

    return;
}
#endif

#ifdef REDUCE_OMASA_META_BITS

/*---------------------------------------------------------------
 * bits_index_ism_ratio()
 *
@@ -414,7 +437,7 @@ void calculate_nbits_meta(
                priority[obj] = max_p;
            }
        }
        bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( (int16_t) ( priority[obj] * 1000.0f ) ) * 0.001f ) * 7 );
        bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( (int16_t) ( priority[obj] * 1000.0f ) ) * 0.001f ) * 6 );
    }

    return;
@@ -463,5 +486,35 @@ void ivas_get_stereo_panning_gains(

    return;
}

int16_t calculate_brate_limit_flag(int16_t * ism_imp, int16_t num_obj)
{
    int16_t n;
    int16_t brate_limit_flag;
    int16_t nzeros;

    brate_limit_flag = 0;
    nzeros = 0;
    for ( n = 0; n < num_obj; n++ )
    {
        brate_limit_flag += ism_imp[n];
        if ( ism_imp[n] == 0 )
        {
            nzeros++;
        }
    }
    if ( brate_limit_flag >= (int16_t) ( num_obj * 2.5f ) )
    {
        brate_limit_flag = 1;
    }
    else
    {
        if ( nzeros / (float) num_obj >= 0.5f )
        {
            brate_limit_flag = -1; /* there is no limitation, on the contrary */
        }
    }
    return brate_limit_flag;
}
#endif
#endif
Loading