Commit 15499265 authored by Jan Kiene's avatar Jan Kiene
Browse files

Merge branch '967-ism-mono-downmix-accumulating-energies' into 'main'

[Non-BE] Resolve "ISM mono downmix accumulating energies"

See merge request !1332
parents 788c16aa 47d5dd36
Loading
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -5469,7 +5469,11 @@ void ivas_mono_dmx_renderer_close(
    MONO_DOWNMIX_RENDERER_HANDLE *hMonoDmxRenderer              /* i/ i/o: Mono downmix structure                       */
);

#ifdef NONBE_FIX_967_ISM_MONO_DMX
void ivas_ism_mono_dmx(
#else
void ivas_mono_downmix_render_passive(
#endif
    Decoder_Struct *st_ivas,                                    /* i/o: IVAS decoder structure                                */
    float *output_f[],                                          /* i/o: synthesized core-coder transport channels/mono output */
    const int16_t output_frame                                  /* i  : output frame length                                   */
+1 −0
Original line number Diff line number Diff line
@@ -175,6 +175,7 @@
#define NONBE_FIX_935_EARLY_REFLECTIONS_WRONG_ORDER           /* Qualcomm: issue 953: fix order or ER channels in LC mode*/
#define NONBE_FIX_949_MC_5MS_FRAMING                          /* Dlb: issue 949: fix for issue 949, distorted output in MC mode with 5ms framing*/
#define NONBE_FIX_952_MC_PARAMUPMIX_5MS                       /* Dlb : issue 952 : Differences between 5ms and 20ms rendering for ParamUpmix*/
#define NONBE_FIX_967_ISM_MONO_DMX                            /* FhG: issue 967: accumulating energies in ISM mono DMX */
#define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX      /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/
#define NONBE_FIX_977_OSBA_GAIN_MISMATCH                      /* Dlb : issue 977 : Output gain mismatch for different bit rates in OSBA */

+12 −0
Original line number Diff line number Diff line
@@ -196,7 +196,11 @@ ivas_error ivas_jbm_dec_tc(

        if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
        {
#ifdef NONBE_FIX_967_ISM_MONO_DMX
            ivas_ism_mono_dmx( st_ivas, p_output, output_frame );
#else
            ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame );
#endif
        }
        else if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) )
        {
@@ -388,7 +392,11 @@ ivas_error ivas_jbm_dec_tc(

        if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
        {
#ifdef NONBE_FIX_967_ISM_MONO_DMX
            ivas_ism_mono_dmx( st_ivas, p_output, output_frame );
#else
            ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame );
#endif
        }
        else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
        {
@@ -512,7 +520,11 @@ ivas_error ivas_jbm_dec_tc(
        }
        else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX && st_ivas->ism_mode == ISM_SBA_MODE_DISC )
        {
#ifdef NONBE_FIX_967_ISM_MONO_DMX
            ivas_ism_mono_dmx( st_ivas, p_output, output_frame );
#else
            ivas_mono_downmix_render_passive( st_ivas, p_output, output_frame );
#endif

            /* add W */
            for ( n = 0; n < nchan_out; n++ )
+36 −4
Original line number Diff line number Diff line
@@ -48,7 +48,9 @@

#define DOWNMIX_ALPHA    0.95f /* Smoothing coefficient */
#define DOWNMIX_MAX_GAIN 4.0f  /* Maximum allowed gain  */
#define MONO_DOWNMIX_RENDERER_MAX_INPUT_CHANS 4
#ifndef NONBE_FIX_967_ISM_MONO_DMX
#define MONO_DOWNMIX_RENDERER_MAX_INPUT_CHANS 4 // FhG esr: this seems to be obsolete; not related to issue 967
#endif


/*-------------------------------------------------------------------------
@@ -99,12 +101,16 @@ void ivas_mono_dmx_renderer_close(


/*-------------------------------------------------------------------------
 * ivas_mono_downmix_render_passive()
 * ivas_ism_mono_dmx()
 *
 * Downmix process
 *------------------------------------------------------------------------*/

#ifdef NONBE_FIX_967_ISM_MONO_DMX
void ivas_ism_mono_dmx(
#else
void ivas_mono_downmix_render_passive(
#endif
    Decoder_Struct *st_ivas,   /* i/o: IVAS decoder structure                                */
    float *output_f[],         /* i/o: synthesized core-coder transport channels/mono output */
    const int16_t output_frame /* i  : output frame length                                   */
@@ -112,6 +118,9 @@ void ivas_mono_downmix_render_passive(
{
    int16_t i, j, numInputChannels;
    float proto_signal[L_FRAME48k], eq;
#ifdef NONBE_FIX_967_ISM_MONO_DMX
    float inputEnergy_local, protoEnergy_local;
#endif
    MONO_DOWNMIX_RENDERER_HANDLE hDownmix;

    numInputChannels = st_ivas->nSCE;
@@ -134,6 +143,10 @@ void ivas_mono_downmix_render_passive(

    hDownmix = st_ivas->hMonoDmxRenderer;
    set_zero( proto_signal, output_frame );
#ifdef NONBE_FIX_967_ISM_MONO_DMX
    inputEnergy_local = 0;
    protoEnergy_local = 0;
#endif

    /* Compute the Proto Signal */
    for ( i = 0; i < numInputChannels; i++ )
@@ -141,6 +154,18 @@ void ivas_mono_downmix_render_passive(
        v_add( output_f[i], proto_signal, proto_signal, output_frame );
    }

#ifdef NONBE_FIX_967_ISM_MONO_DMX
    /* compute the input energy, proto energy */
    for ( i = 0; i < output_frame; i++ )
    {
        protoEnergy_local += proto_signal[i] * proto_signal[i];

        for ( j = 0; j < numInputChannels; j++ )
        {
            inputEnergy_local += ( output_f[j][i] * output_f[j][i] );
        }
    }
#else
    /* compute the input energy, proto energy after smoothing */
    hDownmix->inputEnergy *= DOWNMIX_ALPHA;
    hDownmix->protoEnergy *= DOWNMIX_ALPHA;
@@ -153,6 +178,13 @@ void ivas_mono_downmix_render_passive(
            hDownmix->inputEnergy += ( output_f[j][i] * output_f[j][i] );
        }
    }
#endif
#ifdef NONBE_FIX_967_ISM_MONO_DMX
    hDownmix->inputEnergy *= DOWNMIX_ALPHA;
    hDownmix->protoEnergy *= DOWNMIX_ALPHA;
    hDownmix->inputEnergy += ( 1.0f - DOWNMIX_ALPHA ) * inputEnergy_local;
    hDownmix->protoEnergy += ( 1.0f - DOWNMIX_ALPHA ) * protoEnergy_local;
#endif

    /* compute the eq factor */
    eq = min( DOWNMIX_MAX_GAIN, sqrtf( hDownmix->inputEnergy / ( EPSILON + hDownmix->protoEnergy ) ) );
+1 −1
Original line number Diff line number Diff line
@@ -402,7 +402,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1

// 3 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, EXT out
../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit
../IVAS_dec MONO 48 bit testv/stv3ISM48s.48000_48-48_MONO.tst
../IVAS_dec EXT 48 bit testv/stv3ISM48s.48000_48-48_MONO.tst

// 3 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, EXT out
../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 64000 48 testv/stv3ISM48s.wav bit
Loading