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

Fix issue 991 by correctly using provided HRTF structure for ParamBin in rendering.

parent a63580d4
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -181,6 +181,7 @@
#endif

#define NONBE_FIX_984_OMASA_EXT_OUTPUT                        /* Nokia: issue #984: complete the OMASA EXT output implementation */
#define NONBE_FIX_991_PARAMBIN_BINARY_HRTF                    /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */

/* ##################### End NON-BE switches ########################### */

+4 −0
Original line number Diff line number Diff line
@@ -872,7 +872,11 @@ ivas_error ivas_dirac_dec_config(
            if ( st_ivas->hDiracDecBin == NULL )
#endif
            {
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
                if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, &( st_ivas->hHrtfParambin ) ) ) != IVAS_ERR_OK )
#else
                if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK )
#endif
                {
                    return error;
                }
+4 −0
Original line number Diff line number Diff line
@@ -2006,7 +2006,11 @@ ivas_error ivas_init_decoder(
            }
        }

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
        if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, &( st_ivas->hHrtfParambin ) ) ) != IVAS_ERR_OK )
#else
        if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK )
#endif
        {
            return error;
        }
+8 −0
Original line number Diff line number Diff line
@@ -263,7 +263,11 @@ static ivas_error ivas_ism_bitrate_switching_dec(
                return error;
            }

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, &( st_ivas->hHrtfParambin ) ) ) != IVAS_ERR_OK )
#else
            if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK )
#endif
            {
                return error;
            }
@@ -294,7 +298,11 @@ static ivas_error ivas_ism_bitrate_switching_dec(
                return error;
            }

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, &( st_ivas->hHrtfParambin ) ) ) != IVAS_ERR_OK )
#else
            if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK )
#endif
            {
                return error;
            }
+98 −5
Original line number Diff line number Diff line
@@ -119,9 +119,17 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( COM

static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor );

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
static void hrtfShGetHrtf( const int16_t bin, const int16_t aziDeg, const int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t useCachedValue, HRTFS_PARAMBIN_HANDLE hHrtfParambin );
#else
static void hrtfShGetHrtf( const int16_t bin, const int16_t aziDeg, const int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t useCachedValue );
#endif

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
static void getDirectPartGains( const int16_t bin, int16_t aziDeg, int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, const uint8_t stereoMode, float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t isHeadtracked, HRTFS_PARAMBIN_HANDLE hHrtfParambin );
#else
static void getDirectPartGains( const int16_t bin, int16_t aziDeg, int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, const uint8_t stereoMode, float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t isHeadtracked );
#endif

static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] );

@@ -141,7 +149,11 @@ static void ivas_masa_ext_rend_parambin_internal( MASA_EXT_REND_HANDLE hMasaExtR

ivas_error ivas_dirac_dec_init_binaural_data(
    Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure                  */
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
    HRTFS_PARAMBIN_HANDLE *phHrtfParambin /* i  : HRTF structure for rendering            */
#else
    HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i  : HRTF structure for rendering            */
#endif
)
{
    DIRAC_DEC_BIN_HANDLE hDiracDecBin;
@@ -173,6 +185,9 @@ ivas_error ivas_dirac_dec_init_binaural_data(
            hDiracDecBin->hReverb = NULL;
            hDiracDecBin->h_freq_domain_decorr_ap_params = NULL;
            hDiracDecBin->h_freq_domain_decorr_ap_state = NULL;
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            hDiracDecBin->phHrtfParambin = NULL;
#endif
        }

        output_Fs = st_ivas->hDecoderConfig->output_Fs;
@@ -224,7 +239,11 @@ ivas_error ivas_dirac_dec_init_binaural_data(
        }
        else if ( renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Indication of binaural rendering with room effect */
        {
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            mvr2r( ( *phHrtfParambin )->parametricEarlyPartEneCorrection, hDiracDecBin->earlyPartEneCorrection, nBins );
#else
        mvr2r( hHrtfParambin->parametricEarlyPartEneCorrection, hDiracDecBin->earlyPartEneCorrection, nBins );
#endif

            /* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */
            if ( hDiracDecBin->hReverb != NULL && ( ( hDiracDecBin->hReverb->numBins != nBins ) ||
@@ -239,7 +258,11 @@ ivas_error ivas_dirac_dec_init_binaural_data(
        if ( hDiracDecBin->hReverb == NULL )
#endif
            {
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
                if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes, ( *phHrtfParambin )->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK )
#else
            if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes, st_ivas->hHrtfParambin->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK )
#endif
                {
                    return error;
                }
@@ -303,6 +326,10 @@ ivas_error ivas_dirac_dec_init_binaural_data(

        hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate );

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
        hDiracDecBin->phHrtfParambin = phHrtfParambin;
#endif

#ifdef SPLIT_REND_WITH_HEAD_ROT
        st_ivas->hDiracDecBin[pos_idx] = hDiracDecBin;
    }
@@ -1289,7 +1316,11 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices(
                spreadCoh = max( spreadCoh, altSpreadCoh );
            }

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked, *hDiracDecBin->hHrtfParambin );
#else
            getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked );
#endif

            if ( hDiracDecBin->renderStereoOutputInsteadOfBinaural )
            {
@@ -1332,7 +1363,11 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices(
                rImagp *= centerMul;

                /* Apply the gain for the left source of the three coherent sources */
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
                getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 1], isHeadtracked, *hDiracDecBin->hHrtfParambin );
#else
                getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 1], isHeadtracked );
#endif

                hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
                lRealp += sidesMul * lRealpTmp;
@@ -1342,7 +1377,11 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices(

                /* Apply the gain for the right source of the three coherent sources.
                 * -30 degrees to 330 wrapping due to internal functions. */
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
                getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 2], isHeadtracked, *hDiracDecBin->hHrtfParambin );
#else
                getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 2], isHeadtracked );
#endif
                hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
                lRealp += sidesMul * lRealpTmp;
                lImagp += sidesMul * lImagpTmp;
@@ -1731,7 +1770,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
                spreadCoh = max( spreadCoh, altSpreadCoh );
            }

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked, *hDiracDecBin->phHrtfParambin );
#else
            getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked );
#endif

            if ( hDiracDecBin->renderStereoOutputInsteadOfBinaural )
            {
@@ -1774,7 +1817,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
                rImagp *= centerMul;

                /* Apply the gain for the left source of the three coherent sources */
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
                getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 1], isHeadtracked, *hDiracDecBin->phHrtfParambin );
#else
                getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 1], isHeadtracked );
#endif

                hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
                lRealp += sidesMul * lRealpTmp;
@@ -1784,7 +1831,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric

                /* Apply the gain for the right source of the three coherent sources.
                 * -30 degrees to 330 wrapping due to internal functions. */
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
                getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 2], isHeadtracked, *hDiracDecBin->phHrtfParambin );
#else
                getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 2], isHeadtracked );
#endif
                hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
                lRealp += sidesMul * lRealpTmp;
                lImagp += sidesMul * lImagpTmp;
@@ -2172,7 +2223,11 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices(
                    hDiracDecBin->processMtxImPrev[chA][chB + 2][bin] = hDiracDecBin->processMtxIm[chA][chB + 2][bin];
                }

#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
                getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked, *hDiracDecBin->phHrtfParambin );
#else
                getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked );
#endif

                hDiracDecBin->processMtxRe[0][chB + 2][bin] = lRealp * gainFactor;
                hDiracDecBin->processMtxIm[0][chB + 2][bin] = lImagp * gainFactor;
@@ -2947,7 +3002,12 @@ static void getDirectPartGains(
    const uint8_t renderStereoOutputInsteadOfBinaural,
    float Rmat[3][3],
    PARAMBIN_HRTF_GAIN_CACHE *gainCache,
    const int16_t isHeadtracked )
    const int16_t isHeadtracked
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
    ,
    HRTFS_PARAMBIN_HANDLE hHrtfParambin
#endif
)
{
    float aziRad, eleRad;
    float y, mappedX, aziRadMapped, A, A2, A3;
@@ -2992,7 +3052,11 @@ static void getDirectPartGains(
    {
        if ( aziDeg == gainCache->azi && eleDeg == gainCache->ele )
        {
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE, hHrtfParambin );
#else
            hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE );
#endif
        }
        else
        {
@@ -3002,7 +3066,11 @@ static void getDirectPartGains(
            {
                rotateAziEle( (float) aziDeg, (float) eleDeg, &aziDeg, &eleDeg, Rmat, 0 );
            }
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE, hHrtfParambin );
#else
            hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE );
#endif
        }
    }

@@ -3019,9 +3087,20 @@ static void hrtfShGetHrtf(
    float *rRealp,
    float *rImagp,
    PARAMBIN_HRTF_GAIN_CACHE *gainCache,
    const int16_t useCachedValue )
    const int16_t useCachedValue
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
    ,
    HRTFS_PARAMBIN_HANDLE hHrtfParambin
#endif
)
{
    int16_t k;
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
    float( *hrtfShCoeffsReInt )[16][60];
    float( *hrtfShCoeffsImInt )[16][60];
    hrtfShCoeffsReInt = hHrtfParambin->hrtfShCoeffsRe;
    hrtfShCoeffsImInt = hHrtfParambin->hrtfShCoeffsIm;
#endif

    *lRealp = 0.0f;
    *lImagp = 0.0f;
@@ -3035,10 +3114,17 @@ static void hrtfShGetHrtf(

        for ( k = 0; k < HRTF_SH_CHANNELS; k++ )
        {
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            *lRealp += hrtfShCoeffsReInt[0][k][bin] * shVec[k];
            *lImagp += hrtfShCoeffsImInt[0][k][bin] * shVec[k];
            *rRealp += hrtfShCoeffsReInt[1][k][bin] * shVec[k];
            *rImagp += hrtfShCoeffsImInt[1][k][bin] * shVec[k];
#else
            *lRealp += hrtfShCoeffsRe[0][k][bin] * shVec[k];
            *lImagp += hrtfShCoeffsIm[0][k][bin] * shVec[k];
            *rRealp += hrtfShCoeffsRe[1][k][bin] * shVec[k];
            *rImagp += hrtfShCoeffsIm[1][k][bin] * shVec[k];
#endif
        }
    }
    else
@@ -3052,10 +3138,17 @@ static void hrtfShGetHrtf(

        for ( k = 0; k < HRTF_SH_CHANNELS; k++ )
        {
#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF
            *lRealp += hrtfShCoeffsReInt[0][k][bin] * shVec[k];
            *lImagp += hrtfShCoeffsImInt[0][k][bin] * shVec[k];
            *rRealp += hrtfShCoeffsReInt[1][k][bin] * shVec[k];
            *rImagp += hrtfShCoeffsImInt[1][k][bin] * shVec[k];
#else
            *lRealp += hrtfShCoeffsRe[0][k][bin] * shVec[k];
            *lImagp += hrtfShCoeffsIm[0][k][bin] * shVec[k];
            *rRealp += hrtfShCoeffsRe[1][k][bin] * shVec[k];
            *rImagp += hrtfShCoeffsIm[1][k][bin] * shVec[k];
#endif

            gainCache->shVec[k] = shVec[k];
        }
Loading