Commit 2b63ba45 authored by Dominik Weckbecker's avatar Dominik Weckbecker 💬
Browse files

detect mono input in SBA encoder and signal this to the decoder in the bitstream

parent e94f0289
Loading
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -3399,6 +3399,9 @@ void ivas_dirac_param_est_enc(
    DIRAC_ENC_HANDLE hDirAC, 
    IVAS_QDIRECTION *q_direction, 
    const uint8_t useLowerRes, 
#ifdef FIX_527_SBA_MONO_INPUT
    int16_t *dirac_mono_flag,
#endif
    float data_f[][L_FRAME48k], 
    float **pp_fr_real,
    float **pp_fr_imag,
@@ -5578,6 +5581,10 @@ void computeReferencePower_enc(
#endif
    ,
    const int16_t nchan_ana                                     /* i  : number of analysis channels                     */
#ifdef FIX_527_SBA_MONO_INPUT
	,
	int16_t *dirac_mono_flag
#endif
);

ivas_error ivas_mono_dmx_renderer_open(
+3 −0
Original line number Diff line number Diff line
@@ -546,6 +546,9 @@ typedef struct ivas_masa_qmetadata_frame_struct
    int16_t metadata_max_bits; /* maximum allowed number of bits for metadata per frame */
    uint8_t useLowerRes;
    uint8_t useLowerBandRes;
#ifdef FIX_527_SBA_MONO_INPUT
    int16_t dirac_mono_flag;
#endif
    IVAS_SURROUND_COHERENCE_BAND_DATA *surcoh_band_data;

    /* Additional helper values to include all data required for writing to output file */
+2 −0
Original line number Diff line number Diff line
@@ -234,6 +234,8 @@
#define FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER /* ..\apps\renderer.c(240):  .... (todo: implementation)",*/
#define REMOVE_OBS_CODE                                 /* FhG: Remove unnecessary assignement after LFE cleanup (Issue #451)*/

#define FIX_527_SBA_MONO_INPUT                          /* FhG: fix issue 527, artifacts in mono signals coded in SBA mode */

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

+16 −0
Original line number Diff line number Diff line
@@ -1783,6 +1783,11 @@ void ivas_dirac_dec_read_BS(
        b = st->bit_stream[( st->next_bit_pos )--];
        ( *nb_bits )++;

#ifdef FIX_527_SBA_MONO_INPUT
        hQMetaData->dirac_mono_flag = st->bit_stream[( st->next_bit_pos )--];
        ( *nb_bits )++;
#endif

#ifndef SBA_MODE_CLEAN_UP
        if ( sba_mode != SBA_MODE_SPAR )
        {
@@ -1945,6 +1950,17 @@ void ivas_dirac_dec_read_BS(

    if ( hDirAC != NULL )
    {
#ifdef FIX_527_SBA_MONO_INPUT
        printf( "%d\n", hQMetaData->dirac_mono_flag );
        if ( hQMetaData->dirac_mono_flag )
        {
            for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
            {
                set_zero( hQMetaData->q_direction[0].band_data[b].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES );
                set_zero( hQMetaData->q_direction[0].band_data[b].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES );
            }
        }
#endif
#ifndef SBA_MODE_CLEAN_UP
        ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode,
                                 hodirac_flag,
+67 −2
Original line number Diff line number Diff line
@@ -588,7 +588,24 @@ void ivas_dirac_enc(
    int16_t i, j, b, i_ts;
    push_wmops( "ivas_dirac_enc" );

    ivas_dirac_param_est_enc( hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, ivas_format, hodirac_flag, hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS );
#ifdef FIX_527_SBA_MONO_INPUT
    hQMetaData->dirac_mono_flag = 0;
#endif

    ivas_dirac_param_est_enc(
        hDirAC,
        hQMetaData->q_direction,
        hQMetaData->useLowerRes,
#ifdef FIX_527_SBA_MONO_INPUT
        &hQMetaData->dirac_mono_flag,
#endif
        data_f,
        ppIn_FR_real,
        ppIn_FR_imag,
        input_frame,
        ivas_format,
        hodirac_flag,
        hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS );

    if ( hQMetaData->q_direction->cfg.nbands > 0 )
    {
@@ -599,6 +616,11 @@ void ivas_dirac_enc(
            /* WB 4TC mode bit  : disable for now*/
            push_next_indice( hMetaData, 0, 1 );

#ifdef FIX_527_SBA_MONO_INPUT
            /* flag to indicate a mono input signal */
            push_next_indice( hMetaData, hQMetaData->dirac_mono_flag, 1 );
#endif

            ivas_qmetadata_enc_encode( hMetaData, hQMetaData, hodirac_flag );
        }
        else
@@ -636,9 +658,26 @@ void ivas_dirac_enc(
            /* 1 bit to indicate mode MD coding : temp solution*/
            push_next_indice( hMetaData, 1, 1 );

#ifdef FIX_527_SBA_MONO_INPUT
            /* flag to indicate a mono input signal */
            push_next_indice( hMetaData, hQMetaData->dirac_mono_flag, 1 );
#endif

            /* encode SID parameters */
            ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT );
        }
#ifdef FIX_527_SBA_MONO_INPUT
        if ( hQMetaData->dirac_mono_flag )
        {
            for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ )
            {
                for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ )
                {
                    hQMetaData->q_direction[0].band_data[b].energy_ratio[i_ts] = 1.0f;
                }
            }
        }
#endif

        for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ )
        {
@@ -699,6 +738,10 @@ void computeReferencePower_enc(
#endif
    ,
    const int16_t nchan_ana /* i  : number of analysis channels     */
#ifdef FIX_527_SBA_MONO_INPUT
    ,
    int16_t *dirac_mono_flag
#endif
)
{
    int16_t brange[2];
@@ -706,6 +749,13 @@ void computeReferencePower_enc(

    float reference_power_W[DIRAC_MAX_NBANDS];

#ifdef FIX_527_SBA_MONO_INPUT
    if ( dirac_mono_flag != NULL )
    {
        *dirac_mono_flag = 1;
    }
#endif

    for ( i = 0; i < num_freq_bands; i++ )
    {
        brange[0] = band_grouping[i + enc_param_start_band];
@@ -727,6 +777,13 @@ void computeReferencePower_enc(
                reference_power[i] += ( Cldfb_RealBuffer[ch_idx][j] * Cldfb_RealBuffer[ch_idx][j] ) + ( Cldfb_ImagBuffer[ch_idx][j] * Cldfb_ImagBuffer[ch_idx][j] );
            }
        }

#ifdef FIX_527_SBA_MONO_INPUT
        if ( reference_power[i] - reference_power_W[i] > EPSILON && dirac_mono_flag != NULL )
        {
            *dirac_mono_flag = 0;
        }
#endif
    }

    v_multc( reference_power, 0.5f, reference_power, num_freq_bands );
@@ -756,6 +813,9 @@ void ivas_dirac_param_est_enc(
    DIRAC_ENC_HANDLE hDirAC,
    IVAS_QDIRECTION *q_direction,
    const uint8_t useLowerRes,
#ifdef FIX_527_SBA_MONO_INPUT
    int16_t *dirac_mono_flag,
#endif
    float data_f[][L_FRAME48k],
    float **pp_fr_real,
    float **pp_fr_imag,
@@ -879,7 +939,12 @@ void ivas_dirac_param_est_enc(
                ivas_format,
                hodirac_flag ? 0 : 1,
#endif
                FOA_CHANNELS );
                FOA_CHANNELS
#ifdef FIX_527_SBA_MONO_INPUT
                ,
                dirac_mono_flag
#endif
            );

            computeIntensityVector_enc(
                hDirAC,
Loading