Commit be3b00f0 authored by Tapani Pihlajakuja's avatar Tapani Pihlajakuja
Browse files

Implements downmix gain scaling and reversion for McMASA and OMASA.

parent 93c0cd8d
Loading
Loading
Loading
Loading
Loading
+62 −0
Original line number Diff line number Diff line
@@ -1776,6 +1776,68 @@ typedef enum

} STEREO_DMX_EVS_PRC;

#endif


/*----------------------------------------------------------------------------------*
 * Static downmix scaling factors
 *----------------------------------------------------------------------------------*/

#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA
/* McMASA */
/* 5.1 */
#define ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static     ( 2.44948983f )
#define ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static )

/* 7.1 */
#define ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static     ( 2.82842708f )
#define ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static )

/* 5.1+2 */
#define ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static     ( 2.82842708f )
#define ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static )

/* 5.1+4 */
#define ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static     ( 3.1622777f )
#define ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static )

#define ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static     ( 2.44948983f )
#define ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static )

#define ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static     ( 2.0f )
#define ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static )

/* 7.1+4 */
#define ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static     ( 3.46410155f )
#define ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static )

#define ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static     ( 2.64575124f )
#define ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static )

#define ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static     ( 2.23606801f )
#define ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static )

/* Separated channel */
#define ivas_mcmasa_dmx_scal_fac_sep_chan_static       ( 2.0f )
#define ivas_mcmasa_dmx_scal_fac_sep_chan_static_inv   ( 1.0f / ivas_mcmasa_dmx_scal_fac_sep_chan_static )

#endif

#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA
/* OMASA */
/* Approximates that 2 channels sum coherently and rest are incoherent */
#define ivas_omasa_dmx_scal_fac_2ch_static     ( 2.0f )
#define ivas_omasa_dmx_scal_fac_2ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_2ch_static )

#define ivas_omasa_dmx_scal_fac_3ch_static     ( 2.23606801f )
#define ivas_omasa_dmx_scal_fac_3ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_3ch_static )

#define ivas_omasa_dmx_scal_fac_4ch_static     ( 2.44948983f )
#define ivas_omasa_dmx_scal_fac_4ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_4ch_static )

#define ivas_omasa_dmx_scal_fac_5ch_static     ( 2.64575124f )
#define ivas_omasa_dmx_scal_fac_5ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_5ch_static )

#endif
/* clang-format on */
/* IVAS_CNST_H  */
+16 −0
Original line number Diff line number Diff line
@@ -5362,6 +5362,14 @@ ivas_error ivas_mcmasa_dec_reconfig(
    Decoder_Struct *st_ivas                                     /* i/o: IVAS decoder handle                              */
);

#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA
void ivas_mcmasa_gain_umx(
    Decoder_Struct *st_ivas,                                   /* i/o: IVAS decoder structure                            */
    float *data_f[],                                           /* i/o: output signals                                    */
    const int16_t output_frame                                 /* i  : output frame length per channel                   */
);

#endif
void ivas_mcmasa_setNumTransportChannels(
    int16_t* nchan_transport,                                   /* o  : Pointer to number of transport channels to be set */
    int16_t* element_mode,                                      /* o  : Pointer to element mode to be set                 */
@@ -5858,6 +5866,14 @@ void ivas_omasa_modify_masa_energy_ratios(
    float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_MAXIMUM_CODING_SUBBANDS]
);

#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA
void ivas_omasa_gain_umx(
    Decoder_Struct *st_ivas,                                   /* i/o: IVAS decoder structure                   */
    float *data_f[],                                           /* i/o: output signals                           */
    const int16_t output_frame                                 /* i  : output frame length per channel          */
);

#endif

/*----------------------------------------------------------------------------------*
 * TD Binaural Object renderer
+3 −0
Original line number Diff line number Diff line
@@ -195,6 +195,9 @@

#define NONE_BE_FIX_816_LFE_PLC_FLOAT                   /* DLB: issue 816: reduce required precision to float for LFE-PLC*/
#define NONBE_FIX_1220_OMASA_JBM_EXT_USAN                     /* Nokia: fix issue 1220 OMASA EXT JBM USAN, also fix similar cases of free to avoid future problems */
#define NONBE_FIX_1165_STATIC_SCAL_MCMASA               /* Nok: add static scaling to McMASA DMX */
#define NONBE_FIX_1165_STATIC_SCAL_OMASA                /* Nok: add static scaling to OMASA DMX */


#define NONBE_FIX_1165_STATIC_SCAL_PARAMMC              /* FhG: add static scaling to ParamMC DMX */

+23 −0
Original line number Diff line number Diff line
@@ -308,6 +308,14 @@ ivas_error ivas_jbm_dec_tc(

        if ( st_ivas->ivas_format == MASA_FORMAT )
        {
#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA
            if ( st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT )
            {
                /* Revert scaling done to the downmix in the encoder */
                ivas_omasa_gain_umx( st_ivas, p_output, output_frame );
            }

#endif
            ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped );

            /* external output */
@@ -390,6 +398,11 @@ ivas_error ivas_jbm_dec_tc(
            hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
        }

#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA
        /* Revert scaling done to the downmix in the encoder */
        ivas_omasa_gain_umx( st_ivas, p_output, output_frame );

#endif
        if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
        {
            ivas_ism_mono_dmx( st_ivas, p_output, output_frame );
@@ -682,6 +695,11 @@ ivas_error ivas_jbm_dec_tc(
                    return error;
                }

#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA
                /* Revert scaling done to the downmix in the encoder */
                ivas_mcmasa_gain_umx( st_ivas, p_output, output_frame );

#endif
                /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */
                if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 ||
                     output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 ||
@@ -711,6 +729,11 @@ ivas_error ivas_jbm_dec_tc(
                        return error;
                    }
                }

#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA
                /* Revert scaling done to the downmix in the encoder */
                ivas_mcmasa_gain_umx( st_ivas, p_output, output_frame );
#endif
            }

            if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */
+82 −0
Original line number Diff line number Diff line
@@ -98,3 +98,85 @@ ivas_error ivas_mcmasa_dec_reconfig(

    return error;
}

#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA

/* Gain decoded signals to match the gains applied to the downmix signals in the encoder */
void ivas_mcmasa_gain_umx(
    Decoder_Struct *st_ivas,   /* i/o: IVAS decoder structure          */
    float *data_f[],           /* i/o: output signals                  */
    const int16_t output_frame /* i  : output frame length per channel */
)
{
    float gain;
    int16_t nchan_transport;
    uint8_t separateChannelEnabled;

    nchan_transport = st_ivas->nchan_transport;
    separateChannelEnabled = st_ivas->hOutSetup.separateChannelEnabled;
    gain = 1.0f;

    if ( separateChannelEnabled )
    {
        /* Separate channel gaining */
        v_multc( data_f[2], ivas_mcmasa_dmx_scal_fac_sep_chan_static, data_f[2], output_frame );

        /* Downmix channels gaining */
        if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1_4 )
        {
            gain = ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static;
        }
        else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1_4 )
        {
            gain = ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static;
        }

        v_multc( data_f[0], gain, data_f[0], output_frame );
        v_multc( data_f[1], gain, data_f[1], output_frame );
    }
    else
    {
        if ( nchan_transport == 2 )
        {
            if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1_4 )
            {
                gain = ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static;
            }
            else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1_4 )
            {
                gain = ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static;
            }

            v_multc( data_f[0], gain, data_f[0], output_frame );
            v_multc( data_f[1], gain, data_f[1], output_frame );
        }
        else
        {
            if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1 )
            {
                gain = ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static;
            }
            else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1 )
            {
                gain = ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static;
            }
            else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1_2 )
            {
                gain = ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static;
            }
            else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1_4 )
            {
                gain = ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static;
            }
            else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1_4 )
            {
                gain = ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static;
            }

            v_multc( data_f[0], gain, data_f[0], output_frame );
        }
    }

    return;
}
#endif
Loading