Commit 23dae7a7 authored by Rivukanta Bhattacharya's avatar Rivukanta Bhattacharya
Browse files

Merge branch 'main' into 163-hcovstate-handle-in-sba

parents 74dbc012 628e28d8
Loading
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -552,7 +552,11 @@ int main(

    if ( arg.hrtfReaderEnabled )
    {
#ifdef UPDATE_SBA_FILTER
        IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL;
#else
        IVAS_DEC_HRTF_HANDLE hHrtfTD;
#endif

        IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD );

@@ -563,7 +567,11 @@ int main(
        }


#ifdef UPDATE_SBA_FILTER
        IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL;
#else
        IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF;
#endif
        IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF );

        if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK )
@@ -571,14 +579,22 @@ int main(
            fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfCRendFileName );
            goto cleanup;
        }
#ifdef UPDATE_SBA_FILTER
        IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL;
#else
        IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv;
#endif
        IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv );

        if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfCRendFileName );
        }
#ifdef UPDATE_SBA_FILTER
        IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL;
#else
        IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin;
#endif
        IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin );

        if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK )
@@ -667,10 +683,18 @@ cleanup:

    if ( arg.hrtfReaderEnabled )
    {
#ifdef UPDATE_SBA_FILTER
        IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL;
#else
        IVAS_DEC_HRTF_HANDLE hHrtfTD;
#endif
        IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD );
        dealloc_HRTF_binary( hHrtfTD );
#ifdef UPDATE_SBA_FILTER
        IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL;
#else
        IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF;
#endif
        IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF );
        destroy_SetOfHRTF( hSetOfHRTF );
    }
+10 −0
Original line number Diff line number Diff line
@@ -1512,7 +1512,11 @@ typedef enum

#define BINAURAL_MAXBANDS                       60                          /* Max number of bands */
#define BINAURAL_CONVBANDS                      50                          /* Bands upto which convolution is performed */
#ifdef UPDATE_SBA_FILTER
#define BINAURAL_NTAPS                           5
#else
#define BINAURAL_NTAPS                           7
#endif
#define BINAURAL_NTAPS_MAX                      96

#define HRTF_SH_ORDER                           3
@@ -1530,7 +1534,13 @@ typedef enum
{
    BINAURAL_INPUT_AUDIO_CONFIG_INVALID,
    BINAURAL_INPUT_AUDIO_CONFIG_COMBINED,       /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */
#ifdef UPDATE_SBA_FILTER    
    BINAURAL_INPUT_AUDIO_CONFIG_HOA3,            /*  HOA3 */
    BINAURAL_INPUT_AUDIO_CONFIG_HOA2,            /* HOA2 */
    BINAURAL_INPUT_AUDIO_CONFIG_FOA,            /* FOA */
#else    
    BINAURAL_INPUT_AUDIO_CONFIG_HOA,            /* FOA, HOA2, HOA3 */
#endif    
    BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED       /* Not used */

} BINAURAL_INPUT_AUDIO_CONFIG;
+61 −5
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ typedef enum
    IVAS_ERR_INVALID_SAMPLING_RATE,
    IVAS_ERR_NOT_CONFIGURED,
    IVAS_ERR_INVALID_STEREO_MODE,
    IVAS_ERR_INVALID_CICP_INDEX,
    IVAS_ERR_INVALID_CICP_INDEX, /* ToDo: rename, CICP not used in IVAS anymore */
    IVAS_ERR_INVALID_BITRATE,
    IVAS_ERR_INVALID_MASA_CONFIG,
    IVAS_ERR_TOO_MANY_INPUTS,
@@ -72,17 +72,15 @@ typedef enum
    IVAS_ERR_INVALID_SPAR_CONFIG,
    IVAS_ERR_WRONG_PARAMS,
    IVAS_ERR_INIT_ERROR,
    IVAS_ERR_DECODER_ERROR,
    IVAS_ERR_WRONG_MODE,
    IVAS_ERR_INVALID_OUTPUT_FORMAT,
    IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED,
    IVAS_ERR_INVALID_HRTF,
    IVAS_ERR_INVALID_INPUT_FORMAT,
    IVAS_ERR_INVALID_INDEX,
    IVAS_ERR_INVALID_INDEX, /* ToDo: should be merged with IVAS_ERR_INDEX_OUT_OF_BOUNDS */
    IVAS_ERR_NOT_SUPPORTED_OPTION,
    IVAS_ERR_NOT_IMPLEMENTED,
    IVAS_ERR_WAITING_FOR_BITSTREAM,
    IVAS_ERR_FILE_READER_TIMESTAMP_MISMATCH,
    IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT,
    IVAS_ERR_ISM_INVALID_METADATA_VALUE,
    IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE,
@@ -131,7 +129,7 @@ typedef enum
     *    renderer (lib_rend only)            *
     *----------------------------------------*/

    IVAS_ERR_NUM_CHANNELS_UNKNOWN,
    IVAS_ERR_NUM_CHANNELS_UNKNOWN = 0x6000,
    IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT,
    IVAS_ERR_INVALID_INPUT_ID,
    IVAS_ERR_WRONG_NUM_CHANNELS,
@@ -182,6 +180,64 @@ static inline const char *ivas_error_to_string( ivas_error error_code )
            return "Parse error";
        case IVAS_ERR_END_OF_FILE:
            return "End of file";
        case IVAS_ERR_WRONG_PARAMS:
            return "Wrong function parameters";
        case IVAS_ERR_INVALID_BANDWIDTH:
            return "Invalid bandwidth";
        case IVAS_ERR_INVALID_DTX_UPDATE_RATE:
            return "Invalid DTX update rate";
        case IVAS_ERR_NOT_CONFIGURED:
            return "Handle has not been configured";
        case IVAS_ERR_INVALID_STEREO_MODE:
            return "Invalid stereo mode";
        case IVAS_ERR_INVALID_CICP_INDEX:
            return "Invalid speaker layout";
        case IVAS_ERR_INVALID_BITRATE:
            return "Invalid bitrate";
        case IVAS_ERR_INVALID_MASA_CONFIG:
            return "Invalid MASA config";
        case IVAS_ERR_TOO_MANY_INPUTS:
            return "Too many object inputs provided";
        case IVAS_ERR_INDEX_OUT_OF_BOUNDS:
            return "Index out of bounds";
        case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED:
            return "Reconfigure not supported";
        case IVAS_ERR_INVALID_FEC_OFFSET:
            return "Invalid FEC offset";
        case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE:
            return "Invalid input buffer size";
        case IVAS_ERR_DTX_NOT_SUPPORTED:
            return "DTX is not supported in this IVAS format and element mode";
        case IVAS_ERR_UNEXPECTED_NULL_POINTER:
            return "Unexpected NULL pointer";
        case IVAS_ERR_METADATA_NOT_EXPECTED:
            return "Metadata input not expected for current configuration";
#ifdef DEBUGGING
        case IVAS_ERR_INVALID_FORCE_MODE:
            return "Invalid force mode";
#endif
        case IVAS_ERR_NOT_IMPLEMENTED:
            return "Not implemented";
        case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT:
            return "Invalid metadata file format";
        case IVAS_ERR_ISM_INVALID_METADATA_VALUE:
            return "Invalid metadata value provided";
        case IVAS_ERR_NOT_SUPPORTED_OPTION:
            return "Option not supported in this set-up";
        case IVAS_ERR_INIT_ERROR:
            return "Initialization error";
        case IVAS_ERR_INVALID_BITSTREAM:
            return "Invalid bitstream";
        case IVAS_ERR_WRONG_MODE:
            return "Wrong mode";
        case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED:
            return "Head rotation not supported";
        case IVAS_ERR_INVALID_HRTF:
            return "Unsupported HRTF filter set";
        case IVAS_ERR_INVALID_INPUT_FORMAT:
            return "Invalid format of input bitstream";
        case IVAS_ERR_INVALID_INDEX:
            return "Invalid index";
        default:
            break;
    }
+4 −0
Original line number Diff line number Diff line
@@ -143,6 +143,9 @@
#define DISABLE_ADAP_RES_COD_TMP                        /* temporary fix for IVAS-403, disables adaptive residual coding */
/*#define FIX_I4_OL_PITCH*/                             /* fix open-loop pitch used for EVS core switching */

#define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000  /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */
#define UPDATE_SBA_FILTER                               /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */

/*#define FIX_XXX_JBM_FIFO_BUFFER  */                   /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/
#define HR_METADATA                                     /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */
#define FIX_439_OTR_PARAMS                              /* Philips: Issue 439: orientation tracking parameter aspects. */
@@ -157,6 +160,7 @@
#define FIX_MDCT_ST_PLC_FADEOUT_DELAY
#define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479               /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */
#define HYBRID_ITD_MAX                                 /* FhG: Improvement for DFT-stereo for cases with large ITDs */
#define FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR             /* Eri: Fix for issue 462: Use-of-uninitialized memory in external HRTF deallocation in decoder together with BR switching */
#define FIX_487_LOWRATE_SBA_TUNING_FIX                  /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */
#define FIX_490_MASA_2TC_LBR_DTX                        /* Nokia: Fixes issue 490 by correcting condition. */

+94 −0
Original line number Diff line number Diff line
@@ -150,7 +150,11 @@ static ivas_error ivas_binRenderer_convModuleOpen(

    if ( !isLoudspeaker )
    {
#ifdef UPDATE_SBA_FILTER
        hBinRenderer->nInChannels = audioCfg2channels( input_config ); // TODO maybe an audioCfg2channels_woLFE() function? Works as long as only 1 LFE is present
#else
        hBinRenderer->nInChannels = 16;
#endif
    }
    else
    {
@@ -186,7 +190,11 @@ static ivas_error ivas_binRenderer_convModuleOpen(
    }
    else
    {
#ifdef UPDATE_SBA_FILTER
        hBinRenConvModule->numTaps = BINAURAL_NTAPS;
#else
        hBinRenConvModule->numTaps = 7;
#endif

        /* Use fixed order filtering */
        bandIdx = 0;
@@ -349,12 +357,43 @@ static ivas_error ivas_binRenderer_convModuleOpen(
                }
                else
                {
#ifdef UPDATE_SBA_FILTER
                    if ( input_config == AUDIO_CONFIG_HOA3 )
                    {
                        /* HOA3 filter coefficients */
                        hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx];
                    }
                    else if ( input_config == AUDIO_CONFIG_HOA2 )
                    {
                        /* HOA2 filter coefficients */
                        hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2[bandIdx][chIdx];
                    }
                    else if ( input_config == AUDIO_CONFIG_FOA )
                    {
                        /* FOA filter coefficients */
                        hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA[bandIdx][chIdx];
                        hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA[bandIdx][chIdx];
                    }
                    else
                    {
                        return IVAS_ERR_INVALID_INPUT_FORMAT;
                    }
#else
                    /* HOA3 filter coefficients */
                    hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx];
                    hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx];
                    hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx];
                    hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx];
#endif
                }
            }
        }
    }
@@ -392,16 +431,28 @@ static ivas_error ivas_binaural_hrtf_open(

        HrtfFastConv->FASTCONV_HRIR_latency_s = FASTCONV_HRIR_latency_s;
        HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s;
#ifdef UPDATE_SBA_FILTER
        HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s;
        HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s;
#endif
        HrtfFastConv->FASTCONV_BRIR_latency_s = FASTCONV_BRIR_latency_s;

        for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
        {
            for ( j = 0; j < HRTF_LS_CHANNELS; j++ )
            {
#ifdef UPDATE_SBA_FILTER
                mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], BINAURAL_NTAPS );
                mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], BINAURAL_NTAPS );
                mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], BINAURAL_NTAPS );
                mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], BINAURAL_NTAPS );
#else
                mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], 7 );
                mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], 7 );
                mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], 7 );
                mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], 7 );
#endif


                mvr2r( leftBRIRReal[i][j], HrtfFastConv->leftBRIRReal[i][j], BINAURAL_NTAPS_MAX );
                mvr2r( leftBRIRImag[i][j], HrtfFastConv->leftBRIRImag[i][j], BINAURAL_NTAPS_MAX );
@@ -409,6 +460,29 @@ static ivas_error ivas_binaural_hrtf_open(
                mvr2r( rightBRIRImag[i][j], HrtfFastConv->rightBRIRImag[i][j], BINAURAL_NTAPS_MAX );
            }

#ifdef UPDATE_SBA_FILTER
            for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
            {
                mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], BINAURAL_NTAPS );
                mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], BINAURAL_NTAPS );
                mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], BINAURAL_NTAPS );
                mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS );
            }
            for ( j = 0; j < 9; j++ )
            {
                mvr2r( leftHRIRReal_HOA2[i][j], HrtfFastConv->leftHRIRReal_HOA2[i][j], BINAURAL_NTAPS );
                mvr2r( leftHRIRImag_HOA2[i][j], HrtfFastConv->leftHRIRImag_HOA2[i][j], BINAURAL_NTAPS );
                mvr2r( rightHRIRReal_HOA2[i][j], HrtfFastConv->rightHRIRReal_HOA2[i][j], BINAURAL_NTAPS );
                mvr2r( rightHRIRImag_HOA2[i][j], HrtfFastConv->rightHRIRImag_HOA2[i][j], BINAURAL_NTAPS );
            }
            for ( j = 0; j < 4; j++ )
            {
                mvr2r( leftHRIRReal_FOA[i][j], HrtfFastConv->leftHRIRReal_FOA[i][j], BINAURAL_NTAPS );
                mvr2r( leftHRIRImag_FOA[i][j], HrtfFastConv->leftHRIRImag_FOA[i][j], BINAURAL_NTAPS );
                mvr2r( rightHRIRReal_FOA[i][j], HrtfFastConv->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS );
                mvr2r( rightHRIRImag_FOA[i][j], HrtfFastConv->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS );
            }
#else
            for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
            {
                mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], 7 );
@@ -416,6 +490,7 @@ static ivas_error ivas_binaural_hrtf_open(
                mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], 7 );
                mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], 7 );
            }
#endif
        }

        mvr2r( fastconvReverberationTimes, HrtfFastConv->fastconvReverberationTimes, CLDFB_NO_CHANNELS_MAX );
@@ -665,7 +740,26 @@ ivas_error ivas_binRenderer_open(
            }
            else
            {
#ifdef UPDATE_SBA_FILTER
                if ( hBinRenderer->nInChannels == 16 )
                {
                    st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f );
                }
                else if ( hBinRenderer->nInChannels == 9 )
                {
                    st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA2_latency_s * 1000000000.f );
                }
                else if ( hBinRenderer->nInChannels == 4 )
                {
                    st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_FOA_latency_s * 1000000000.f );
                }
                else
                {
                    return IVAS_ERR_INVALID_INPUT_FORMAT;
                }
#else
                st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f );
#endif
            }
        }
        else
Loading