Commit 4f0e7cdf authored by Lauros Pajunen's avatar Lauros Pajunen
Browse files

Merge branch '566-masa-2dir-metadata-coding-at-384-encodes-wrong-data' into 'main'

[non-BE] Resolve "MASA 2dir metadata coding at 384 encodes wrong data"

See merge request !763
parents d7e97f1f ac3861bc
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -165,6 +165,7 @@
#define ISM_FB                                          /* issue 556: change SWB to FB coding in 1ISM at 24.4 kbps */
#define FIX_558_PLC_DISCONT                             /* FhG: issue 558: fix discontinuities in DFT Stereo when switching from TCX concealment to ACELP */
#define FIX_564                                         /* Nokia: Issue 564: Fix gains in JBM path for SBA with parametric binaural renderer */
#define FIX_566_2DIR_MASA_384K                          /* Nokia: Issued 566:  Bugfix in 384k MASA metadata encoding of second direction */

/* ################## End DEVELOPMENT switches ######################### */
/* clang-format on */
+20 −0
Original line number Diff line number Diff line
@@ -916,6 +916,25 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512(
    }
    if ( hQMetaData->no_directions == 2 )
    {
#ifdef FIX_566_2DIR_MASA_384K
        float ratioSum;
        for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ )
        {
            for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ )
            {
                hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 1.0f - diffuseness_reconstructions_hr[hQMetaData->q_direction[1].band_data[b].energy_ratio_index[m]];

                /* Scale energy ratios that sum to over one */
                ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[m] + hQMetaData->q_direction[1].band_data[b].energy_ratio[m];

                if ( ratioSum > 1.0f )
                {
                    hQMetaData->q_direction[0].band_data[b].energy_ratio[m] /= ratioSum;
                    hQMetaData->q_direction[1].band_data[b].energy_ratio[m] /= ratioSum;
                }
            }
        }
#else
        for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ )
        {
            for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ )
@@ -927,6 +946,7 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512(
                }
            }
        }
#endif
    }

    if ( hQMetaData->no_directions == 2 )
+29 −0
Original line number Diff line number Diff line
@@ -789,7 +789,24 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512(
        bits_no_dirs_coh +=
#endif
            write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands );
#ifdef FIX_566_2DIR_MASA_384K
        d = 0;
        for ( i = hQMetaData->q_direction[1].cfg.start_band; i < hQMetaData->q_direction[1].cfg.nbands; i++ )
        {
            if ( hQMetaData->twoDirBands[i] == 1 )
            {
                mvr2r( hQMetaData->q_direction[1].band_data[i].azimuth, hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].cfg.nblocks );
                mvr2r( hQMetaData->q_direction[1].band_data[i].elevation, hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].cfg.nblocks );
                mvr2r( hQMetaData->q_direction[1].band_data[i].energy_ratio, hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].cfg.nblocks );

                if ( hQMetaData->coherence_flag )
                {
                    mvc2c( hQMetaData->q_direction[1].coherence_band_data[i].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].cfg.nblocks );
                }
                d++;
            }
        }
#endif
        for ( i = hQMetaData->numTwoDirBands; i < hQMetaData->q_direction[0].cfg.nbands; i++ )
        {
            set_f( hQMetaData->q_direction[1].band_data[i].energy_ratio, 0.0f, hQMetaData->q_direction[1].cfg.nblocks );
@@ -1537,6 +1554,9 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512(

    if ( hQMetaData->no_directions == 2 )
    {
#ifdef FIX_566_2DIR_MASA_384K
        float ratioSum;
#endif
        for ( j = hQMetaData->q_direction[1].cfg.start_band; j < hQMetaData->q_direction[1].cfg.nbands; ++j )
        {
            for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ )
@@ -1545,10 +1565,19 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512(
                push_next_indice( hMetaData, index, MASA_BITS_ER_HR );
                hQMetaData->q_direction[1].band_data[j].energy_ratio_index[k] = index;
                hQMetaData->q_direction[1].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index];
#ifdef FIX_566_2DIR_MASA_384K
                ratioSum = hQMetaData->q_direction[0].band_data[j].energy_ratio[k] + hQMetaData->q_direction[1].band_data[j].energy_ratio[k];
                if ( ratioSum > 1.0f )
                {
                    hQMetaData->q_direction[0].band_data[j].energy_ratio[k] /= ratioSum;
                    hQMetaData->q_direction[1].band_data[j].energy_ratio[k] /= ratioSum;
                }
#else
                if ( hQMetaData->q_direction[1].band_data[j].energy_ratio[k] > 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k] )
                {
                    hQMetaData->q_direction[1].band_data[j].energy_ratio[k] = 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k];
                }
#endif
                needed_bits[1] += MASA_BITS_ER_HR;
                hQMetaData->q_direction[1].band_data[j].bits_sph_idx[k] = bits_dir_hr;
            }