diff --git a/lib_com/options.h b/lib_com/options.h index b2d288ce7ad7034843d4b47566b4e1856dafd716..af2029e26b4936cabd811031f98d0c555118175f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,6 +171,7 @@ /*#define FIX_1123_FASTCONV_16BIT_ROM*/ /* FhG: issue 1123: update FastConv ROM tables to 16 bit (must regenerate ROM file!) */ #define FIX_1123_FASTCONV_16BIT_FMT /* FhG: issue 1123: update FastConv binary file format and scripts to 16 bit */ /*#define FIX_1123_PARAMBIN_16BIT_ROM*/ /* FhG,Nok: issue 1123: update ParamBin ROM tables and scripts to generate 16 bit tables instead of float */ +#define FIX_1146_OPT_FASTCONV_STRUCT /* FhG: issue 1146: optimize pointers in FastConv struct */ #define FIX_RETURN /* VA: fix location of function returns */ #endif #define FIX_1129_EXT_REND_OUTPUT_HIGH /* Philips: issue 1129: External renderer BINAURAL_ROOM_REVERB format output level too high compared to internal rendering output */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 50d7214713f63913cf48b4201e6428333f978fca..6c3cb8d1d6013806ba56bf983664c0f12f708bd9 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -201,6 +201,12 @@ static ivas_error ivas_binRenderer_convModuleOpen( if ( hBinRenderer->ivas_format == SBA_FORMAT ) { #ifdef FIX_1123_FASTCONV_16BIT_FMT +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + if ( input_config == IVAS_AUDIO_CONFIG_HOA3 || input_config == IVAS_AUDIO_CONFIG_HOA2 || input_config == IVAS_AUDIO_CONFIG_FOA ) + { + hBinRenConvModule->numTaps = hHrtf->ntaps_hrir_sba; + } +#else if ( input_config == IVAS_AUDIO_CONFIG_HOA3 ) { hBinRenConvModule->numTaps = hHrtf->ntaps_hrir_hoa3; @@ -213,6 +219,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( { hBinRenConvModule->numTaps = hHrtf->ntaps_hrir_foa; } +#endif else { return IVAS_ERR_INVALID_INPUT_FORMAT; @@ -397,6 +404,15 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else { +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + if ( input_config == IVAS_AUDIO_CONFIG_HOA3 || input_config == IVAS_AUDIO_CONFIG_HOA2 || input_config == IVAS_AUDIO_CONFIG_FOA ) + { + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_SBA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_SBA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_SBA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_SBA[bandIdx][chIdx]; + } +#else if ( input_config == IVAS_AUDIO_CONFIG_HOA3 ) { /* HOA3 filter coefficients */ @@ -421,6 +437,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA[bandIdx][chIdx]; } +#endif else { return IVAS_ERR_INVALID_INPUT_FORMAT; @@ -461,11 +478,19 @@ void ivas_init_binaural_hrtf( { int16_t i; +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->leftHRIRReal_SBA = NULL; + HrtfFastConv->leftHRIRImag_SBA = NULL; + HrtfFastConv->rightHRIRReal_SBA = NULL; + HrtfFastConv->rightHRIRImag_SBA = NULL; + HrtfFastConv->FASTCONV_SBA_latency_s = 0x00; +#else HrtfFastConv->leftHRIRReal_HOA3 = NULL; HrtfFastConv->leftHRIRImag_HOA3 = NULL; HrtfFastConv->rightHRIRReal_HOA3 = NULL; HrtfFastConv->rightHRIRImag_HOA3 = NULL; HrtfFastConv->FASTCONV_HOA3_latency_s = 0x00; +#endif HrtfFastConv->leftHRIRReal = NULL; HrtfFastConv->leftHRIRImag = NULL; @@ -479,6 +504,7 @@ void ivas_init_binaural_hrtf( HrtfFastConv->rightBRIRImag = NULL; HrtfFastConv->FASTCONV_BRIR_latency_s = 0x00; +#ifndef FIX_1146_OPT_FASTCONV_STRUCT HrtfFastConv->leftHRIRReal_HOA2 = NULL; HrtfFastConv->leftHRIRImag_HOA2 = NULL; HrtfFastConv->rightHRIRReal_HOA2 = NULL; @@ -490,15 +516,20 @@ void ivas_init_binaural_hrtf( HrtfFastConv->rightHRIRReal_FOA = NULL; HrtfFastConv->rightHRIRImag_FOA = NULL; HrtfFastConv->FASTCONV_FOA_latency_s = 0x00; +#endif #ifndef FIX_1123_FASTCONV_16BIT_ROM HrtfFastConv->allocate_init_flag = 0x00; #endif #ifdef FIX_1123_FASTCONV_16BIT_FMT HrtfFastConv->ntaps_hrir = BINAURAL_NTAPS; +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->ntaps_hrir_sba = BINAURAL_NTAPS_SBA; +#else HrtfFastConv->ntaps_hrir_foa = BINAURAL_NTAPS_SBA; HrtfFastConv->ntaps_hrir_hoa2 = BINAURAL_NTAPS_SBA; HrtfFastConv->ntaps_hrir_hoa3 = BINAURAL_NTAPS_SBA; +#endif HrtfFastConv->ntaps_brir = BINAURAL_NTAPS_MAX; #endif @@ -582,6 +613,64 @@ ivas_error ivas_allocate_binaural_hrtf( #endif ) { +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->nchan_alloc_sba = 0; + + if ( input_config == IVAS_AUDIO_CONFIG_HOA3 || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) + { + HrtfFastConv->nchan_alloc_sba = HOA3_CHANNELS; + } + else if ( input_config == IVAS_AUDIO_CONFIG_HOA2 || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + HrtfFastConv->nchan_alloc_sba = HOA2_CHANNELS; + } + else if ( input_config == IVAS_AUDIO_CONFIG_FOA || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + HrtfFastConv->nchan_alloc_sba = FOA_CHANNELS; + } + + if ( HrtfFastConv->nchan_alloc_sba == HOA3_CHANNELS || HrtfFastConv->nchan_alloc_sba == HOA2_CHANNELS || HrtfFastConv->nchan_alloc_sba == FOA_CHANNELS ) + { + if ( ( HrtfFastConv->leftHRIRReal_SBA == NULL ) && ( HrtfFastConv->leftHRIRImag_SBA == NULL ) && ( HrtfFastConv->rightHRIRReal_SBA == NULL ) && ( HrtfFastConv->rightHRIRImag_SBA == NULL ) ) + { +#ifdef FIX_1123_FASTCONV_16BIT_ROM + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRReal_SBA, BINAURAL_CONVBANDS, HrtfFastConv->nchan_sba, HrtfFastConv->ntaps_hrir_sba ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal_SBA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRImag_SBA, BINAURAL_CONVBANDS, HrtfFastConv->nchan_sba, HrtfFastConv->ntaps_hrir_sba ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag_SBA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRReal_SBA, BINAURAL_CONVBANDS, HrtfFastConv->nchan_sba, HrtfFastConv->ntaps_hrir_sba ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal_SBA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRImag_SBA, BINAURAL_CONVBANDS, HrtfFastConv->nchan_sba, HrtfFastConv->ntaps_hrir_sba ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag_SBA" ); + } +#else + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRReal_SBA, BINAURAL_CONVBANDS, HrtfFastConv->nchan_alloc_sba, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRReal_SBA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->leftHRIRImag_SBA, BINAURAL_CONVBANDS, HrtfFastConv->nchan_alloc_sba, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for leftHRIRImag_SBA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRReal_SBA, BINAURAL_CONVBANDS, HrtfFastConv->nchan_alloc_sba, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRReal_SBA" ); + } + if ( IVAS_ERR_OK != ivas_alloc_pppMem( &HrtfFastConv->rightHRIRImag_SBA, BINAURAL_CONVBANDS, HrtfFastConv->nchan_alloc_sba, BINAURAL_NTAPS_SBA, allocate_init_flag ) ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for rightHRIRImag_SBA" ); + } +#endif + } + } +#else if ( input_config == IVAS_AUDIO_CONFIG_HOA3 || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) { if ( ( HrtfFastConv->leftHRIRReal_HOA3 != NULL ) && ( HrtfFastConv->leftHRIRImag_HOA3 != NULL ) && ( HrtfFastConv->rightHRIRReal_HOA3 != NULL ) && ( HrtfFastConv->rightHRIRImag_HOA3 != NULL ) ) @@ -719,9 +808,10 @@ ivas_error ivas_allocate_binaural_hrtf( #endif } } +#endif #ifdef FIX_1123_FASTCONV_16BIT_FMT - else if ( ( renderer_type == RENDERER_BINAURAL_FASTCONV && bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) || ( renderer_type == RENDERER_BINAURAL_FASTCONV && input_config != IVAS_AUDIO_CONFIG_INVALID ) ) + if ( ( renderer_type == RENDERER_BINAURAL_FASTCONV && bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) || ( renderer_type == RENDERER_BINAURAL_FASTCONV && input_config != IVAS_AUDIO_CONFIG_INVALID ) ) #else if ( renderer_type == RENDERER_BINAURAL_FASTCONV || bin_input_config == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #endif @@ -869,25 +959,49 @@ static ivas_error ivas_binaural_hrtf_open( if ( input_config == IVAS_AUDIO_CONFIG_HOA2 ) { #ifdef FIX_1123_FASTCONV_16BIT_ROM +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->FASTCONV_SBA_latency_s = FASTCONV_HOA2_latency_s * powf( 2.f, -1.f * FASTCONV_HOA2_latency_s_factorQ ); +#else HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s * powf( 2.f, -1.f * FASTCONV_HOA2_latency_s_factorQ ); +#endif +#else +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->FASTCONV_SBA_latency_s = FASTCONV_HOA2_latency_s; #else HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s; +#endif #endif } if ( input_config == IVAS_AUDIO_CONFIG_HOA3 ) { #ifdef FIX_1123_FASTCONV_16BIT_ROM +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->FASTCONV_SBA_latency_s = FASTCONV_HOA3_latency_s * powf( 2.f, -1.f * FASTCONV_HOA3_latency_s_factorQ ); +#else HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s * powf( 2.f, -1.f * FASTCONV_HOA3_latency_s_factorQ ); +#endif +#else +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->FASTCONV_SBA_latency_s = FASTCONV_HOA3_latency_s; #else HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s; +#endif #endif } if ( input_config == IVAS_AUDIO_CONFIG_FOA ) { #ifdef FIX_1123_FASTCONV_16BIT_ROM +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->FASTCONV_SBA_latency_s = FASTCONV_FOA_latency_s * powf( 2.f, -1.f * FASTCONV_HRIR_latency_s_factorQ ); +#else HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s * powf( 2.f, -1.f * FASTCONV_HRIR_latency_s_factorQ ); +#endif +#else +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->FASTCONV_SBA_latency_s = FASTCONV_FOA_latency_s; #else HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s; +#endif #endif } if ( input_config == IVAS_AUDIO_CONFIG_BINAURAL || renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) @@ -981,18 +1095,34 @@ static ivas_error ivas_binaural_hrtf_open( for ( j = 0; j < HOA3_CHANNELS; j++ ) { #ifdef FIX_1123_FASTCONV_16BIT_ROM +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + for ( k = 0; k < HrtfFastConv->ntaps_hrir_sba; k++ ) + { + HrtfFastConv->leftHRIRReal_SBA[i][j][k] = leftHRIRReal_HOA3[i][j][k] * scaleFactorSBA; + HrtfFastConv->leftHRIRImag_SBA[i][j][k] = leftHRIRImag_HOA3[i][j][k] * scaleFactorSBA; + HrtfFastConv->rightHRIRReal_SBA[i][j][k] = rightHRIRReal_HOA3[i][j][k] * scaleFactorSBA; + HrtfFastConv->rightHRIRImag_SBA[i][j][k] = rightHRIRImag_HOA3[i][j][k] * scaleFactorSBA; +#else for ( k = 0; k < HrtfFastConv->ntaps_hrir_hoa3; k++ ) { HrtfFastConv->leftHRIRReal_HOA3[i][j][k] = leftHRIRReal_HOA3[i][j][k] * scaleFactorSBA; HrtfFastConv->leftHRIRImag_HOA3[i][j][k] = leftHRIRImag_HOA3[i][j][k] * scaleFactorSBA; HrtfFastConv->rightHRIRReal_HOA3[i][j][k] = rightHRIRReal_HOA3[i][j][k] * scaleFactorSBA; HrtfFastConv->rightHRIRImag_HOA3[i][j][k] = rightHRIRImag_HOA3[i][j][k] * scaleFactorSBA; +#endif } +#else +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->leftHRIRReal_SBA[i][j] = leftHRIRReal_HOA3[i][j]; + HrtfFastConv->leftHRIRImag_SBA[i][j] = leftHRIRImag_HOA3[i][j]; + HrtfFastConv->rightHRIRReal_SBA[i][j] = rightHRIRReal_HOA3[i][j]; + HrtfFastConv->rightHRIRImag_SBA[i][j] = rightHRIRImag_HOA3[i][j]; #else HrtfFastConv->leftHRIRReal_HOA3[i][j] = leftHRIRReal_HOA3[i][j]; HrtfFastConv->leftHRIRImag_HOA3[i][j] = leftHRIRImag_HOA3[i][j]; HrtfFastConv->rightHRIRReal_HOA3[i][j] = rightHRIRReal_HOA3[i][j]; HrtfFastConv->rightHRIRImag_HOA3[i][j] = rightHRIRImag_HOA3[i][j]; +#endif #endif } } @@ -1005,18 +1135,34 @@ static ivas_error ivas_binaural_hrtf_open( for ( j = 0; j < HOA2_CHANNELS; j++ ) { #ifdef FIX_1123_FASTCONV_16BIT_ROM +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + for ( k = 0; k < HrtfFastConv->ntaps_hrir_sba; k++ ) + { + HrtfFastConv->leftHRIRReal_SBA[i][j][k] = leftHRIRReal_HOA2[i][j][k] * scaleFactorSBA; + HrtfFastConv->leftHRIRImag_SBA[i][j][k] = leftHRIRImag_HOA2[i][j][k] * scaleFactorSBA; + HrtfFastConv->rightHRIRReal_SBA[i][j][k] = rightHRIRReal_HOA2[i][j][k] * scaleFactorSBA; + HrtfFastConv->rightHRIRImag_SBA[i][j][k] = rightHRIRImag_HOA2[i][j][k] * scaleFactorSBA; +#else for ( k = 0; k < HrtfFastConv->ntaps_hrir_hoa2; k++ ) { HrtfFastConv->leftHRIRReal_HOA2[i][j][k] = leftHRIRReal_HOA2[i][j][k] * scaleFactorSBA; HrtfFastConv->leftHRIRImag_HOA2[i][j][k] = leftHRIRImag_HOA2[i][j][k] * scaleFactorSBA; HrtfFastConv->rightHRIRReal_HOA2[i][j][k] = rightHRIRReal_HOA2[i][j][k] * scaleFactorSBA; HrtfFastConv->rightHRIRImag_HOA2[i][j][k] = rightHRIRImag_HOA2[i][j][k] * scaleFactorSBA; +#endif } +#else +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->leftHRIRReal_SBA[i][j] = leftHRIRReal_HOA2[i][j]; + HrtfFastConv->leftHRIRImag_SBA[i][j] = leftHRIRImag_HOA2[i][j]; + HrtfFastConv->rightHRIRReal_SBA[i][j] = rightHRIRReal_HOA2[i][j]; + HrtfFastConv->rightHRIRImag_SBA[i][j] = rightHRIRImag_HOA2[i][j]; #else HrtfFastConv->leftHRIRReal_HOA2[i][j] = leftHRIRReal_HOA2[i][j]; HrtfFastConv->leftHRIRImag_HOA2[i][j] = leftHRIRImag_HOA2[i][j]; HrtfFastConv->rightHRIRReal_HOA2[i][j] = rightHRIRReal_HOA2[i][j]; HrtfFastConv->rightHRIRImag_HOA2[i][j] = rightHRIRImag_HOA2[i][j]; +#endif #endif } } @@ -1029,18 +1175,34 @@ static ivas_error ivas_binaural_hrtf_open( for ( j = 0; j < FOA_CHANNELS; j++ ) { #ifdef FIX_1123_FASTCONV_16BIT_ROM +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + for ( k = 0; k < HrtfFastConv->ntaps_hrir_sba; k++ ) + { + HrtfFastConv->leftHRIRReal_SBA[i][j][k] = leftHRIRReal_FOA[i][j][k] * scaleFactorSBA; + HrtfFastConv->leftHRIRImag_SBA[i][j][k] = leftHRIRImag_FOA[i][j][k] * scaleFactorSBA; + HrtfFastConv->rightHRIRReal_SBA[i][j][k] = rightHRIRReal_FOA[i][j][k] * scaleFactorSBA; + HrtfFastConv->rightHRIRImag_SBA[i][j][k] = rightHRIRImag_FOA[i][j][k] * scaleFactorSBA; +#else for ( k = 0; k < HrtfFastConv->ntaps_hrir_foa; k++ ) { HrtfFastConv->leftHRIRReal_FOA[i][j][k] = leftHRIRReal_FOA[i][j][k] * scaleFactorSBA; HrtfFastConv->leftHRIRImag_FOA[i][j][k] = leftHRIRImag_FOA[i][j][k] * scaleFactorSBA; HrtfFastConv->rightHRIRReal_FOA[i][j][k] = rightHRIRReal_FOA[i][j][k] * scaleFactorSBA; HrtfFastConv->rightHRIRImag_FOA[i][j][k] = rightHRIRImag_FOA[i][j][k] * scaleFactorSBA; +#endif } +#else +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + HrtfFastConv->leftHRIRReal_SBA[i][j] = leftHRIRReal_FOA[i][j]; + HrtfFastConv->leftHRIRImag_SBA[i][j] = leftHRIRImag_FOA[i][j]; + HrtfFastConv->rightHRIRReal_SBA[i][j] = rightHRIRReal_FOA[i][j]; + HrtfFastConv->rightHRIRImag_SBA[i][j] = rightHRIRImag_FOA[i][j]; #else HrtfFastConv->leftHRIRReal_FOA[i][j] = leftHRIRReal_FOA[i][j]; HrtfFastConv->leftHRIRImag_FOA[i][j] = leftHRIRImag_FOA[i][j]; HrtfFastConv->rightHRIRReal_FOA[i][j] = rightHRIRReal_FOA[i][j]; HrtfFastConv->rightHRIRImag_FOA[i][j] = rightHRIRImag_FOA[i][j]; +#endif #endif } } @@ -1299,6 +1461,12 @@ ivas_error ivas_rend_openCldfbRend( return error; } +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + if ( inConfig == IVAS_AUDIO_CONFIG_FOA || inConfig == IVAS_AUDIO_CONFIG_HOA2 || inConfig == IVAS_AUDIO_CONFIG_HOA3 ) + { + pCldfbRend->binaural_latency_ns = (int32_t) ( pCldfbRend->hHrtfFastConv->FASTCONV_SBA_latency_s * 1000000000.f ); + } +#else if ( inConfig == IVAS_AUDIO_CONFIG_FOA ) { pCldfbRend->binaural_latency_ns = (int32_t) ( pCldfbRend->hHrtfFastConv->FASTCONV_FOA_latency_s * 1000000000.f ); @@ -1311,6 +1479,7 @@ ivas_error ivas_rend_openCldfbRend( { pCldfbRend->binaural_latency_ns = (int32_t) ( pCldfbRend->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); } +#endif else { /* should never happen for SBA */ @@ -1449,6 +1618,12 @@ ivas_error ivas_binRenderer_open( } else { +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + if ( hBinRenderer->nInChannels == HOA3_CHANNELS || hBinRenderer->nInChannels == HOA2_CHANNELS || hBinRenderer->nInChannels == FOA_CHANNELS ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_SBA_latency_s * 1000000000.f ); + } +#else if ( hBinRenderer->nInChannels == HOA3_CHANNELS ) { st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); @@ -1461,6 +1636,7 @@ ivas_error ivas_binRenderer_open( { st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_FOA_latency_s * 1000000000.f ); } +#endif else { return IVAS_ERR_INVALID_INPUT_FORMAT; @@ -1715,6 +1891,12 @@ void ivas_binaural_hrtf_close( ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightBRIRReal, HRTF_LS_CHANNELS ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightBRIRImag, HRTF_LS_CHANNELS ); +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal_SBA, ( *hHrtfFastConv )->nchan_sba ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_SBA, ( *hHrtfFastConv )->nchan_sba ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_SBA, ( *hHrtfFastConv )->nchan_sba ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRImag_SBA, ( *hHrtfFastConv )->nchan_sba ); +#else ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal_HOA3, HOA3_CHANNELS ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_HOA3, HOA3_CHANNELS ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_HOA3, HOA3_CHANNELS ); @@ -1729,6 +1911,7 @@ void ivas_binaural_hrtf_close( ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_FOA, FOA_CHANNELS ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_FOA, FOA_CHANNELS ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRImag_FOA, FOA_CHANNELS ); +#endif #else ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal, HRTF_LS_CHANNELS, allocate_init_flag ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag, HRTF_LS_CHANNELS, allocate_init_flag ); @@ -1740,6 +1923,12 @@ void ivas_binaural_hrtf_close( ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightBRIRReal, HRTF_LS_CHANNELS, allocate_init_flag ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightBRIRImag, HRTF_LS_CHANNELS, allocate_init_flag ); +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal_SBA, ( *hHrtfFastConv )->nchan_alloc_sba, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_SBA, ( *hHrtfFastConv )->nchan_alloc_sba, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_SBA, ( *hHrtfFastConv )->nchan_alloc_sba, allocate_init_flag ); + ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRImag_SBA, ( *hHrtfFastConv )->nchan_alloc_sba, allocate_init_flag ); +#else ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRReal_HOA3, HOA3_CHANNELS, allocate_init_flag ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_HOA3, HOA3_CHANNELS, allocate_init_flag ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_HOA3, HOA3_CHANNELS, allocate_init_flag ); @@ -1754,6 +1943,7 @@ void ivas_binaural_hrtf_close( ivas_free_pppHrtfMem( &( *hHrtfFastConv )->leftHRIRImag_FOA, FOA_CHANNELS, allocate_init_flag ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRReal_FOA, FOA_CHANNELS, allocate_init_flag ); ivas_free_pppHrtfMem( &( *hHrtfFastConv )->rightHRIRImag_FOA, FOA_CHANNELS, allocate_init_flag ); +#endif #endif return; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 3c99dff2537b2cf3f904f561f59d8969529797b4..8df26670f84f7ff57894f572156ca2d9ffcc515a 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1262,22 +1262,33 @@ typedef struct ivas_hrtfs_crend_structure /* Fastconv binaural data structure */ typedef struct ivas_hrtfs_fastconv_struct { +#ifndef FIX_1146_OPT_FASTCONV_STRUCT float FASTCONV_HOA3_latency_s; -#ifndef FIX_1123_FASTCONV_16BIT_FMT +#endif +#if !defined( FIX_1123_FASTCONV_16BIT_FMT ) && !defined( FIX_1146_OPT_FASTCONV_STRUCT ) float FASTCONV_HRIR_latency_s; #endif +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + int16_t nchan_alloc_sba; + float ***leftHRIRReal_SBA; + float ***leftHRIRImag_SBA; + float ***rightHRIRReal_SBA; + float ***rightHRIRImag_SBA; + float FASTCONV_SBA_latency_s; +#else float ***leftHRIRReal_HOA3; float ***leftHRIRImag_HOA3; float ***rightHRIRReal_HOA3; float ***rightHRIRImag_HOA3; - -#ifdef FIX_1123_FASTCONV_16BIT_FMT - float FASTCONV_HRIR_latency_s; #endif + float ***leftHRIRReal; float ***leftHRIRImag; float ***rightHRIRReal; float ***rightHRIRImag; +#if defined( FIX_1123_FASTCONV_16BIT_FMT ) || defined( FIX_1146_OPT_FASTCONV_STRUCT ) + float FASTCONV_HRIR_latency_s; +#endif float ***leftBRIRReal; float ***leftBRIRImag; @@ -1285,6 +1296,7 @@ typedef struct ivas_hrtfs_fastconv_struct float ***rightBRIRImag; float FASTCONV_BRIR_latency_s; +#ifndef FIX_1146_OPT_FASTCONV_STRUCT float ***leftHRIRReal_HOA2; float ***leftHRIRImag_HOA2; float ***rightHRIRReal_HOA2; @@ -1296,15 +1308,20 @@ typedef struct ivas_hrtfs_fastconv_struct float ***rightHRIRReal_FOA; float ***rightHRIRImag_FOA; float FASTCONV_FOA_latency_s; +#endif #ifndef FIX_1123_FASTCONV_16BIT_ROM int16_t allocate_init_flag; /*Memory allocation flag 0: if the hrtf pointers are allocated at application level , 1: of allocated at ivas_binaural_hrtf_open() */ #endif #ifdef FIX_1123_FASTCONV_16BIT_FMT uint16_t ntaps_hrir; +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + uint16_t ntaps_hrir_sba; +#else uint16_t ntaps_hrir_hoa3; uint16_t ntaps_hrir_hoa2; uint16_t ntaps_hrir_foa; +#endif uint16_t ntaps_brir; #endif diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index b63e9d26b7956a86fdd506fba270454c410cb342..6074fc7b00825fcf9d39f1440a31d1ed189ff555 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1878,9 +1878,9 @@ static ivas_error create_fastconv_HRTF_from_rawdata( char *hrtf_data_rptr; ivas_error error; Word16 factorQ; + int16_t *ptW16; #ifdef FIX_1123_FASTCONV_16BIT_FMT float scaleFactor; - int16_t *ptW16; #else int32_t *ptW32; #endif @@ -2062,6 +2062,172 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } +#ifdef FIX_1146_OPT_FASTCONV_STRUCT + if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && + ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 || input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 || input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) ) + { + { + /* latency_s Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); + + /* latency_s */ + ( *hHRTF )->FASTCONV_SBA_latency_s = ( *( (Word32 *) ( hrtf_data_rptr ) ) ) * powf( 2.f, -1.f * factorQ ); + hrtf_data_rptr += sizeof( Word32 ); + + if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + i = -1; + if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + i = FOA_CHANNELS; + } + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + i = HOA2_CHANNELS; + } + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) + { + i = HOA3_CHANNELS; + } + + if ( i != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (SBA_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ( *hHRTF )->ntaps_hrir_sba = *( (uint16_t *) ( hrtf_data_rptr ) ); +#else + if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); + } +#endif + hrtf_data_rptr += sizeof( uint16_t ); + +#ifdef FIX_1123_FASTCONV_16BIT_ROM + if ( ( error = ivas_allocate_binaural_hrtf( *hHRTF, IVAS_AUDIO_CONFIG_INVALID, input_cfg, RENDERER_BINAURAL_FASTCONV ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + + /* HRIR Q factor*/ + factorQ = *( (Word16 *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( Word16 ); +#ifdef FIX_1123_FASTCONV_16BIT_FMT + scaleFactor = powf( 2.f, -1.f * factorQ ); +#endif + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ptW16 = (Word16 *) hrtf_data_rptr; + for ( k = 0; k < ( *hHRTF )->ntaps_hrir_sba; k++ ) +#else + ptW32 = (Word32 *) hrtf_data_rptr; + for ( k = 0; k < BINAURAL_NTAPS_SBA; k++ ) +#endif + { +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ( *hHRTF )->leftHRIRReal_SBA[i][j][k] = ptW16[k] * scaleFactor; +#else + ( *hHRTF )->leftHRIRReal_SBA[i][j][k] = (float) ptW32[k] * powf( 2.f, -1.f * (float) factorQ ); +#endif + } +#ifdef FIX_1123_FASTCONV_16BIT_FMT + hrtf_data_rptr += ( *hHRTF )->ntaps_hrir_sba * sizeof( Word16 ); +#else + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( int32_t ); +#endif + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ptW16 = (Word16 *) hrtf_data_rptr; + for ( k = 0; k < ( *hHRTF )->ntaps_hrir_sba; k++ ) +#else + ptW32 = (Word32 *) hrtf_data_rptr; + for ( k = 0; k < BINAURAL_NTAPS_SBA; k++ ) +#endif + { +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ( *hHRTF )->leftHRIRImag_SBA[i][j][k] = ptW16[k] * scaleFactor; +#else + ( *hHRTF )->leftHRIRImag_SBA[i][j][k] = (float) ptW32[k] * powf( 2.f, -1.f * (float) factorQ ); +#endif + } +#ifdef FIX_1123_FASTCONV_16BIT_FMT + hrtf_data_rptr += ( *hHRTF )->ntaps_hrir_sba * sizeof( Word16 ); +#else + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( int32_t ); +#endif + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ptW16 = (Word16 *) hrtf_data_rptr; + for ( k = 0; k < ( *hHRTF )->ntaps_hrir_sba; k++ ) +#else + ptW32 = (Word32 *) hrtf_data_rptr; + for ( k = 0; k < BINAURAL_NTAPS_SBA; k++ ) +#endif + { +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ( *hHRTF )->rightHRIRReal_SBA[i][j][k] = ptW16[k] * scaleFactor; +#else + ( *hHRTF )->rightHRIRReal_SBA[i][j][k] = (float) ptW32[k] * powf( 2.f, -1.f * (float) factorQ ); +#endif + } +#ifdef FIX_1123_FASTCONV_16BIT_FMT + hrtf_data_rptr += ( *hHRTF )->ntaps_hrir_sba * sizeof( Word16 ); +#else + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( int32_t ); +#endif + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HOA3_CHANNELS; j++ ) + { +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ptW16 = (Word16 *) hrtf_data_rptr; + for ( k = 0; k < ( *hHRTF )->ntaps_hrir_sba; k++ ) +#else + ptW32 = (Word32 *) hrtf_data_rptr; + for ( k = 0; k < BINAURAL_NTAPS_SBA; k++ ) +#endif + { +#ifdef FIX_1123_FASTCONV_16BIT_FMT + ( *hHRTF )->rightHRIRImag_SBA[i][j][k] = ptW16[k] * scaleFactor; +#else + ( *hHRTF )->rightHRIRImag_SBA[i][j][k] = (float) ptW32[k] * powf( 2.f, -1.f * (float) factorQ ); +#endif + } +#ifdef FIX_1123_FASTCONV_16BIT_FMT + hrtf_data_rptr += ( *hHRTF )->ntaps_hrir_sba * sizeof( Word16 ); +#else + hrtf_data_rptr += BINAURAL_NTAPS_SBA * sizeof( int32_t ); +#endif + } + } + } + } +#else else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) { /* latency_s Q factor*/ @@ -2504,6 +2670,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } +#endif /* BRIR */ else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) { @@ -2670,9 +2837,9 @@ static ivas_error create_fastconv_HRTF_from_rawdata( for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { #ifdef FIX_1123_FASTCONV_16BIT_FMT - ( *hHRTF )->fastconvReverberationTimes[j] = ptW16[j] * powf( 2.f, -1.f * factorQ ); -#else ( *hHRTF )->fastconvReverberationTimes[j] = (float) ptW16[j] * scaleFactor; +#else + ( *hHRTF )->fastconvReverberationTimes[j] = ptW16[j] * powf( 2.f, -1.f * factorQ ); #endif } hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( int16_t ); @@ -2688,9 +2855,9 @@ static ivas_error create_fastconv_HRTF_from_rawdata( for ( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { #ifdef FIX_1123_FASTCONV_16BIT_FMT - ( *hHRTF )->fastconvReverberationEneCorrections[j] = ptW16[j] * powf( 2.f, -1.f * factorQ ); -#else ( *hHRTF )->fastconvReverberationEneCorrections[j] = (float) ptW16[j] * scaleFactor; +#else + ( *hHRTF )->fastconvReverberationEneCorrections[j] = ptW16[j] * powf( 2.f, -1.f * factorQ ); #endif } hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( int16_t );