diff --git a/lib_com/options.h b/lib_com/options.h index 574c453a175a4d431ffa20c0850cd02140463d0f..e5c2517ce80a79dac3e63d058daa77a1d4db7305 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -180,6 +180,8 @@ #define NONBE_FIX_861_MASA_CRASH_STEREO_SWITCHING /* VA: issue 861: fix MASA 2TC crash when switching from MDCT stereo to TD/DFT stereo */ #define BE_FIX_867_PARAMC_RECONFIG /* FhG: issue #867: fix ParamMC CLDFB buffer dealloc when reconfiguring */ +#define NONBE_FIX_850_MASA_HBR_META_RATIO_DECODING /* Nokia: issue #850: Fixes rare non-valid diffuseness and energy ratio values in 2dir MASA. */ + /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index ebdee8beaeed441ed726d830894ce1f980fa6f3e..876ae9130d7487f9848250ade82856f36c68a574 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1260,6 +1260,14 @@ void ivas_qmetadata_to_dirac( hSpatParamRendCom->energy_ratio2[meta_write_index][b] = q_direction->band_data[band].energy_ratio[block]; hSpatParamRendCom->diffuseness_vector[meta_write_index][b] -= q_direction->band_data[band].energy_ratio[block]; +#ifdef NONBE_FIX_850_MASA_HBR_META_RATIO_DECODING + /* Sanitize diffuseness for rare cases where floating point inaccuracy could result in negative diffuseness. */ + if ( hSpatParamRendCom->diffuseness_vector[meta_write_index][b] < 0.0f ) + { + hSpatParamRendCom->diffuseness_vector[meta_write_index][b] = 0.0f; + } + +#endif if ( q_direction->coherence_band_data != NULL ) { hSpatParamRendCom->spreadCoherence2[meta_write_index][b] = q_direction->coherence_band_data[band].spread_coherence[block] / 255.0f; diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 3a5510d5cb46ac80cf39985bd7ad76abc68612cf..47d3d29fb14618ecee643ee2a5a5d536943fd1cb 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -1103,8 +1103,30 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } } } + +#ifdef NONBE_FIX_850_MASA_HBR_META_RATIO_DECODING + /* Scale energy ratios that sum to over one */ + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + float ratioSum; + + 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 ) + { + float ratioSumInv; + ratioSumInv = 1.0f / ratioSum; + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] *= ratioSumInv; + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] *= ratioSumInv; + } + } + } +#endif } + #ifdef DEBUG_MODE_QMETADATA for ( d = 0; d < hQMetaData->no_directions; d++ ) {