From cc8c2294b054eedecfe3b6ef248957554ce2e621 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 17 Nov 2023 07:21:23 +0100 Subject: [PATCH 001/601] fix #864, use correct information for the JBM control for all rendering sizes --- apps/decoder.c | 162 +++++++++++++++++++++++++++++++++++++++++++++- lib_com/options.h | 2 + lib_dec/lib_dec.c | 41 ++++++++++++ lib_dec/lib_dec.h | 6 ++ 4 files changed, 210 insertions(+), 1 deletion(-) diff --git a/apps/decoder.c b/apps/decoder.c index ca333d9572..84c36e67d5 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -3208,6 +3208,13 @@ static ivas_error decodeVoIP( } #endif +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + if ( vec_pos_update == 0 ) + { + IVAS_DEC_VoIP_Set20msStart( hIvasDec ); + } +#endif + /* read all packets with a receive time smaller than the system time */ while ( nextPacketRcvTime_ms <= systemTime_ms ) { @@ -3399,7 +3406,14 @@ static ivas_error decodeVoIP( vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len; #endif frame++; - systemTime_ms += systemTimeInc_ms; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + if ( vec_pos_update == 0 ) + { +#endif + systemTime_ms += vec_pos_len * systemTimeInc_ms; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + } +#endif #ifdef WMOPS update_mem(); @@ -3407,6 +3421,152 @@ static ivas_error decodeVoIP( #endif } + +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + int16_t nSamplesFlushed = 0; + + do + { + + + /* Feed into decoder */ + + /* reference vector */ + if ( arg.enableReferenceVectorTracking ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Reference rotation */ + if ( arg.enableReferenceRotation ) + { + IVAS_QUATERNION quaternion; + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Head-tracking input simulation */ + if ( arg.enableHeadRotation ) + { + IVAS_QUATERNION Quaternion; + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternion, &Pos[0] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + +#ifdef SPLIT_REND_WITH_HEAD_ROT + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0, DEFAULT_AXIS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0 ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* decode and get samples */ +#ifdef SPLIT_REND_WITH_HEAD_ROT + if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* Write current frame */ + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + + if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) + { + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + +#ifdef NONBE_UNIFIED_DECODING_PATHS + vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len; +#endif + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); +#ifdef DEBUGGING + if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) ) + { + fprintf( stdout, "\n Decoding error: BER detected in frame %d !!!!!\n", frame - 1 ); + } +#endif + } + } while ( nSamplesFlushed > 0 ); +#endif + /*------------------------------------------------------------------------------------------* * Add zeros at the end to have equal length of synthesized signals *------------------------------------------------------------------------------------------*/ diff --git a/lib_com/options.h b/lib_com/options.h index f44ad78c49..540d8793b8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,6 +128,7 @@ /*#define DEBUG_AGC_ENCODER_CMD_OPTION*/ /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ /*#define DEBUG_JBM_CMD_OPTION*/ /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ /*#define VARIABLE_SPEED_DECODING*/ /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ +#define DISABLE_LIMITER /* disable the limiter */ /*Split Rendering Debug switches*/ /*#define DBG_WAV_WRITER*/ /* add debugging function dbgwrite_wav() */ @@ -165,6 +166,7 @@ #define NONBE_FIX_871_ACELP_CRASH_IN_OSBA /* FhG: isse 871: crash in ACELP core encoder with OSBA */ #define NONBE_FIX_225_MASA_EXT_REND /* Nokia: Resolve #225: Complete MASA external renderer implementation */ #define NONBE_FIX_897_USAN_WITH_MASA_RENDERING /* Nokia: issue #897: USAN null pointer in MASA external renderer to Ambisonics */ +#define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 5abb39cd86..ab2c618500 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -57,6 +57,9 @@ struct IVAS_DEC_VOIP uint16_t lastDecodedWasActive; JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + int16_t nSamplesRendered20ms; /* how many samples have been rendered since the last 20ms render border*/ +#endif #ifdef SUPPORT_JBM_TRACEFILE IVAS_JBM_TRACE_DATA JbmTraceData; #endif @@ -2612,7 +2615,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } } +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + extBufferedSamples = hVoIP->nSamplesRendered20ms + nSamplesBuffered; +#else extBufferedSamples = nSamplesRendered + nSamplesBuffered; +#endif extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; dataUnit = NULL; @@ -2723,6 +2730,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples( nSamplesRendered += nSamplesToZero; hIvasDec->nSamplesRendered += nSamplesToZero; hIvasDec->nSamplesAvailableNext -= nSamplesToZero; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hVoIP->nSamplesRendered20ms += nSamplesToZero; +#endif } else { @@ -2741,6 +2751,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } nSamplesRendered += nSamplesRendered_loop; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hVoIP->nSamplesRendered20ms += nSamplesRendered_loop; +#endif } } @@ -2748,6 +2761,34 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_Set20msStart( ) + * + * Function to tell the API that a new 20ms rendered samples border has been reached + * needed for correct JBM packet buffer operations + *---------------------------------------------------------------------*/ +ivas_error IVAS_DEC_VoIP_Set20msStart( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec->hVoIP == NULL ) + { + return IVAS_ERR_UNKNOWN; + } + + hIvasDec->hVoIP->nSamplesRendered20ms = 0; + + + return error; +} + +#endif + /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_Flush( ) * diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 11aa3917ef..5901afe4f4 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -283,6 +283,12 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #endif ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE +ivas_error IVAS_DEC_VoIP_Set20msStart( + IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +); +#endif + ivas_error IVAS_DEC_Flush( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ -- GitLab From 3d9a3ebfd7f5c00cd3bef64b81826589d7eda656 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 17 Nov 2023 07:51:15 +0100 Subject: [PATCH 002/601] move orientation reading if the JBM flush part to the correct place, unset #DISABLE_LIMITER --- apps/decoder.c | 180 +++++++++++++++++++++++++++++++--------------- lib_com/options.h | 2 +- 2 files changed, 123 insertions(+), 59 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 9cdcb140c2..b7a00f2c16 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -3497,64 +3497,6 @@ static ivas_error decodeVoIP( do { - - /* Feed into decoder */ - - /* reference vector */ - if ( arg.enableReferenceVectorTracking ) - { - IVAS_VECTOR3 listenerPosition, referencePosition; - if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); - goto cleanup; - } - - if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - } - - /* Reference rotation */ - if ( arg.enableReferenceRotation ) - { - IVAS_QUATERNION quaternion; - if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( refRotReader ) ); - goto cleanup; - } - - if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - } - - /* Head-tracking input simulation */ - if ( arg.enableHeadRotation ) - { - IVAS_QUATERNION Quaternion; - if ( ( error = HeadRotationFileReading( headRotReader, &Quaternion, &Pos[0] ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) ); - goto cleanup; - } - -#ifdef SPLIT_REND_WITH_HEAD_ROT - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0, DEFAULT_AXIS ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0 ) ) != IVAS_ERR_OK ) -#endif - { - fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - } - /* decode and get samples */ #ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) @@ -3633,6 +3575,128 @@ static ivas_error decodeVoIP( } #endif } + +#ifdef NONBE_UNIFIED_DECODING_PATHS + /* reference vector */ + if ( arg.enableReferenceVectorTracking && vec_pos_update == 0 ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Reference rotation */ + if ( arg.enableReferenceRotation && vec_pos_update == 0 ) + { + IVAS_QUATERNION quaternion; + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + int16_t num_subframes; + if ( ( error = IVAS_DEC_GetNumOrientationSubframes( hIvasDec, &num_subframes ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetNumOrientationSubframes failed: \n" ); + goto cleanup; + } + + /* Head-tracking input simulation */ + /* Head-tracking input simulation */ + if ( arg.enableHeadRotation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + +#ifdef SPLIT_REND_WITH_HEAD_ROT + if ( headRotReader == NULL ) + { + for ( i = 0; i < num_subframes; i++ ) + { + Quaternions[i].w = -3.0f; + Quaternions[i].x = 0.0f; + Quaternions[i].y = 0.0f; + Quaternions[i].z = 0.0f; + Pos[i].x = 0.0f; + Pos[i].y = 0.0f; + Pos[i].z = 0.0f; + } + } + else + { +#endif + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), + RotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + } +#ifdef SPLIT_REND_WITH_HEAD_ROT + } +#endif + + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i +#ifdef SPLIT_REND_WITH_HEAD_ROT + , + DEFAULT_AXIS +#endif + ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + } + + if ( arg.enableExternalOrientation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < num_subframes; i++ ) + { + + if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &Quaternions[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading external orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), + RotationFileReader_getFilePath( externalOrientationFileReader ) ); + goto cleanup; + } + } + for ( i = 0; i < num_subframes; i++ ) + { + if ( ( error = IVAS_DEC_FeedExternalOrientationData( hIvasDec, Quaternions[i], enableHeadRotation[i], enableExternalOrientation[i], enableRotationInterpolation[i], numFramesToTargetOrientation[i], i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedExternalOrientationData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + } +#endif + } while ( nSamplesFlushed > 0 ); #endif diff --git a/lib_com/options.h b/lib_com/options.h index e00d4ec682..a4dc2bfd07 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,7 +128,7 @@ /*#define DEBUG_AGC_ENCODER_CMD_OPTION*/ /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ /*#define DEBUG_JBM_CMD_OPTION*/ /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ /*#define VARIABLE_SPEED_DECODING*/ /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ -#define DISABLE_LIMITER /* disable the limiter */ +/*#define DISABLE_LIMITER*/ /* disable the limiter */ /*Split Rendering Debug switches*/ /*#define DBG_WAV_WRITER*/ /* add debugging function dbgwrite_wav() */ -- GitLab From a0a21782d26e948222d0019bfcd848d93f4dadf4 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 17 Nov 2023 08:29:24 +0100 Subject: [PATCH 003/601] fix flush function, return immediately if there is nothing to flush. --- lib_dec/lib_dec.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 2c8bf04e3a..326bb2dac8 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2858,13 +2858,19 @@ ivas_error IVAS_DEC_Flush( nSamplesToRender = (uint16_t) *nSamplesFlushed; /* render IVAS frames */ - +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + error = IVAS_ERR_OK; + if ( nSamplesToRender > 0 ) + { +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT - error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmType, pcmBuf ); + error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmType, pcmBuf ); #else - error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); + error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); +#endif +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + } #endif - return error; } -- GitLab From 86a8926d86f267c7e7233bb9ccff6ebfd5d253eb Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 17 Nov 2023 09:05:35 +0100 Subject: [PATCH 004/601] do not flush EVS to ensure BE --- lib_dec/lib_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 326bb2dac8..03126f2599 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2860,13 +2860,13 @@ ivas_error IVAS_DEC_Flush( /* render IVAS frames */ #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE error = IVAS_ERR_OK; - if ( nSamplesToRender > 0 ) + if ( nSamplesToRender > 0 && hIvasDec->st_ivas->ivas_format != MONO_FORMAT ) { #endif #ifdef SPLIT_REND_WITH_HEAD_ROT error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmType, pcmBuf ); #else - error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); + error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); #endif #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE } -- GitLab From 8c97318a61d3206cdf4369e18105cab24075985e Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 17 Nov 2023 09:30:00 +0100 Subject: [PATCH 005/601] fix flushing for EVS --- lib_dec/lib_dec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 03126f2599..4dd8f9412c 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2870,6 +2870,10 @@ ivas_error IVAS_DEC_Flush( #endif #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE } + else + { + *nSamplesFlushed = 0; + } #endif return error; } -- GitLab From d0d54aa786b9828f83ab203c6b5da3c07de7d1da Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 8 Dec 2023 09:36:15 +0100 Subject: [PATCH 006/601] keep the 20ms JBM householding inside the API, change ISM TD renderer to really render subframes and in case of combined orientation use the same MD logic as the TD binaural renderer --- apps/decoder.c | 7 -- lib_dec/ivas_ism_renderer.c | 144 +++++++++++++++++++++++++++--------- lib_dec/lib_dec.c | 42 +++++------ lib_dec/lib_dec.h | 6 -- 4 files changed, 128 insertions(+), 71 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index b7a00f2c16..d57f88af56 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -3277,13 +3277,6 @@ static ivas_error decodeVoIP( } #endif -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - if ( vec_pos_update == 0 ) - { - IVAS_DEC_VoIP_Set20msStart( hIvasDec ); - } -#endif - /* read all packets with a receive time smaller than the system time */ while ( nextPacketRcvTime_ms <= systemTime_ms ) { diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 94060ae8ef..7d2c815386 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -254,87 +254,161 @@ void ivas_ism_render_sf( int16_t tc_offset; int16_t interp_offset; float gain, prev_gain; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + int16_t ism_md_subframe_update_jbm, slots_to_render, first_sf, last_sf, subframe_idx; + int16_t n_samples_rendered_loop; +#endif num_objects = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) { num_objects = st_ivas->nchan_ism; } +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_to_render / st_ivas->hTcBuffer->n_samples_granularity ); + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + n_samples_rendered_loop = 0; + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + +#endif nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; tc_offset = st_ivas->hTcBuffer->n_samples_rendered; interp_offset = st_ivas->hTcBuffer->n_samples_rendered; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + /* Number of subframes to delay metadata to sync with audio */ + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) + { + ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 ); + } + else + { + ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; + } +#endif for ( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) { set_f( output_f[i], 0.0f, n_samples_to_render ); } +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + int16_t n_samples_in_subframe; + + n_samples_in_subframe = st_ivas->hTcBuffer->n_samples_granularity * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; +#endif + #ifdef NONBE_UNIFIED_DECODING_PATHS - if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) #else if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) #endif - { + { +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_in_subframe, n_samples_in_subframe, st_ivas->hIsmRendererData->interpolator ); +#else ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator ); - interp_offset = 0; - } +#endif + interp_offset = 0; + } - for ( i = 0; i < num_objects; i++ ) - { - /* Combined rotation: rotate the object positions depending the head and external orientations */ + for ( i = 0; i < num_objects; i++ ) + { + /* Combined rotation: rotate the object positions depending the head and external orientations */ #ifdef NONBE_UNIFIED_DECODING_PATHS - if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) #else if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) #endif - { + { +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + if ( subframe_idx >= ism_md_subframe_update_jbm ) + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); + } + else + { + rotateAziEle( st_ivas->hIsmMetaData[i]->last_azimuth, st_ivas->hIsmMetaData[i]->last_elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); + } +#else rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); +#endif - if ( st_ivas->hEFAPdata != NULL ) - { - efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + } } - } - lfe_index = 0; - for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) - { - if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) + lfe_index = 0; + for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) { - ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; - } + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) + { + ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; + } - gain = st_ivas->hIsmRendererData->gains[i][j]; - prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; - if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) - { - g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; - tc = &st_ivas->hTcBuffer->tc[i][tc_offset]; - for ( k = 0; k < n_samples_to_render; k++ ) + gain = st_ivas->hIsmRendererData->gains[i][j]; + prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; + if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) { - g2 = 1.0f - *g1; + g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; + tc = &st_ivas->hTcBuffer->tc[i][tc_offset]; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + for ( k = 0; k < n_samples_in_subframe; k++ ) +#else + for ( k = 0; k < n_samples_to_render; k++ ) +#endif + { + g2 = 1.0f - *g1; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + output_f[j2][k + n_samples_rendered_loop] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ ); +#else output_f[j2][k] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ ); +#endif + } } - } - /* update here only in case of head rotation */ + /* update here only in case of head rotation */ #ifdef NONBE_UNIFIED_DECODING_PATHS - if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) #else if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) #endif - { - st_ivas->hIsmRendererData->prev_gains[i][j] = gain; + { + st_ivas->hIsmRendererData->prev_gains[i][j] = gain; + } } } - } #ifdef NONBE_UNIFIED_DECODING_PATHS - /* update combined orientation access index */ - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_to_render ); + /* update combined orientation access index */ +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); +#else + ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_to_render ); +#endif +#endif +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + n_samples_rendered_loop += n_samples_in_subframe; + if ( st_ivas->renderer_type == RENDERER_TD_PANNING ) + { + st_ivas->hTcBuffer->subframes_rendered += 1; + st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; + } + tc_offset += n_samples_in_subframe; + interp_offset += n_samples_in_subframe; + } #endif return; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 4dd8f9412c..b99ef856e8 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -134,7 +134,9 @@ static ivas_error set_pcm_buffer_to_zero( void *buffer, const IVAS_DEC_PCM_TYPE #ifdef NONBE_UNIFIED_DECODING_PATHS static int16_t get_render_frame_size_ms( IVAS_RENDER_FRAMESIZE render_framesize ); #endif - +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE +static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesRendered ); +#endif /*---------------------------------------------------------------------* * IVAS_DEC_Open() @@ -787,6 +789,9 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->lastDecodedWasActive = 0; hIvasDec->hVoIP->hCurrentDataUnit = NULL; hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->hVoIP->nSamplesRendered20ms = 0; +#endif #define WMC_TOOL_SKIP /* Bitstream conversion is not counted towards complexity and memory usage */ @@ -1583,6 +1588,9 @@ static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( if ( hIvasDec->st_ivas->hTcBuffer != NULL ) { *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + *nSamplesBuffered += hIvasDec->hVoIP->nSamplesRendered20ms; +#endif } return IVAS_ERR_OK; @@ -2658,7 +2666,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - extBufferedSamples = hVoIP->nSamplesRendered20ms + nSamplesBuffered; + extBufferedSamples = nSamplesBuffered; #else extBufferedSamples = nSamplesRendered + nSamplesBuffered; #endif @@ -2773,7 +2781,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hIvasDec->nSamplesRendered += nSamplesToZero; hIvasDec->nSamplesAvailableNext -= nSamplesToZero; #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - hVoIP->nSamplesRendered20ms += nSamplesToZero; + update_voip_rendered20ms( hIvasDec, nSamplesToZero ); #endif } else @@ -2794,7 +2802,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( nSamplesRendered += nSamplesRendered_loop; #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - hVoIP->nSamplesRendered20ms += nSamplesRendered_loop; + update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); #endif } } @@ -2802,31 +2810,19 @@ ivas_error IVAS_DEC_VoIP_GetSamples( return IVAS_ERR_OK; } - #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE /*---------------------------------------------------------------------* - * IVAS_DEC_VoIP_Set20msStart( ) + * update_voip_rendered20ms( ) * - * Function to tell the API that a new 20ms rendered samples border has been reached - * needed for correct JBM packet buffer operations + * Function to flush remaining audio in VoIP *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_VoIP_Set20msStart( - IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ -) -{ - ivas_error error; - - error = IVAS_ERR_OK; - - if ( hIvasDec->hVoIP == NULL ) - { - return IVAS_ERR_UNKNOWN; - } - - hIvasDec->hVoIP->nSamplesRendered20ms = 0; +static void update_voip_rendered20ms( + IVAS_DEC_HANDLE hIvasDec, + const int16_t nSamplesRendered ) +{ - return error; + hIvasDec->hVoIP->nSamplesRendered20ms = ( hIvasDec->hVoIP->nSamplesRendered20ms + nSamplesRendered ) % hIvasDec->hVoIP->nSamplesFrame; } #endif diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 67315a121b..1b5e7e4fcc 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -290,12 +290,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #endif ); -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE -ivas_error IVAS_DEC_VoIP_Set20msStart( - IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ -); -#endif - ivas_error IVAS_DEC_Flush( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ -- GitLab From 745f55ee87ec63ccb7cd85b070cfb17adacbce94 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 11 Dec 2023 09:32:06 +0100 Subject: [PATCH 007/601] fix TSM, time scaling done flag was not set correctly for non-20ms render frame size. --- lib_com/options.h | 3 ++- lib_dec/lib_dec.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a4dc2bfd07..4e24b8ad22 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ #ifdef DEBUGGING -/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ @@ -72,6 +72,7 @@ /*#define DEBUG_MODE_INFO_PLC */ /* define to output PLC related parameters */ /*#define DEBUG_MODE_INFO_ALLRAD*/ /* define to output generated HOA decoding mtx */ /*#define DEBUG_MODE_LFE */ /* define to output LFE relevant parameters */ +/*#define DEBUG_MODE_JBM */ /* define to output JBM relevant parameters */ #endif #ifdef DEBUG_MODE_MDCT diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index b99ef856e8..8a2de056b9 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -81,6 +81,9 @@ struct IVAS_DEC bool Opt_VOIP; /* flag indicating VOIP mode with JBM */ int16_t tsm_scale; /* scale for TSM operation */ int16_t tsm_max_scaling; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + int16_t timeScalingDone; /* have we done already one TSM in a 20ms frame? */ +#endif #ifdef FIX_899_VARIABLE_SPEED_DECODING float tsm_quality; #endif @@ -174,6 +177,9 @@ ivas_error IVAS_DEC_Open( #ifdef FIX_899_VARIABLE_SPEED_DECODING hIvasDec->tsm_max_scaling = 0; hIvasDec->tsm_quality = 1.0f; +#endif +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->timeScalingDone = 0; #endif hIvasDec->needNewFrame = false; hIvasDec->nTransportChannelsOld = 0; @@ -1134,19 +1140,26 @@ ivas_error IVAS_DEC_GetSamples( return IVAS_ERR_UNKNOWN; } assert( nTimeScalerOutSamples <= APA_BUF ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->timeScalingDone = 1; +#endif } else { nTimeScalerOutSamples = hIvasDec->nSamplesFrame * nTransportChannels; } nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; - +#ifdef DEBUG_MODE_JBM + dbgwrite( &nTimeScalerOutSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_nTimeScaleOutSamples.dat" ); +#endif /* render IVAS frames */ if ( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ) ) != IVAS_ERR_OK ) { return error; } - +#ifdef DEBUG_MODE_JBM + dbgwrite( &nResidualSamples, sizeof( int16_t ), 1, 1, "./res/JBM_nResidualSamples.dat" ); +#endif if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) { /* feed residual samples to TSM for the next call */ @@ -2632,7 +2645,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples( uint32_t extBufferedTime_ms, scale, maxScaling; JB4_DATAUNIT_HANDLE dataUnit; uint16_t extBufferedSamples; +#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE int16_t timeScalingDone; +#endif int16_t result; ivas_error error; int16_t nSamplesRendered; @@ -2641,7 +2656,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples( st_ivas = hIvasDec->st_ivas; hDecoderConfig = st_ivas->hDecoderConfig; hVoIP = hIvasDec->hVoIP; +#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE timeScalingDone = 0; +#endif nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; nSamplesRendered = 0; @@ -2673,6 +2690,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; dataUnit = NULL; + /* pop one access unit from the jitter buffer */ result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); if ( result != 0 ) @@ -2681,17 +2699,30 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000; - /* avoid time scaling multiple times in one sound card slot */ +#ifdef DEBUG_MODE_JBM + dbgwrite( &extBufferedSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_extBufferedSamples.dat" ); + dbgwrite( &systemTimestamp_ms, sizeof( uint32_t ), 1, 1, "./res/JBM_systemTimestamp.dat" ); + dbgwrite( &scale, sizeof( uint32_t ), 1, 1, "./res/JBM_scale.dat" ); + dbgwrite( &maxScaling, sizeof( uint32_t ), 1, 1, "./res/JBM_maxScale.dat" ); +#endif + + /* avoid time scaling multiple times within one 20ms frame*/ if ( scale != 100U ) { +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + if ( hIvasDec->timeScalingDone ) +#else if ( timeScalingDone ) +#endif { scale = 100; } +#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE else { timeScalingDone = 1; } +#endif } /* limit scale to range supported by time scaler */ @@ -2821,8 +2852,14 @@ static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesRendered ) { - - hIvasDec->hVoIP->nSamplesRendered20ms = ( hIvasDec->hVoIP->nSamplesRendered20ms + nSamplesRendered ) % hIvasDec->hVoIP->nSamplesFrame; + int16_t nSamplesRenderedTotal; + nSamplesRenderedTotal = hIvasDec->hVoIP->nSamplesRendered20ms + nSamplesRendered; + /* we have crossed a 20ms border, reset the time scaling done flag */ + if ( nSamplesRenderedTotal >= hIvasDec->hVoIP->nSamplesFrame ) + { + hIvasDec->timeScalingDone = 0; + } + hIvasDec->hVoIP->nSamplesRendered20ms = nSamplesRenderedTotal % hIvasDec->hVoIP->nSamplesFrame; } #endif -- GitLab From 2abf597fe17ebdbb5940a8e67a37202c42cabcd6 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 18 Dec 2023 17:08:03 +0100 Subject: [PATCH 008/601] add bw switching to some testcases in self_test.prm --- scripts/config/self_test.prm | 100 +++++++++++++++++------------------ 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 0be62cefe6..bc90050fec 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -73,8 +73,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -stereo -dtx 13200 32 testv/stvST32n.wav bit ../IVAS_dec STEREO 32 bit testv/stvST32n.wav_stereo_13200_32-32_DTX.tst -// stereo at 13.2 kbps, 32kHz in, 32kHz out, DTX on, random FER at 5% -../IVAS_cod -stereo -dtx 13200 32 testv/stvST32n.wav bit +// stereo at 13.2 kbps, 32kHz in, 32kHz out, DTX on, random FER at 5%, bandwidth switching +../IVAS_cod -max_band scripts/testv/ivas_bws_20fr_start_WB.txt -stereo -dtx 13200 32 testv/stvST32n.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec STEREO 32 bit_error testv/stvST32n.wav_stereo_13200_32-32_DTX_FER5.tst @@ -187,8 +187,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec STEREO 32 bit_error testv/stvST48c.wav_stereo_32000_48-32_FER5.tst -// stereo at 32 kbps, 48kHz in, 48kHz out, DTX on, random FER at 5% -../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit +// stereo at 32 kbps, 48kHz in, 48kHz out, DTX on, random FER at 5%, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -stereo -dtx 32000 48 testv/stvST48n.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec STEREO 48 bit_error testv/stvST48n.wav_stereo_32000_48-48_DTX_FER5.tst @@ -225,8 +225,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec STEREO 32 bit_error testv/stvST32c.wav_stereo_48000_32-32_FER5.tst -// stereo at 64 kbps, 32kHz in, 32kHz out -../IVAS_cod -stereo 64000 32 testv/stvST32c.wav bit +// stereo at 64 kbps, 32kHz in, 32kHz out, bandwidth switching +../IVAS_co -max_band ivas_bws_20fr_start_FB.txtd -stereo 64000 32 testv/stvST32c.wav bit ../IVAS_dec STEREO 32 bit testv/stvST32c.wav_stereo_64000_32-32.tst // stereo at 96 kbps, 32kHz in, 32kHz out, random FER at 5% @@ -246,8 +246,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -stereo 128000 48 testv/stvST48c.wav bit ../IVAS_dec MONO 48 bit testv/stvST48c.wav_stereo_128000_48-48_MONO.tst -// stereo at 48 kbps, 48 kHz in, 48 kHz out, DTX on -../IVAS_cod -stereo -dtx 48000 48 testv/stvST48n.wav bit +// stereo at 48 kbps, 48 kHz in, 48 kHz out, DTX on, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_SWB.txt -stereo -dtx 48000 48 testv/stvST48n.wav bit ../IVAS_dec STEREO 48 bit testv/stvST48n.wav_stereo_48000_48-48_DTX.tst // stereo at 48 kbps, 32 kHz in, 32 kHz out, DTX on @@ -295,8 +295,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 48 bit_error testv/stv48n.wav_1ISM_13200_48-48_DTX_FER5_BINAURAL.tst -// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out -../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit +// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst // 1 ISM with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out @@ -328,8 +328,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit_error testv/stv1ISM48s.wav_80000_48-16_FER5_binaural_file_TDHR_EXOF.tst -// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, EXT out -../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit +// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, EXT out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_FB.txt -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit ../IVAS_dec EXT 16 bit testv/stv1ISM48s.wav_96000_48-16_EXT.tst // 1 ISM with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, EXT out, DTX on @@ -435,8 +435,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec FOA 48 bit testv/stv4ISM48s.wav_32000_48-48_FOA.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, STEREO out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, STEREO out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_32000_48-48_STEREO.tst // 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out @@ -477,8 +477,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv4ISM48s.wav_96000_48-48_EXT.tst -// 4 ISM with metadata at 128 kbps, 48 kHz in, 48 kHz out, EXT out -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48s.wav bit +// 4 ISM with metadata at 128 kbps, 48 kHz in, 48 kHz out, EXT out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_SWB.txt -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv4ISM48s.wav_128000_48-48_EXT.tst // 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, EXT out @@ -540,8 +540,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48n+non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst -// SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out -../IVAS_cod -sba 3 13200 32 testv/stv3OA32c.wav bit +// SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -sba 3 13200 32 testv/stv3OA32c.wav bit ../IVAS_dec HOA3 32 bit testv/stv3OA32c.wav_SBA_13200_32-32_HOA3.tst // SBA at 13.2 kbps, 32kHz in, 32kHz out, STEREO out @@ -611,8 +611,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst -// SBA at 32 kbps, 48kHz in, 48kHz out, MONO out, DTX -../IVAS_cod -dtx -sba 1 32000 48 testv/stvFOA48c.wav bit +// SBA at 32 kbps, 48kHz in, 48kHz out, MONO out, DTX,bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_FB.txt -dtx -sba 1 32000 48 testv/stvFOA48c.wav bit ../IVAS_dec MONO 48 bit testv/stvFOA48c.wav_SBA_32000_48-48_DTX_MONO.tst // SBA at 48 kbps, 32kHz in, 32kHz out, MONO out, random FER at 5% @@ -786,12 +786,12 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec 7_1 48 bit_error testv/stvFOA48c.wav_SBA_256000_48-48_7_1_FER5.tst -// SBA 2OA at 384 kbps, 32kHz in, 32kHz out, STEREO out -../IVAS_cod -sba 2 384000 32 testv/stv2OA32c.wav bit +// SBA 2OA at 384 kbps, 32kHz in, 32kHz out, STEREO out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -sba 2 384000 32 testv/stv2OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv2OA32c.wav_SBA_384000_32-32_stereo.tst -// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out -../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit +// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_SWB.txt -sba 3 512000 48 testv/stv3OA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural.tst // SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, external orientation @@ -843,8 +843,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_sw_48-48_FOA.tst -// MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out -../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 13200 48 testv/stv1MASA1TC48c.wav bit +// MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_SWB.txt -masa 1 testv/stv1MASA1TC48c.met 13200 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv1MASA1TC48c.wav_13200_48-48_BINAURAL.tst // MASA 1dir 1TC at 16.4 kbps, 48kHz in, 48kHz out, HOA3 out, random FER at 5% @@ -898,8 +898,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot_EXOF.tst -// MASA 1dir 2TC at 13.2 kbps, 48kHz in, 48kHz out, 5_1 out, random FER at 5% -../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 13200 48 testv/stv1MASA2TC48c.wav bit +// MASA 1dir 2TC at 13.2 kbps, 48kHz in, 48kHz out, 5_1 out, random FER at 5%, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -masa 2 testv/stv1MASA2TC48c.met 13200 48 testv/stv1MASA2TC48c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec 5_1 48 bit_error testv/stv1MASA2TC48c.wav_13200_48-48_5_1_FER5.tst @@ -953,8 +953,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 256000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec 5_1 48 bit testv/stv1MASA2TC48c.wav_256000_48-48_5_1.tst -// MASA 2dir 2TC at 48 kbps, 48kHz in, 48kHz out, 5_1 out -../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 48000 48 testv/stv2MASA2TC48c.wav bit +// MASA 2dir 2TC at 48 kbps, 48kHz in, 48kHz out, 5_1 out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_FB.txt -masa 2 testv/stv2MASA2TC48c.met 48000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec 5_1 48 bit testv/stv2MASA2TC48c.wav_48000_48-48_5_1.tst // MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, EXTERNAL out, random FER at 5% @@ -983,8 +983,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out -../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst // MASA 2dir 2TC at 512 kbps, 48kHz in, 48kHz out, 5_1 out @@ -1059,8 +1059,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 48 bit_error testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_FER5.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out -../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -mc 5_1 24400 48 testv/stv51MC48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Subframe.tst // Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation @@ -1096,8 +1096,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot_EXOF.tst -// Multi-channel 5_1 at 96 kbps, 48kHz in, 48kHz out, random FER at 5% -../IVAS_cod -mc 5_1 96000 48 testv/stv51MC48c.wav bit +// Multi-channel 5_1 at 96 kbps, 48kHz in, 48kHz out, random FER at 5%, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_FB.txt -mc 5_1 96000 48 testv/stv51MC48c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec 5_1 48 bit_error testv/stv51MC48c.wav_MC51_96000_48-48_5_1_FER5.tst @@ -1162,8 +1162,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit ../IVAS_dec MONO 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_MONO.tst -// Multi-channel 7_1_4 at 48 kbps, 48kHz in, 48kHz out, MONO out -../IVAS_cod -mc 7_1_4 48000 48 testv/stv714MC48c.wav bit +// Multi-channel 7_1_4 at 48 kbps, 48kHz in, 48kHz out, MONO out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_SWB.txt -mc 7_1_4 48000 48 testv/stv714MC48c.wav bit ../IVAS_dec MONO 48 bit testv/stv714MC48c.wav_MC714_48000_48-48_Mono.tst // Multi-channel 7_1_4 at 64 kbps, 48kHz in, 48kHz out, MONO out, random FER at 5% @@ -1184,8 +1184,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec 5_1 48 bit_error testv/stv714MC48c.wav_MC714_96000_48-48_5_1_FER5.tst -// Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL out -../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit +// Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC_binaural.tst // Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, 7_1_4 out @@ -1233,8 +1233,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 5_1_2 512000 48 testv/stv512MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer -../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_SWB.txt -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst // Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer @@ -1261,8 +1261,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv51MC48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stv51MC48c.wav_sw_48-48_7_1_4.tst -// Multi-channel 5_1 bitrate switching from 24.4 kbps to 256 kbps, 48kHz in, 48kHz out, BINAURAL out, FER at 10% -../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv51MC48c.wav bit +// Multi-channel 5_1 bitrate switching from 24.4 kbps to 256 kbps, 48kHz in, 48kHz out, BINAURAL out, FER at 10%, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -mc 5_1 ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv51MC48c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g192 bit_error ../IVAS_dec BINAURAL 48 bit_error testv/stv51MC48c.wav_sw_48-48_binaural_FER10.tst @@ -1424,8 +1424,8 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit ../IVAS_cod -ism_masa 1 2 NULL testv/stv2MASA2TC48c.met 13200 48 testv/stvOMASA_1ISM_2MASA2TC48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvOMASA_1ISM_2MASA2TC48c.wav_BINAURAL_13200_48-48.tst -// OMASA 1Dir2TC 1ISM at 128 kbps, 48kHz in, 48kHz out, EXT out -../IVAS_cod -ism_masa 1 2 testv/stvISM1.csv testv/stv1MASA2TC48c.met 128000 48 testv/stvOMASA_1ISM_1MASA2TC48c.wav bit +// OMASA 1Dir2TC 1ISM at 128 kbps, 48kHz in, 48kHz out, EXT out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_SWB.txt -ism_masa 1 2 testv/stvISM1.csv testv/stv1MASA2TC48c.met 128000 48 testv/stvOMASA_1ISM_1MASA2TC48c.wav bit ../IVAS_dec EXT 48 bit testv/stvOMASA_1ISM_1MASA2TC48c.wav_EXT_128000_48-48.tst // OMASA 2Dir1TC 1ISM at 512 kbps, 32kHz in, 48kHz out, 7.1.4 out, FER at 5% @@ -1548,8 +1548,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 1 1 testv/stvISM1.csv 32000 48 testv/stvOSBA_1ISM_FOA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvOSBA_1ISM_FOA48c.wav_BINAURAL_32000_48-48.tst -// OSBA FOA 2ISM at 64 kbps, 48kHz in, 48kHz out, HOA3 out -../IVAS_cod -ism_sba 2 1 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stvOSBA_2ISM_FOA48c.wav bit +// OSBA FOA 2ISM at 64 kbps, 48kHz in, 48kHz out, HOA3 out, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_WB.txt -ism_sba 2 1 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stvOSBA_2ISM_FOA48c.wav bit ../IVAS_dec HOA3 48 bit testv/stvOSBA_2ISM_FOA48c.wav_HOA3_64000_48-48.tst // OSBA FOA 3ISM at 128 kbps, 48kHz in, 48kHz out, 7_1_4 out @@ -1616,8 +1616,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 4 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 32 testv/stvOSBA_4ISM_3OA32c.wav bit ../IVAS_dec EXT 48 bit testv/stvOSBA_4ISM_3OA32c.wav_EXT_sw_13k2_512k_32-48.tst -// OSBA FOA 4ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 48kHz out, BINAURAL out, FER at 5% -../IVAS_cod -ism_sba 4 1 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_4ISM_FOA48c.wav bit +// OSBA FOA 4ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 48kHz out, BINAURAL out, FER at 5%, bandwidth switching +../IVAS_cod -max_band ivas_bws_20fr_start_FB.txt -ism_sba 4 1 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_4ISM_FOA48c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 48 bit_error testv/stvOSBA_4ISM_FOA48c.wav_BINAURAL_sw_48-48_FER5.tst -- GitLab From 4fbd8abcd4b3e379e9839f187c9dcbee762241fd Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 15 Jan 2024 22:31:29 +1100 Subject: [PATCH 009/601] LCLD 5ms changes --- apps/decoder.c | 34 ++ lib_com/options.h | 3 + lib_dec/ivas_init_dec.c | 13 +- lib_dec/ivas_mc_paramupmix_dec.c | 30 +- lib_dec/ivas_stat_dec.h | 4 +- lib_dec/lib_dec.c | 90 +++- lib_rend/ivas_MSPred.c | 93 ---- lib_rend/ivas_PredDecoder.c | 234 ++++++++- lib_rend/ivas_PredEncoder.c | 544 ++++++++++++++++++++- lib_rend/ivas_RMSEnvGrouping.c | 225 ++++++++- lib_rend/ivas_lcld_decoder.c | 171 +++---- lib_rend/ivas_lcld_encoder.c | 713 +++++++++++++++++++++++----- lib_rend/ivas_lcld_prot.h | 94 +++- lib_rend/ivas_lcld_rom_tables.c | 2 + lib_rend/ivas_lcld_rom_tables.h | 12 +- lib_rend/ivas_prot_rend.h | 64 +++ lib_rend/ivas_splitRend_lcld_dec.c | 94 +++- lib_rend/ivas_splitRend_lcld_enc.c | 127 +++-- lib_rend/ivas_splitRendererPLC.c | 165 +++++-- lib_rend/ivas_splitRendererPre.c | 64 ++- lib_rend/ivas_splitRenderer_utils.c | 25 + lib_rend/ivas_stat_rend.h | 8 + lib_rend/lib_rend.c | 68 ++- 23 files changed, 2434 insertions(+), 443 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 54879bb30e..3d961ae833 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -456,9 +456,14 @@ int main( *------------------------------------------------------------------------------------------*/ #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef SPLIT_REND_LCLD_5MS + asked_frame_size = arg.renderFramesize; +#endif if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { +#ifndef SPLIT_REND_LCLD_5MS asked_frame_size = arg.renderFramesize; +#endif if ( ( error = IVAS_DEC_EnableSplitRendering( hIvasDec ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -471,10 +476,12 @@ int main( goto cleanup; } +#ifndef SPLIT_REND_LCLD_5MS if ( arg.renderFramesize != asked_frame_size ) { fprintf( stderr, "\nChanged render framesize, only 20ms are allowed for split rendering!\n" ); } +#endif arg.enableHeadRotation = true; } @@ -629,6 +636,7 @@ int main( } #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifndef SPLIT_REND_LCLD_5MS if ( arg.renderFramesize == IVAS_RENDER_FRAMESIZE_5MS && ( renderConfig.split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE || renderConfig.split_rend_config.dof == 0 ) ) { @@ -645,6 +653,7 @@ int main( return error; } +#endif #endif if ( RenderConfigReader_read( renderConfigReader, arg.renderConfigFilename, &renderConfig ) != IVAS_ERR_OK ) @@ -659,6 +668,31 @@ int main( goto cleanup; } +#ifdef SPLIT_REND_LCLD_5MS +#ifdef SPLIT_REND_WITH_HEAD_ROT + if ( asked_frame_size == IVAS_RENDER_FRAMESIZE_5MS && ( renderConfig.split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE || + renderConfig.split_rend_config.dof == 0 ) ) + { + arg.renderFramesize = IVAS_RENDER_FRAMESIZE_5MS; + } + else + { + arg.renderFramesize = IVAS_RENDER_FRAMESIZE_20MS; + } + + if ( ( error = IVAS_DEC_SetRenderFramesize( hIvasDec, arg.renderFramesize ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( arg.renderFramesize != asked_frame_size ) + { + fprintf( stderr, "\nChanged render framesize, only 20ms are allowed for non-0dof split rendering!\n" ); + } + +#endif +#endif + if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, arg.acousticEnvironmentId, &renderConfig.roomAcoustics ) ) == IVAS_ERR_OK ) diff --git a/lib_com/options.h b/lib_com/options.h index fc6c6a06aa..b1215c8761 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -134,6 +134,8 @@ /*#define SPLIT_REND_WITH_HEAD_ROT_DEBUG*/ /* debugging switch for split rendering */ /*#define SPLIT_POSE_CORRECTION_DEBUG*/ /* debugging switch for split rendering pose correction */ /*#define SPLIT_MD_CODING_DEBUG*/ /* debugging switch for split rendering metadata coding */ +/*#define DEBUG_WRITE_PREDICTORS*/ /* debugging switch for LCDL predictors*/ +/*#define DEBUG_WRITE_MS_PRED*/ /* debugging switch for LCLD mid-side prediction*/ #endif /* DEBUGGING */ @@ -172,6 +174,7 @@ #define SPLIT_REND_HF_TUNING /* Dlb: issue 950: split rendering MD tuning change at high frequencies*/ #define SPLIT_REND_MC_FIX_LFE /* Dlb: issue 950: split rendering LFE fix for 7.1 and 5.1 MC mode*/ #define SPLIT_EXT_REND_FIX_LIMITER_POS /* Dlb: issue 950: fixing limiter position in split rendering mode in external renderer*/ +#define SPLIT_REND_LCLD_5MS /* Dlb: LCLD 5ms framing operation */ #endif /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d24e043648..2aea345c36 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -247,10 +247,18 @@ static ivas_error ivas_dec_init_split_rend( } } +#ifdef SPLIT_REND_LCLD_5MS + if ( ( error = ivas_split_rend_choose_default_codec( &st_ivas->hRenderConfig->split_rend_config.codec, &st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, pcm_out_flag, st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_split_rend_choose_default_codec( &st_ivas->hRenderConfig->split_rend_config.codec, &st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, pcm_out_flag ) ) != IVAS_ERR_OK ) { return error; } +#endif + #ifdef SPLIT_REND_WITH_HEAD_ROT if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV && st_ivas->ivas_format == SBA_ISM_FORMAT ) @@ -2477,7 +2485,9 @@ void ivas_initialize_handles_dec( st_ivas->hSplitBinRend.hMultiBinCldfbData = NULL; st_ivas->hSplitBinRend.hSplitRendBits = NULL; st_ivas->hSplitBinRend.hCldfbDataOut = NULL; +#ifndef SPLIT_REND_LCLD_5MS st_ivas->hSplitBinRend.tdDataOut = NULL; +#endif st_ivas->hSplitBinRend.numTdSamplesPerChannelCached = 0; ivas_init_split_rend_handles( &st_ivas->hSplitBinRend.splitrend ); #endif @@ -2627,11 +2637,12 @@ void ivas_destroy_dec( free( st_ivas->hSplitBinRend.hCldfbDataOut ); st_ivas->hSplitBinRend.hCldfbDataOut = NULL; } - +#ifndef SPLIT_REND_LCLD_5MS if ( st_ivas->hSplitBinRend.tdDataOut != NULL ) { free( st_ivas->hSplitBinRend.tdDataOut ); } +#endif #endif /* Parametric binaural renderer handle */ diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index fdbca9f546..5fc36b9e61 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -66,11 +66,15 @@ const int16_t MC_PARAMUPMIX_CHIDX2[MC_PARAMUPMIX_COMBINATIONS] = { 2, 3, 6, 7 }; static void ps_pred_process_sf( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, DECODER_TC_BUFFER_HANDLE hTcBuffer, float qmf_mod_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float *param_interpol, const int16_t ch, const int16_t slots_rendered ); +#ifndef SPLIT_REND_LCLD_5MS #ifdef SPLIT_REND_WITH_HEAD_ROT static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS], const int16_t slot_index_start ); #else static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS] ); #endif +#else +static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS] ); +#endif static void ivas_param_upmix_dec_decorr_subframes( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering ); @@ -208,8 +212,10 @@ void ivas_mc_paramupmix_dec_render( int16_t slots_to_render, first_sf, last_sf, subframe_idx; uint16_t slot_size, ch; float *output_f_local[MAX_OUTPUT_CHANNELS]; +#ifndef SPLIT_REND_LCLD_5MS #ifdef SPLIT_REND_WITH_HEAD_ROT int16_t slot_index_start; +#endif #endif MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; @@ -251,18 +257,22 @@ void ivas_mc_paramupmix_dec_render( mvr2r( hMCParamUpmix->alpha_prev[ch], hMCParamUpmix->alpha_sf[ch], IVAS_MAX_NUM_BANDS ); mvr2r( hMCParamUpmix->beta_prev[ch], hMCParamUpmix->beta_sf[ch], IVAS_MAX_NUM_BANDS ); } - +#ifndef SPLIT_REND_LCLD_5MS #ifdef SPLIT_REND_WITH_HEAD_ROT slot_index_start = 0; +#endif #endif for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; - +#ifndef SPLIT_REND_LCLD_5MS #ifdef SPLIT_REND_WITH_HEAD_ROT ivas_mc_paramupmix_dec_sf( st_ivas, output_f_local, slot_index_start ); slot_index_start += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; +#else + ivas_mc_paramupmix_dec_sf( st_ivas, output_f_local ); +#endif #else ivas_mc_paramupmix_dec_sf( st_ivas, output_f_local ); #endif @@ -644,7 +654,7 @@ static void ps_pred_process_sf( return; } - +#ifndef SPLIT_REND_LCLD_5MS static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -654,6 +664,12 @@ static void ivas_mc_paramupmix_dec_sf( float *output_f[MAX_OUTPUT_CHANNELS] /* i/o: synthesized core-coder transport channels */ #endif ) +#else +static void ivas_mc_paramupmix_dec_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[MAX_OUTPUT_CHANNELS] /* i/o: synthesized core-coder transport channels */ +) +#endif { int16_t i, ch, slot_idx, k; float *pPcm_temp[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/ @@ -668,6 +684,9 @@ static void ivas_mc_paramupmix_dec_sf( #ifdef SPLIT_REND_WITH_HEAD_ROT float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; +#ifdef SPLIT_REND_LCLD_5MS + int16_t slot_index_start; +#endif #else float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -677,6 +696,11 @@ static void ivas_mc_paramupmix_dec_sf( assert( hMCParamUpmix ); push_wmops( "ivas_mc_paramupmix_dec_sf" ); +#ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef SPLIT_REND_LCLD_5MS + slot_index_start = st_ivas->hTcBuffer->slots_rendered; +#endif +#endif for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { pPcm_temp[2 * i] = output_f[i + 4]; /* un-decorrelated */ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 81427d9cfa..c3ea6c9c57 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -979,7 +979,9 @@ typedef struct IVAS_SPLIT_REND_BITS_HANDLE hSplitRendBits; /*scratch buffer for frame by frame processing*/ SPLIT_REND_WRAPPER splitrend; IVAS_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE hCldfbDataOut; /*buffer to store cldfb data before binauralization*/ - float *tdDataOut; /*buffer to store TD data before binauralization*/ +#ifndef SPLIT_REND_LCLD_5MS + float *tdDataOut; /*buffer to store TD data before binauralization*/ +#endif int16_t numTdSamplesPerChannelCached; } IVAS_DEC_SPLIT_REND_WRAPPER; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 4bf943351e..c80c593d02 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1036,14 +1036,21 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( Decoder_Struct *st_ivas; AUDIO_CONFIG output_config; int32_t output_Fs; +#ifndef SPLIT_REND_LCLD_5MS float *writePtr; float *readPtr, *readEnd; +#endif float *pOutput[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; float output[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; float pcmBuf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES * L_FRAME48k]; +#ifdef SPLIT_REND_LCLD_5MS + float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; +#else int16_t numSamplesPerChannelCacheSize; - int16_t numSamplesPerChannelToDecode; int16_t numSamplesPerChannelToSplitEncode; +#endif + int16_t numSamplesPerChannelToDecode; int16_t i, j; ivas_error error; IVAS_DEC_SPLIT_REND_WRAPPER *hSplitBinRend; @@ -1051,6 +1058,9 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( int16_t pcm_out_flag; int16_t td_input; int16_t numPoses; +#ifdef SPLIT_REND_LCLD_5MS + int16_t slots_rendered, slots_rendered_new; +#endif #ifdef SPLIT_REND_HF_TUNING int16_t ro_md_flag; #endif @@ -1071,6 +1081,14 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( numPoses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; +#ifdef SPLIT_REND_LCLD_5MS + if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS && + ( hIvasDec->st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE || + hIvasDec->st_ivas->hRenderConfig->split_rend_config.dof == 0 ) ) + { + numSamplesPerChannelToDecode = (int16_t) ( output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ); + } +#else if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS && hIvasDec->st_ivas->hRenderConfig->split_rend_config.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS && ( hIvasDec->st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE || hIvasDec->st_ivas->hRenderConfig->split_rend_config.dof == 0 ) ) @@ -1092,12 +1110,29 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( numSamplesPerChannelToSplitEncode = (int16_t) ( output_Fs / FRAMES_PER_SEC ); numSamplesPerChannelCacheSize = 0; } - +#endif if ( output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { return IVAS_ERR_WRONG_PARAMS; } +#ifdef SPLIT_REND_LCLD_5MS + if ( st_ivas->hTcBuffer == NULL || hIvasDec->hasBeenFedFrame ) + { + slots_rendered = 0; + } + else + { + slots_rendered = st_ivas->hTcBuffer->n_samples_rendered / st_ivas->hTcBuffer->n_samples_granularity; + } + + + /* Decode and render */ + if ( ( error = IVAS_DEC_GetSamples( hIvasDec, numSamplesPerChannelToDecode, IVAS_DEC_PCM_FLOAT, pcmBuf, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( numSamplesPerChannelToDecode == numSamplesPerChannelToSplitEncode || hSplitBinRend->numTdSamplesPerChannelCached == 0 ) { /* Decode and render */ @@ -1138,9 +1173,14 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( } hSplitBinRend->numTdSamplesPerChannelCached -= numSamplesPerChannelToSplitEncode; } +#endif - /* change buffer layout */ +/* change buffer layout */ +#ifdef SPLIT_REND_LCLD_5MS + for ( i = 0; i < numSamplesPerChannelToDecode; ++i ) +#else for ( i = 0; i < numSamplesPerChannelToSplitEncode; ++i ) +#endif { for ( j = 0; j < BINAURAL_CHANNELS * numPoses; ++j ) { @@ -1152,6 +1192,26 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( pOutput[i] = output[i]; } +#ifdef SPLIT_REND_LCLD_5MS + if ( st_ivas->hTcBuffer == NULL ) + { + slots_rendered_new = 0; + } + else + { + slots_rendered_new = st_ivas->hTcBuffer->n_samples_rendered / st_ivas->hTcBuffer->n_samples_granularity; + } + + for ( i = 0; i < BINAURAL_CHANNELS * numPoses; ++i ) + { + for ( j = slots_rendered; j < slots_rendered_new; ++j ) + { + mvr2r( hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[i][j], Cldfb_RealBuffer_Binaural[i][j - slots_rendered], CLDFB_NO_CHANNELS_MAX ); + mvr2r( hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[i][j], Cldfb_ImagBuffer_Binaural[i][j - slots_rendered], CLDFB_NO_CHANNELS_MAX ); + } + } +#endif + max_band = (int16_t) ( ( BINAURAL_MAXBANDS * output_Fs ) / 48000 ); pcm_out_flag = ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; td_input = st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC; @@ -1172,8 +1232,13 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( st_ivas->hRenderConfig->split_rend_config.codec, st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, hSplitBinRend->hSplitRendBits, +#ifdef SPLIT_REND_LCLD_5MS + Cldfb_RealBuffer_Binaural, + Cldfb_ImagBuffer_Binaural, +#else hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural, hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural, +#endif max_band, pOutput, 1, !td_input, pcm_out_flag, ro_md_flag ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_renderMultiBinToSplitBinaural( &hSplitBinRend->splitrend, @@ -1182,8 +1247,13 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( st_ivas->hRenderConfig->split_rend_config.codec, st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, hSplitBinRend->hSplitRendBits, +#ifdef SPLIT_REND_LCLD_5MS + Cldfb_RealBuffer_Binaural, + Cldfb_ImagBuffer_Binaural, +#else hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural, hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural, +#endif max_band, pOutput, 1, !td_input, pcm_out_flag ) ) != IVAS_ERR_OK ) #endif { @@ -1196,18 +1266,30 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) { #ifndef DISABLE_LIMITER +#ifdef SPLIT_REND_LCLD_5MS + ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); +#else ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToSplitEncode, st_ivas->BER_detect ); +#endif #endif } else { +#ifdef SPLIT_REND_LCLD_5MS + ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); +#else ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToSplitEncode, st_ivas->BER_detect ); +#endif } #ifdef DEBUGGING st_ivas->noClipping += #endif - ivas_syn_output( pOutput, numSamplesPerChannelToSplitEncode, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf_out ); +#ifdef SPLIT_REND_LCLD_5MS + ivas_syn_output( pOutput, numSamplesPerChannelToDecode, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf_out ); +#else + ivas_syn_output( pOutput, numSamplesPerChannelToSplitEncode, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf_out ); +#endif } free( st_ivas->hSplitBinRend.hMultiBinCldfbData ); diff --git a/lib_rend/ivas_MSPred.c b/lib_rend/ivas_MSPred.c index 4dcdbbb1cf..fcfb29a55c 100644 --- a/lib_rend/ivas_MSPred.c +++ b/lib_rend/ivas_MSPred.c @@ -61,15 +61,6 @@ static int32_t _round( int32_t quantPhase( float phase ) { -#ifdef SIMPLE_PHASE - int32_t phaseQ; - if ( phase < 0.0f ) - { - phase += 2.0f * _PI_; - } - phaseQ = _round( phase * SIMPLE_PHASE_QUANT_FACTOR ); - phaseQ = ( phaseQ > SIMPLE_PHASE_MAX_VAL ? SIMPLE_PHASE_MIN_VAL : phaseQ ); -#else int32_t phaseQ; phaseQ = _round( phase * PHASE_QUANT_FACTOR ); @@ -77,83 +68,9 @@ int32_t quantPhase( { phaseQ = PHASE_MIN_VAL; } -#endif return phaseQ; } -#ifdef SIMPLE_PHASE -/*-------------------------------------------------------------------* - * Function rot_pm_pi() - * - * - *-------------------------------------------------------------------*/ - -void rot_pm_pi( - float *pr, - float *pi ) -{ - /* (-1 + j0) */ - *pr = -( *pr ); - *pi = -( *pi ); - - return; -} - - -/*-------------------------------------------------------------------* - * Function ApplyInversePredictros() - * - * - *-------------------------------------------------------------------*/ - -void rot_p_pi_2( - float *pr, - float *pi ) -{ - /* (0 + j) */ - float r = *pr; - - *pr = -( *pi ); - *pi = r; - - return; -} - -/*-------------------------------------------------------------------* - * Function rot_zero() - * - * - *-------------------------------------------------------------------*/ - -void rot_zero( - float *pr, - float *pi ) -{ - *pr = *pr; - *pi = *pi; - - return; -} - -/*-------------------------------------------------------------------* - * Function rot_m_pi_2() - * - * - *-------------------------------------------------------------------*/ - -void rot_m_pi_2( - float *pr, - float *pi ) -{ - /* (0 - j) */ - float r = *pr; - - *pr = *pi; - *pi = -r; - - return; -} -#endif /*-------------------------------------------------------------------* * Function cplxmult() @@ -233,11 +150,7 @@ int32_t quantPred( float dequantPhase( const int32_t phaseQ ) { -#ifdef SIMPLE_PHASE - return (float) phaseQ / SIMPLE_PHASE_QUANT_FACTOR; -#else return (float) phaseQ / PHASE_QUANT_FACTOR; -#endif } @@ -468,9 +381,7 @@ int32_t CountMSBits( /* Differential Coding of Phase Data*/ PrepEncode( piPhaseCopy, piMSFlags, iNumBands ); PrepEncode( piPredCopy, piMSFlags, iNumBands ); -#ifndef SIMPLE_PHASE EncodePhase( piPhaseCopy, iNumMSBands, PHASE_DIFF_DIM ); -#endif EncodePredCoef( piPredCopy, iNumMSBands ); iBitsWritten += 1; /* iMSPredAll */ @@ -486,16 +397,12 @@ int32_t CountMSBits( iBitsWritten++; /*anyNonZero Phase*/ if ( anyNonZero ) { -#ifdef SIMPLE_PHASE - iBitsWritten += iNumMSBands * SIMPLE_PHASE_BITS; -#else iBitsWritten += PHASE_BAND0_BITS; for ( b = 1; b < iNumMSBands; b++ ) { int32_t tabIdx = piPhaseCopy[b] - ENV_DELTA_MIN; iBitsWritten += c_aaiRMSEnvHuffEnc[tabIdx][0]; } -#endif } anyNonZero = 0; /* prediction */ for ( b = 0; b < iNumMSBands; b++ ) diff --git a/lib_rend/ivas_PredDecoder.c b/lib_rend/ivas_PredDecoder.c index 914435e2fe..cc383160e2 100644 --- a/lib_rend/ivas_PredDecoder.c +++ b/lib_rend/ivas_PredDecoder.c @@ -40,6 +40,18 @@ #include "ivas_lcld_rom_tables.h" #include "wmc_auto.h" +#ifdef SPLIT_REND_LCLD_5MS +/*-------------------------------------------------------------------* + * Function get_bit() + * + * + *-------------------------------------------------------------------*/ + +static int get_bit( int state, int bit_id ) +{ + return ( state & ( 1 << bit_id ) ); +} +#endif /*-------------------------------------------------------------------* * Function CreatePredictionDecoder() @@ -53,6 +65,9 @@ ivas_error CreatePredictionDecoder( const int32_t iNumBlocks ) { int16_t n; +#ifdef SPLIT_REND_LCLD_5MS + int16_t m; +#endif PredictionDecoder *psPredictionDecoder = NULL; if ( ( psPredictionDecoder = (PredictionDecoder *) malloc( sizeof( PredictionDecoder ) ) ) == NULL ) @@ -62,11 +77,15 @@ ivas_error CreatePredictionDecoder( psPredictionDecoder->iChannels = iChannels; psPredictionDecoder->iNumBlocks = iNumBlocks; - +#ifdef SPLIT_REND_LCLD_5MS + psPredictionDecoder->iNumSubSets = LCLD_BLOCKS_PER_FRAME / psPredictionDecoder->iNumBlocks; + psPredictionDecoder->iSubSetId = 0; +#endif if ( ( psPredictionDecoder->piPredChanEnable = (int32_t *) malloc( sizeof( int32_t ) * iChannels ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } +#ifndef SPLIT_REND_LCLD_5MS if ( ( psPredictionDecoder->piNumPredBands = (int32_t *) malloc( sizeof( int32_t ) * iChannels ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); @@ -76,6 +95,7 @@ ivas_error CreatePredictionDecoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } +#endif if ( ( psPredictionDecoder->ppiPredBandEnable = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); @@ -96,17 +116,37 @@ ivas_error CreatePredictionDecoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } +#ifdef SPLIT_REND_LCLD_5MS + if ( ( psPredictionDecoder->ppfPredStateReal = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } + if ( ( psPredictionDecoder->ppfPredStateImag = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); + } +#endif for ( n = 0; n < psPredictionDecoder->iChannels; n++ ) { +#ifdef SPLIT_REND_LCLD_5MS + psPredictionDecoder->piPredChanEnable[n] = 0; +#else if ( ( psPredictionDecoder->ppfEstPredGain[n] = (float *) malloc( sizeof( float ) * LCLD_BANDS ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } - if ( ( psPredictionDecoder->ppiPredBandEnable[n] = (int32_t *) malloc( sizeof( int32_t ) * LCLD_BANDS ) ) == NULL ) +#endif + if ( ( psPredictionDecoder->ppiPredBandEnable[n] = (int32_t *) malloc( LCLD_BANDS * sizeof( int32_t ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } +#ifdef SPLIT_REND_LCLD_5MS + for ( m = 0; m < LCLD_BANDS; m++ ) + { + psPredictionDecoder->ppiPredBandEnable[n][m] = 0; + } +#endif if ( ( psPredictionDecoder->ppfA1Real[n] = (float *) malloc( sizeof( float ) * LCLD_BANDS ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); @@ -123,6 +163,23 @@ ivas_error CreatePredictionDecoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } +#ifdef SPLIT_REND_LCLD_5MS + if ( ( psPredictionDecoder->ppfPredStateReal[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionDecoder Module \n" ) ); + } + if ( ( psPredictionDecoder->ppfPredStateImag[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionDecoder Module \n" ) ); + } +#ifdef SPLIT_REND_LCLD_5MS + for ( m = 0; m < LCLD_BANDS; m++ ) + { + psPredictionDecoder->ppfPredStateReal[n][m] = 0; + psPredictionDecoder->ppfPredStateImag[n][m] = 0; + } +#endif +#endif } /* pre-define these tables? */ @@ -161,21 +218,33 @@ void DeletePredictionDecoder( for ( n = 0; n < psPredictionDecoder->iChannels; n++ ) { +#ifndef SPLIT_REND_LCLD_5MS free( psPredictionDecoder->ppfEstPredGain[n] ); +#endif free( psPredictionDecoder->ppiPredBandEnable[n] ); free( psPredictionDecoder->ppfA1Real[n] ); free( psPredictionDecoder->ppfA1Imag[n] ); free( psPredictionDecoder->ppiA1Mag[n] ); free( psPredictionDecoder->ppiA1Phase[n] ); +#ifdef SPLIT_REND_LCLD_5MS + free( psPredictionDecoder->ppfPredStateReal[n] ); + free( psPredictionDecoder->ppfPredStateImag[n] ); +#endif } free( psPredictionDecoder->piPredChanEnable ); +#ifndef SPLIT_REND_LCLD_5MS free( psPredictionDecoder->piNumPredBands ); free( psPredictionDecoder->ppfEstPredGain ); +#endif free( psPredictionDecoder->ppiPredBandEnable ); free( psPredictionDecoder->ppfA1Real ); free( psPredictionDecoder->ppfA1Imag ); free( psPredictionDecoder->ppiA1Mag ); free( psPredictionDecoder->ppiA1Phase ); +#ifdef SPLIT_REND_LCLD_5MS + free( psPredictionDecoder->ppfPredStateReal ); + free( psPredictionDecoder->ppfPredStateImag ); +#endif free( psPredictionDecoder ); psPredictionDecoder = NULL; @@ -183,7 +252,7 @@ void DeletePredictionDecoder( return; } - +#ifndef SPLIT_REND_LCLD_5MS #define USE_TABLE_LOOKUP /*-------------------------------------------------------------------* * Function ReadPredictors() @@ -286,7 +355,105 @@ int32_t ReadPredictors( return iBitsRead; } +#else +/*-------------------------------------------------------------------* + * Function ReadPredictors() + * + * + *-------------------------------------------------------------------*/ + +int32_t ReadPredictors( + PredictionDecoder *psPredictionDecoder, + IVAS_SPLIT_REND_BITS_HANDLE pBits ) +{ + int16_t iBitsRead = 0; + int32_t c; + int32_t b; + int16_t iNumPredBandBits = 6; + const int16_t iSubSetBits = ( LCLD_MAX_NUM_PRED_SUBSETS > 4 ? 3 : 2 ); + psPredictionDecoder->iNumSubSets = ivas_split_rend_bitstream_read_int32( pBits, iSubSetBits ) + 1; + iBitsRead += iSubSetBits; + + if ( psPredictionDecoder->iNumSubSets > 1 ) + { + psPredictionDecoder->iSubSetId = ivas_split_rend_bitstream_read_int32( pBits, iSubSetBits ); + iBitsRead += iSubSetBits; + iNumPredBandBits = ( psPredictionDecoder->iNumSubSets >= 4 ? 4 : 5 ); + } + else + { + psPredictionDecoder->iSubSetId = 0; + } + for ( c = 0; c < psPredictionDecoder->iChannels; c++ ) + { + psPredictionDecoder->piPredChanEnable[c] = ivas_split_rend_bitstream_read_int32( pBits, psPredictionDecoder->iNumSubSets ); + iBitsRead += (int16_t) psPredictionDecoder->iNumSubSets; + + if ( get_bit( psPredictionDecoder->piPredChanEnable[c], psPredictionDecoder->iSubSetId ) ) + { + int32_t b0 = psPredictionDecoder->iSubSetId; + int32_t bstep = psPredictionDecoder->iNumSubSets; + int32_t iNumPredBands; + + for ( b = b0; b < LCLD_BANDS; b += bstep ) + { + psPredictionDecoder->ppiPredBandEnable[c][b] = 0; + } + iNumPredBands = ivas_split_rend_bitstream_read_int32( pBits, iNumPredBandBits ); + iBitsRead += iNumPredBandBits; + iNumPredBands = iNumPredBands * psPredictionDecoder->iNumSubSets + b0; + + for ( b = b0; b < iNumPredBands; b += bstep ) + { + psPredictionDecoder->ppiPredBandEnable[c][b] = ivas_split_rend_bitstream_read_int32( pBits, 1 ); + iBitsRead += 1; + + if ( psPredictionDecoder->ppiPredBandEnable[c][b] == 1 ) + { + int32_t iA1Mag; + int32_t iA1Phase; + float fA1Real; + float fA1Imag; + iA1Mag = ivas_split_rend_bitstream_read_int32( pBits, PRED_QUNAT_FILTER_MAG_BITS ); + iBitsRead += PRED_QUNAT_FILTER_MAG_BITS; + iA1Phase = ivas_split_rend_bitstream_read_int32( pBits, PRED_QUANT_FILTER_PHASE_BITS ); + iBitsRead += PRED_QUANT_FILTER_PHASE_BITS; + + psPredictionDecoder->ppiA1Mag[c][b] = iA1Mag; + psPredictionDecoder->ppiA1Phase[c][b] = iA1Phase + PRED_QUANT_FILTER_PHASE_MIN; + + fA1Real = psPredictionDecoder->pfMagLUT[iA1Mag] * psPredictionDecoder->pfP2RRealLUT[iA1Phase]; + fA1Imag = psPredictionDecoder->pfMagLUT[iA1Mag] * psPredictionDecoder->pfP2RImagLUT[iA1Phase]; + + psPredictionDecoder->ppfA1Real[c][b] = fA1Real; + psPredictionDecoder->ppfA1Imag[c][b] = fA1Imag; + } + } + } + } + + /* disable any inactive prediction bands */ + for ( c = 0; c < psPredictionDecoder->iChannels; c++ ) + { + int set; + for ( set = 0; set < psPredictionDecoder->iNumSubSets; set++ ) + { + if ( !get_bit( psPredictionDecoder->piPredChanEnable[c], set ) ) + { + for ( b = set; b < LCLD_BANDS; b += psPredictionDecoder->iNumSubSets ) + { + psPredictionDecoder->ppiPredBandEnable[c][b] = 0; + } + } + } + } + + return iBitsRead; +} +#endif + +#ifndef SPLIT_REND_LCLD_5MS /*-------------------------------------------------------------------* * Function ApplyInversePredictros() * @@ -332,4 +499,65 @@ void ApplyInversePredictros( return; } +#else +/*-------------------------------------------------------------------* + * Function ApplyInversePredictors() + * + * + *-------------------------------------------------------------------*/ + +void ApplyInversePredictors( + PredictionDecoder *psPredictionDecoder, + float ***pppfReal, + float ***pppfImag ) +{ + int32_t c; + for ( c = 0; c < psPredictionDecoder->iChannels; c++ ) + { + if ( psPredictionDecoder->piPredChanEnable[c] > 0 ) + { + int32_t b; + for ( b = 0; b < LCLD_BANDS; b++ ) + { + if ( psPredictionDecoder->ppiPredBandEnable[c][b] == 1 ) + { + int32_t n; + float fA1Real; + float fA1Imag; + float fPrevReal = 0.0f; + float fPrevImag = 0.0f; + int32_t iSubset = b % psPredictionDecoder->iNumSubSets; + + if ( iSubset != psPredictionDecoder->iSubSetId ) + { + fPrevReal = psPredictionDecoder->ppfPredStateReal[c][b]; + fPrevImag = psPredictionDecoder->ppfPredStateImag[c][b]; + } + + fA1Real = psPredictionDecoder->ppfA1Real[c][b]; + fA1Imag = psPredictionDecoder->ppfA1Imag[c][b]; + for ( n = 0; n < psPredictionDecoder->iNumBlocks; n++ ) + { + float fReal; + float fImag; + + fReal = pppfReal[c][n][b] - fA1Real * fPrevReal + fA1Imag * fPrevImag; + fImag = pppfImag[c][n][b] - fA1Real * fPrevImag - fA1Imag * fPrevReal; + + pppfReal[c][n][b] = fReal; + pppfImag[c][n][b] = fImag; + + fPrevReal = fReal; + fPrevImag = fImag; + } + psPredictionDecoder->ppfPredStateReal[c][b] = fPrevReal; + psPredictionDecoder->ppfPredStateImag[c][b] = fPrevImag; + } + } + } + } + + return; +} +#endif #endif diff --git a/lib_rend/ivas_PredEncoder.c b/lib_rend/ivas_PredEncoder.c index 804a00a6a1..b4fdc234af 100644 --- a/lib_rend/ivas_PredEncoder.c +++ b/lib_rend/ivas_PredEncoder.c @@ -40,6 +40,40 @@ #include "ivas_prot_rend.h" #include "wmc_auto.h" +#ifdef SPLIT_REND_LCLD_5MS + +/*-------------------------------------------------------------------* + * Function activate_bit() + * + * + *-------------------------------------------------------------------*/ +static void activate_bit( int *state, int bit_id ) +{ + ( *state ) |= ( 1 << bit_id ); +} + +/*-------------------------------------------------------------------* + * Function deactivate_bit() + * + * + *-------------------------------------------------------------------*/ + +static void deactivate_bit( int *state, int bit_id ) +{ + ( *state ) &= ( ~( 1 << bit_id ) ); +} + +/*-------------------------------------------------------------------* + * Function get_bit() + * + * + *-------------------------------------------------------------------*/ + +static int get_bit( int state, int bit_id ) +{ + return ( state & ( 1 << bit_id ) ); +} +#endif /*-------------------------------------------------------------------* * Function CreatePredictionEncoder() @@ -47,10 +81,19 @@ * *-------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +ivas_error CreatePredictionEncoder( + PredictionEncoder **psPredictionEncoder_out, + const int32_t iChannels, + const int32_t iNumBlocks, + const int32_t iNumSubSets, + const int32_t iMaxNumPredBands ) +#else ivas_error CreatePredictionEncoder( PredictionEncoder **psPredictionEncoder_out, const int32_t iChannels, const int32_t iNumBlocks ) +#endif { int32_t k, n; PredictionEncoder *psPredictionEncoder = NULL; @@ -62,15 +105,33 @@ ivas_error CreatePredictionEncoder( psPredictionEncoder->iChannels = iChannels; psPredictionEncoder->iNumBlocks = iNumBlocks; - +#ifdef SPLIT_REND_LCLD_5MS + psPredictionEncoder->iSubSetId = 0; + psPredictionEncoder->iMaxNumPredBands = iMaxNumPredBands; + psPredictionEncoder->iNumSubSets = iNumSubSets; + if ( ( psPredictionEncoder->pfWindow = (float *) malloc( sizeof( float ) * LCLD_PRED_WIN_LEN ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } +#else if ( ( psPredictionEncoder->pfWindow = (float *) malloc( sizeof( float ) * iNumBlocks ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); } +#endif + +#ifdef SPLIT_REND_LCLD_5MS + for ( n = 0; n < LCLD_PRED_WIN_LEN; n++ ) + { + psPredictionEncoder->pfWindow[n] = 0.54f - 0.46f * cosf( 2.0f * M_PI * ( (float) n + 0.5f ) / (float) LCLD_PRED_WIN_LEN ); + } +#else for ( n = 0; n < iNumBlocks; n++ ) { psPredictionEncoder->pfWindow[n] = 0.54f - 0.46f * cosf( 2.0f * M_PI * ( (float) n + 0.5f ) / (float) iNumBlocks ); } +#endif + if ( ( psPredictionEncoder->piPredChanEnable = (int32_t *) malloc( sizeof( int32_t ) * iChannels ) ) == NULL ) { @@ -87,6 +148,60 @@ ivas_error CreatePredictionEncoder( psPredictionEncoder->piNumPredBands[n] = 40; // Will need to be set correctly } +#ifdef SPLIT_REND_LCLD_5MS + if ( ( psPredictionEncoder->ppiPredBandEnable = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfA1Real = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfA1Imag = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppiA1Mag = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppiA1Phase = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->pppfInpBufReal = (float ***) malloc( sizeof( float ** ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->pppfInpBufImag = (float ***) malloc( sizeof( float ** ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfInpPrevReal = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfInpPrevImag = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfPredStateReal = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfPredStateImag = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfPredStateRealTmp = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfPredStateImagTmp = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } +#else if ( ( psPredictionEncoder->ppfEstPredGain = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); @@ -116,8 +231,11 @@ ivas_error CreatePredictionEncoder( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); } +#endif + for ( n = 0; n < psPredictionEncoder->iChannels; n++ ) { +#ifndef SPLIT_REND_LCLD_5MS if ( ( psPredictionEncoder->ppfEstPredGain[n] = (float *) malloc( sizeof( float ) * LCLD_BANDS ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); @@ -126,6 +244,7 @@ ivas_error CreatePredictionEncoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); } +#endif if ( ( psPredictionEncoder->ppiPredBandEnable[n] = (int32_t *) malloc( sizeof( int32_t ) * LCLD_BANDS ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); @@ -146,11 +265,72 @@ ivas_error CreatePredictionEncoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); } +#ifdef SPLIT_REND_LCLD_5MS + if ( ( psPredictionEncoder->pppfInpBufReal[n] = (float **) malloc( sizeof( float * ) * LCLD_PRED_WIN_LEN ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->pppfInpBufImag[n] = (float **) malloc( sizeof( float * ) * LCLD_PRED_WIN_LEN ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + for ( k = 0; k < LCLD_PRED_WIN_LEN; k++ ) + { + if ( ( psPredictionEncoder->pppfInpBufReal[n][k] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->pppfInpBufImag[n][k] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + set_zero( psPredictionEncoder->pppfInpBufReal[n][k], LCLD_BANDS ); + set_zero( psPredictionEncoder->pppfInpBufImag[n][k], LCLD_BANDS ); + } + if ( ( psPredictionEncoder->ppfPredStateReal[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfPredStateImag[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + set_zero( psPredictionEncoder->ppfPredStateReal[n], LCLD_BANDS ); + set_zero( psPredictionEncoder->ppfPredStateImag[n], LCLD_BANDS ); + + if ( ( psPredictionEncoder->ppfInpPrevReal[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfInpPrevImag[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + + set_zero( psPredictionEncoder->ppfInpPrevReal[n], LCLD_BANDS ); + set_zero( psPredictionEncoder->ppfInpPrevImag[n], LCLD_BANDS ); + + if ( ( psPredictionEncoder->ppfPredStateRealTmp[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + if ( ( psPredictionEncoder->ppfPredStateImagTmp[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); + } + set_zero( psPredictionEncoder->ppfPredStateRealTmp[n], LCLD_BANDS ); + set_zero( psPredictionEncoder->ppfPredStateImagTmp[n], LCLD_BANDS ); +#endif for ( k = 0; k < LCLD_BANDS; k++ ) { psPredictionEncoder->ppiPredBandEnable[n][k] = 0; +#ifndef SPLIT_REND_LCLD_5MS psPredictionEncoder->ppfA1Real[n][k] = 0.0; psPredictionEncoder->ppfA1Imag[n][k] = 0.0; +#else + psPredictionEncoder->ppfA1Real[n][k] = 0.0f; + psPredictionEncoder->ppfA1Imag[n][k] = 0.0f; +#endif } } @@ -175,23 +355,55 @@ void DeletePredictionEncoder( for ( n = 0; n < psPredictionEncoder->iChannels; n++ ) { +#ifdef SPLIT_REND_LCLD_5MS + int32_t k; +#else free( psPredictionEncoder->ppfEstPredGain[n] ); free( psPredictionEncoder->ppfEstPredBitGain[n] ); +#endif free( psPredictionEncoder->ppiPredBandEnable[n] ); free( psPredictionEncoder->ppfA1Real[n] ); free( psPredictionEncoder->ppfA1Imag[n] ); free( psPredictionEncoder->ppiA1Mag[n] ); free( psPredictionEncoder->ppiA1Phase[n] ); +#ifdef SPLIT_REND_LCLD_5MS + for ( k = 0; k < LCLD_PRED_WIN_LEN; k++ ) + { + free( psPredictionEncoder->pppfInpBufReal[n][k] ); + free( psPredictionEncoder->pppfInpBufImag[n][k] ); + } + free( psPredictionEncoder->pppfInpBufReal[n] ); + free( psPredictionEncoder->pppfInpBufImag[n] ); + free( psPredictionEncoder->ppfInpPrevReal[n] ); + free( psPredictionEncoder->ppfInpPrevImag[n] ); + free( psPredictionEncoder->ppfPredStateReal[n] ); + free( psPredictionEncoder->ppfPredStateImag[n] ); + free( psPredictionEncoder->ppfPredStateRealTmp[n] ); + free( psPredictionEncoder->ppfPredStateImagTmp[n] ); +#endif } free( psPredictionEncoder->piPredChanEnable ); free( psPredictionEncoder->piNumPredBands ); +#ifndef SPLIT_REND_LCLD_5MS free( psPredictionEncoder->ppfEstPredGain ); free( psPredictionEncoder->ppfEstPredBitGain ); +#endif free( psPredictionEncoder->ppiPredBandEnable ); free( psPredictionEncoder->ppfA1Real ); free( psPredictionEncoder->ppfA1Imag ); free( psPredictionEncoder->ppiA1Mag ); free( psPredictionEncoder->ppiA1Phase ); +#ifdef SPLIT_REND_LCLD_5MS + free( psPredictionEncoder->pppfInpBufReal ); + free( psPredictionEncoder->pppfInpBufImag ); + free( psPredictionEncoder->ppfInpPrevReal ); + free( psPredictionEncoder->ppfInpPrevImag ); + free( psPredictionEncoder->ppfPredStateReal ); + free( psPredictionEncoder->ppfPredStateImag ); + free( psPredictionEncoder->ppfPredStateRealTmp ); + free( psPredictionEncoder->ppfPredStateImagTmp ); +#endif + free( psPredictionEncoder ); @@ -206,7 +418,216 @@ void DeletePredictionEncoder( * * *-------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +void ComputePredictors( + PredictionEncoder *psPredictionEncoder, + float ***pppfReal, + float ***pppfImag ) +{ + int32_t c; + + int32_t b0 = psPredictionEncoder->iSubSetId; + int32_t bstep = psPredictionEncoder->iNumSubSets; + int32_t iNumBlocks = psPredictionEncoder->iNumBlocks; + float ***pppfRealBuf; + float ***pppfImagBuf; + float pfEstPredBitGain[LCLD_BANDS] = { 0 }; + + if ( iNumBlocks < LCLD_PRED_WIN_LEN ) + { + pppfRealBuf = psPredictionEncoder->pppfInpBufReal; + pppfImagBuf = psPredictionEncoder->pppfInpBufImag; + for ( c = 0; c < psPredictionEncoder->iChannels; c++ ) + { + int n; + for ( n = 0; n < LCLD_PRED_WIN_LEN - iNumBlocks; n++ ) + { + mvr2r( pppfRealBuf[c][n + iNumBlocks], pppfRealBuf[c][n], LCLD_BANDS ); + mvr2r( pppfImagBuf[c][n + iNumBlocks], pppfImagBuf[c][n], LCLD_BANDS ); + } + for ( n = 0; n < iNumBlocks; n++ ) + { + mvr2r( pppfReal[c][n], pppfRealBuf[c][n + LCLD_PRED_WIN_LEN - iNumBlocks], LCLD_BANDS ); + mvr2r( pppfImag[c][n], pppfImagBuf[c][n + LCLD_PRED_WIN_LEN - iNumBlocks], LCLD_BANDS ); + } + } + } + else + { + pppfRealBuf = pppfReal; + pppfImagBuf = pppfImag; + } + + for ( c = 0; c < psPredictionEncoder->iChannels; c++ ) + { + int32_t b; + psPredictionEncoder->piNumPredBands[c] = min( 50, psPredictionEncoder->iMaxNumPredBands ); + for ( b = b0; b < psPredictionEncoder->piNumPredBands[c]; b += bstep ) + { + int32_t n; + float fGain = 0.0; + float fBitGain = 0.0; + float *pfRxxReal; + float *pfRxxImag; + float fA1Real; + float fA1Imag; + int32_t iA1Mag; + int32_t iA1Phase; + + pfRxxReal = psPredictionEncoder->pfRxxReal; + pfRxxImag = psPredictionEncoder->pfRxxImag; + + pfRxxReal[0] = 0.0; + pfRxxImag[0] = 0.0; + for ( n = 0; n < LCLD_PRED_WIN_LEN; n++ ) + { +#ifdef USE_RXX_WINDOW + float fReal; + float fImag; + fReal = psPredictionEncoder->pfWindow[n] * pppfRealBuf[c][n][b]; + fImag = psPredictionEncoder->pfWindow[n] * pppfImagBuf[c][n][b]; + pfRxxReal[0] += ( fReal * fReal + fImag * fImag ); +#else + pfRxxReal[0] += ( pppfRealBuf[c][n][b] * pppfRealBuf[c][n][b] + pppfImagBuf[c][n][b] * pppfImagBuf[c][n][b] ); +#endif + } + + pfRxxReal[1] = 0.0; + pfRxxImag[1] = 0.0; + for ( n = 1; n < LCLD_PRED_WIN_LEN; n++ ) + { +#ifdef USE_RXX_WINDOW + float fReal1; + float fImag1; + float fReal2; + float fImag2; + fReal1 = psPredictionEncoder->pfWindow[n] * pppfRealBuf[c][n][b]; + fImag1 = psPredictionEncoder->pfWindow[n] * pppfImagBuf[c][n][b]; + fReal2 = psPredictionEncoder->pfWindow[n - 1] * pppfRealBuf[c][n - 1][b]; + fImag2 = psPredictionEncoder->pfWindow[n - 1] * pppfImagBuf[c][n - 1][b]; + pfRxxReal[1] += ( fReal1 * fReal2 + fImag1 * fImag2 ); + pfRxxImag[1] += ( fImag1 * fReal2 - fReal1 * fImag2 ); +#else + pfRxxReal[1] += ( pppfRealBuf[c][n][b] * pppfRealBuf[c][n - 1][b] + pppfImagBuf[c][n][b] * pppfImagBuf[c][n - 1][b] ); + pfRxxImag[1] += ( pppfImagBuf[c][n][b] * pppfRealBuf[c][n - 1][b] - pppfRealBuf[c][n][b] * pppfImagBuf[c][n - 1][b] ); +#endif + } + + if ( pfRxxReal[0] > 1e-12f ) + { + float fA1Mag; + float fA1Phase; + float fGain2; + float fBitGain2; + int iNumBlocksPerPredCoef = min( iNumBlocks * psPredictionEncoder->iNumSubSets, LCLD_PRED_WIN_LEN ); + + const float fMagScale = ( 2.0f * (float) ( 1 << ( PRED_QUNAT_FILTER_MAG_BITS ) ) + 1.0f ) / M_PI; + const float fInvMagScale = M_PI / ( 2.0f * (float) ( 1 << ( PRED_QUNAT_FILTER_MAG_BITS ) ) + 1.0f ); + const float fPhaseScale = (float) ( 1 << ( PRED_QUANT_FILTER_PHASE_BITS - 1 ) ) / M_PI; + const float fInvPhaseScale = M_PI / (float) ( 1 << ( PRED_QUANT_FILTER_PHASE_BITS - 1 ) ); + + /* Compute filter coefficeints */ + fA1Real = -pfRxxReal[1] / pfRxxReal[0]; + fA1Imag = -pfRxxImag[1] / pfRxxReal[0]; + + /* compute these before quant */ + /* Compute est coding gain based on quantized filter coefficients */ + fGain = 1.0f / ( 1.0f - fA1Real * fA1Real - fA1Imag * fA1Imag ); + fBitGain = 0.65f * log2f( fGain ) * (float) ( iNumBlocksPerPredCoef ) - (float) ( PRED_QUNAT_FILTER_MAG_BITS + PRED_QUANT_FILTER_PHASE_BITS ); // Wrong fix (iNumBlocks-1) + fA1Mag = sqrtf( fA1Real * fA1Real + fA1Imag * fA1Imag ); + fA1Mag = fMagScale * asinf( fA1Mag ); + iA1Mag = (int32_t) ( fA1Mag + 0.5f ); + iA1Mag = ( iA1Mag > PRED_QUANT_FILTER_MAG_MIN ) ? iA1Mag : PRED_QUANT_FILTER_MAG_MIN; + iA1Mag = ( iA1Mag < PRED_QUANT_FILTER_MAG_MAX ) ? iA1Mag : PRED_QUANT_FILTER_MAG_MAX; + fA1Mag = sinf( fInvMagScale * (float) iA1Mag ); + + fA1Phase = atan2f( fA1Imag, fA1Real ); + fA1Phase = fPhaseScale * fA1Phase; + iA1Phase = ( fA1Phase > 0.0f ) ? (int32_t) ( fA1Phase + 0.5f ) : (int32_t) ( fA1Phase - 0.5f ); + iA1Phase = ( iA1Phase > PRED_QUANT_FILTER_PHASE_MIN ) ? iA1Phase : PRED_QUANT_FILTER_PHASE_MIN; + iA1Phase = ( iA1Phase < PRED_QUANT_FILTER_PHASE_MAX ) ? iA1Phase : PRED_QUANT_FILTER_PHASE_MAX; // Is this the correct way to deal with this? should wrap? + fA1Phase = fInvPhaseScale * (float) iA1Phase; + + fA1Real = fA1Mag * cosf( fA1Phase ); + fA1Imag = fA1Mag * sinf( fA1Phase ); + fGain2 = 1.0f / ( 1.0f - fA1Real * fA1Real - fA1Imag * fA1Imag ); + fBitGain2 = 0.65f * log2f( fGain ) * (float) ( iNumBlocksPerPredCoef ) - (float) ( PRED_QUNAT_FILTER_MAG_BITS + PRED_QUANT_FILTER_PHASE_BITS ); // Wrong fix (iNumBlocks-1) + fGain = ( fGain < fGain2 ) ? fGain : fGain2; + fBitGain = ( fBitGain < fBitGain2 ) ? fBitGain : fBitGain2; + } + else + { + fA1Real = 0.0f; + fA1Imag = 0.0f; + iA1Mag = 0; + iA1Phase = 0; + fGain = -10.0f; // Fix this + } + + pfEstPredBitGain[b] = fBitGain; + psPredictionEncoder->ppiPredBandEnable[c][b] = ( fBitGain > 0.0f ); // Initial prediction enable + psPredictionEncoder->ppfA1Real[c][b] = fA1Real; + psPredictionEncoder->ppfA1Imag[c][b] = fA1Imag; + psPredictionEncoder->ppiA1Mag[c][b] = iA1Mag; + psPredictionEncoder->ppiA1Phase[c][b] = iA1Phase; + } + + { + float fBestCost; + int32_t iPredBands; + float fBitGain; + int32_t iPredChanEnable = 0; + + fBestCost = 0.0; + iPredBands = 0; + fBitGain = -7.0; + for ( b = b0; b < 50; b += bstep ) + { // still getting this decision wrong! + fBitGain -= 1.0; + if ( psPredictionEncoder->ppiPredBandEnable[c][b] == 1 ) + { + fBitGain += pfEstPredBitGain[b]; + } + if ( fBitGain > fBestCost ) + { + fBestCost = fBitGain; + iPredBands = b; + iPredChanEnable = 1; + } + } + + if ( iPredChanEnable == 1 ) + { + for ( b = iPredBands + bstep; b < LCLD_BANDS; b += bstep ) + { + psPredictionEncoder->ppiPredBandEnable[c][b] = 0; + } + activate_bit( &psPredictionEncoder->piPredChanEnable[c], psPredictionEncoder->iSubSetId ); + psPredictionEncoder->piNumPredBands[c] = iPredBands + bstep; + } + else if ( iPredBands > 0 ) + { + for ( b = iPredBands; b < LCLD_BANDS; b += bstep ) + { + psPredictionEncoder->ppiPredBandEnable[c][b] = 0; + } + activate_bit( &psPredictionEncoder->piPredChanEnable[c], psPredictionEncoder->iSubSetId ); + psPredictionEncoder->piNumPredBands[c] = iPredBands; + } + else + { + for ( b = b0; b < LCLD_BANDS; b += bstep ) + { + psPredictionEncoder->ppiPredBandEnable[c][b] = 0; + } + deactivate_bit( &psPredictionEncoder->piPredChanEnable[c], psPredictionEncoder->iSubSetId ); + psPredictionEncoder->piNumPredBands[c] = 0; + } + } + } +} +#else int32_t ComputePredictors( PredictionEncoder *psPredictionEncoder, float ***pppfReal, @@ -425,6 +846,7 @@ int32_t ComputePredictors( return iPredictionBits; } +#endif /*-------------------------------------------------------------------* @@ -432,7 +854,61 @@ int32_t ComputePredictors( * * *-------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +void ApplyForwardPredictors( + PredictionEncoder *psPredictionEncoder, + float ***pppfReal, + float ***pppfImag ) +{ + int32_t c; + for ( c = 0; c < psPredictionEncoder->iChannels; c++ ) + { + int32_t b; + if ( psPredictionEncoder->piPredChanEnable[c] > 0 ) + { + for ( b = 0; b < LCLD_BANDS; b++ ) + { + if ( psPredictionEncoder->ppiPredBandEnable[c][b] == 1 ) + { + int32_t n; + float fOldReal = 0.0f; + float fOldImag = 0.0f; + float fA1Real; + float fA1Imag; + int32_t iSubset = b % psPredictionEncoder->iNumSubSets; + if ( iSubset != psPredictionEncoder->iSubSetId ) + { + fOldReal = psPredictionEncoder->ppfInpPrevReal[c][b]; + fOldImag = psPredictionEncoder->ppfInpPrevImag[c][b]; + } + psPredictionEncoder->ppfInpPrevReal[c][b] = pppfReal[c][psPredictionEncoder->iNumBlocks - 1][b]; + psPredictionEncoder->ppfInpPrevImag[c][b] = pppfImag[c][psPredictionEncoder->iNumBlocks - 1][b]; + + fA1Real = psPredictionEncoder->ppfA1Real[c][b]; + fA1Imag = psPredictionEncoder->ppfA1Imag[c][b]; + for ( n = 0; n < psPredictionEncoder->iNumBlocks; n++ ) + { + float fReal; + float fImag; + + fReal = pppfReal[c][n][b] + fA1Real * fOldReal - fA1Imag * fOldImag; + fImag = pppfImag[c][n][b] + fA1Real * fOldImag + fA1Imag * fOldReal; + + fOldReal = pppfReal[c][n][b]; + fOldImag = pppfImag[c][n][b]; + + pppfReal[c][n][b] = fReal; + pppfImag[c][n][b] = fImag; + } + } + } + } + } + + return; +} +#else void ApplyForwardPredictors( PredictionEncoder *psPredictionEncoder, float ***pppfReal, @@ -479,6 +955,7 @@ void ApplyForwardPredictors( return; } +#endif /*-------------------------------------------------------------------* @@ -486,7 +963,71 @@ void ApplyForwardPredictors( * * *-------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +int32_t WritePredictors( + PredictionEncoder *psPredictionEncoder, + IVAS_SPLIT_REND_BITS_HANDLE pBits ) +{ + int32_t iBitsWritten = 0; + int32_t c; + int32_t iNumSubSets = psPredictionEncoder->iNumSubSets; + int32_t iSubSetId = psPredictionEncoder->iSubSetId; + int32_t iNumPredBandBits = 6; + const int16_t iSubSetBits = ( LCLD_MAX_NUM_PRED_SUBSETS > 4 ? 3 : 2 ); + + /* number of subsets */ + ivas_split_rend_bitstream_write_int32( pBits, iNumSubSets - 1, iSubSetBits ); /* otherwise use default */ + iBitsWritten += iSubSetBits; + + if ( iNumSubSets > 1 ) + { + /* write current subset */ + ivas_split_rend_bitstream_write_int32( pBits, iSubSetId, iSubSetBits ); + iBitsWritten += iSubSetBits; + iNumPredBandBits = ( iNumSubSets >= 4 ? 4 : 5 ); + } + + for ( c = 0; c < psPredictionEncoder->iChannels; c++ ) + { + int32_t b; + int32_t b0 = iSubSetId; + + ivas_split_rend_bitstream_write_int32( pBits, psPredictionEncoder->piPredChanEnable[c], iNumSubSets ); + iBitsWritten += iNumSubSets; + if ( get_bit( psPredictionEncoder->piPredChanEnable[c], iSubSetId ) ) + { + int32_t iNumPredBands = ( psPredictionEncoder->piNumPredBands[c] - b0 ) / iNumSubSets; + + ivas_split_rend_bitstream_write_int32( pBits, iNumPredBands, iNumPredBandBits ); + iBitsWritten += iNumPredBandBits; + + for ( b = b0; b < psPredictionEncoder->piNumPredBands[c]; b += iNumSubSets ) + { + ivas_split_rend_bitstream_write_int32( pBits, psPredictionEncoder->ppiPredBandEnable[c][b], 1 ); + iBitsWritten += 1; + + if ( psPredictionEncoder->ppiPredBandEnable[c][b] == 1 ) + { + int32_t iA1Mag; + int32_t iA1Phase; + + iA1Mag = psPredictionEncoder->ppiA1Mag[c][b]; + iA1Phase = psPredictionEncoder->ppiA1Phase[c][b] - PRED_QUANT_FILTER_PHASE_MIN; + + ivas_split_rend_bitstream_write_int32( pBits, iA1Mag, PRED_QUNAT_FILTER_MAG_BITS ); + iBitsWritten += PRED_QUNAT_FILTER_MAG_BITS; + + ivas_split_rend_bitstream_write_int32( pBits, iA1Phase, PRED_QUANT_FILTER_PHASE_BITS ); + iBitsWritten += PRED_QUANT_FILTER_PHASE_BITS; + } + } + } + } + + return iBitsWritten; +} +#else int32_t WritePredictors( PredictionEncoder *psPredictionEncoder, IVAS_SPLIT_REND_BITS_HANDLE pBits ) @@ -529,3 +1070,4 @@ int32_t WritePredictors( return iBitsWritten; } #endif +#endif diff --git a/lib_rend/ivas_RMSEnvGrouping.c b/lib_rend/ivas_RMSEnvGrouping.c index edbde3cb01..1d8ef2593f 100644 --- a/lib_rend/ivas_RMSEnvGrouping.c +++ b/lib_rend/ivas_RMSEnvGrouping.c @@ -276,6 +276,108 @@ static void ComputeBandEnergy( } +#ifdef SPLIT_REND_LCLD_5MS +/*-------------------------------------------------------------------* + * Function TryMerge() + * + * + *-------------------------------------------------------------------*/ + +/* THis is temporary cost function */ +static float TryMerge( + const int32_t iNumBands, + const int32_t iStartBlock, + const int32_t iGroupLength, + const float fMaxAllowedDiffdB, + float **ppfBandEnergy, + float **ppfBandEnergydB, +#ifdef APPLY_WEIGHT + float **ppfWeight, +#endif + float *pfMegredEnergydB ) +{ + int32_t b; + int32_t n; + float fMeanCost; + float fMaxCost; + float fMinDiffCost; + float fMaxDiffCost; + float fInvGroupSize = 1.0f / (float) iGroupLength; + float fInvNumBands = 1.0f / (float) iNumBands; + + for ( b = 0; b < iNumBands; b++ ) + { + float fGroupEnergy; + + + fGroupEnergy = 0.0; + for ( n = iStartBlock; n < ( iStartBlock + iGroupLength ); n++ ) + { + fGroupEnergy += ppfBandEnergy[n][b]; + } + fGroupEnergy *= fInvGroupSize; + fGroupEnergy = 10.0f * log10f( fGroupEnergy ); // Note epsolon was added when computing BandEnergy; + + pfMegredEnergydB[b] = fGroupEnergy; + } + + fMeanCost = 0.0; + fMaxCost = 0.0; + fMinDiffCost = 0.0; + fMaxDiffCost = 0.0; + for ( n = iStartBlock; n < ( iStartBlock + iGroupLength ); n++ ) + { + float fMeanAbsDiff; + float fMaxAbsDiff; + float fMaxDiff; + float fMinDiff; + + fMeanAbsDiff = 0.0; + fMaxAbsDiff = 0.0; + fMaxDiff = 0.0; + fMinDiff = 0.0; + for ( b = 0; b < iNumBands; b++ ) + { + float fDiff; + float fAbsDiff; + + fDiff = pfMegredEnergydB[b] - ppfBandEnergydB[n][b]; // Changed the order of this + fAbsDiff = fabsf( fDiff ); +#ifdef APPLY_WEIGHT + fAbsDiff *= ppfWeight[n][b]; +#endif + + fMeanAbsDiff += fAbsDiff; + fMaxAbsDiff = ( fMaxAbsDiff > fAbsDiff ) ? fMaxAbsDiff : fAbsDiff; + + + fMaxDiff = ( fMaxDiff > fDiff ) ? fMaxDiff : fDiff; + fMinDiff = ( fMinDiff < fDiff ) ? fMinDiff : fDiff; + } + fMeanAbsDiff *= fInvNumBands; + + fMeanCost = ( fMeanCost > fMeanAbsDiff ) ? fMeanCost : fMeanAbsDiff; + fMaxCost = ( fMaxCost > fMaxAbsDiff ) ? fMaxCost : fMaxAbsDiff; + + fMaxDiffCost = ( fMaxDiffCost > fMaxDiff ) ? fMaxDiffCost : fMaxDiff; + fMinDiffCost = ( fMinDiffCost < fMinDiff ) ? fMinDiffCost : fMinDiff; + } + + // printf("%f\t%f\t%f\t%f\n",fMeanCost,fMaxCost,fMaxDiffCost,fMinDiffCost); + + /*if(fMinDiffCost < -9.0){ // This prevents cliping + fMeanCost = 1e12; //Some large value + }*/ + + if ( fMaxCost > fMaxAllowedDiffdB ) + { + fMeanCost = 1e12f; // Some large value + } + + return fMeanCost; +} +#endif + /*-------------------------------------------------------------------* * Function ComputeMergeRMS() * @@ -487,6 +589,121 @@ static float TryMerge2( return fMergedCost; } +#ifdef SPLIT_REND_LCLD_5MS +/*-------------------------------------------------------------------* + * Function ComputeGreedyGroups() + * + * + *-------------------------------------------------------------------*/ + +static void ComputeGreedyGroups( + RMSEnvelopeGrouping *psRMSEnvelopeGrouping, + const int32_t iChannels, + const int32_t iNumBands, + const float fMeanAllowedDiffdB, + const float fMaxAllowedDiffdB ) +{ + float fBestMeanCost; + + fBestMeanCost = 0.0; + while ( fBestMeanCost < fMeanAllowedDiffdB ) + { + GMNode *psGMNode; + GMNode *psBestGMNode; + + fBestMeanCost = fMeanAllowedDiffdB; + psGMNode = &psRMSEnvelopeGrouping->psGMNodes[0]; + psBestGMNode = NULL; + while ( psGMNode->psNext != NULL ) + { + float fMeanCost; + int32_t iGroupLength; + + iGroupLength = psGMNode->iGroupLength + psGMNode->psNext->iGroupLength; + + fMeanCost = TryMerge( iNumBands * iChannels, + psGMNode->iGroupStart, + iGroupLength, // psGMNode->iGroupLength, //Fix this bug + fMaxAllowedDiffdB, + psRMSEnvelopeGrouping->ppfBandEnergy, + psRMSEnvelopeGrouping->ppfBandEnergydB, +#ifdef APPLY_WEIGHT + psRMSEnvelopeGrouping->ppfWeight, +#endif + psGMNode->pfMergedEnergydB ); + + + if ( fMeanCost < fBestMeanCost ) + { + fBestMeanCost = fMeanCost; + psBestGMNode = psGMNode; + } + + psGMNode = psGMNode->psNext; + } + + if ( fBestMeanCost < fMeanAllowedDiffdB && psBestGMNode != NULL && psBestGMNode->psNext != NULL ) + { + psBestGMNode->iGroupLength += psBestGMNode->psNext->iGroupLength; + psBestGMNode->psNext = psBestGMNode->psNext->psNext; + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * Function ComputeGreedyGroups2() + * + * + *-------------------------------------------------------------------*/ + +static void ComputeGreedyGroups2( + RMSEnvelopeGrouping *psRMSEnvelopeGrouping, + const int32_t iChannels, + const int32_t iNumBands, + const int32_t *piBandwidths ) +{ + float fBestMergeCost; + // int32_t iDone = 0; + fBestMergeCost = -1.0; + + while ( fBestMergeCost < 0.0 ) + { + GMNode *psGMNode; + GMNode *psBestGMNode; + + fBestMergeCost = 0.0; + psGMNode = &psRMSEnvelopeGrouping->psGMNodes[0]; + psBestGMNode = NULL; + while ( psGMNode->psNext != NULL ) + { + float fMergeCost; + + fMergeCost = TryMerge2( iChannels, iNumBands, piBandwidths, psRMSEnvelopeGrouping->ppfBandEnergy, psRMSEnvelopeGrouping->ppfBandEnergydB, psGMNode, psGMNode->psNext ); + + if ( fMergeCost < fBestMergeCost ) + { + fBestMergeCost = fMergeCost; + psBestGMNode = psGMNode; + } + + psGMNode = psGMNode->psNext; + } + + if ( fBestMergeCost < 0.0 && psBestGMNode != NULL && psBestGMNode->psNext != NULL ) + { + psBestGMNode->iGroupLength += psBestGMNode->psNext->iGroupLength; + psBestGMNode->iGroupRMSEnvelopeCost = -1; + psBestGMNode->fGroupSNRPenalty = -1.0; + psBestGMNode->psNext = psBestGMNode->psNext->psNext; + } + } + + return; +} +#endif /*-------------------------------------------------------------------* * Function ComputeGreedyGroups3() @@ -700,9 +917,13 @@ void ComputeEnvelopeGrouping( psRMSEnvelopeGrouping->psGMNodes[n].psNext = NULL; } - /* Perform grouping via Greedy Merge */ - /* Allows control over max groups can call using 16 if want same as previous call */ +/* Perform grouping via Greedy Merge */ +/* Allows control over max groups can call using 16 if want same as previous call */ +#ifdef SPLIT_REND_LCLD_5MS + ComputeGreedyGroups3( psRMSEnvelopeGrouping, iChannels, iNumBands, piBandwidths, psRMSEnvelopeGrouping->iNumBlocks ); +#else ComputeGreedyGroups3( psRMSEnvelopeGrouping, iChannels, iNumBands, piBandwidths, LCLD_BLOCKS_PER_FRAME ); +#endif /* Calc Groups from Merge Results */ *piNumGroups = 0; diff --git a/lib_rend/ivas_lcld_decoder.c b/lib_rend/ivas_lcld_decoder.c index 8aafcb1fa8..d989797a29 100644 --- a/lib_rend/ivas_lcld_decoder.c +++ b/lib_rend/ivas_lcld_decoder.c @@ -83,9 +83,6 @@ struct LCLD_DECODER uint32_t num_decode_table[2 * ALLOC_TABLE_SIZE]; int32_t piMSPredCoefs[MAX_BANDS]; int32_t piLRPhaseDiffs[MAX_BANDS]; -#ifdef ENABLE_PMOD_ADJUST - int32_t **ppiHiSMRFlags; -#endif int32_t iCommonGrouping; int32_t *piNumGroups; int32_t **ppiGroupLengths; @@ -344,10 +341,18 @@ static void CreateDecodeTable( LCLDDecoder *psLCLDDecoder, int32_t num, const ui * *------------------------------------------------------------------------------------------*/ +#ifndef SPLIT_REND_LCLD_5MS ivas_error CreateLCLDDecoder( LCLDDecoder **psLCLDDecoder_out, const int32_t iSampleRate, const int32_t iChannels ) +#else +ivas_error CreateLCLDDecoder( + LCLDDecoder **psLCLDDecoder_out, + const int32_t iSampleRate, + const int32_t iChannels, + const int32_t iNumBlocks ) +#endif { int32_t n; int32_t read_length; @@ -355,17 +360,27 @@ ivas_error CreateLCLDDecoder( LCLDDecoder *psLCLDDecoder = NULL; assert( iSampleRate == 48000 ); // Fix - +#ifdef SPLIT_REND_LCLD_5MS + assert( iNumBlocks == 16 || iNumBlocks == 8 || iNumBlocks == 4 ); +#endif if ( ( psLCLDDecoder = (LCLDDecoder *) malloc( sizeof( LCLDDecoder ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } psLCLDDecoder->iSampleRate = iSampleRate; psLCLDDecoder->iChannels = iChannels; +#ifdef SPLIT_REND_LCLD_5MS + psLCLDDecoder->iNumBlocks = iNumBlocks; +#else psLCLDDecoder->iNumBlocks = LCLD_BLOCKS_PER_FRAME; +#endif psLCLDDecoder->iAllocOffset = 0; - psLCLDDecoder->iNumBands = MAX_BANDS_48; // Fix +#ifdef SPLIT_REND_LCLD_5MS + psLCLDDecoder->iNumBands = 0; // read from bitstream +#else + psLCLDDecoder->iNumBands = MAX_BANDS_48; // Fix +#endif psLCLDDecoder->piBandwidths = c_aiBandwidths48; // Fix psLCLDDecoder->iMSMode = 0; @@ -378,10 +393,6 @@ ivas_error CreateLCLDDecoder( psLCLDDecoder->piLRPhaseDiffs[n] = 0; psLCLDDecoder->piMSPredCoefs[n] = 0; } -#ifdef ENABLE_PMOD_ADJUST - psLCLDDecoder->ppiHiSMRFlags = - (int32_t **) malloc( psLCLDDecoder->iChannels * sizeof( int32_t * ) ); -#endif psLCLDDecoder->iCommonGrouping = 1; /* Common grouping always on only impacts stereo */ if ( ( psLCLDDecoder->piNumGroups = (int32_t *) malloc( psLCLDDecoder->iChannels * sizeof( int32_t ) ) ) == NULL ) @@ -429,11 +440,6 @@ ivas_error CreateLCLDDecoder( for ( n = 0; n < iChannels; n++ ) { int16_t k; -#ifdef ENABLE_PMOD_ADJUST - psLCLDDecoder->ppiHiSMRFlags[n] = - (int32_t *) malloc( MAX_BANDS * sizeof( int32_t ) ); - ; -#endif if ( ( psLCLDDecoder->ppiGroupLengths[n] = (int32_t *) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( int32_t ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); @@ -606,16 +612,6 @@ void DeleteLCLDDecoder( LCLDDecoder *psLCLDDecoder ) free( psLCLDDecoder->pppiExcitation ); } -#ifdef ENABLE_PMOD_ADJUST - if ( psLCLDDecoder->ppiHiSMRFlags != NULL ) - { - for ( n = 0; n < psLCLDDecoder->iChannels; n++ ) - { - free( psLCLDDecoder->ppiHiSMRFlags[n] ); - } - free( psLCLDDecoder->ppiHiSMRFlags ); - } -#endif if ( psLCLDDecoder->pppiAlloc != NULL ) { @@ -768,9 +764,6 @@ int32_t DecodeLCLDFrame( ReadRMSEnvelope( psLCLDDecoder->iChannels, (const int32_t *) psLCLDDecoder->piNumGroups, psLCLDDecoder->iNumBands, psLCLDDecoder->pppiRMSEnvelope, pBits ); -#ifdef ENABLE_PMOD_ADJUST - ReadPmodInformation( psLCLDDecoder->ppiHiSMRFlags, pBits, psLCLDDecoder->iChannels, psLCLDDecoder->iNumBands ); -#endif ReadAllocInformation( &psLCLDDecoder->iAllocOffset, pBits ); @@ -831,8 +824,26 @@ int32_t DecodeLCLDFrame( psLCLDDecoder->pppiLCLDSignImag[n], pppfLCLDReal[n], pppfLCLDImag[n] ); } +#ifdef DEBUG_WRITE_PREDICTORS + { + static FILE *fid; + if ( !fid ) + fid = fopen( "pred_dec.txt", "wt" ); + for ( n = 0; n < psLCLDDecoder->iChannels; n++ ) + { + int b; + for ( b = 0; b < 60; b++ ) + fprintf( fid, "%.5f ", (float) psLCLDDecoder->psPredictionDecoder->ppiPredBandEnable[n][b] * psLCLDDecoder->psPredictionDecoder->ppfA1Imag[n][b] ); + } + fprintf( fid, "%d %d\n", psLCLDDecoder->psPredictionDecoder->iSubSetId, psLCLDDecoder->psPredictionDecoder->piPredChanEnable[n] ); + } +#endif +#ifdef SPLIT_REND_LCLD_5MS + ApplyInversePredictors( psLCLDDecoder->psPredictionDecoder, pppfLCLDReal, pppfLCLDImag ); +#else ApplyInversePredictros( psLCLDDecoder->psPredictionDecoder, pppfLCLDReal, pppfLCLDImag ); +#endif for ( n = 0; n < psLCLDDecoder->iChannels; n++ ) { @@ -1020,9 +1031,10 @@ static void InvMSCoding( { int32_t b; int32_t iFBOffset; +#ifdef SPLIT_REND_LCLD_5MS + int32_t bMSPred = 0; +#else int32_t bms = 0; -#if defined SIMPLE_PHASE - void( *pFuncPhaseRotateOptions[4] ) = { &rot_zero, &rot_m_pi_2, &rot_pm_pi, &rot_p_pi_2 }; #endif iFBOffset = 0; @@ -1031,9 +1043,11 @@ static void InvMSCoding( if ( piMSFlags[b] == 1 ) { int32_t n; -#if defined SIMPLE_PHASE - void ( *pFuncPhaseRotate )( float *, float * ) = - pFuncPhaseRotateOptions[piLRPhaseDiffs[bms]]; +#ifdef SPLIT_REND_LCLD_5MS + int32_t phaseIdx; + float fPred; + phaseIdx = piLRPhaseDiffs[bMSPred] - PHASE_MIN_VAL; + fPred = dequantPred( piMSPredCoefs[bMSPred] ); #endif for ( n = 0; n < piBandwidths[b]; n++ ) { @@ -1047,8 +1061,10 @@ static void InvMSCoding( if ( iMSMode == 3 ) { +#ifndef SPLIT_REND_LCLD_5MS float fPred; fPred = dequantPred( piMSPredCoefs[bms] ); +#endif pppfReal[1][k][iFBOffset] += fPred * pppfReal[0][k][iFBOffset]; pppfImag[1][k][iFBOffset] += fPred * pppfImag[0][k][iFBOffset]; } @@ -1060,13 +1076,11 @@ static void InvMSCoding( if ( iMSMode == 3 ) { -#ifdef SIMPLE_PHASE - ( *pFuncPhaseRotate )( &fRightReal, &fRightImag ); -#else +#ifndef SPLIT_REND_LCLD_5MS int32_t phaseIdx; phaseIdx = piLRPhaseDiffs[bms] - PHASE_MIN_VAL; - cplxmult( &fRightReal, &fRightImag, c_afRotRealImag[phaseIdx][0], -c_afRotRealImag[phaseIdx][1] ); #endif + cplxmult( &fRightReal, &fRightImag, c_afRotRealImag[phaseIdx][0], -c_afRotRealImag[phaseIdx][1] ); } pppfReal[0][k][iFBOffset] = fLeftReal; @@ -1076,8 +1090,11 @@ static void InvMSCoding( } iFBOffset++; } - +#ifdef SPLIT_REND_LCLD_5MS + bMSPred++; +#else bms++; +#endif } else { @@ -1175,13 +1192,6 @@ static int32_t ReadMSInformation( anyNonZero = ivas_split_rend_bitstream_read_int32( pBits, 1 ); if ( anyNonZero ) { -#ifdef SIMPLE_PHASE - for ( n = 0; n < iNumMSPredBands; n++ ) - { - piLRPhaseDiffs[n] = ivas_split_rend_bitstream_read_int32( pBits, SIMPLE_PHASE_BITS ); - iBitsRead += SIMPLE_PHASE_BITS; - } -#else piLRPhaseDiffs[0] = ivas_split_rend_bitstream_read_int32( pBits, PHASE_BAND0_BITS ); piLRPhaseDiffs[0] += PHASE_MIN_VAL; iBitsRead += PHASE_BAND0_BITS; @@ -1192,7 +1202,6 @@ static int32_t ReadMSInformation( piLRPhaseDiffs[n] = tabIdx + ENV_DELTA_MIN; } DecodePhase( piLRPhaseDiffs, iNumMSPredBands, PHASE_DIFF_DIM ); -#endif } else { @@ -1224,11 +1233,9 @@ static int32_t ReadMSInformation( } #ifdef DEBUG_WRITE_MS_PRED { - static FILE *fid = 0; + static FILE *fid; if ( !fid ) - { - fid = fopen( "ms_mode_dec.txt", "wt" ); - } + fid = fopen( "ms_pred_dec.txt", "wt" ); writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumMSPredBands, iNumBands, fid, piMSFlags ); } #endif @@ -1241,6 +1248,12 @@ static int32_t ReadMSInformation( return iBitsRead; } +#ifdef SPLIT_REND_LCLD_5MS +int32_t GetNumPredSubSets( LCLDDecoder *psLCLDDecoder ) +{ + return psLCLDDecoder->psPredictionDecoder->iNumSubSets; +} +#endif static int32_t ReadGroupInformation( const int32_t iChannels, @@ -1430,66 +1443,6 @@ static int32_t ReadRMSEnvelope( } -#ifdef ENABLE_PMOD_ADJUST -static int32_t ReadPmodInformation( - int32_t **ppiHiSMRFlags, - IVAS_SPLIT_REND_BITS_HANDLE pBits, - int32_t iChannels, - int32_t iNumBands ) -{ - int32_t iBitsRead; - int32_t c; - iBitsRead = 0; - for ( c = 0; c < iChannels; c++ ) - { - int32_t b; - int32_t iFlags = ivas_split_rend_bitstream_read_int32( pBits, 1 ); - iBitsRead += 1; - if ( iFlags ) - { - for ( b = 0; b < iNumBands; b++ ) - { - ppiHiSMRFlags[c][b] = ivas_split_rend_bitstream_read_int32( pBits, 1 ); - iBitsRead += 1; - } - } - else - { - for ( b = 0; b < iNumBands; b++ ) - { - ppiHiSMRFlags[c][b] = 0; - } - } - } -#ifdef WRITE_HISMR_FLAGS - { - static FILE *fid = 0; - if ( !fid ) - { - fid = fopen( "hismr_dec.txt", "wt" ); - } - for ( c = 0; c < iChannels; c++ ) - { - int32_t b; - for ( b = 0; b < iNumBands; b++ ) - { - if ( c == iChannels - 1 && b == iNumBands - 1 ) - { - fprintf( fid, "%d\n", ppiHiSMRFlags[c][b] ); - } - else - { - fprintf( fid, "%d ", ppiHiSMRFlags[c][b] ); - } - } - } - } -#endif - return iBitsRead; -} -#endif - - static int32_t ReadAllocInformation( int32_t *piAllocOffset, IVAS_SPLIT_REND_BITS_HANDLE pBits ) diff --git a/lib_rend/ivas_lcld_encoder.c b/lib_rend/ivas_lcld_encoder.c index 8052edee4a..3d64e6012e 100644 --- a/lib_rend/ivas_lcld_encoder.c +++ b/lib_rend/ivas_lcld_encoder.c @@ -39,9 +39,6 @@ #include "ivas_lcld_rom_tables.h" #include "prot.h" #include "ivas_prot_rend.h" -#ifdef ENABLE_PMOD_ADJUST -#include "ton_corr.h" -#endif #include "wmc_auto.h" /*------------------------------------------------------------------------------------------* @@ -55,7 +52,9 @@ struct LCLD_ENCODER int32_t iNumBlocks; int32_t iTargetBitRate; +#ifndef SPLIT_REND_LCLD_5MS int32_t iTargetBitsPerFrame; +#endif int32_t iNumBands; const int32_t *piBandwidths; @@ -66,9 +65,6 @@ struct LCLD_ENCODER int32_t piLRPhaseDiffs[MAX_BANDS]; int32_t iAllowSidePred; -#ifdef ENABLE_PMOD_ADJUST - int32_t **ppiHiSMRFlags; -#endif RMSEnvelopeGrouping *psRMSEnvelopeGrouping; @@ -92,6 +88,38 @@ struct LCLD_ENCODER PredictionEncoder *psPredictionEncoder; }; +#ifdef SPLIT_REND_LCLD_5MS +static int Quantize( float fVal, float fScale, int *iSign, int iMaxVal ) +{ + int iVal; + if ( fVal > 0.0f ) + { + iVal = (int) ( fScale * fVal + 0.5f ); + *iSign = 0; + } + else + { + iVal = (int) ( -fScale * fVal + 0.5f ); + *iSign = 1; + } + iVal = ( iVal < iMaxVal ) ? iVal : iMaxVal; + + return iVal; +} +static float UnQuantize( int iVal, float fScale, int iSign ) +{ + float fVal; + if ( iSign == 0 ) + { + fVal = fScale * (float) iVal; + } + else + { + fVal = -fScale * (float) iVal; + } + return fVal; +} +#endif /*------------------------------------------------------------------------------------------* * Function CreateLCLDEncoder() @@ -99,18 +127,36 @@ struct LCLD_ENCODER * *------------------------------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +ivas_error CreateLCLDEncoder( + LCLDEncoder **psLCLDEncoder_out, + const int32_t iSampleRate, + const int32_t iChannels, + const int32_t iTargetBitRate, + const int32_t iAllowSidePred, + const int32_t iNumBlocks, + const int32_t iNumSubSets ) +#else ivas_error CreateLCLDEncoder( LCLDEncoder **psLCLDEncoder_out, const int32_t iSampleRate, const int32_t iChannels, const int32_t iTargetBitRate, const int32_t iAllowSidePred ) +#endif { int32_t n; LCLDEncoder *psLCLDEncoder; ivas_error error; +#ifdef SPLIT_REND_LCLD_5MS + int32_t iMaxNumPredBands = 0; +#endif assert( iSampleRate == 48000 ); // Fix +#ifdef SPLIT_REND_LCLD_5MS + assert( iNumBlocks == 16 || iNumBlocks == 8 || iNumBlocks == 4 ); + assert( iNumSubSets > 0 && iNumSubSets <= LCLD_MAX_NUM_PRED_SUBSETS ); +#endif if ( ( psLCLDEncoder = (LCLDEncoder *) malloc( sizeof( LCLDEncoder ) ) ) == NULL ) { @@ -119,14 +165,29 @@ ivas_error CreateLCLDEncoder( psLCLDEncoder->iSampleRate = iSampleRate; psLCLDEncoder->iChannels = iChannels; +#ifdef SPLIT_REND_LCLD_5MS + psLCLDEncoder->iNumBlocks = iNumBlocks; +#else psLCLDEncoder->iNumBlocks = LCLD_BLOCKS_PER_FRAME; +#endif psLCLDEncoder->iAllocOffset = 0; psLCLDEncoder->iTargetBitRate = iTargetBitRate; +#ifndef SPLIT_REND_LCLD_5MS psLCLDEncoder->iTargetBitsPerFrame = iTargetBitRate * LCLD_BLOCKS_PER_FRAME * LCLD_BANDS / iSampleRate; +#endif + + psLCLDEncoder->piBandwidths = c_aiBandwidths48; +#ifdef SPLIT_REND_LCLD_5MS + psLCLDEncoder->iNumBands = DEF_BANDS_48; /* 22 bands = 50 CLDFB bands (rather than 23 bands) */ + for ( n = 0; n < psLCLDEncoder->iNumBands; n++ ) + { + iMaxNumPredBands += psLCLDEncoder->piBandwidths[n]; + } +#else + psLCLDEncoder->iNumBands = MAX_BANDS_48; +#endif - psLCLDEncoder->iNumBands = MAX_BANDS_48; // Fix - psLCLDEncoder->piBandwidths = c_aiBandwidths48; // Fix psLCLDEncoder->iMSMode = 0; if ( ( psLCLDEncoder->piMSFlags = (int32_t *) malloc( MAX_BANDS * sizeof( int32_t ) ) ) == NULL ) @@ -194,23 +255,11 @@ ivas_error CreateLCLDEncoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } -#ifdef ENABLE_PMOD_ADJUST - if ( ( psLCLDEncoder->ppiHiSMRFlags = (int32_t **) malloc( psLCLDEncoder->iChannels * sizeof( int32_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); - } -#endif for ( n = 0; n < iChannels; n++ ) { int32_t k; -#ifdef ENABLE_PMOD_ADJUST - if ( ( psLCLDEncoder->ppiHiSMRFlags[n] = (int32_t *) malloc( MAX_BANDS * sizeof( int32_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); - } -#endif if ( ( psLCLDEncoder->ppiGroupLengths[n] = (int32_t *) malloc( LCLD_BLOCKS_PER_FRAME * sizeof( int32_t ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); @@ -302,10 +351,17 @@ ivas_error CreateLCLDEncoder( } } +#ifdef SPLIT_REND_LCLD_5MS + if ( ( error = CreatePredictionEncoder( &( psLCLDEncoder->psPredictionEncoder ), iChannels, psLCLDEncoder->iNumBlocks, iNumSubSets, iMaxNumPredBands ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = CreatePredictionEncoder( &( psLCLDEncoder->psPredictionEncoder ), iChannels, psLCLDEncoder->iNumBlocks ) ) != IVAS_ERR_OK ) { return error; } +#endif *psLCLDEncoder_out = psLCLDEncoder; @@ -350,16 +406,6 @@ void DeleteLCLDEncoder( } free( psLCLDEncoder->ppiGroupLengths ); } -#ifdef ENABLE_PMOD_ADJUST - if ( psLCLDEncoder->ppiHiSMRFlags != NULL ) - { - for ( n = 0; n < psLCLDEncoder->iChannels; n++ ) - { - free( psLCLDEncoder->ppiHiSMRFlags[n] ); - } - free( psLCLDEncoder->ppiHiSMRFlags ); - } -#endif if ( psLCLDEncoder->pppiRMSEnvelope != NULL ) { for ( n = 0; n < psLCLDEncoder->iChannels; n++ ) @@ -483,10 +529,6 @@ static int32_t CountLCLDBits( const int32_t iNumGroups, const int32_t *piGroupLe static int32_t WriteHeaderInformation( const int32_t iNumBands, IVAS_SPLIT_REND_BITS_HANDLE pBits ); -#ifdef ENABLE_PMOD_ADJUST -static int32_t WritePmodInformation( const int32_t **ppiHiSMRFlags, IVAS_SPLIT_REND_BITS_HANDLE pBits, int32_t iChannels, int32_t iNumBands ); -#endif - static int32_t WriteMSInformation( const int32_t iNumBands, const int32_t iMSMode, const int32_t *piMSFlags, const int32_t *piLRPhaseDiffs, const int32_t *piMSPredCoefs, int32_t iNumMSPredBands, IVAS_SPLIT_REND_BITS_HANDLE pBits ); static int32_t WriteGroupInformation( const int32_t iChannels, const int32_t iCommonGrouping, const int32_t *piNumGroups, int32_t **ppiGroupLengths, IVAS_SPLIT_REND_BITS_HANDLE pBits ); @@ -497,8 +539,11 @@ static int32_t WriteAllocInformation( const int32_t iAllocOffset, IVAS_SPLIT_REN static int32_t WriteLCLDData( const int32_t iNumGroups, const int32_t *piGroupLengths, const int32_t iNumBands, const int32_t *piBandwidths, const int32_t *piPredEnable, int32_t **ppiAlloc, int32_t **ppiSignReal, int32_t **ppiSignImag, int32_t **ppiQReal, int32_t **ppiQImag, IVAS_SPLIT_REND_BITS_HANDLE pBits ); +#ifdef SPLIT_REND_LCLD_5MS +static int32_t ComputeAllocation( const int32_t iChannels, const int32_t *piNumGroups, int32_t **ppiGroupLengths, const int32_t iNumBands, const int32_t *piBandwidths, float ***pppfReal, float ***pppfImag, int32_t ***pppiSMR, const int32_t iAvailableBits, int32_t *piAllocOffset, int32_t ***pppiAlloc, int32_t ***pppiQReal, int32_t ***pppiQImag, int32_t ***pppiSignReal, int32_t ***pppiSignImag, PredictionEncoder *psPredictionEncoder ); +#else static int32_t ComputeAllocation( const int32_t iChannels, const int32_t *piNumGroups, int32_t **ppiGroupLengths, const int32_t iNumBands, const int32_t *piBandwidths, float ***pppfReal, float ***pppfImag, int32_t ***pppiSMR, const int32_t iAvailableBits, int32_t *piAllocOffset, int32_t ***pppiAlloc, int32_t ***pppiQReal, int32_t ***pppiQImag, int32_t ***pppiSignReal, int32_t ***pppiSignImag, int32_t **ppiPredEnable, float **ppfA1Real, float **ppfA1Imag ); - +#endif /*------------------------------------------------------------------------------------------* * Function EncodeLCLDFrame() @@ -519,6 +564,9 @@ int32_t EncodeLCLDFrame( int32_t iNumMSBands = 0; iAvailableBits = available_bits; // HCBR for now iBitsWritten = 0; +#ifdef SPLIT_REND_LCLD_5MS + assert( available_bits <= pBits->buf_len * 8 ); +#endif /* Do MS calc here */ if ( psLCLDEncoder->iChannels == 2 ) @@ -540,9 +588,6 @@ int32_t EncodeLCLDFrame( } } -#ifdef ENABLE_PMOD_ADJUST - CalcTonQuotas( psLCLDEncoder->iChannels, psLCLDEncoder->iNumBands, psLCLDEncoder->piBandwidths, pppfLCLDReal, pppfLCLDImag, psLCLDEncoder->ppiHiSMRFlags ); -#endif /* Compute Grouping and RMS Envelopes */ if ( psLCLDEncoder->iChannels == 2 && psLCLDEncoder->iCommonGrouping == 1 ) @@ -612,12 +657,6 @@ int32_t EncodeLCLDFrame( iBitsWritten += WriteRMSEnvelope( psLCLDEncoder->iChannels, (const int32_t *) psLCLDEncoder->piNumGroups, psLCLDEncoder->iNumBands, psLCLDEncoder->pppiRMSEnvelope, pBits ); -#ifdef ENABLE_PMOD_ADJUST - iBitsWritten += WritePmodInformation( psLCLDEncoder->ppiHiSMRFlags, - pBits, - psLCLDEncoder->iChannels, - psLCLDEncoder->iNumBands ); -#endif if ( psLCLDEncoder->iChannels == 2 && psLCLDEncoder->iCommonGrouping == 1 ) { @@ -648,7 +687,20 @@ int32_t EncodeLCLDFrame( } } } - +#ifdef DEBUG_WRITE_PREDICTORS + { + static FILE *fid; + if ( !fid ) + fid = fopen( "pred_enc.txt", "wt" ); + for ( n = 0; n < psLCLDEncoder->iChannels; n++ ) + { + int b; + for ( b = 0; b < 60; b++ ) + fprintf( fid, "%.5f ", (float) psLCLDEncoder->psPredictionEncoder->ppiPredBandEnable[n][b] * psLCLDEncoder->psPredictionEncoder->ppfA1Imag[n][b] ); + } + fprintf( fid, "%d %d\n", psLCLDEncoder->psPredictionEncoder->iSubSetId, psLCLDEncoder->psPredictionEncoder->piPredChanEnable[n] ); + } +#endif iAvailableBits -= iBitsWritten; ComputeAllocation( psLCLDEncoder->iChannels, (const int32_t *) psLCLDEncoder->piNumGroups, @@ -665,10 +717,15 @@ int32_t EncodeLCLDFrame( psLCLDEncoder->pppiQLCLDImag, psLCLDEncoder->pppiLCLDSignReal, psLCLDEncoder->pppiLCLDSignImag, +#ifdef SPLIT_REND_LCLD_5MS + psLCLDEncoder->psPredictionEncoder ); +#else psLCLDEncoder->psPredictionEncoder->ppiPredBandEnable, psLCLDEncoder->psPredictionEncoder->ppfA1Real, psLCLDEncoder->psPredictionEncoder->ppfA1Imag ); +#endif + iBitsWritten += WriteAllocInformation( psLCLDEncoder->iAllocOffset, pBits ); @@ -710,6 +767,344 @@ int32_t GetNumGroups( LCLDEncoder *psLCLDEncoder ) * *------------------------------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +enum MSPred_Types +{ + MS_PHASE_AND_PRED = 0, /* LR phase alignment + real-valued M/S prediction */ + MS_PRED_ONLY = 1, /* real-valued M/S prediction */ + MS_PHASE_ONLY = 2 /* LR phase alignment + M/S */ +}; + +enum MS_BS_TYPES +{ + MS_OFF = 0, + MS_ALL = 1, + MS_SOME = 2, + MS_PRED = 3 +}; + +static int32_t MSModeCalculation( + const int32_t iNumBlocks, + const int32_t iNumBands, + const int32_t *piBandwidths, + float ***pppfReal, + float ***pppfImag, + int32_t *piMSMode, + int32_t *piLRPhaseDiffs, + int32_t *piMSPredCoefs, + const int32_t iAllowSidePred, + int32_t *piMSFlags ) +{ + int32_t b; + int32_t iFBOffset; + int32_t iNumMSBands; + int32_t iMSPredType; + float fMSBitGain = 0.0f; + float pfMSPredBitGain[3] = { 0.0f }; + float fPred; + int32_t piMSPredFlags0[MAX_BANDS] = { 0 }; + int32_t piMSPredFlags1[MAX_BANDS] = { 0 }; + int32_t piMSPredFlags2[MAX_BANDS] = { 0 }; + int32_t *ppiMSPredFlags[3]; + int32_t piMSPredCoefs0[MAX_BANDS] = { 0 }; + int32_t piMSPredCoefs1[MAX_BANDS] = { 0 }; + int32_t piMSPredCoefs2[MAX_BANDS] = { 0 }; + int32_t *ppiMSPredCoefs[3]; + int32_t piMSPredPhase0[MAX_BANDS] = { 0 }; + int32_t piMSPredPhase1[MAX_BANDS] = { 0 }; + int32_t piMSPredPhase2[MAX_BANDS] = { 0 }; + int32_t *ppiMSPredPhase[3]; + int32_t iMsInfoBits; + int32_t piMsPredInfoBits[3] = { 0 }; + + const float feps = 1e-12f; + float fBitsFactor = 3.32192809488736f; /* = 1/log10(2), from dB/10 to bits assuming 1 bit per log2(SNR) or 1 bit per 3dB SNR */ + if ( iNumBlocks < LCLD_BLOCKS_PER_FRAME ) + { + fBitsFactor *= ( 0.7f + (float) ( iNumBlocks - 4 ) / (float) ( LCLD_BLOCKS_PER_FRAME - 4 ) * ( 1.0f - 0.7f ) ); /* Tuning for relatively higher side rate due to shorter frame length */ + } + + ppiMSPredFlags[0] = piMSPredFlags0; + ppiMSPredFlags[1] = piMSPredFlags1; + ppiMSPredFlags[2] = piMSPredFlags2; + + ppiMSPredCoefs[0] = piMSPredCoefs0; + ppiMSPredCoefs[1] = piMSPredCoefs1; + ppiMSPredCoefs[2] = piMSPredCoefs2; + + ppiMSPredPhase[0] = piMSPredPhase0; + ppiMSPredPhase[1] = piMSPredPhase1; + ppiMSPredPhase[2] = piMSPredPhase2; + + *piMSMode = MS_OFF; + iFBOffset = 0; + iNumMSBands = 0; + for ( b = 0; b < iNumBands; b++ ) + { + int32_t n; + float fLeftEnergy; + float fRightEnergy; + float fMidEnergy; + float fSideEnergy; + float fLRRatio; + float fMSRatio; + float pfMSPredRatio[3] = { 0.0f }; + float fMidEnergyPred; + float fSideEnergyPred; + float fLRCovReal = 0.0f; + float fLRCovImag = 0.0f; + int32_t iPhase; + int32_t iPred; + int32_t tabIdx = 0; + float fNumLines = (float) ( iNumBlocks * piBandwidths[b] * 2 ); /* per band per channel */ + float fLevelToSMRdBFactor = (float) c_aiDefaultTheta48[b] / (float) ( 1 << PERCEPTUAL_MODEL_SLGAIN_SHIFT ); /* frequency dependent SMR slope in psy model */ +#ifndef SPLIT_REND_LCLD_5MS + fLevelToSMRdBFactor = (float) c_aiDefaultTheta48[b] / 16.0f; /* this is a bug due to a change of PERCEPTUAL_MODEL_SLGAIN_SHIFT */ +#endif + fLeftEnergy = 0.0f; + fRightEnergy = 0.0f; + fMidEnergy = 0.0f; + fSideEnergy = 0.0f; + + for ( n = 0; n < piBandwidths[b]; n++ ) + { + int32_t k; + for ( k = 0; k < iNumBlocks; k++ ) + { + float fMidReal; + float fMidImag; + float fSideReal; + float fSideImag; + + fMidReal = 0.5f * ( pppfReal[0][k][iFBOffset] + pppfReal[1][k][iFBOffset] ); + fMidImag = 0.5f * ( pppfImag[0][k][iFBOffset] + pppfImag[1][k][iFBOffset] ); + fSideReal = 0.5f * ( pppfReal[0][k][iFBOffset] - pppfReal[1][k][iFBOffset] ); + fSideImag = 0.5f * ( pppfImag[0][k][iFBOffset] - pppfImag[1][k][iFBOffset] ); + + fLeftEnergy += ( pppfReal[0][k][iFBOffset] * pppfReal[0][k][iFBOffset] + pppfImag[0][k][iFBOffset] * pppfImag[0][k][iFBOffset] ); + fRightEnergy += ( pppfReal[1][k][iFBOffset] * pppfReal[1][k][iFBOffset] + pppfImag[1][k][iFBOffset] * pppfImag[1][k][iFBOffset] ); + fMidEnergy += ( fMidReal * fMidReal + fMidImag * fMidImag ); + fSideEnergy += ( fSideReal * fSideReal + fSideImag * fSideImag ); + + fLRCovReal += ( pppfReal[0][k][iFBOffset] * pppfReal[1][k][iFBOffset] + pppfImag[0][k][iFBOffset] * pppfImag[1][k][iFBOffset] ); + fLRCovImag += ( pppfImag[0][k][iFBOffset] * pppfReal[1][k][iFBOffset] - pppfImag[1][k][iFBOffset] * pppfReal[0][k][iFBOffset] ); + } + + iFBOffset++; + } + + /* M/S prediction without phase alignment*/ + fPred = 0.25f * ( fLeftEnergy - fRightEnergy ) / ( fMidEnergy + feps ); + iPred = quantPred( fPred ); + fPred = dequantPred( iPred ); + fSideEnergyPred = fSideEnergy + ( fPred * fPred * fMidEnergy - 2.0f * fPred * 0.25f * ( fLeftEnergy - fRightEnergy ) ); + + ppiMSPredCoefs[MS_PRED_ONLY][b] = iPred; + ppiMSPredPhase[MS_PRED_ONLY][b] = 0; + pfMSPredRatio[MS_PRED_ONLY] = log10f( ( fMidEnergy + feps ) / ( fSideEnergyPred + feps ) ); + + /* Phase alignment*/ + iPhase = 0; + if ( fLRCovReal * fLRCovReal + fLRCovImag * fLRCovImag > 0.5f * fLeftEnergy * fRightEnergy ) + { + float fPhase = atan2f( fLRCovImag, fLRCovReal ); + iPhase = quantPhase( fPhase ); + } + + /* adjust covariance */ + tabIdx = iPhase - PHASE_MIN_VAL; + cplxmult( &fLRCovReal, &fLRCovImag, c_afRotRealImag[tabIdx][0], -c_afRotRealImag[tabIdx][1] ); + + /* compute MS prediction coefficient based on adjusted covariance */ + fMidEnergyPred = 0.25f * ( fLeftEnergy + fRightEnergy + 2.0f * fLRCovReal ); + fSideEnergyPred = 0.25f * ( fLeftEnergy + fRightEnergy - 2.0f * fLRCovReal ); + + /* M/S with LR phase alignment but without prediction */ + ppiMSPredCoefs[MS_PHASE_ONLY][b] = 0; + ppiMSPredPhase[MS_PHASE_ONLY][b] = iPhase; + pfMSPredRatio[MS_PHASE_ONLY] = log10f( ( fMidEnergyPred + feps ) / ( fSideEnergyPred + feps ) ); + + /* M/S with LR phase alignment and prediction */ + fPred = fMidEnergyPred == 0.0f ? 0.0f : 0.25f * ( fLeftEnergy - fRightEnergy ) / fMidEnergyPred; + iPred = quantPred( fPred ); + fPred = dequantPred( iPred ); + fSideEnergyPred += ( fPred * fPred * fMidEnergyPred - 2.0f * fPred * 0.25f * ( fLeftEnergy - fRightEnergy ) ); + /* -= fPred * fPred * fMidEnergyPred doesn't work because fPred is quantized and does not match MS/MM exactly */ + ppiMSPredCoefs[MS_PHASE_AND_PRED][b] = iPred; + ppiMSPredPhase[MS_PHASE_AND_PRED][b] = iPhase; + pfMSPredRatio[MS_PHASE_AND_PRED] = log10f( ( fMidEnergyPred + feps ) / ( fSideEnergyPred + feps ) ); + + /* Plain M/S */ + fLeftEnergy = log10f( fLeftEnergy + feps ); + fRightEnergy = log10f( fRightEnergy + feps ); + fMidEnergy = log10f( fMidEnergy + feps ); + fSideEnergy = log10f( fSideEnergy + feps ); + + fLRRatio = ( fLeftEnergy > fRightEnergy ? fLeftEnergy - fRightEnergy : fRightEnergy - fLeftEnergy ); + fMSRatio = ( fMidEnergy > fSideEnergy ? fMidEnergy - fSideEnergy : fSideEnergy - fMidEnergy ); + + if ( fMSRatio > fLRRatio ) + { + iNumMSBands++; + piMSFlags[b] = 1; + fMSBitGain += fNumLines * ( fMSRatio - fLRRatio ) * fLevelToSMRdBFactor * fBitsFactor; + } + else + { + piMSFlags[b] = 0; + } + piLRPhaseDiffs[b] = 0; + piMSPredCoefs[b] = 0; + + /* MSPred bit gains based on increase of level ratio compared to L/R ratio and the level dependent psy-model */ + for ( iMSPredType = 0; iMSPredType < 3; iMSPredType++ ) + { + if ( pfMSPredRatio[iMSPredType] > fLRRatio ) + { + ppiMSPredFlags[iMSPredType][b] = 1; + pfMSPredBitGain[iMSPredType] += fNumLines * ( pfMSPredRatio[iMSPredType] - fLRRatio ) * fLevelToSMRdBFactor * fBitsFactor; + } + } + } + + /* remove signalling cost from bit gains */ + for ( iMSPredType = 0; iMSPredType < 3; iMSPredType++ ) + { + piMsPredInfoBits[iMSPredType] = CountMSBits( iNumBands, MS_PRED, ppiMSPredFlags[iMSPredType], ppiMSPredPhase[iMSPredType], ppiMSPredCoefs[iMSPredType] ); + pfMSPredBitGain[iMSPredType] = max( pfMSPredBitGain[iMSPredType] - piMsPredInfoBits[iMSPredType], 0.0f ); + } + + /* find the best M/S Pred type */ + iMSPredType = MS_PHASE_AND_PRED; +#ifdef SPLIT_REND_LCLD_5MS + iMSPredType = ( pfMSPredBitGain[MS_PRED_ONLY] > pfMSPredBitGain[iMSPredType] ? MS_PRED_ONLY : iMSPredType ); + iMSPredType = ( pfMSPredBitGain[MS_PHASE_ONLY] > pfMSPredBitGain[iMSPredType] ? MS_PHASE_ONLY : iMSPredType ); +#endif + + /* plain M/S */ + iMsInfoBits = CountMSBits( iNumBands, MS_SOME, piMSFlags, NULL, NULL ); + fMSBitGain = max( fMSBitGain - iMsInfoBits, 0.0f ); + if ( iAllowSidePred && pfMSPredBitGain[iMSPredType] > 1.1f * fMSBitGain ) + { + *piMSMode = MS_PRED; + iNumMSBands = 0; + for ( b = 0; b < iNumBands; b++ ) + { + piMSFlags[b] = ppiMSPredFlags[iMSPredType][b]; + if ( piMSFlags[b] == 1 ) + { + piMSPredCoefs[b] = ppiMSPredCoefs[iMSPredType][b]; + piLRPhaseDiffs[b] = ppiMSPredPhase[iMSPredType][b]; + iNumMSBands++; + } + else + { + piMSPredCoefs[b] = 0; + piLRPhaseDiffs[b] = 0; + } + } + } + else if ( iNumMSBands == iNumBands ) + { + *piMSMode = MS_ALL; + } + else if ( iNumMSBands > 0 ) + { + *piMSMode = MS_SOME; + } + else + { + *piMSMode = MS_OFF; + } +#ifdef DEBUG_WRITE_MS_PRED + { + static FILE *fid; + int32_t iActualInfoBits = CountMSBits( iNumBands, *piMSMode, piMSFlags, piLRPhaseDiffs, piMSPredCoefs ); + if ( !fid ) + fid = fopen( "ms_info_bits.txt", "wt" ); + fprintf( fid, "%d %d %d %d %d\n", iMsInfoBits, piMsPredInfoBits[MS_PHASE_AND_PRED], piMsPredInfoBits[MS_PRED_ONLY], piMsPredInfoBits[MS_PHASE_ONLY], iActualInfoBits ); + } +#endif + if ( *piMSMode != MS_OFF ) + { + iFBOffset = 0; + for ( b = 0; b < iNumBands; b++ ) + { + if ( piMSFlags[b] == 1 ) + { + int32_t n; + int32_t phaseIdx; + phaseIdx = piLRPhaseDiffs[b] - PHASE_MIN_VAL; + fPred = dequantPred( piMSPredCoefs[b] ); + for ( n = 0; n < piBandwidths[b]; n++ ) + { + int32_t k; + for ( k = 0; k < iNumBlocks; k++ ) + { + float fMidReal; + float fMidImag; + float fSideReal; + float fSideImag; + + if ( *piMSMode == MS_PRED ) + { + cplxmult( &pppfReal[1][k][iFBOffset], &pppfImag[1][k][iFBOffset], c_afRotRealImag[phaseIdx][0], c_afRotRealImag[phaseIdx][1] ); + } + + fMidReal = 0.5f * ( pppfReal[0][k][iFBOffset] + pppfReal[1][k][iFBOffset] ); + fMidImag = 0.5f * ( pppfImag[0][k][iFBOffset] + pppfImag[1][k][iFBOffset] ); + fSideReal = 0.5f * ( pppfReal[0][k][iFBOffset] - pppfReal[1][k][iFBOffset] ); + fSideImag = 0.5f * ( pppfImag[0][k][iFBOffset] - pppfImag[1][k][iFBOffset] ); + + if ( *piMSMode == MS_PRED ) + { + fSideReal -= fPred * fMidReal; + fSideImag -= fPred * fMidImag; + } + + pppfReal[0][k][iFBOffset] = fMidReal; + pppfReal[1][k][iFBOffset] = fSideReal; + pppfImag[0][k][iFBOffset] = fMidImag; + pppfImag[1][k][iFBOffset] = fSideImag; + } + iFBOffset++; + } + } + else + { + iFBOffset += piBandwidths[b]; + } + } + } +#ifdef DEBUG_WRITE_MS_PRED + { + static FILE *fid; + if ( !fid ) + fid = fopen( "ms_enc.txt", "wt" ); + writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumMSBands, iNumBands, fid, piMSFlags ); + } +#endif + if ( *piMSMode == MS_PRED ) + { + /* Differential Coding of Phase Data*/ + PrepEncode( piLRPhaseDiffs, piMSFlags, iNumBands ); + PrepEncode( piMSPredCoefs, piMSFlags, iNumBands ); +#ifdef DEBUG_WRITE_MS_PRED + { + static FILE *fid; + if ( !fid ) + fid = fopen( "ms_pred_enc.txt", "wt" ); + writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumMSBands, iNumBands, fid, piMSFlags ); + } +#endif + /* Differential Coding*/ + EncodePhase( piLRPhaseDiffs, iNumMSBands, PHASE_DIFF_DIM ); + EncodePredCoef( piMSPredCoefs, iNumMSBands ); + } + + return iNumMSBands; +} +#else static int32_t MSModeCalculation( const int32_t iNumBlocks, const int32_t iNumBands, @@ -1018,6 +1413,7 @@ static int32_t MSModeCalculation( return iNumMSBands; } +#endif static void RemoveRMSEnvelope( @@ -1057,7 +1453,119 @@ static void RemoveRMSEnvelope( return; } +#ifdef SPLIT_REND_LCLD_5MS +static void QuantizeSpectrumDPCM_Opt( + const int32_t iNumGroups, + const int32_t *piGroupLengths, + const int32_t iNumBands, + const int32_t *piBandwidths, + int32_t **ppiAlloc, + float **ppfReal, + float **ppfImag, + int32_t **ppiQReal, + int32_t **ppiQImag, + int32_t **ppiSignReal, + int32_t **ppiSignImag, + int32_t iNumSubSets, + int32_t iSubSetId, + int32_t *piPredEnable, + float *pfA1Real, + float *pfA1Imag, + float *pfPredStateReal, + float *pfPredStateImag ) +{ + int32_t b, n; + int32_t iFBOffset; + int32_t k, iAlloc, iMaxQuantVal; + float fSCFGain, fInvSCFGain; + + iFBOffset = 0; + for ( b = 0; b < iNumBands; b++ ) + { + int32_t m; + for ( m = 0; m < piBandwidths[b]; m++ ) + { + int32_t iBlockOffset = 0; + if ( piPredEnable[iFBOffset] == 1 ) + { + float fReal; + float fImag; + int32_t iSubset = iFBOffset % iNumSubSets; + float fPrevReal = 0.0f; + float fPrevImag = 0.0f; + if ( iSubset != iSubSetId ) + { + /* run predictors across sub-frames */ + fPrevReal = pfPredStateReal[iFBOffset]; + fPrevImag = pfPredStateImag[iFBOffset]; + } + for ( n = 0; n < iNumGroups; n++ ) + { + iAlloc = ppiAlloc[n][b]; + iMaxQuantVal = c_aiQuantMaxValues[iAlloc]; + fSCFGain = c_afScaleFactor[iAlloc]; + fInvSCFGain = c_afInvScaleFactor[iAlloc]; + for ( k = 0; k < piGroupLengths[n]; k++ ) + { + /* prediction */ + fReal = pfA1Real[iFBOffset] * fPrevReal - pfA1Imag[iFBOffset] * fPrevImag; + fImag = pfA1Real[iFBOffset] * fPrevImag + pfA1Imag[iFBOffset] * fPrevReal; + + ppiQReal[iBlockOffset][iFBOffset] = Quantize( ppfReal[iBlockOffset][iFBOffset] + fReal, /* quantize residual */ + fSCFGain, + &ppiSignReal[iBlockOffset][iFBOffset], + iMaxQuantVal ); + + ppiQImag[iBlockOffset][iFBOffset] = Quantize( ppfImag[iBlockOffset][iFBOffset] + fImag, + fSCFGain, + &ppiSignImag[iBlockOffset][iFBOffset], + iMaxQuantVal ); + + fPrevReal = UnQuantize( ppiQReal[iBlockOffset][iFBOffset], + fInvSCFGain, + ppiSignReal[iBlockOffset][iFBOffset] ) - + fReal; /* add prediction to quantized residual = reconstructed sample */ + + fPrevImag = UnQuantize( ppiQImag[iBlockOffset][iFBOffset], + fInvSCFGain, + ppiSignImag[iBlockOffset][iFBOffset] ) - + fImag; + + iBlockOffset++; + } /* group length */ + } /* groups */ + pfPredStateReal[iFBOffset] = fPrevReal; + pfPredStateImag[iFBOffset] = fPrevImag; + } /* predEnable */ + else + { /* no prediction */ + for ( n = 0; n < iNumGroups; n++ ) + { + iAlloc = ppiAlloc[n][b]; + iMaxQuantVal = c_aiQuantMaxValues[iAlloc]; + fSCFGain = c_afScaleFactor[iAlloc]; + fInvSCFGain = c_afInvScaleFactor[iAlloc]; + for ( k = 0; k < piGroupLengths[n]; k++ ) + { + ppiQReal[iBlockOffset][iFBOffset] = Quantize( ppfReal[iBlockOffset][iFBOffset], + fSCFGain, + &ppiSignReal[iBlockOffset][iFBOffset], + iMaxQuantVal ); + ppiQImag[iBlockOffset][iFBOffset] = Quantize( ppfImag[iBlockOffset][iFBOffset], + fSCFGain, + &ppiSignImag[iBlockOffset][iFBOffset], + iMaxQuantVal ); + + iBlockOffset++; + } /* group length */ + } /* groups */ + } /* predEnable */ + iFBOffset++; + } /* bandwidth */ + } /* bands */ +} +#else static void QuantizeSpectrumDPCM_Opt( const int32_t iNumGroups, const int32_t *piGroupLengths, @@ -1199,7 +1707,7 @@ static void QuantizeSpectrumDPCM_Opt( return; } - +#endif static int32_t CountLCLDBits( const int32_t iNumGroups, @@ -1362,13 +1870,6 @@ static int32_t WriteMSInformation( if ( anyNonZero ) { -#ifdef SIMPLE_PHASE - for ( b = 0; b < iNumMSPredBands; b++ ) - { - ivas_split_rend_bitstream_write_int32( pBits, piLRPhaseDiff[b], SIMPLE_PHASE_BITS ); - iBitsWritten += SIMPLE_PHASE_BITS; - } -#else ivas_split_rend_bitstream_write_int32( pBits, piLRPhaseDiff[0] - PHASE_MIN_VAL, PHASE_BAND0_BITS ); iBitsWritten += PHASE_BAND0_BITS; for ( b = 1; b < iNumMSPredBands; b++ ) @@ -1377,7 +1878,6 @@ static int32_t WriteMSInformation( ivas_split_rend_bitstream_write_int32( pBits, c_aaiRMSEnvHuffEnc[tabIdx][1], c_aaiRMSEnvHuffEnc[tabIdx][0] ); iBitsWritten += c_aaiRMSEnvHuffEnc[tabIdx][0]; } -#endif } anyNonZero = 0; @@ -1540,70 +2040,6 @@ static int32_t WriteRMSEnvelope( } -#ifdef ENABLE_PMOD_ADJUST -static int32_t WritePmodInformation( - const int32_t **ppiHiSMRFlags, - IVAS_SPLIT_REND_BITS_HANDLE pBits, - int32_t iChannels, - int32_t iNumBands ) -{ - int32_t iBitsWritten, c, b; - - iBitsWritten = 0; - - for ( c = 0; c < iChannels; c++ ) - { - int32_t anyNonZero = 0; - const int32_t *flags = ppiHiSMRFlags[c]; - for ( b = 0; b < iNumBands; b++ ) - { - if ( flags[b] ) - { - anyNonZero = 1; - break; - } - } - ivas_split_rend_bitstream_write_int32( pBits, anyNonZero, 1 ); - iBitsWritten += 1; - if ( anyNonZero ) - { - for ( b = 0; b < iNumBands; b++ ) - { - ivas_split_rend_bitstream_write_int32( pBits, flags[b], 1 ); - iBitsWritten += 1; - } - } - } -#ifdef WRITE_HISMR_FLAGS - { - static FILE *fid = 0; - if ( !fid ) - { - fid = fopen( "hismr_enc.txt", "wt" ); - } - for ( c = 0; c < iChannels; c++ ) - { - int32_t b; - for ( b = 0; b < iNumBands; b++ ) - { - if ( c == iChannels - 1 && b == iNumBands - 1 ) - { - fprintf( fid, "%d\n", ppiHiSMRFlags[c][b] ); - } - else - { - fprintf( fid, "%d ", ppiHiSMRFlags[c][b] ); - } - } - } - } -#endif - - return iBitsWritten; -} -#endif - - static int32_t WriteAllocInformation( const int32_t iAllocOffset, IVAS_SPLIT_REND_BITS_HANDLE pBits ) @@ -1764,9 +2200,13 @@ static int32_t ComputeAllocation( int32_t ***pppiQImag, int32_t ***pppiSignReal, int32_t ***pppiSignImag, +#ifdef SPLIT_REND_LCLD_5MS + PredictionEncoder *psPredictionEncoder ) +#else int32_t **ppiPredEnable, float **ppfA1Real, float **ppfA1Imag ) +#endif { int32_t iBitsUsed, iDone, iDelta; int32_t b, k, n; @@ -1800,6 +2240,14 @@ static int32_t ComputeAllocation( } } +#ifdef SPLIT_REND_LCLD_5MS + if ( psPredictionEncoder->iNumSubSets > 1 ) + { + mvr2r( psPredictionEncoder->ppfPredStateReal[n], psPredictionEncoder->ppfPredStateRealTmp[n], LCLD_BANDS ); + mvr2r( psPredictionEncoder->ppfPredStateImag[n], psPredictionEncoder->ppfPredStateImagTmp[n], LCLD_BANDS ); + } +#endif + QuantizeSpectrumDPCM_Opt( piNumGroups[n], (const int32_t *) ppiGroupLengths[n], iNumBands, @@ -1811,15 +2259,29 @@ static int32_t ComputeAllocation( pppiQImag[n], pppiSignReal[n], pppiSignImag[n], +#ifdef SPLIT_REND_LCLD_5MS + psPredictionEncoder->iNumSubSets, + psPredictionEncoder->iSubSetId, + psPredictionEncoder->ppiPredBandEnable[n], + psPredictionEncoder->ppfA1Real[n], + psPredictionEncoder->ppfA1Imag[n], + psPredictionEncoder->ppfPredStateRealTmp[n], + psPredictionEncoder->ppfPredStateImagTmp[n] ); +#else ppiPredEnable[n], ppfA1Real[n], ppfA1Imag[n] ); +#endif iBitsUsed += CountLCLDBits( piNumGroups[n], (const int32_t *) ppiGroupLengths[n], iNumBands, piBandwidths, +#ifdef SPLIT_REND_LCLD_5MS + (const int32_t *) psPredictionEncoder->ppiPredBandEnable[n], +#else (const int32_t *) ppiPredEnable[n], +#endif pppiAlloc[n], pppiQReal[n], pppiQImag[n] ); @@ -1866,6 +2328,21 @@ static int32_t ComputeAllocation( } } +#ifdef SPLIT_REND_LCLD_5MS + if ( psPredictionEncoder->iNumSubSets > 1 ) + { + for ( n = 0; n < iChannels; n++ ) + { + mvr2r( psPredictionEncoder->ppfPredStateRealTmp[n], psPredictionEncoder->ppfPredStateReal[n], LCLD_BANDS ); + mvr2r( psPredictionEncoder->ppfPredStateImagTmp[n], psPredictionEncoder->ppfPredStateImag[n], LCLD_BANDS ); + } + if ( ++psPredictionEncoder->iSubSetId == psPredictionEncoder->iNumSubSets ) + { + psPredictionEncoder->iSubSetId = 0; + } + } +#endif + // printf("%d\n",*piAllocOffset); // printf("%d\t%d\t%d\n",pppiAlloc[0][0][0],pppiAlloc[0][0][1],pppiAlloc[0][0][22]); diff --git a/lib_rend/ivas_lcld_prot.h b/lib_rend/ivas_lcld_prot.h index 2af8355c97..08daf79c05 100644 --- a/lib_rend/ivas_lcld_prot.h +++ b/lib_rend/ivas_lcld_prot.h @@ -42,12 +42,23 @@ typedef struct LCLD_ENCODER LCLDEncoder; +#ifdef SPLIT_REND_LCLD_5MS +ivas_error CreateLCLDEncoder( + LCLDEncoder **psLCLDEncoder_out, + const int32_t iSampleRate, + const int32_t iChannels, + const int32_t iTargetBitRate, + const int32_t iAllowSidePred, + const int32_t iNumBlocks, + const int32_t iNumSubSets ); +#else ivas_error CreateLCLDEncoder( LCLDEncoder **psLCLDEncoder, const int32_t iSampleRate, const int32_t iChannels, const int32_t iTargetBitRate, const int32_t iAllowSidePred ); +#endif void DeleteLCLDEncoder( LCLDEncoder *psLCLDEncoder @@ -68,10 +79,22 @@ int32_t GetNumGroups( typedef struct LCLD_DECODER LCLDDecoder; +#ifndef SPLIT_REND_LCLD_5MS ivas_error CreateLCLDDecoder( LCLDDecoder **psLCLDDecoder_out, const int32_t iSampleRate, const int32_t iChannels ); +#else +int32_t GetNumPredSubSets( + LCLDDecoder *psLCLDDecoder +); + +ivas_error CreateLCLDDecoder( + LCLDDecoder **psLCLDDecoder_out, + const int32_t iSampleRate, + const int32_t iChannels, + const int32_t iNumBlocks ); +#endif void DeleteLCLDDecoder( LCLDDecoder *psLCLDDecoder @@ -100,25 +123,6 @@ void cplxmult( float i2 ); -#ifdef SIMPLE_PHASE -void rot_pm_pi( - float *pr, - float *pi ); - -void rot_p_pi_2( - float *pr, - float *pi -); - -void rot_m_pi_2( - float *pr, - float *pi ); - -void rot_zero( - float *pr, - float *pi -); -#endif int32_t requantPhase( int32_t phaseQ @@ -195,6 +199,11 @@ typedef struct NOISE_GEN float *pfNoiseBuffer; } NoiseGen; +#ifdef SPLIT_REND_LCLD_5MS +NoiseGen *CreateNoiseGen( + void +); +#endif void DeleteNoiseGen( NoiseGen *psNoiseGen @@ -244,15 +253,30 @@ typedef struct PREDICTION_ENCODER int32_t iChannels; int32_t iNumBlocks; +#ifdef SPLIT_REND_LCLD_5MS + int32_t iSubSetId; + int32_t iNumSubSets; + int32_t iMaxNumPredBands; + float ***pppfInpBufReal; /* channels, LCLD_PRED_WIN_LEN, bands */ + float ***pppfInpBufImag; + float **ppfPredStateReal; /* channels, bands */ + float **ppfPredStateImag; + float **ppfPredStateRealTmp; + float **ppfPredStateImagTmp; + float **ppfInpPrevReal; /* channels, bands */ + float **ppfInpPrevImag; +#endif + float *pfWindow; float pfRxxReal[2]; float pfRxxImag[2]; int32_t *piPredChanEnable; int32_t *piNumPredBands; - +#ifndef SPLIT_REND_LCLD_5MS float **ppfEstPredGain; float **ppfEstPredBitGain; +#endif int32_t **ppiPredBandEnable; float **ppfA1Real; @@ -262,21 +286,39 @@ typedef struct PREDICTION_ENCODER int32_t **ppiA1Phase; } PredictionEncoder; +#ifdef SPLIT_REND_LCLD_5MS +ivas_error CreatePredictionEncoder( + PredictionEncoder **psPredictionEncoder_out, + const int32_t iChannels, + const int32_t iNumBlocks, + const int32_t iNumSubSets, + const int32_t iMaxNumPredBands +); +#else ivas_error CreatePredictionEncoder( PredictionEncoder **psPredictionEncoder_out, const int32_t iChannels, const int32_t iNumBlocks ); +#endif void DeletePredictionEncoder( PredictionEncoder *psPredictionEncoder ); +#ifdef SPLIT_REND_LCLD_5MS +void ComputePredictors( + PredictionEncoder *psPredictionEncoder, + float ***pppfReal, + float ***pppfImag +); +#else int32_t ComputePredictors( PredictionEncoder *psPredictionEncoder, float ***pppfReal, float ***pppfImag ); +#endif void ApplyForwardPredictors( PredictionEncoder *psPredictionEncoder, @@ -293,11 +335,19 @@ typedef struct PREDICTION_DECODER { int32_t iChannels; int32_t iNumBlocks; + #ifdef SPLIT_REND_LCLD_5MS + int32_t iSubSetId; + int32_t iNumSubSets; + float **ppfPredStateReal; + float **ppfPredStateImag; + #endif int32_t *piPredChanEnable; + #ifndef SPLIT_REND_LCLD_5MS int32_t *piNumPredBands; float **ppfEstPredGain; + #endif int32_t **ppiPredBandEnable; float **ppfA1Real; @@ -327,7 +377,11 @@ int32_t ReadPredictors( IVAS_SPLIT_REND_BITS_HANDLE pBits ); +#ifdef SPLIT_REND_LCLD_5MS +void ApplyInversePredictors( +#else void ApplyInversePredictros( +#endif PredictionDecoder *psPredictionDecoder, float ***pppfReal, float ***pppfImag diff --git a/lib_rend/ivas_lcld_rom_tables.c b/lib_rend/ivas_lcld_rom_tables.c index 144c44718d..58fd22ff5c 100644 --- a/lib_rend/ivas_lcld_rom_tables.c +++ b/lib_rend/ivas_lcld_rom_tables.c @@ -39,12 +39,14 @@ /* clang-format off */ +#ifndef SPLIT_REND_LCLD_5MS const float c_afRotRealImagSimple[SIMPLE_PHASE_MAX_VAL + 1][2] = { { 1.0f, 0.0f }, /* zero */ { 0.0f, 1.0f }, /* pi/2 */ { -1.0f, 0.0f }, /* pi */ { 0.0f, -1.0f }, /* 3*pi/2 */ }; +#endif /* phi = (-12:12)'/12 *pi; tmp = [cos(phi),sin(phi)]; tmp = tmp';sprintf('{%.8ff, %.8ff},\n',tmp(:)) */ const float c_afRotRealImag[PHASE_MAX_VAL - PHASE_MIN_VAL + 1][2] = diff --git a/lib_rend/ivas_lcld_rom_tables.h b/lib_rend/ivas_lcld_rom_tables.h index 132f52addf..8e9de87606 100644 --- a/lib_rend/ivas_lcld_rom_tables.h +++ b/lib_rend/ivas_lcld_rom_tables.h @@ -45,9 +45,16 @@ #define LCLD_BLOCKS_PER_FRAME ( 16 ) #define LCLD_MAX_BLOCKS_PER_FRAME ( 16 ) #define LCLD_BANDS ( 60 ) +#ifdef SPLIT_REND_LCLD_5MS +#define LCLD_PRED_WIN_LEN ( 16 ) +#define LCLD_MAX_NUM_PRED_SUBSETS ( 8 ) +#endif #define MAX_BANDS ( 23 ) #define MAX_BANDS_48 ( 23 ) +#ifdef SPLIT_REND_LCLD_5MS +#define DEF_BANDS_48 ( 22 ) +#endif #define ENV_MIN ( -64 ) #define ENV_MAX ( 64 ) @@ -88,6 +95,7 @@ #define PHASE_DIFF_DIM ( 2 ) #define PHASE_BAND0_BITS ( 5 ) +#ifndef SPLIT_REND_LCLD_5MS #define SIMPLE_PHASE_MAX_VAL ( 3 ) #define SIMPLE_PHASE_MIN_VAL ( 0 ) #define SIMPLE_PHASE_BITS ( 2 ) @@ -95,7 +103,7 @@ #define TON_QUOTA_ABS_THRESHOLD ( 8.0f ) #define TON_QUOTA_INC_THRESHOLD ( 4.0f ) - +#endif #define PERCEPTUAL_MODEL_SLGAIN_SHIFT ( 8 ) //#define USE_DEMOD_TABLES @@ -103,7 +111,9 @@ #define HUFF_DEC_TABLE_SIZE ( 16 ) extern const float c_afRotRealImag[PRED_MAX_VAL - PRED_MIN_VAL + 1][2]; +#ifndef SPLIT_REND_LCLD_5MS extern const float c_afRotRealImagSimple[SIMPLE_PHASE_MAX_VAL + 1][2]; +#endif extern const int32_t c_aiDefaultTheta48[MAX_BANDS_48]; extern const float c_afScaleFactor[ALLOC_TABLE_SIZE]; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index bb120dcafa..3438c693d0 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1486,12 +1486,23 @@ void ivas_split_renderer_close( SPLIT_REND_WRAPPER *hSplitBinRend ); +#ifdef SPLIT_REND_LCLD_5MS +ivas_error ivas_splitBinLCLDEncOpen( + BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, + const int32_t iSampleRate, + const int16_t iChannels, + const int32_t iDataRate, + const int32_t iNumBlocks, + const int32_t iNumIterations +); +#else ivas_error ivas_splitBinLCLDEncOpen( BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, const int32_t iSampleRate, const int16_t iChannels, const int32_t iDataRate ); +#endif void ivas_splitBinLCLDEncClose( BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc @@ -1505,11 +1516,21 @@ void ivas_splitBinLCLDEncProcess( IVAS_SPLIT_REND_BITS_HANDLE pBits ); +#ifdef SPLIT_REND_LCLD_5MS +ivas_error ivas_splitBinLCLDDecOpen( + BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, + const int32_t iSampleRate, + const int16_t iChannels, + const int16_t iNumBlocks, + const int16_t iNumIterations +); +#else ivas_error ivas_splitBinLCLDDecOpen( BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, const int32_t iSampleRate, const int16_t iChannels ); +#endif void ivas_splitBinLCLDDecClose( BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec @@ -1650,26 +1671,59 @@ void ivas_splitBinRendPLCClose( SPLIT_REND_PLC_HANDLE* phSplitRendPLC ); +#ifdef SPLIT_REND_LCLD_5MS +void ivas_splitBinRendPLCsaveState( + SPLIT_REND_PLC_HANDLE hSplitRendPLC, + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const int16_t num_chs, + const int16_t iNumBlocks, + const int16_t iNumIterations +); +#else void ivas_splitBinRendPLCsaveState( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t num_chs ); +#endif +#ifdef SPLIT_REND_LCLD_5MS +void ivas_splitBinRendPLC_xf( + SPLIT_REND_PLC_HANDLE hSplitRendPLC, + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const int16_t num_chs, + const int16_t iNumBlocks, + const int16_t iNumIterations +); +#else void ivas_splitBinRendPLC_xf( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t num_chs ); +#endif +#ifdef SPLIT_REND_LCLD_5MS +void ivas_splitBinRendPLC( + SPLIT_REND_PLC_HANDLE hSplitRendPLC, + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const int16_t num_chs, + const int16_t iNumBlocks, + const int16_t iNumIterations +); +#else void ivas_splitBinRendPLC( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t num_chs ); +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG void ivas_log_cldfb2wav_data( @@ -2011,12 +2065,22 @@ void ivas_split_rend_get_quant_params( int16_t *num_complex_bands ); +#ifdef SPLIT_REND_LCLD_5MS +ivas_error ivas_split_rend_choose_default_codec( + IVAS_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ + int16_t *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ + const int16_t cldfb_in_flag, /* i : flag indicating rendering in TD */ + const int16_t pcm_out_flag, /* i : flag to indicate PCM output */ + const int16_t is_5ms_frame /* i : flag to indicate 5ms framing */ +); +#else ivas_error ivas_split_rend_choose_default_codec( IVAS_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ int16_t *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ const int16_t cldfb_in_flag, /* i : flag indicating rendering in CLDFB */ const int16_t pcm_out_flag /* i : flag to indicate PCM output */ ); +#endif #endif diff --git a/lib_rend/ivas_splitRend_lcld_dec.c b/lib_rend/ivas_splitRend_lcld_dec.c index 1d81dfebc9..3ca53e513d 100644 --- a/lib_rend/ivas_splitRend_lcld_dec.c +++ b/lib_rend/ivas_splitRend_lcld_dec.c @@ -47,11 +47,19 @@ * * *------------------------------------------------------------------------*/ - +#ifdef SPLIT_REND_LCLD_5MS +ivas_error ivas_splitBinLCLDDecOpen( + BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, + const int32_t iSampleRate, + const int16_t iChannels, + const int16_t iNumBlocks, + const int16_t iNumIterations ) +#else ivas_error ivas_splitBinLCLDDecOpen( BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, const int32_t iSampleRate, const int16_t iChannels ) +#endif { int16_t n; BIN_HR_SPLIT_LCLD_DEC_HANDLE splitBinLCLDDec; @@ -65,10 +73,17 @@ ivas_error ivas_splitBinLCLDDecOpen( splitBinLCLDDec->pLcld_dec = NULL; /* place holder for CLDFB decoder handle */ splitBinLCLDDec->iChannels = iChannels; +#ifndef SPLIT_REND_LCLD_5MS if ( ( error = CreateLCLDDecoder( &splitBinLCLDDec->psLCLDDecoder, iSampleRate, iChannels ) ) != IVAS_ERR_OK ) { return error; } +#else + if ( ( error = CreateLCLDDecoder( &splitBinLCLDDec->psLCLDDecoder, iSampleRate, iChannels, iNumBlocks ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif if ( ( splitBinLCLDDec->pppfDecLCLDReal = (float ***) malloc( iChannels * sizeof( float ** ) ) ) == NULL ) { @@ -108,6 +123,10 @@ ivas_error ivas_splitBinLCLDDecOpen( { return error; } +#ifdef SPLIT_REND_LCLD_5MS + splitBinLCLDDec->iNumBlocks = iNumBlocks; + splitBinLCLDDec->iNumIterations = iNumIterations; +#endif *hSplitBinLCLDDec = splitBinLCLDDec; @@ -171,7 +190,9 @@ void ivas_splitBinLCLDDecProcess( const int16_t bfi ) { int16_t k, n; - +#ifdef SPLIT_REND_LCLD_5MS + int16_t itr; +#endif push_wmops( "ivas_splitBinLCLDDecProcess" ); assert( hSplitBinLCLDDec != NULL ); @@ -184,9 +205,22 @@ void ivas_splitBinLCLDDecProcess( #endif if ( !bfi ) { - /* Initialized with zeros....... */ - for ( n = 0; n < hSplitBinLCLDDec->iChannels; n++ ) +#ifdef SPLIT_REND_LCLD_5MS + for ( itr = 0; itr < hSplitBinLCLDDec->iNumIterations; itr++ ) { +#endif + /* Initialized with zeros....... */ + for ( n = 0; n < hSplitBinLCLDDec->iChannels; n++ ) + { +#ifdef SPLIT_REND_LCLD_5MS + for ( k = 0; k < hSplitBinLCLDDec->iNumBlocks; k++ ) + { + hSplitBinLCLDDec->pppfDecLCLDReal[n][k] = Cldfb_Out_Real[n][hSplitBinLCLDDec->iNumBlocks * itr + k]; + hSplitBinLCLDDec->pppfDecLCLDImag[n][k] = Cldfb_Out_Imag[n][hSplitBinLCLDDec->iNumBlocks * itr + k]; + set_f( hSplitBinLCLDDec->pppfDecLCLDReal[n][k], 0, CLDFB_NO_CHANNELS_MAX ); + set_f( hSplitBinLCLDDec->pppfDecLCLDImag[n][k], 0, CLDFB_NO_CHANNELS_MAX ); + } +#else for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) { hSplitBinLCLDDec->pppfDecLCLDReal[n][k] = Cldfb_Out_Real[n][k]; @@ -194,43 +228,59 @@ void ivas_splitBinLCLDDecProcess( set_f( hSplitBinLCLDDec->pppfDecLCLDReal[n][k], 0, CLDFB_NO_CHANNELS_MAX ); set_f( hSplitBinLCLDDec->pppfDecLCLDImag[n][k], 0, CLDFB_NO_CHANNELS_MAX ); } - } +#endif + } - DecodeLCLDFrame( hSplitBinLCLDDec->psLCLDDecoder, pBits, hSplitBinLCLDDec->pppfDecLCLDReal, hSplitBinLCLDDec->pppfDecLCLDImag ); + DecodeLCLDFrame( hSplitBinLCLDDec->psLCLDDecoder, pBits, hSplitBinLCLDDec->pppfDecLCLDReal, hSplitBinLCLDDec->pppfDecLCLDImag ); #ifdef CLDFB_DEBUG - printf( "Frame Decoded = %d\n", ++hSplitBinLCLDDec->numFrame ); - int16_t writeByte = 0; - for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) - { - for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) + printf( "Frame Decoded = %d\n", ++hSplitBinLCLDDec->numFrame ); + int16_t writeByte = 0; + for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) { - for ( n = 0; n < hSplitBinLCLDDec->iChannels; n++ ) + for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) { - writeByte = fwrite( &hSplitBinLCLDDec->pppfDecLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDDec->cldfbOut ); - if ( writeByte != 1 ) - exit( -1 ); - writeByte = fwrite( &hSplitBinLCLDDec->pppfDecLCLDImag[n][k][b], sizeof( float ), 1, hSplitBinLCLDDec->cldfbOut ); - if ( writeByte != 1 ) - exit( -1 ); + for ( n = 0; n < hSplitBinLCLDDec->iChannels; n++ ) + { + writeByte = fwrite( &hSplitBinLCLDDec->pppfDecLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDDec->cldfbOut ); + if ( writeByte != 1 ) + exit( -1 ); + writeByte = fwrite( &hSplitBinLCLDDec->pppfDecLCLDImag[n][k][b], sizeof( float ), 1, hSplitBinLCLDDec->cldfbOut ); + if ( writeByte != 1 ) + exit( -1 ); + } } } - } #endif - if ( hSplitBinLCLDDec->hSplitRendPLC->prev_bfi != 0 ) - { - /* cross-fade recovered frame into good frame */ + if ( hSplitBinLCLDDec->hSplitRendPLC->prev_bfi != 0 ) + { + /* cross-fade recovered frame into good frame */ +#ifdef SPLIT_REND_LCLD_5MS + ivas_splitBinRendPLC_xf( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations ); +#else ivas_splitBinRendPLC_xf( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels ); +#endif + } +#ifdef SPLIT_REND_LCLD_5MS } +#endif } else { /* do PLC for lost split renderer frame */ +#ifdef SPLIT_REND_LCLD_5MS + ivas_splitBinRendPLC( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations ); +#else ivas_splitBinRendPLC( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels ); +#endif } /* save PLC state */ +#ifdef SPLIT_REND_LCLD_5MS + ivas_splitBinRendPLCsaveState( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations ); +#else ivas_splitBinRendPLCsaveState( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels ); +#endif pop_wmops(); diff --git a/lib_rend/ivas_splitRend_lcld_enc.c b/lib_rend/ivas_splitRend_lcld_enc.c index a0789d63a8..83a60a8710 100644 --- a/lib_rend/ivas_splitRend_lcld_enc.c +++ b/lib_rend/ivas_splitRend_lcld_enc.c @@ -47,11 +47,21 @@ * *------------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +ivas_error ivas_splitBinLCLDEncOpen( + BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, + const int32_t iSampleRate, + const int16_t iChannels, + const int32_t iDataRate, + const int32_t iNumBlocks, + const int32_t iNumIterations ) +#else ivas_error ivas_splitBinLCLDEncOpen( BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, const int32_t iSampleRate, const int16_t iChannels, const int32_t iDataRate ) +#endif { BIN_HR_SPLIT_LCLD_ENC_HANDLE splitBinLCLDEnc; ivas_error error; @@ -64,10 +74,17 @@ ivas_error ivas_splitBinLCLDEncOpen( splitBinLCLDEnc->pLcld_enc = NULL; // place holder for CLDFB encoder handle splitBinLCLDEnc->iChannels = iChannels; +#ifdef SPLIT_REND_LCLD_5MS + if ( ( error = CreateLCLDEncoder( &( splitBinLCLDEnc->psLCLDEncoder ), iSampleRate, iChannels, iDataRate, 1, iNumBlocks, CLDFB_NO_COL_MAX / iNumBlocks ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = CreateLCLDEncoder( &( splitBinLCLDEnc->psLCLDEncoder ), iSampleRate, iChannels, iDataRate, 1 ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( ( splitBinLCLDEnc->pppfLCLDReal = (float ***) malloc( iChannels * sizeof( float ** ) ) ) == NULL ) { @@ -90,6 +107,11 @@ ivas_error ivas_splitBinLCLDEncOpen( } } +#ifdef SPLIT_REND_LCLD_5MS + splitBinLCLDEnc->iNumIterations = iNumIterations; + splitBinLCLDEnc->iNumBlocks = iNumBlocks; +#endif + #ifdef CLDFB_DEBUG splitBinLCLDEnc->numFrame = 0; char cldfbFilename[50] = "cldfb_in_ref.qmf"; @@ -158,16 +180,37 @@ void ivas_splitBinLCLDEncProcess( const int32_t available_bits, IVAS_SPLIT_REND_BITS_HANDLE pBits ) { +#ifdef SPLIT_REND_LCLD_5MS + int32_t iBitsWritten, itr, available_bits_itr, rem_itr, available_bits_local; +#else int32_t iBitsWritten; - +#endif push_wmops( "ivas_splitBinLCLDEncProcess" ); assert( hSplitBinLCLDEnc != NULL ); assert( Cldfb_In_Real != NULL ); assert( Cldfb_In_Imag != NULL ); assert( pBits != NULL ); - +#ifdef SPLIT_REND_LCLD_5MS + available_bits_local = available_bits; +#endif /* A conversion is needed for the 3d pointer interface here ........ */ +#ifdef SPLIT_REND_LCLD_5MS + for ( itr = 0; itr < hSplitBinLCLDEnc->iNumIterations; itr++ ) + { + + rem_itr = hSplitBinLCLDEnc->iNumIterations - itr; + available_bits_itr = available_bits_local / rem_itr; + + for ( int32_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) + { + for ( int32_t k = 0; k < hSplitBinLCLDEnc->iNumBlocks; k++ ) + { + hSplitBinLCLDEnc->pppfLCLDReal[n][k] = Cldfb_In_Real[n][hSplitBinLCLDEnc->iNumBlocks * itr + k]; + hSplitBinLCLDEnc->pppfLCLDImag[n][k] = Cldfb_In_Imag[n][hSplitBinLCLDEnc->iNumBlocks * itr + k]; + } + } +#else for ( int32_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) { for ( int32_t k = 0; k < CLDFB_NO_COL_MAX; k++ ) @@ -176,55 +219,83 @@ void ivas_splitBinLCLDEncProcess( hSplitBinLCLDEnc->pppfLCLDImag[n][k] = Cldfb_In_Imag[n][k]; } } +#endif #ifdef CLDFB_DEBUG - int16_t readByte = 0; - for ( int16_t k = 0; k < CLDFB_NO_COL_MAX; k++ ) - { - for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) + int16_t readByte = 0; +#ifdef SPLIT_REND_LCLD_5MS + for ( int16_t k = 0; k < hSplitBinLCLDEnc->iNumBlocks; k++ ) +#else + for ( int16_t k = 0; k < CLDFB_NO_COL_MAX; k++ ) +#endif { - for ( int16_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) + for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) { - readByte = fread( &Cldfb_In_Real[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); - if ( readByte != 1 ) - break; - readByte = fread( &Cldfb_In_Imag[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); + for ( int16_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) + { +#ifdef SPLIT_REND_LCLD_5MS + readByte = fread( &hSplitBinLCLDEnc->pppfLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); + if ( readByte != 1 ) + break; + readByte = fread( &hSplitBinLCLDEnc->pppfLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); +#else + readByte = fread( &Cldfb_In_Real[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); + if ( readByte != 1 ) + break; + readByte = fread( &Cldfb_In_Imag[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); +#endif + } } } - } - if ( readByte == 1 ) - { - printf( "Frame Read = %d\n", ++hSplitBinLCLDEnc->numFrame ); - } - else - { - printf( "Writing zeroes...\n" ); - for ( int16_T k = 0; k < CLDFB_NO_COL_MAX; k++ ) + if ( readByte == 1 ) { - for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) + printf( "Frame Read = %d\n", ++hSplitBinLCLDEnc->numFrame ); + } + else + { + printf( "Writing zeroes...\n" ); +#ifdef SPLIT_REND_LCLD_5MS + for ( int16_T k = 0; k < hSplitBinLCLDEnc->iNumBlocks; k++ ) +#else + for ( int16_T k = 0; k < CLDFB_NO_COL_MAX; k++ ) +#endif { - for ( int16_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) + for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) { - hSplitBinLCLDEnc->pppfLCLDReal[n][k][b] = 0.f; - hSplitBinLCLDEnc->pppfLCLDImag[n][k][b] = 0.f; + for ( int16_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) + { + hSplitBinLCLDEnc->pppfLCLDReal[n][k][b] = 0.f; + hSplitBinLCLDEnc->pppfLCLDImag[n][k][b] = 0.f; + } } } } - } #endif - +#ifdef SPLIT_REND_LCLD_5MS + EncodeLCLDFrame( hSplitBinLCLDEnc->psLCLDEncoder, hSplitBinLCLDEnc->pppfLCLDReal, hSplitBinLCLDEnc->pppfLCLDImag, &iBitsWritten, available_bits_itr, pBits ); +#else EncodeLCLDFrame( hSplitBinLCLDEnc->psLCLDEncoder, hSplitBinLCLDEnc->pppfLCLDReal, hSplitBinLCLDEnc->pppfLCLDImag, &iBitsWritten, available_bits, pBits ); +#endif +#ifdef SPLIT_REND_LCLD_5MS + available_bits_local -= iBitsWritten; +#ifdef DEBUGGING + assert( available_bits_local >= 0 ); +#endif +#else #ifdef DEBUGGING if ( iBitsWritten > available_bits ) assert( iBitsWritten <= available_bits ); #endif +#endif #ifdef CLDFB_DEBUG - printf( "Bits written = %d\n", iBitsWritten ); + printf( "Bits written = %d\n", iBitsWritten ); +#endif +#ifdef SPLIT_REND_LCLD_5MS + } #endif - pop_wmops(); return; diff --git a/lib_rend/ivas_splitRendererPLC.c b/lib_rend/ivas_splitRendererPLC.c index 0c75b55eb6..459827bd56 100644 --- a/lib_rend/ivas_splitRendererPLC.c +++ b/lib_rend/ivas_splitRendererPLC.c @@ -74,6 +74,10 @@ static void adaptive_polar_ext_plc( float xf_alp[CLDFB_PLC_XF], float xf_bet[CLDFB_PLC_XF] #endif +#ifdef SPLIT_REND_LCLD_5MS + , + const int16_t iNumCols +#endif ) { float uth[CLDFB_NO_COL_MAX], uthu[CLDFB_NO_COL_MAX], urh[CLDFB_NO_COL_MAX]; @@ -82,6 +86,10 @@ static void adaptive_polar_ext_plc( float start_real, start_imag, abs_fac, abs_fac_powj, comp_fac, fac_powj_real, fac_powj_imag, temp, abs2inv; float fac_ph_real, fac_ph_imag, rat_real, rat_imag, abs_temp; int32_t k, j; +#ifndef SPLIT_REND_LCLD_5MS + int16_t iNumCols; + iNumCols = CLDFB_NO_COL_MAX; +#endif /* reset of accumulators */ ph_adj = 0.0f; @@ -91,7 +99,7 @@ static void adaptive_polar_ext_plc( sth = 0.0f; /* calculate per-sample phase and magnitude evolution in preceding frame */ - for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) + for ( k = 0; k < iNumCols; k++ ) { urh[k] = sqrtf( prev_imag[k] * prev_imag[k] + prev_real[k] * prev_real[k] ); if ( urh[k] < EPSILON ) @@ -134,14 +142,14 @@ static void adaptive_polar_ext_plc( } } - if ( k == CLDFB_NO_COL_MAX ) + if ( k == iNumCols ) { /* mean and stdev of per-sample magnitude ratios */ - drho *= 1.0f / ( CLDFB_NO_COL_MAX - 1 ); - temp = srho - ( CLDFB_NO_COL_MAX - 1 ) * SQR( drho ); + drho *= 1.0f / ( iNumCols - 1 ); + temp = srho - ( iNumCols - 1 ) * SQR( drho ); if ( temp > 0 ) { - srho = sqrtf( temp * ( 1.0f / ( CLDFB_NO_COL_MAX - 2 ) ) ); + srho = sqrtf( temp * ( 1.0f / ( iNumCols - 2 ) ) ); } else { @@ -149,11 +157,11 @@ static void adaptive_polar_ext_plc( } /* mean and stdev of per-sample phase differences */ - dth *= 1.0f / ( CLDFB_NO_COL_MAX - 1 ); - temp = sth - ( CLDFB_NO_COL_MAX - 1 ) * SQR( dth ); + dth *= 1.0f / ( iNumCols - 1 ); + temp = sth - ( iNumCols - 1 ) * SQR( dth ); if ( temp > 0 ) { - sth = sqrtf( temp * ( 1.0f / ( CLDFB_NO_COL_MAX - 2 ) ) ); + sth = sqrtf( temp * ( 1.0f / ( iNumCols - 2 ) ) ); } else { @@ -173,12 +181,12 @@ static void adaptive_polar_ext_plc( /* Calculate start value for evolution from last samples of previous frame */ fac_powj_real = fac_real; fac_powj_imag = fac_imag; - start_real = prev_real[CLDFB_NO_COL_MAX - 1]; - start_imag = prev_imag[CLDFB_NO_COL_MAX - 1]; + start_real = prev_real[iNumCols - 1]; + start_imag = prev_imag[iNumCols - 1]; for ( j = 1; j < START_VAL_AVG_LEN; j++ ) { - start_real += fac_powj_real * prev_real[CLDFB_NO_COL_MAX - j - 1] - fac_powj_imag * prev_imag[CLDFB_NO_COL_MAX - j - 1]; - start_imag += fac_powj_imag * prev_real[CLDFB_NO_COL_MAX - j - 1] + fac_powj_real * prev_imag[CLDFB_NO_COL_MAX - j - 1]; + start_real += fac_powj_real * prev_real[iNumCols - j - 1] - fac_powj_imag * prev_imag[iNumCols - j - 1]; + start_imag += fac_powj_imag * prev_real[iNumCols - j - 1] + fac_powj_real * prev_imag[iNumCols - j - 1]; temp = fac_powj_real * fac_real - fac_powj_imag * fac_imag; fac_powj_imag = fac_powj_imag * fac_real + fac_powj_real * fac_imag; fac_powj_real = temp; @@ -187,8 +195,8 @@ static void adaptive_polar_ext_plc( start_imag *= 1.0f / START_VAL_AVG_LEN; #else /* take last sample of previous frame as start value */ - start_real = prev_real[CLDFB_NO_COL_MAX - 1]; - start_imag = prev_imag[CLDFB_NO_COL_MAX - 1]; + start_real = prev_real[iNumCols - 1]; + start_imag = prev_imag[iNumCols - 1]; #endif #if DO_PERTURB != 0 @@ -211,7 +219,7 @@ static void adaptive_polar_ext_plc( /* apply complex evolution for first substitution sample */ rec_real[0] = rat_real * start_real - rat_imag * start_imag; rec_imag[0] = rat_imag * start_real + rat_real * start_imag; - for ( j = 2; j < CLDFB_NO_COL_MAX; j++ ) + for ( j = 2; j < iNumCols; j++ ) { /* make evolution less static: apply per samples differences as in preceding frame */ rat_real = ( prev_real[j] * prev_real[j - 1] + prev_imag[j] * prev_imag[j - 1] ); @@ -244,13 +252,13 @@ static void adaptive_polar_ext_plc( #endif rat_real *= abs2inv; rat_imag *= abs2inv; - rec_real[j + CLDFB_NO_COL_MAX - 2] = rat_real * rec_real[j + CLDFB_NO_COL_MAX - 3] - rat_imag * rec_imag[j + CLDFB_NO_COL_MAX - 3]; - rec_imag[j + CLDFB_NO_COL_MAX - 2] = rat_imag * rec_real[j + CLDFB_NO_COL_MAX - 3] + rat_real * rec_imag[j + CLDFB_NO_COL_MAX - 3]; + rec_real[j + iNumCols - 2] = rat_real * rec_real[j + iNumCols - 3] - rat_imag * rec_imag[j + iNumCols - 3]; + rec_imag[j + iNumCols - 2] = rat_imag * rec_real[j + iNumCols - 3] + rat_real * rec_imag[j + iNumCols - 3]; } #else rec_real[0] = fac_real * start_real - fac_imag * start_imag; rec_imag[0] = fac_imag * start_real + fac_real * start_imag; - for ( j = 1; j < CLDFB_NO_COL_MAX + CLDFB_PLC_XF; j++ ) + for ( j = 1; j < iNumCols + CLDFB_PLC_XF; j++ ) { rec_real[j] = fac_real * rec_real[j - 1] - fac_imag * rec_imag[j - 1]; rec_imag[j] = fac_imag * rec_real[j - 1] + fac_real * rec_imag[j - 1]; @@ -261,8 +269,8 @@ static void adaptive_polar_ext_plc( /* apply crossfade */ for ( j = 0; j < CLDFB_PLC_XF; j++ ) { - rec_real[CLDFB_NO_COL_MAX + j] *= xf_alp[j]; - rec_imag[CLDFB_NO_COL_MAX + j] *= xf_alp[j]; + rec_real[iNumCols + j] *= xf_alp[j]; + rec_imag[iNumCols + j] *= xf_alp[j]; xf_bet[j] = 1 - xf_alp[j]; } #endif @@ -273,7 +281,7 @@ static void adaptive_polar_ext_plc( Ruu_real[0] = SQR( prev_real[0] ) + SQR( prev_imag[0] ); Ruu_real[1] = 0; Ruu_imag[1] = 0; - for ( j = 1; j < CLDFB_NO_COL_MAX; j++ ) + for ( j = 1; j < iNumCols; j++ ) { Ruu_real[0] += SQR( prev_real[j] ) + SQR( prev_imag[j] ); Ruu_real[1] += prev_real[j] * prev_real[j - 1] + prev_imag[j] * prev_imag[j - 1]; @@ -296,12 +304,12 @@ static void adaptive_polar_ext_plc( fac_powj_imag = fac_imag; abs_fac = sqrtf( SQR( fac_real ) + SQR( fac_imag ) ); abs_fac_powj = abs_fac; - for ( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + for ( j = 0; j < iNumCols; j++ ) { comp_fac = 1 - abs_fac_powj; - rec_real[j] = prev_real[CLDFB_NO_COL_MAX - 1] * fac_powj_real - prev_imag[CLDFB_NO_COL_MAX - 1] * fac_powj_imag + + rec_real[j] = prev_real[iNumCols - 1] * fac_powj_real - prev_imag[iNumCols - 1] * fac_powj_imag + prev_real[j] * comp_fac; - rec_imag[j] = prev_real[CLDFB_NO_COL_MAX - 1] * fac_powj_imag + prev_imag[CLDFB_NO_COL_MAX - 1] * fac_powj_real + + rec_imag[j] = prev_real[iNumCols - 1] * fac_powj_imag + prev_imag[iNumCols - 1] * fac_powj_real + prev_imag[j] * comp_fac; abs_fac_powj = abs_fac_powj * abs_fac; temp = fac_powj_real * fac_real - fac_powj_imag * fac_imag; @@ -317,8 +325,8 @@ static void adaptive_polar_ext_plc( for ( j = 0; j < CLDFB_PLC_XF; j++ ) { xf_bet[j] = 1 - abs_fac_powj; - rec_real[j + CLDFB_NO_COL_MAX] = rec_real[CLDFB_NO_COL_MAX - 1] * fac_powj_real - rec_imag[CLDFB_NO_COL_MAX - 1] * fac_powj_imag; - rec_imag[j + CLDFB_NO_COL_MAX] = rec_real[CLDFB_NO_COL_MAX - 1] * fac_powj_imag + rec_imag[CLDFB_NO_COL_MAX - 1] * fac_powj_real; + rec_real[j + iNumCols] = rec_real[iNumCols - 1] * fac_powj_real - rec_imag[iNumCols - 1] * fac_powj_imag; + rec_imag[j + iNumCols] = rec_real[iNumCols - 1] * fac_powj_imag + rec_imag[iNumCols - 1] * fac_powj_real; abs_fac_powj = abs_fac_powj * abs_fac; temp = fac_powj_real * fac_real - fac_powj_imag * fac_imag; fac_powj_imag = fac_powj_real * fac_imag + fac_powj_imag * fac_real; @@ -329,7 +337,7 @@ static void adaptive_polar_ext_plc( } else { - for ( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + for ( j = 0; j < iNumCols; j++ ) { rec_real[j] = prev_real[j]; rec_imag[j] = prev_imag[j]; @@ -338,8 +346,8 @@ static void adaptive_polar_ext_plc( for ( j = 0; j < CLDFB_PLC_XF; j++ ) { xf_bet[j] = 1; - rec_real[j + CLDFB_NO_COL_MAX] = 0; - rec_imag[j + CLDFB_NO_COL_MAX] = 0; + rec_real[j + iNumCols] = 0; + rec_imag[j + iNumCols] = 0; } #endif } @@ -401,16 +409,30 @@ void ivas_splitBinRendPLCClose( * *------------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +void ivas_splitBinRendPLCsaveState( + SPLIT_REND_PLC_HANDLE hSplitRendPLC, + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const int16_t num_chs, + const int16_t iNumBlocks, + const int16_t iNumIterations ) +#else void ivas_splitBinRendPLCsaveState( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t num_chs ) +#endif { int16_t k, n; - /* Save Cldfb frame */ +/* Save Cldfb frame */ +#ifdef SPLIT_REND_LCLD_5MS + for ( k = 0; k < ( iNumBlocks * iNumIterations ); k++ ) +#else for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) +#endif { for ( n = 0; n < num_chs; n++ ) { @@ -429,11 +451,21 @@ void ivas_splitBinRendPLCsaveState( * Cross-fade of preceding bad frame into good frame *------------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +void ivas_splitBinRendPLC_xf( + SPLIT_REND_PLC_HANDLE hSplitRendPLC, + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const int16_t num_chs, + const int16_t iNumBlocks, + const int16_t iNumIterations ) +#else void ivas_splitBinRendPLC_xf( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t num_chs ) +#endif { int16_t n, i, k; @@ -452,8 +484,13 @@ void ivas_splitBinRendPLC_xf( #if CLDFB_PLC_XF > 0 for ( k = 0; k < CLDFB_PLC_XF; k++ ) { +#ifdef SPLIT_REND_LCLD_5MS + Cldfb_RealBuffer_Binaural[n][k][i] = hSplitRendPLC->CldfbPLC_state.xf_bet[n][i][k] * Cldfb_RealBuffer_Binaural[n][k][i] + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k + ( iNumBlocks * iNumIterations )][i]; + Cldfb_ImagBuffer_Binaural[n][k][i] = hSplitRendPLC->CldfbPLC_state.xf_bet[n][i][k] * Cldfb_ImagBuffer_Binaural[n][k][i] + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag[n][k + ( iNumBlocks * iNumIterations )][i]; +#else Cldfb_RealBuffer_Binaural[n][k][i] = hSplitRendPLC->CldfbPLC_state.xf_bet[n][i][k] * Cldfb_RealBuffer_Binaural[n][k][i] + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k + CLDFB_NO_COL_MAX][i]; Cldfb_ImagBuffer_Binaural[n][k][i] = hSplitRendPLC->CldfbPLC_state.xf_bet[n][i][k] * Cldfb_ImagBuffer_Binaural[n][k][i] + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag[n][k + CLDFB_NO_COL_MAX][i]; +#endif } #endif } @@ -469,11 +506,21 @@ void ivas_splitBinRendPLC_xf( * Conceal bad frame *------------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +void ivas_splitBinRendPLC( + SPLIT_REND_PLC_HANDLE hSplitRendPLC, + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const int16_t num_chs, + const int16_t iNumBlocks, + const int16_t iNumIterations ) +#else void ivas_splitBinRendPLC( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t num_chs ) +#endif { int32_t i, n, k; float fade_fac; @@ -481,6 +528,11 @@ void ivas_splitBinRendPLC( #if CLDFB_PLC_XF > 0 float xf_alp[CLDFB_PLC_XF]; #endif +#ifdef SPLIT_REND_LCLD_5MS + int16_t iNumCols, fade_start_cntr, mute_cntr, fade_val; + + iNumCols = iNumBlocks * iNumIterations; +#endif /* Indicate that next transition will be from a bad frame */ hSplitRendPLC->prev_bfi = 1; @@ -497,7 +549,11 @@ void ivas_splitBinRendPLC( { for ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { +#ifdef SPLIT_REND_LCLD_5MS + for ( k = 0; k < iNumCols; k++ ) +#else for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) +#endif { prev_real[k] = hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k][i]; prev_imag[k] = hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag[n][k][i]; @@ -507,10 +563,18 @@ void ivas_splitBinRendPLC( #if CLDFB_PLC_XF > 0 , xf_alp, hSplitRendPLC->CldfbPLC_state.xf_bet[n][i] +#endif +#ifdef SPLIT_REND_LCLD_5MS + , + iNumCols #endif ); +#ifdef SPLIT_REND_LCLD_5MS + for ( k = 0; k < iNumCols; k++ ) +#else for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) +#endif { Cldfb_RealBuffer_Binaural[n][k][i] = rec_real[k]; hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k][i] = rec_real[k]; @@ -519,7 +583,11 @@ void ivas_splitBinRendPLC( } #if CLDFB_PLC_XF > 0 +#ifdef SPLIT_REND_LCLD_5MS + for ( k = iNumCols; k < iNumCols + CLDFB_PLC_XF; k++ ) +#else for ( k = CLDFB_NO_COL_MAX; k < CLDFB_NO_COL_MAX + CLDFB_PLC_XF; k++ ) +#endif { hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k][i] = rec_real[k]; hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag[n][k][i] = rec_imag[k]; @@ -529,7 +597,41 @@ void ivas_splitBinRendPLC( } - /* Check bf counter */ +/* Check bf counter */ +#ifdef SPLIT_REND_LCLD_5MS + fade_start_cntr = SR_PLC_FADE_START * CLDFB_NO_COL_MAX / iNumCols; + mute_cntr = SR_PLC_MUTE * CLDFB_NO_COL_MAX / iNumCols; + + if ( hSplitRendPLC->bf_count++ >= fade_start_cntr ) + { + if ( hSplitRendPLC->bf_count < mute_cntr ) + { + fade_val = ( ( hSplitRendPLC->bf_count - fade_start_cntr ) * iNumCols ) / CLDFB_NO_COL_MAX; + fade_fac = powf( 10, ( hSplitRendPLC->bf_count - fade_start_cntr ) * SR_PLC_FADE_DEGREE / 20.0f ); + + for ( n = 0; n < num_chs; n++ ) + { + for ( k = 0; k < iNumCols; k++ ) + { + v_multc( &Cldfb_RealBuffer_Binaural[n][k][0], fade_fac, &Cldfb_RealBuffer_Binaural[n][k][0], (int16_t) CLDFB_NO_CHANNELS_MAX ); + v_multc( &Cldfb_ImagBuffer_Binaural[n][k][0], fade_fac, &Cldfb_ImagBuffer_Binaural[n][k][0], (int16_t) CLDFB_NO_CHANNELS_MAX ); + } + } + } + else + { + for ( n = 0; n < num_chs; n++ ) + { + for ( k = 0; k < iNumCols; k++ ) + { + set_zero( &Cldfb_RealBuffer_Binaural[n][k][0], (int16_t) CLDFB_NO_CHANNELS_MAX ); + set_zero( &Cldfb_ImagBuffer_Binaural[n][k][0], (int16_t) CLDFB_NO_CHANNELS_MAX ); + } + } + hSplitRendPLC->bf_count = mute_cntr; + } + } +#else if ( hSplitRendPLC->bf_count++ >= SR_PLC_FADE_START ) { if ( hSplitRendPLC->bf_count < SR_PLC_MUTE ) @@ -545,6 +647,7 @@ void ivas_splitBinRendPLC( hSplitRendPLC->bf_count = SR_PLC_MUTE; } } +#endif return; } diff --git a/lib_rend/ivas_splitRendererPre.c b/lib_rend/ivas_splitRendererPre.c index 973432ec50..e25e7fc5de 100644 --- a/lib_rend/ivas_splitRendererPre.c +++ b/lib_rend/ivas_splitRendererPre.c @@ -2025,10 +2025,20 @@ ivas_error ivas_split_renderer_open( } else { +#ifdef SPLIT_REND_LCLD_5MS + int16_t iNumBlocksPerFrame; + iNumBlocksPerFrame = ( CLDFB_NO_COL_MAX * pSplitRendConfig->codec_frame_size_ms ) / 20; + + if ( ( error = ivas_splitBinLCLDEncOpen( &hSplitRendWrapper->hSplitBinLCLDEnc, OutSampleRate, BINAURAL_CHANNELS, ivas_get_lcld_bitrate( pSplitRendConfig->splitRendBitRate, hSplitRendWrapper->multiBinPoseData.poseCorrectionMode ), iNumBlocksPerFrame, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_splitBinLCLDEncOpen( &hSplitRendWrapper->hSplitBinLCLDEnc, OutSampleRate, BINAURAL_CHANNELS, ivas_get_lcld_bitrate( pSplitRendConfig->splitRendBitRate, hSplitRendWrapper->multiBinPoseData.poseCorrectionMode ) ) ) != IVAS_ERR_OK ) { return error; } +#endif } } @@ -2233,10 +2243,12 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( actual_md_bits = pBits->bits_written; if ( ( hSplitBin->multiBinPoseData.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) || ( !useLc3plus && !pcm_out_flag ) ) { +#ifndef SPLIT_REND_LCLD_5MS if ( !useLc3plus && codec_frame_size_ms != 20 && !pcm_out_flag ) { return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_BUFFER_SIZE, "Unsupported framing for LCLD codec!" ); } +#endif num_cldfb_bands = hSplitBin->hCldfbHandles->cldfbAna[0]->no_channels; /* CLDFB Analysis*/ @@ -2260,7 +2272,11 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( #endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { +#ifdef SPLIT_REND_LCLD_5MS + for ( slot_idx = 0; slot_idx < hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) +#endif { cldfbAnalysis_ts( &( in_delayed[pos_idx * BINAURAL_CHANNELS + ch][num_cldfb_bands * slot_idx] ), Cldfb_In_BinReal[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], Cldfb_In_BinImag[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], @@ -2289,10 +2305,17 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( if ( !useLc3plus ) { +#ifdef SPLIT_REND_LCLD_5MS + available_bits = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); + actual_md_bits = pBits->bits_written - actual_md_bits; + available_bits -= actual_md_bits; + pBits->codec_frame_size_ms = codec_frame_size_ms; +#else available_bits = SplitRendBitRate * L_FRAME48k / 48000; actual_md_bits = pBits->bits_written - actual_md_bits; available_bits -= actual_md_bits; pBits->codec_frame_size_ms = 20; +#endif ivas_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, Cldfb_In_BinReal, Cldfb_In_BinImag, available_bits, pBits ); } @@ -2319,7 +2342,11 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( { if ( !useLc3plus ) { +#ifdef SPLIT_REND_LCLD_5MS + bit_len = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); +#else bit_len = SplitRendBitRate / FRAMES_PER_SEC; +#endif } else { @@ -2455,10 +2482,18 @@ ivas_error ivas_renderMultiBinToSplitBinaural( /* Needs to be done at runtime. If this was in another API function, * there would be no guarantee that the user did not change * the split rendering config before calling the main rendering function */ +#ifdef SPLIT_REND_LCLD_5MS + if ( ( error = ivas_split_rend_choose_default_codec( &splitCodec, &codec_frame_size_ms, cldfb_in_flag, pcm_out_flag, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_split_rend_choose_default_codec( &splitCodec, &codec_frame_size_ms, cldfb_in_flag, pcm_out_flag ) ) != IVAS_ERR_OK ) { return error; } +#endif + if ( cldfb_in_flag == 0 ) { @@ -2500,31 +2535,49 @@ ivas_error ivas_renderMultiBinToSplitBinaural( if ( splitCodec == IVAS_SPLIT_REND_CODEC_LCLD ) { +#ifdef SPLIT_REND_LCLD_5MS + available_bits = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); + actual_md_bits = pBits->bits_written - actual_md_bits; + available_bits -= actual_md_bits; + pBits->codec_frame_size_ms = codec_frame_size_ms; +#else available_bits = SplitRendBitRate * L_FRAME48k / 48000; actual_md_bits = pBits->bits_written - actual_md_bits; available_bits -= actual_md_bits; - +#endif ivas_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, Cldfb_In_BinReal, Cldfb_In_BinImag, available_bits, pBits ); } else { +#ifdef SPLIT_REND_LCLD_5MS + int16_t ch, slot_idx, num_slots, ivas_fs; + ivas_fs = (int16_t) hSplitBin->hLc3plusEnc->config.ivas_frame_duration_us / 1000; + num_slots = (int16_t) ( CLDFB_NO_COL_MAX * ivas_fs ) / 20; +#else int16_t ch, slot_idx; - +#endif /* CLDFB synthesis of main pose */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { float *Cldfb_In_BinReal_p[CLDFB_NO_COL_MAX]; float *Cldfb_In_BinImag_p[CLDFB_NO_COL_MAX]; - +#ifdef SPLIT_REND_LCLD_5MS + for ( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) +#endif { Cldfb_In_BinReal_p[slot_idx] = Cldfb_In_BinReal[ch][slot_idx]; Cldfb_In_BinImag_p[slot_idx] = Cldfb_In_BinImag[ch][slot_idx]; } #ifndef SPLIT_REND_WITH_HEAD_ROT cldfbSynthesis( Cldfb_In_BinReal_p, Cldfb_In_BinImag_p, output[ch], hSplitBin->hCldfbHandles->cldfbAna[0]->no_channels * CLDFB_NO_COL_MAX, hSplitBin->hCldfbHandles->cldfbAna[ch] ); +#else +#ifdef SPLIT_REND_LCLD_5MS + cldfbSynthesis( Cldfb_In_BinReal_p, Cldfb_In_BinImag_p, output[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); #else cldfbSynthesis( Cldfb_In_BinReal_p, Cldfb_In_BinImag_p, output[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); +#endif #endif } @@ -2561,7 +2614,6 @@ ivas_error ivas_renderMultiBinToSplitBinaural( } /*zero pad*/ - /*TODO: do this inside the LCLD ENC codec */ if ( pcm_out_flag ) { bit_len = SplitRendBitRate / FRAMES_PER_SEC; @@ -2570,7 +2622,11 @@ ivas_error ivas_renderMultiBinToSplitBinaural( { if ( splitCodec == IVAS_SPLIT_REND_CODEC_LCLD ) { +#ifdef SPLIT_REND_LCLD_5MS + bit_len = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); +#else bit_len = SplitRendBitRate / FRAMES_PER_SEC; +#endif } else { diff --git a/lib_rend/ivas_splitRenderer_utils.c b/lib_rend/ivas_splitRenderer_utils.c index daf6eb6f28..f3f3cad2a3 100644 --- a/lib_rend/ivas_splitRenderer_utils.c +++ b/lib_rend/ivas_splitRenderer_utils.c @@ -724,7 +724,11 @@ ivas_error ivas_split_rend_validate_config( if ( pSplitRendConfig->codec_frame_size_ms != 0 ) /* 0 means "default for current codec", will be set to actual value at a later stage */ { +#ifdef SPLIT_REND_LCLD_5MS + if ( pSplitRendConfig->codec == IVAS_SPLIT_REND_CODEC_LCLD && pSplitRendConfig->codec_frame_size_ms != 5 && pSplitRendConfig->codec_frame_size_ms != 10 && pSplitRendConfig->codec_frame_size_ms != 20 ) +#else if ( pSplitRendConfig->codec == IVAS_SPLIT_REND_CODEC_LCLD && pSplitRendConfig->codec_frame_size_ms != 20 ) +#endif { return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Invalid framing for LCLD codec" ); } @@ -1049,12 +1053,22 @@ void ivas_init_multi_bin_pose_data( * *------------------------------------------------------------------------*/ +#ifdef SPLIT_REND_LCLD_5MS +ivas_error ivas_split_rend_choose_default_codec( + IVAS_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ + int16_t *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ + const int16_t cldfb_in_flag, /* i : flag indicating rendering in TD */ + const int16_t pcm_out_flag, /* i : flag to indicate PCM output */ + const int16_t is_5ms_frame /* i : flag to indicate 5ms framing */ +) +#else ivas_error ivas_split_rend_choose_default_codec( IVAS_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ int16_t *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ const int16_t cldfb_in_flag, /* i : flag indicating rendering in TD */ const int16_t pcm_out_flag /* i : flag to indicate PCM output */ ) +#endif { if ( pcm_out_flag == 0 ) { @@ -1073,7 +1087,18 @@ ivas_error ivas_split_rend_choose_default_codec( switch ( *pCodec ) { case IVAS_SPLIT_REND_CODEC_LCLD: +#ifdef SPLIT_REND_LCLD_5MS + if ( is_5ms_frame ) + { + *pCodec_frame_size_ms = 5; + } + else + { + *pCodec_frame_size_ms = 20; + } +#else *pCodec_frame_size_ms = 20; +#endif break; case IVAS_SPLIT_REND_CODEC_LC3PLUS: case IVAS_SPLIT_REND_CODEC_NONE: diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index ec5d5efa4a..c4e042f429 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1438,6 +1438,10 @@ typedef struct ivas_binaural_head_rot_split_rendering_lcld_enc_struct FILE *cldfbIn; int16_t numFrame; #endif +#ifdef SPLIT_REND_LCLD_5MS + int32_t iNumIterations; + int32_t iNumBlocks; +#endif } BIN_HR_SPLIT_LCLD_ENC, *BIN_HR_SPLIT_LCLD_ENC_HANDLE; @@ -1471,6 +1475,10 @@ typedef struct ivas_binaural_head_rot_split_rendering_lcld_dec_struct int16_t numFrame; #endif SPLIT_REND_PLC_HANDLE hSplitRendPLC; +#ifdef SPLIT_REND_LCLD_5MS + int16_t iNumBlocks; + int16_t iNumIterations; +#endif } BIN_HR_SPLIT_LCLD_DEC, *BIN_HR_SPLIT_LCLD_DEC_HANDLE; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 947889e837..1bd89d4084 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3916,10 +3916,17 @@ ivas_error IVAS_REND_AddInput( int16_t cldfb_in_flag; cldfb_in_flag = getCldfbRendFlag( hIvasRend, getAudioConfigType( inConfig ) ); +#ifdef SPLIT_REND_LCLD_5MS + if ( ( error = ivas_split_rend_choose_default_codec( &hIvasRend->hRendererConfig->split_rend_config.codec, &hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM, ( hIvasRend->num_subframes == 1 ) ? 1 : 0 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_split_rend_choose_default_codec( &hIvasRend->hRendererConfig->split_rend_config.codec, &hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( ( error = initSplitRend( &hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer, &hIvasRend->hRendererConfig->split_rend_config, hIvasRend->headRotData, hIvasRend->sampleRateOut, hIvasRend->outputConfig, cldfb_in_flag, ( hIvasRend->num_subframes == 1 ) ? 1 : 0 ) ) != IVAS_ERR_OK ) { @@ -4797,10 +4804,17 @@ int16_t IVAS_REND_FeedRenderConfig( cldfb_in_flag = getCldfbRendFlag( hIvasRend, IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ); closeSplitRend( &hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer ); +#ifdef SPLIT_REND_LCLD_5MS + if ( ( error = ivas_split_rend_choose_default_codec( &hIvasRend->hRendererConfig->split_rend_config.codec, &hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM, ( hIvasRend->num_subframes == 1 ) ? 1 : 0 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_split_rend_choose_default_codec( &hIvasRend->hRendererConfig->split_rend_config.codec, &hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( ( error = initSplitRend( &hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer, &hIvasRend->hRendererConfig->split_rend_config, hIvasRend->headRotData, hIvasRend->sampleRateOut, hIvasRend->outputConfig, cldfb_in_flag, ( hIvasRend->num_subframes == 1 ) ? 1 : 0 ) ) != IVAS_ERR_OK ) { @@ -6993,6 +7007,10 @@ static ivas_error renderSplitBinauralWithPostRot( int16_t outBufNumSamplesPerChannel, outBufNumColPerChannel; int16_t numSamplesPerChannelCacheSize, numColPerChannelCacheSize; float *readPtr, *writePtr; +#ifdef SPLIT_REND_LCLD_5MS + LC3PLUS_CONFIG config; + int16_t iNumBlocksPerFrame, iNumLCLDIterationsPerFrame; +#endif isPostRendInputCldfb = 0; push_wmops( "renderSplitBinauralWithPostRot" ); @@ -7002,15 +7020,43 @@ static ivas_error renderSplitBinauralWithPostRot( hSplitBin = &splitBinInput->splitPostRendWrapper; convertBitsBufferToInternalBitsBuff( *splitBinInput->hBits, &bits ); +#ifdef SPLIT_REND_LCLD_5MS + config.lc3plus_frame_duration_us = bits.codec_frame_size_ms * 1000; + if ( pCombinedOrientationData->num_subframes == 1 ) + { + config.ivas_frame_duration_us = ( bits.pose_correction == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ? config.lc3plus_frame_duration_us : 20000; + iNumLCLDIterationsPerFrame = 1; + } + else + { + config.ivas_frame_duration_us = 20000; + } + + iNumLCLDIterationsPerFrame = (int16_t) config.ivas_frame_duration_us / ( 1000 * bits.codec_frame_size_ms ); + iNumLCLDIterationsPerFrame = max( 1, iNumLCLDIterationsPerFrame ); + iNumBlocksPerFrame = CLDFB_NO_COL_MAX * bits.codec_frame_size_ms / 20; + + config.channels = BINAURAL_CHANNELS; + config.samplerate = *splitBinInput->base.ctx.pOutSampleRate; +#endif + if ( bits.codec == IVAS_SPLIT_REND_CODEC_LCLD && splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec == NULL ) { +#ifdef SPLIT_REND_LCLD_5MS + if ( ( error = ivas_splitBinLCLDDecOpen( &splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec, *splitBinInput->base.ctx.pOutSampleRate, BINAURAL_CHANNELS, iNumBlocksPerFrame, iNumLCLDIterationsPerFrame ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_splitBinLCLDDecOpen( &splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec, *splitBinInput->base.ctx.pOutSampleRate, BINAURAL_CHANNELS ) ) != IVAS_ERR_OK ) { return error; } +#endif } else if ( bits.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS && splitBinInput->splitPostRendWrapper.hLc3plusDec == NULL ) { +#ifndef SPLIT_REND_LCLD_5MS LC3PLUS_CONFIG config; if ( outAudio.config.numSamplesPerChannel == 240 ) @@ -7026,6 +7072,7 @@ static ivas_error renderSplitBinauralWithPostRot( config.channels = BINAURAL_CHANNELS; config.samplerate = *splitBinInput->base.ctx.pOutSampleRate; +#endif if ( ( error = IVAS_LC3PLUS_DEC_Open( config, &splitBinInput->splitPostRendWrapper.hLc3plusDec ) ) != IVAS_ERR_OK ) { @@ -7069,13 +7116,20 @@ static ivas_error renderSplitBinauralWithPostRot( { isPostRendInputCldfb = 1; } - +#ifdef SPLIT_REND_LCLD_5MS + preRendFrameSize_ms = (int16_t) ( config.ivas_frame_duration_us ) / 1000; +#else preRendFrameSize_ms = bits.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS ? (int16_t) ( hSplitBin->hLc3plusDec->config.ivas_frame_duration_us ) / 1000 : 20; +#endif numSamplesPerChannelCacheSize = (int16_t) ( *splitBinInput->base.ctx.pOutSampleRate * ( preRendFrameSize_ms - bits.codec_frame_size_ms ) / 1000 ); outBufNumColPerChannel = MAX_PARAM_SPATIAL_SUBFRAMES; +#ifdef SPLIT_REND_LCLD_5MS + numColPerChannelCacheSize = ( iNumBlocksPerFrame * iNumLCLDIterationsPerFrame ) - outBufNumColPerChannel; +#else numColPerChannelCacheSize = CLDFB_NO_COL_MAX - outBufNumColPerChannel; +#endif for ( sf_idx = 0; sf_idx < pCombinedOrientationData->num_subframes; sf_idx++ ) { @@ -7098,7 +7152,11 @@ static ivas_error renderSplitBinauralWithPostRot( /* cache the remaining 15ms */ splitBinInput->numCachedSamples = numColPerChannelCacheSize; writePtr = splitBinInput->bufferData; +#ifdef SPLIT_REND_LCLD_5MS + for ( slotIdx = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slotIdx < ( iNumBlocksPerFrame * iNumLCLDIterationsPerFrame ); ++slotIdx ) +#else for ( slotIdx = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slotIdx < CLDFB_NO_COL_MAX; ++slotIdx ) +#endif { for ( chnlIdx = 0; chnlIdx < BINAURAL_CHANNELS; ++chnlIdx ) { @@ -8549,12 +8607,18 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream( cldfb_in_flag = getCldfbRendFlag( hIvasRend, IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ); hIvasRend->splitRendEncBuffer.config.is_cldfb = cldfb_in_flag; - +#ifdef SPLIT_REND_LCLD_5MS + if ( hIvasRend->hRendererConfig->split_rend_config.dof == 0 || hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) + { + hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = outAudio.config.numSamplesPerChannel; + } +#else if ( hIvasRend->hRendererConfig->split_rend_config.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS && ( hIvasRend->hRendererConfig->split_rend_config.dof == 0 || hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) { hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms * hIvasRend->num_subframes * (int16_t) ( hIvasRend->sampleRateOut / 1000 ); } +#endif else { hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = (int16_t) ( hIvasRend->sampleRateOut / FRAMES_PER_SEC ); -- GitLab From f00dd9a2363065f7bcfb924d7f9ca839e9493066 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 15 Jan 2024 22:59:10 +1100 Subject: [PATCH 010/601] warning fixes --- lib_rend/ivas_RMSEnvGrouping.c | 2 +- lib_rend/ivas_splitRendererPLC.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_RMSEnvGrouping.c b/lib_rend/ivas_RMSEnvGrouping.c index 1d8ef2593f..7dc34714bf 100644 --- a/lib_rend/ivas_RMSEnvGrouping.c +++ b/lib_rend/ivas_RMSEnvGrouping.c @@ -589,7 +589,7 @@ static float TryMerge2( return fMergedCost; } -#ifdef SPLIT_REND_LCLD_5MS +#ifndef SPLIT_REND_LCLD_5MS /*-------------------------------------------------------------------* * Function ComputeGreedyGroups() * diff --git a/lib_rend/ivas_splitRendererPLC.c b/lib_rend/ivas_splitRendererPLC.c index 459827bd56..c63715a230 100644 --- a/lib_rend/ivas_splitRendererPLC.c +++ b/lib_rend/ivas_splitRendererPLC.c @@ -607,7 +607,7 @@ void ivas_splitBinRendPLC( if ( hSplitRendPLC->bf_count < mute_cntr ) { fade_val = ( ( hSplitRendPLC->bf_count - fade_start_cntr ) * iNumCols ) / CLDFB_NO_COL_MAX; - fade_fac = powf( 10, ( hSplitRendPLC->bf_count - fade_start_cntr ) * SR_PLC_FADE_DEGREE / 20.0f ); + fade_fac = powf( 10, fade_val * SR_PLC_FADE_DEGREE / 20.0f ); for ( n = 0; n < num_chs; n++ ) { -- GitLab From 027ccdbcb2fc94d8a412b7df511016b7da0b615c Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 16 Jan 2024 09:44:06 +1100 Subject: [PATCH 011/601] remove unused functions --- lib_rend/ivas_RMSEnvGrouping.c | 219 --------------------------------- 1 file changed, 219 deletions(-) diff --git a/lib_rend/ivas_RMSEnvGrouping.c b/lib_rend/ivas_RMSEnvGrouping.c index 7dc34714bf..f7174b6526 100644 --- a/lib_rend/ivas_RMSEnvGrouping.c +++ b/lib_rend/ivas_RMSEnvGrouping.c @@ -275,109 +275,6 @@ static void ComputeBandEnergy( return; } - -#ifdef SPLIT_REND_LCLD_5MS -/*-------------------------------------------------------------------* - * Function TryMerge() - * - * - *-------------------------------------------------------------------*/ - -/* THis is temporary cost function */ -static float TryMerge( - const int32_t iNumBands, - const int32_t iStartBlock, - const int32_t iGroupLength, - const float fMaxAllowedDiffdB, - float **ppfBandEnergy, - float **ppfBandEnergydB, -#ifdef APPLY_WEIGHT - float **ppfWeight, -#endif - float *pfMegredEnergydB ) -{ - int32_t b; - int32_t n; - float fMeanCost; - float fMaxCost; - float fMinDiffCost; - float fMaxDiffCost; - float fInvGroupSize = 1.0f / (float) iGroupLength; - float fInvNumBands = 1.0f / (float) iNumBands; - - for ( b = 0; b < iNumBands; b++ ) - { - float fGroupEnergy; - - - fGroupEnergy = 0.0; - for ( n = iStartBlock; n < ( iStartBlock + iGroupLength ); n++ ) - { - fGroupEnergy += ppfBandEnergy[n][b]; - } - fGroupEnergy *= fInvGroupSize; - fGroupEnergy = 10.0f * log10f( fGroupEnergy ); // Note epsolon was added when computing BandEnergy; - - pfMegredEnergydB[b] = fGroupEnergy; - } - - fMeanCost = 0.0; - fMaxCost = 0.0; - fMinDiffCost = 0.0; - fMaxDiffCost = 0.0; - for ( n = iStartBlock; n < ( iStartBlock + iGroupLength ); n++ ) - { - float fMeanAbsDiff; - float fMaxAbsDiff; - float fMaxDiff; - float fMinDiff; - - fMeanAbsDiff = 0.0; - fMaxAbsDiff = 0.0; - fMaxDiff = 0.0; - fMinDiff = 0.0; - for ( b = 0; b < iNumBands; b++ ) - { - float fDiff; - float fAbsDiff; - - fDiff = pfMegredEnergydB[b] - ppfBandEnergydB[n][b]; // Changed the order of this - fAbsDiff = fabsf( fDiff ); -#ifdef APPLY_WEIGHT - fAbsDiff *= ppfWeight[n][b]; -#endif - - fMeanAbsDiff += fAbsDiff; - fMaxAbsDiff = ( fMaxAbsDiff > fAbsDiff ) ? fMaxAbsDiff : fAbsDiff; - - - fMaxDiff = ( fMaxDiff > fDiff ) ? fMaxDiff : fDiff; - fMinDiff = ( fMinDiff < fDiff ) ? fMinDiff : fDiff; - } - fMeanAbsDiff *= fInvNumBands; - - fMeanCost = ( fMeanCost > fMeanAbsDiff ) ? fMeanCost : fMeanAbsDiff; - fMaxCost = ( fMaxCost > fMaxAbsDiff ) ? fMaxCost : fMaxAbsDiff; - - fMaxDiffCost = ( fMaxDiffCost > fMaxDiff ) ? fMaxDiffCost : fMaxDiff; - fMinDiffCost = ( fMinDiffCost < fMinDiff ) ? fMinDiffCost : fMinDiff; - } - - // printf("%f\t%f\t%f\t%f\n",fMeanCost,fMaxCost,fMaxDiffCost,fMinDiffCost); - - /*if(fMinDiffCost < -9.0){ // This prevents cliping - fMeanCost = 1e12; //Some large value - }*/ - - if ( fMaxCost > fMaxAllowedDiffdB ) - { - fMeanCost = 1e12f; // Some large value - } - - return fMeanCost; -} -#endif - /*-------------------------------------------------------------------* * Function ComputeMergeRMS() * @@ -589,122 +486,6 @@ static float TryMerge2( return fMergedCost; } -#ifndef SPLIT_REND_LCLD_5MS -/*-------------------------------------------------------------------* - * Function ComputeGreedyGroups() - * - * - *-------------------------------------------------------------------*/ - -static void ComputeGreedyGroups( - RMSEnvelopeGrouping *psRMSEnvelopeGrouping, - const int32_t iChannels, - const int32_t iNumBands, - const float fMeanAllowedDiffdB, - const float fMaxAllowedDiffdB ) -{ - float fBestMeanCost; - - fBestMeanCost = 0.0; - while ( fBestMeanCost < fMeanAllowedDiffdB ) - { - GMNode *psGMNode; - GMNode *psBestGMNode; - - fBestMeanCost = fMeanAllowedDiffdB; - psGMNode = &psRMSEnvelopeGrouping->psGMNodes[0]; - psBestGMNode = NULL; - while ( psGMNode->psNext != NULL ) - { - float fMeanCost; - int32_t iGroupLength; - - iGroupLength = psGMNode->iGroupLength + psGMNode->psNext->iGroupLength; - - fMeanCost = TryMerge( iNumBands * iChannels, - psGMNode->iGroupStart, - iGroupLength, // psGMNode->iGroupLength, //Fix this bug - fMaxAllowedDiffdB, - psRMSEnvelopeGrouping->ppfBandEnergy, - psRMSEnvelopeGrouping->ppfBandEnergydB, -#ifdef APPLY_WEIGHT - psRMSEnvelopeGrouping->ppfWeight, -#endif - psGMNode->pfMergedEnergydB ); - - - if ( fMeanCost < fBestMeanCost ) - { - fBestMeanCost = fMeanCost; - psBestGMNode = psGMNode; - } - - psGMNode = psGMNode->psNext; - } - - if ( fBestMeanCost < fMeanAllowedDiffdB && psBestGMNode != NULL && psBestGMNode->psNext != NULL ) - { - psBestGMNode->iGroupLength += psBestGMNode->psNext->iGroupLength; - psBestGMNode->psNext = psBestGMNode->psNext->psNext; - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * Function ComputeGreedyGroups2() - * - * - *-------------------------------------------------------------------*/ - -static void ComputeGreedyGroups2( - RMSEnvelopeGrouping *psRMSEnvelopeGrouping, - const int32_t iChannels, - const int32_t iNumBands, - const int32_t *piBandwidths ) -{ - float fBestMergeCost; - // int32_t iDone = 0; - fBestMergeCost = -1.0; - - while ( fBestMergeCost < 0.0 ) - { - GMNode *psGMNode; - GMNode *psBestGMNode; - - fBestMergeCost = 0.0; - psGMNode = &psRMSEnvelopeGrouping->psGMNodes[0]; - psBestGMNode = NULL; - while ( psGMNode->psNext != NULL ) - { - float fMergeCost; - - fMergeCost = TryMerge2( iChannels, iNumBands, piBandwidths, psRMSEnvelopeGrouping->ppfBandEnergy, psRMSEnvelopeGrouping->ppfBandEnergydB, psGMNode, psGMNode->psNext ); - - if ( fMergeCost < fBestMergeCost ) - { - fBestMergeCost = fMergeCost; - psBestGMNode = psGMNode; - } - - psGMNode = psGMNode->psNext; - } - - if ( fBestMergeCost < 0.0 && psBestGMNode != NULL && psBestGMNode->psNext != NULL ) - { - psBestGMNode->iGroupLength += psBestGMNode->psNext->iGroupLength; - psBestGMNode->iGroupRMSEnvelopeCost = -1; - psBestGMNode->fGroupSNRPenalty = -1.0; - psBestGMNode->psNext = psBestGMNode->psNext->psNext; - } - } - - return; -} -#endif - /*-------------------------------------------------------------------* * Function ComputeGreedyGroups3() * -- GitLab From 61e1be5ba6ef498184c8039be361407d7d5c4614 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 16 Jan 2024 10:45:16 +1100 Subject: [PATCH 012/601] avoid division by 0 --- lib_rend/lib_rend.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 1bd89d4084..28fd9850f3 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -7032,9 +7032,17 @@ static ivas_error renderSplitBinauralWithPostRot( config.ivas_frame_duration_us = 20000; } - iNumLCLDIterationsPerFrame = (int16_t) config.ivas_frame_duration_us / ( 1000 * bits.codec_frame_size_ms ); - iNumLCLDIterationsPerFrame = max( 1, iNumLCLDIterationsPerFrame ); - iNumBlocksPerFrame = CLDFB_NO_COL_MAX * bits.codec_frame_size_ms / 20; + if ( bits.codec_frame_size_ms > 0 ) + { + iNumLCLDIterationsPerFrame = (int16_t) config.ivas_frame_duration_us / ( 1000 * bits.codec_frame_size_ms ); + iNumLCLDIterationsPerFrame = max( 1, iNumLCLDIterationsPerFrame ); + iNumBlocksPerFrame = CLDFB_NO_COL_MAX * bits.codec_frame_size_ms / 20; + } + else + { + iNumLCLDIterationsPerFrame = 1; + iNumBlocksPerFrame = CLDFB_NO_COL_MAX; + } config.channels = BINAURAL_CHANNELS; config.samplerate = *splitBinInput->base.ctx.pOutSampleRate; -- GitLab From 5604d3b788574be75aefb9def2763fae7eb416cf Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 16 Jan 2024 12:11:42 +1100 Subject: [PATCH 013/601] crash fix with TD to CLDFB conversion in pre renderer --- lib_rend/ivas_splitRendererPre.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_splitRendererPre.c b/lib_rend/ivas_splitRendererPre.c index e25e7fc5de..d0c5ca4e76 100644 --- a/lib_rend/ivas_splitRendererPre.c +++ b/lib_rend/ivas_splitRendererPre.c @@ -2211,6 +2211,9 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( uint8_t useLc3plus; float *in_delayed[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; int16_t i; +#ifdef SPLIT_REND_LCLD_5MS + int32_t num_slots; +#endif push_wmops( "ivas_renderMultiTDBinToSplitBinaural" ); @@ -2248,6 +2251,8 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( { return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_BUFFER_SIZE, "Unsupported framing for LCLD codec!" ); } +#else + num_slots = ( hSplitBin->multiBinPoseData.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ? CLDFB_NO_COL_MAX : ( hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ); #endif num_cldfb_bands = hSplitBin->hCldfbHandles->cldfbAna[0]->no_channels; @@ -2273,7 +2278,7 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { #ifdef SPLIT_REND_LCLD_5MS - for ( slot_idx = 0; slot_idx < hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations; slot_idx++ ) + for ( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) #else for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) #endif -- GitLab From 664b872b650506e2e3f7f450567fca4f8f8a3ea7 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 22 Jan 2024 07:21:32 +0100 Subject: [PATCH 014/601] added initial version of 5ms decoding BE test --- .gitlab-ci.yml | 32 ++++++++++++++++++++++++++++++++ scripts/self_test.py | 8 ++++++++ tests/conftest.py | 18 ++++++++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 27212c8646..8cb358e006 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -159,6 +159,10 @@ stages: - sed -i.bak -e "s/\/\*[[:space:]]*\(#define[[:space:]]*SPLIT_REND_WITH_HEAD_ROT\)[[:space:]]*\*\//\1/g" ./lib_com/options.h - sed -i.bak -e "s/\/\/[[:space:]]*\(#define[[:space:]]*SPLIT_REND_WITH_HEAD_ROT\)/\1/g" ./lib_com/options.h +.disable-limiter: &disable-limiter +# automatically enable #define DISABLE_LIMITER in options.h, handling both /**/-comment and //-comment + - sed -i.bak -e "s/\/\*[[:space:]]*\(#define[[:space:]]*DISABLE_LIMITER\)[[:space:]]*\*\//\1/g" ./lib_com/options.h + .get-commits-behind-count: &get-commits-behind-count - echo $CI_COMMIT_SHA - echo $CI_MERGE_REQUEST_TARGET_BRANCH_NAME @@ -505,6 +509,34 @@ codec-usan: - scripts/ref/logs/ expose_as: "usan selftest results" +# compare bit-exactness between 5ms and 20 on the branch +codec-5ms: + extends: + - .test-job-linux + - .rules-merge-request + stage: test + needs: ["build-codec-linux"] + script: + - *print-common-info + - *disable-limiter + - make clean + - make -j + ### prepare pytest + # create short test vectors + - python3 tests/create_short_testvectors.py + ### run pytest + - exit_code=0 + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --update_ref 2 --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec --dut_fr5 || exit_code=$? + - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + - *merge-request-comparison-check + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week + when: always + paths: + - scripts/ref/logs/ + expose_as: "pytest IVAS 5ms results" + # test renderer executable renderer-smoke-test: extends: diff --git a/scripts/self_test.py b/scripts/self_test.py index 418f19b27d..7e7a7ae760 100755 --- a/scripts/self_test.py +++ b/scripts/self_test.py @@ -193,6 +193,12 @@ class SelfTest(IvasScriptsCommon.IvasScript): action="store_true", default=False, ) + self.parser.add_argument( + "--dut_fr5", + help="Run the decoder under test with 5ms rendering", + action="store_true", + default=False, + ) if shutil.which("valgrind"): self.valgrind = [ "valgrind", @@ -1502,6 +1508,8 @@ class SelfTest(IvasScriptsCommon.IvasScript): enable_logging=True, logger_name="{}.testrunner".format(self.logger.name), ) + if self.args["dut_fr5"] is True: + test_runner.decoder_cmdline_options.extend(["-fr","5"]) test_runner.set_flat_mode_list(run_dict) test_runner.run() self.logger.console(" ") diff --git a/tests/conftest.py b/tests/conftest.py index 5f7ed04a82..8410f1f47b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -158,6 +158,11 @@ def pytest_addoption(parser): help="Run the MLD tool instead of just comparing for bitexactness", ) + parser.addoption( + "--dut_fr5", + action="store_true", + help="5ms rendering for the DUT output.", + ) @pytest.fixture(scope="session", autouse=True) def update_ref(request): @@ -393,13 +398,14 @@ def dut_decoder_path(request) -> str: class DecoderFrontend: - def __init__(self, path, dec_type, timeout=None) -> None: + def __init__(self, path, dec_type, timeout=None, fr5=None) -> None: self._path = path self._type = dec_type self.returncode = None self.stdout = None self.stderr = None self.timeout = timeout + self.fr5 = fr5 def run( self, @@ -417,6 +423,9 @@ class DecoderFrontend: if quiet_mode: command.extend(["-q"]) + if self.fr5 is not None: + command.extend(["-fr", "5"]) + if plc_file is not None: system = platform.system() @@ -503,8 +512,13 @@ def dut_decoder_frontend(dut_decoder_path, request) -> DecoderFrontend: """ Return a :class:`conftest.DecoderFrontend` instance as DUT for the test session. """ + + fr5 = None + if request.config.option.dut_fr5 is True: + fr5 = True + decoder = DecoderFrontend( - dut_decoder_path, "DUT", timeout=request.config.getoption("--testcase_timeout") + dut_decoder_path, "DUT", timeout=request.config.getoption("--testcase_timeout"), fr5=fr5 ) yield decoder -- GitLab From 4a843c11738cf22c77de2845bc654b9d2c8d0f45 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 22 Jan 2024 08:57:10 +0100 Subject: [PATCH 015/601] add disabled switch DISABLE_LIMITER, needed for 5ms BE tests --- lib_com/options.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/options.h b/lib_com/options.h index 743d9db9d2..77c27cbd7a 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -142,6 +142,7 @@ /* keep as part of options.h */ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ +/*#define DISABLE_LIMITER */ /* test switch for testing BE between 5ms and 20ms rendering */ /* ################## Start DEVELOPMENT switches ######################### */ -- GitLab From c26c2f3b5b65d116086657577efc5eb4508e4bbb Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 22 Jan 2024 23:49:22 +1100 Subject: [PATCH 016/601] fixes for 5ms PCM modes --- apps/renderer.c | 19 +++++++++++++++++++ lib_rend/lib_rend.c | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/apps/renderer.c b/apps/renderer.c index 449df94dca..968cee37f2 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1928,8 +1928,26 @@ int main( #ifdef SPLIT_REND_WITH_HEAD_ROT for ( i = 0; i < args.inConfig.numBinBuses; ++i ) { +#ifdef SPLIT_REND_LCLD_5MS + if ( numSamplesRead > 0 ) + { + if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, splitBinIds[i], &numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.binBuses[i].inputChannelIndex, numChannels ); + + if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, splitBinIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } +#endif if ( splitBinNeedsNewFrame ) { +#ifndef SPLIT_REND_LCLD_5MS if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, splitBinIds[i], &numChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); @@ -1942,6 +1960,7 @@ int main( fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } +#endif if ( ( error = IVAS_REND_FeedSplitBinauralBitstream( hIvasRend, splitBinIds[i], &bitsBuffer ) ) != IVAS_ERR_OK ) { diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 28fd9850f3..09872dcbae 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4413,6 +4413,12 @@ ivas_error IVAS_REND_GetDelay( { latency_ns += IVAS_FB_DEC_DELAY_NS; } +#ifdef SPLIT_REND_LCLD_5MS + else if ( hIvasRend->inputsSplitPost[i].splitPostRendWrapper.hSplitBinLCLDDec != NULL ) + { + latency_ns += IVAS_FB_DEC_DELAY_NS; + } +#endif max_latency_ns = max( max_latency_ns, latency_ns ); } } @@ -7232,6 +7238,19 @@ static ivas_error renderSplitBinauralWithPostRot( else { copyBufferTo2dArray( splitBinInput->base.inputBuffer, tmpCrendBuffer ); +#ifdef SPLIT_REND_LCLD_5MS + if ( splitBinInput->numCachedSamples == 0 ) + { + preRendFrameSize_ms = (int16_t) ( config.ivas_frame_duration_us ) / 1000; + numSamplesPerChannelCacheSize = (int16_t) ( *splitBinInput->base.ctx.pOutSampleRate * preRendFrameSize_ms / 1000 ); + numSamplesPerChannelCacheSize -= outAudio.config.numSamplesPerChannel; + splitBinInput->numCachedSamples = numSamplesPerChannelCacheSize; + } + else + { + splitBinInput->numCachedSamples -= outAudio.config.numSamplesPerChannel; + } +#endif } /* apply pose correction if enabled */ -- GitLab From 33fca880d10c46d74746961d7434bcb2708bcd42 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 09:32:24 +0100 Subject: [PATCH 017/601] Add ivas-conformance job --- .gitlab-ci.yml | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 27212c8646..2104d12c7b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,6 +20,7 @@ variables: - 'default' - 'test-be-release' - 'test-long-self-test' + - 'ivas-conformance' default: @@ -50,6 +51,9 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'test-long-self-test' variables: IVAS_PIPELINE_NAME: 'Test long self-test against main pipeline: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'ivas-conformance' + variables: + IVAS_PIPELINE_NAME: 'Draft IVAS Conformance test: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'trigger' stages: @@ -201,6 +205,8 @@ stages: when: never - if: $MANUAL_PIPELINE_TYPE == 'test-long-self-test' # Skip all the normal jobs when testing manually against release codec when: never + - if: $MANUAL_PIPELINE_TYPE == 'ivas-conformance' + when: never - when: on_success .rules-merge-request: @@ -1187,6 +1193,43 @@ test-be-to-release: expose_as: "test-be-to-release results" +ivas-conformance: + tags: + - ivas-linux-fast + stage: test + timeout: "60 minutes" + rules: + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'test-long-self-test' + allow_failure: + exit_codes: + - 123 + script: + - *print-common-info + # Prepare reference exec, TBD + - make -j + - cp IVAS_cod IVAS_cod_ref + - cp IVAS_dec IVAS_dec_ref + - cp IVAS_rend IVAS_rend_ref + + # Reference creation + - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref + - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 + - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref + + # Output creation + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html + + artifacts: + name: "ivas-conformance-$CI_COMMIT_SHORT_SHA" + expire_in: 1 week + when: always + paths: + - report-junit.xml + - report.html + expose_as: "Draft IVAS conformance" + reports: + junit: report-junit.xml + test-long-self-test: tags: - ivas-linux-fast -- GitLab From 3d3579ca2328dec58035d1062608156397a4f493 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 09:37:07 +0100 Subject: [PATCH 018/601] Fix manual trigger --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2104d12c7b..9257028c1a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1199,7 +1199,7 @@ ivas-conformance: stage: test timeout: "60 minutes" rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'test-long-self-test' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'ivas-conformance' allow_failure: exit_codes: - 123 -- GitLab From 3ce5512096396418fb3b596b4913ec176142db38 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 10:14:45 +0100 Subject: [PATCH 019/601] Add create_cut for renderer test --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9257028c1a..41c831885b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1217,7 +1217,7 @@ ivas-conformance: - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --create_cut --junit-xml=report-junit.xml --html=report.html --self-contained-html artifacts: name: "ivas-conformance-$CI_COMMIT_SHORT_SHA" -- GitLab From 29bf5319ab298b2afbf2ec0f921213600fc41af5 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 10:25:51 +0100 Subject: [PATCH 020/601] Revert the create_cut for renderer, since it seemed to reduce the number of tests run --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 41c831885b..9257028c1a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1217,7 +1217,7 @@ ivas-conformance: - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --create_cut --junit-xml=report-junit.xml --html=report.html --self-contained-html + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html artifacts: name: "ivas-conformance-$CI_COMMIT_SHORT_SHA" -- GitLab From 40f4b16cbaff9046746a55cf7fb84db0acfeee47 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 11:13:32 +0100 Subject: [PATCH 021/601] Added command line extraction script --- dec_header.txt | 20 +++++++++ enc_header.txt | 21 ++++++++++ parse_commands.py | 104 ++++++++++++++++++++++++++++++++++++++++++++++ rend_header.txt | 19 +++++++++ 4 files changed, 164 insertions(+) create mode 100644 dec_header.txt create mode 100644 enc_header.txt create mode 100644 parse_commands.py create mode 100644 rend_header.txt diff --git a/dec_header.txt b/dec_header.txt new file mode 100644 index 0000000000..729186d351 --- /dev/null +++ b/dec_header.txt @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit -1 +fi + +CUT_DEC_BIN=$1 +DIFF_BIN="diff" + +REF_PATH="./tests" +CUT_PATH="./TMP_DEC" + +rm -rf $CUT_PATH +mkdir -p $CUT_PATH +mkdir -p $CUT_PATH/ref/masa_test/dec_output +mkdir -p $CUT_PATH/ref/param_file/dec +mkdir -p $CUT_PATH/ref/sba_bs/raw + diff --git a/enc_header.txt b/enc_header.txt new file mode 100644 index 0000000000..5208a95a6e --- /dev/null +++ b/enc_header.txt @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -e + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit -1 +fi + +CUT_ENC_BIN=$1 +DIFF_BIN="diff" + +TESTV_PATH="./scripts" +REF_PATH="./tests" +CUT_PATH="./TMP_ENC" + +rm -rf $CUT_PATH +mkdir -p $CUT_PATH +mkdir -p $CUT_PATH/ref/masa_test/bitstreams +mkdir -p $CUT_PATH/ref/param_file/enc +mkdir -p $CUT_PATH/ref/sba_bs/pkt + diff --git a/parse_commands.py b/parse_commands.py new file mode 100644 index 0000000000..30d8d27a13 --- /dev/null +++ b/parse_commands.py @@ -0,0 +1,104 @@ +#!/usr/bin/python3 + +import argparse +import re +from os import path +from pathlib import Path + +# Main routine +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Parse HTML reports to extract commands') + parser.add_argument('input',type=str,help='Path to HTML report or directory') + parser.add_argument('txt_file',type=str,help='Output txt file, e.g. output.txt') + args = parser.parse_args() + input = args.input + txt_file = args.txt_file + + TESTV_PATH='$TESTV_PATH/' + REF_PATH='$REF_PATH/' + CUT_PATH='$CUT_PATH/' + + cmds_enc=[] + cmds_dec=[] + cmds_rend=[] + + + if path.isdir(input): + input = Path(input).rglob('*.html') + else: + input = [input] + for html_report in input: + + with open(html_report,'r') as infile: + for line in infile.readlines(): + cmds_enc.extend(re.findall(r"DUT encoder command:\\n\\t(.*?)\\n", line)) + cmds_dec.extend(re.findall(r"DUT decoder command:\\n\\t(.*?)\\n", line)) + cmds_rend.extend(re.findall(r"Running command\\n(.*?)\\n", line)) + + with open(txt_file.replace('.','_enc.'),'w', newline='\n') as outfile: + with open('enc_header.txt','r') as header: + outfile.write(header.read()) + for cmd in cmds_enc: + arg1 = cmd.split()[0] + root_folder = arg1[0:arg1.find("ivas-codec/")+10] + cmd = cmd.replace(root_folder + r'/IVAS_cod', '$CUT_ENC_BIN') + cmd = cmd.replace(r'\\', '/') + cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) + cmd = cmd.replace(root_folder + r'/tests/',CUT_PATH) + + + #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/scripts/', TESTV_PATH) + #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/tests/',CUT_PATH) + #cmd = cmd.replace('/home/ejatoma/ivas-codec/scripts', TESTV_PATH) + #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref',CUT_PATH) + outfile.write(cmd+'\n') + bts = re.search(r"\s(([\S]+)(.bts|.192))$", cmd) + if bts: + outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH,REF_PATH)+' '+bts.group(1)+'\n') + outfile.write('\n') + + with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile: + with open('dec_header.txt','r') as header: + outfile.write(header.read()) + for cmd in cmds_dec: + arg1 = cmd.split()[0] + root_folder = arg1[0:arg1.find("ivas-codec/")+10] + cmd = cmd.replace(root_folder + r'/IVAS_dec', '$CUT_DEC_BIN') + cmd = cmd.replace(r'\\', '/') + cmd = cmd.replace(root_folder + r'/tests/', REF_PATH) + cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) + + #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/tests/', REF_PATH, 1) + #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/tests/', CUT_PATH) + #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref', REF_PATH, 1) + #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref', CUT_PATH) + outfile.write(cmd+'\n') + out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) + if out: + outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH,REF_PATH)+' '+out.group(1)+'\n') + outfile.write('\n') + + with open(txt_file.replace('.','_rend.'),'w', newline='\n') as outfile: + with open('rend_header.txt','r') as header: + outfile.write(header.read()) + for cmd in cmds_rend: + arg1 = cmd.split()[0] + root_folder = arg1[0:arg1.find("ivas-codec/")+10] + + cmd = cmd.replace(r'\\', '/') + + cmd = cmd.replace(root_folder + r'/IVAS_rend', '$CUT_REND_BIN') + cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH, 1) + cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) + + + #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/IVAS_rend_ref', '$CUT_REND_BIN') + #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/scripts/', TESTV_PATH, 1) + #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/tests/', CUT_PATH) + #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref', REF_PATH, 1) + #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref', CUT_PATH) + outfile.write(cmd+'\n') + out = re.search(r"-o\s(([\S]+)(.wav|.raw|.pcm))", cmd) + if out: + outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH,REF_PATH)+' '+out.group(1)+'\n') + outfile.write('\n') \ No newline at end of file diff --git a/rend_header.txt b/rend_header.txt new file mode 100644 index 0000000000..9102429eed --- /dev/null +++ b/rend_header.txt @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -e + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit -1 +fi + +CUT_REND_BIN=$1 +DIFF_BIN="diff" + +TESTV_PATH="./scripts" +REF_PATH="./tests" +CUT_PATH="./TMP_REND" + +rm -rf $CUT_PATH +mkdir -p $CUT_PATH/renderer/ref + + -- GitLab From de94331fd7c1cf3e6ef05066617937f002eb0bbe Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 11:15:19 +0100 Subject: [PATCH 022/601] Added parsing of command lines in job --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9257028c1a..9b4769b687 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1218,6 +1218,7 @@ ivas-conformance: # Output creation - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html + - python3 parse_commands.py report.html Readme_IVAS.txt artifacts: name: "ivas-conformance-$CI_COMMIT_SHORT_SHA" @@ -1226,6 +1227,9 @@ ivas-conformance: paths: - report-junit.xml - report.html + - Readme_IVAS_dec.txt + - Readme_IVAS_enc.txt + - Readme_IVAS_rend.txt expose_as: "Draft IVAS conformance" reports: junit: report-junit.xml -- GitLab From 939a1e10a8c9d71786a299c539c261724233e5b0 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 12:12:45 +0100 Subject: [PATCH 023/601] Change ref to 20230815_RC02_SA4#125_delivery --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9b4769b687..186fe88bc2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1206,10 +1206,12 @@ ivas-conformance: script: - *print-common-info # Prepare reference exec, TBD + - git checkout 20230815_RC02_SA4#125_delivery - make -j - cp IVAS_cod IVAS_cod_ref - cp IVAS_dec IVAS_dec_ref - cp IVAS_rend IVAS_rend_ref + - git restore . # Reference creation - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref -- GitLab From 8e66f5428f368f001da6f5d10b5c4a5c8d60a2d3 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 12:26:20 +0100 Subject: [PATCH 024/601] Fix restoring source branch --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 186fe88bc2..cdf5157068 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1206,12 +1206,14 @@ ivas-conformance: script: - *print-common-info # Prepare reference exec, TBD + - source_branch_commit_sha=$(git rev-parse HEAD) - git checkout 20230815_RC02_SA4#125_delivery - make -j - cp IVAS_cod IVAS_cod_ref - cp IVAS_dec IVAS_dec_ref - cp IVAS_rend IVAS_rend_ref - - git restore . + - git restore . + - git checkout $source_branch_commit_sha # Reference creation - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref -- GitLab From dcb5371749380aa85c645991d763c22dc90edab1 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 12:40:21 +0100 Subject: [PATCH 025/601] Fix for failing for errors --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cdf5157068..88711eeb89 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1221,8 +1221,11 @@ ivas-conformance: - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt + - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + + - *merge-request-comparison-check artifacts: name: "ivas-conformance-$CI_COMMIT_SHORT_SHA" -- GitLab From d4149f147b8dc7775123eadb8e496f23474a7698 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 12:47:23 +0100 Subject: [PATCH 026/601] Fix for failing for errors --- .gitlab-ci.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 88711eeb89..f2add62447 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1216,11 +1216,13 @@ ivas-conformance: - git checkout $source_branch_commit_sha # Reference creation - - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref - - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 - - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref + - exit_code=0 + - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? + - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref || exit_code=$? # Output creation + - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true -- GitLab From 88b659bd5f02f2874edc827a733b0800fd682345 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 13:14:33 +0100 Subject: [PATCH 027/601] Remove unsupported test cases from prm file --- .gitlab-ci.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f2add62447..43ef442a43 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1215,6 +1215,17 @@ ivas-conformance: - git restore . - git checkout $source_branch_commit_sha + # remove unsupported testcases, in reverse row order + - sed -i '1623,1625d' scripts/config/self_test.prm + - sed -i '1307,1321d' scripts/config/self_test.prm + - sed -i '1205,1213d' scripts/config/self_test.prm + - sed -i '849,851d' scripts/config/self_test.prm + - sed -i '805,807d' scripts/config/self_test.prm + - sed -i '684,686d' scripts/config/self_test.prm + - sed -i '420,422d' scripts/config/self_test.prm + - sed -i '377,383d' scripts/config/self_test.prm + - sed -i '321,329d' scripts/config/self_test.prm + # Reference creation - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? -- GitLab From 8b9984c148a22ebfc7558d0c2a121c458c5ea39f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 13:30:23 +0100 Subject: [PATCH 028/601] Remove unsupported -fr option from renderer tests --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 43ef442a43..9c5eaebe4f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1225,6 +1225,8 @@ ivas-conformance: - sed -i '420,422d' scripts/config/self_test.prm - sed -i '377,383d' scripts/config/self_test.prm - sed -i '321,329d' scripts/config/self_test.prm + # Remove unsupported -fr option from renderer tests + - sed -i '206,207d' tests/renderer/utils.py # Reference creation - exit_code=0 -- GitLab From 59bd040e49a9af71b72a51d42b4efb7f772beaec Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 13:49:34 +0100 Subject: [PATCH 029/601] Revert to -tf for IVAS_rend --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9c5eaebe4f..55ef9b209f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1227,6 +1227,8 @@ ivas-conformance: - sed -i '321,329d' scripts/config/self_test.prm # Remove unsupported -fr option from renderer tests - sed -i '206,207d' tests/renderer/utils.py + # Revert to -tf option used in old IVAS_rend + - sed -i '187s/-T/-tf/' tests/renderer/utils.py # Reference creation - exit_code=0 -- GitLab From d89f012278069362e97c196f8bca9fa76512bb4a Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 14:03:40 +0100 Subject: [PATCH 030/601] Use scripts and tests from reference --- .gitlab-ci.yml | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 55ef9b209f..ca751cc9d9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1205,39 +1205,28 @@ ivas-conformance: - 123 script: - *print-common-info - # Prepare reference exec, TBD + # Prepare reference exec, use tests and scripts from reference - source_branch_commit_sha=$(git rev-parse HEAD) - git checkout 20230815_RC02_SA4#125_delivery - make -j - cp IVAS_cod IVAS_cod_ref - cp IVAS_dec IVAS_dec_ref - cp IVAS_rend IVAS_rend_ref + - cp -r tests tests_ref + - cp -r scripts scripts_ref - git restore . - git checkout $source_branch_commit_sha - - # remove unsupported testcases, in reverse row order - - sed -i '1623,1625d' scripts/config/self_test.prm - - sed -i '1307,1321d' scripts/config/self_test.prm - - sed -i '1205,1213d' scripts/config/self_test.prm - - sed -i '849,851d' scripts/config/self_test.prm - - sed -i '805,807d' scripts/config/self_test.prm - - sed -i '684,686d' scripts/config/self_test.prm - - sed -i '420,422d' scripts/config/self_test.prm - - sed -i '377,383d' scripts/config/self_test.prm - - sed -i '321,329d' scripts/config/self_test.prm - # Remove unsupported -fr option from renderer tests - - sed -i '206,207d' tests/renderer/utils.py - # Revert to -tf option used in old IVAS_rend - - sed -i '187s/-T/-tf/' tests/renderer/utils.py + - mv tests_ref tests + - mv scripts_ref scripts # Reference creation + - non_be_flag=0 - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref || exit_code=$? # Output creation - - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true -- GitLab From 82998040f0e94c682475c8f00360bdec92906e75 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 14:09:53 +0100 Subject: [PATCH 031/601] Use scripts and tests from reference --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ca751cc9d9..c3bd63e386 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1213,11 +1213,10 @@ ivas-conformance: - cp IVAS_dec IVAS_dec_ref - cp IVAS_rend IVAS_rend_ref - cp -r tests tests_ref - - cp -r scripts scripts_ref - git restore . - git checkout $source_branch_commit_sha + - rm -r tests - mv tests_ref tests - - mv scripts_ref scripts # Reference creation - non_be_flag=0 -- GitLab From 318e2b489ed9e7b918441f7dff10d9755ca70161 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 14:17:54 +0100 Subject: [PATCH 032/601] Revert to old renderer test --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c3bd63e386..774d4496d9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1223,10 +1223,9 @@ ivas-conformance: - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref || exit_code=$? # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer_be_comparison.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true -- GitLab From db0207a9103542d8f537c6c92693ab935723ae16 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 14:24:10 +0100 Subject: [PATCH 033/601] Revert to old self_test.prm --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 774d4496d9..d915c6a8cc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1213,10 +1213,12 @@ ivas-conformance: - cp IVAS_dec IVAS_dec_ref - cp IVAS_rend IVAS_rend_ref - cp -r tests tests_ref + - cp scripts/config/self_test.prm scripts/config/self_test_ref.prm - git restore . - git checkout $source_branch_commit_sha - - rm -r tests + - rm -r tests scripts - mv tests_ref tests + - cp scripts/config/self_test_ref.prm scripts/config/self_test.prm # Reference creation - non_be_flag=0 -- GitLab From 8af2db12ea4cef335070bef6a40983f47c5f381d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 14:26:33 +0100 Subject: [PATCH 034/601] Revert to old self_test.prm --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d915c6a8cc..0fe4413259 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1216,7 +1216,7 @@ ivas-conformance: - cp scripts/config/self_test.prm scripts/config/self_test_ref.prm - git restore . - git checkout $source_branch_commit_sha - - rm -r tests scripts + - rm -r tests - mv tests_ref tests - cp scripts/config/self_test_ref.prm scripts/config/self_test.prm -- GitLab From b30db7142f73e48183ca24a744340668b15229d9 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 14:30:57 +0100 Subject: [PATCH 035/601] Revert to old scripts folder --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0fe4413259..8b5489d0d2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1213,12 +1213,12 @@ ivas-conformance: - cp IVAS_dec IVAS_dec_ref - cp IVAS_rend IVAS_rend_ref - cp -r tests tests_ref - - cp scripts/config/self_test.prm scripts/config/self_test_ref.prm + - cp -r scripts scripts_ref - git restore . - git checkout $source_branch_commit_sha - - rm -r tests + - rm -r tests scripts - mv tests_ref tests - - cp scripts/config/self_test_ref.prm scripts/config/self_test.prm + - mv scripts_ref scripts # Reference creation - non_be_flag=0 -- GitLab From 3d73bd4cfa5968f2d75d39813421956b40bd0c16 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 16:19:42 +0100 Subject: [PATCH 036/601] Correct script generation --- .gitlab-ci.yml | 2 ++ parse_commands.py | 32 +++++++++----------------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8b5489d0d2..4ba8acb476 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1225,6 +1225,8 @@ ivas-conformance: - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? + - python3 -m test_renderer_be_comparison.py # This run is needed for reference creation. renderer/cut/ can be ignored + - rm -r tests/renderer/cut # Output creation - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer_be_comparison.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? diff --git a/parse_commands.py b/parse_commands.py index 30d8d27a13..a93c7a5e1a 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -44,17 +44,12 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/IVAS_cod', '$CUT_ENC_BIN') cmd = cmd.replace(r'\\', '/') cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) - cmd = cmd.replace(root_folder + r'/tests/',CUT_PATH) + cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH ) - - #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/scripts/', TESTV_PATH) - #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/tests/',CUT_PATH) - #cmd = cmd.replace('/home/ejatoma/ivas-codec/scripts', TESTV_PATH) - #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref',CUT_PATH) outfile.write(cmd+'\n') bts = re.search(r"\s(([\S]+)(.bts|.192))$", cmd) if bts: - outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH,REF_PATH)+' '+bts.group(1)+'\n') + outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+'\n') outfile.write('\n') with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile: @@ -65,17 +60,13 @@ if __name__ == '__main__': root_folder = arg1[0:arg1.find("ivas-codec/")+10] cmd = cmd.replace(root_folder + r'/IVAS_dec', '$CUT_DEC_BIN') cmd = cmd.replace(r'\\', '/') - cmd = cmd.replace(root_folder + r'/tests/', REF_PATH) + cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', 1) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) - #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/tests/', REF_PATH, 1) - #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/tests/', CUT_PATH) - #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref', REF_PATH, 1) - #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref', CUT_PATH) outfile.write(cmd+'\n') out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) if out: - outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH,REF_PATH)+' '+out.group(1)+'\n') + outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+out.group(1)+'\n') outfile.write('\n') with open(txt_file.replace('.','_rend.'),'w', newline='\n') as outfile: @@ -91,14 +82,9 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH, 1) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) - - #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/IVAS_rend_ref', '$CUT_REND_BIN') - #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/scripts/', TESTV_PATH, 1) - #cmd = cmd.replace(r'C:/listen/ivas-codec_temp/tests/', CUT_PATH) - #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref', REF_PATH, 1) - #cmd = cmd.replace('/home/ejatoma/ivas-codec/tests/ref', CUT_PATH) - outfile.write(cmd+'\n') + if "cut" in cmd: + outfile.write(cmd+'\n') out = re.search(r"-o\s(([\S]+)(.wav|.raw|.pcm))", cmd) - if out: - outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH,REF_PATH)+' '+out.group(1)+'\n') - outfile.write('\n') \ No newline at end of file + if out and "cut" in out.group(1): + outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH + r'renderer/cut',REF_PATH + r'renderer/ref')+' '+out.group(1)+'\n') + outfile.write('\n') \ No newline at end of file -- GitLab From 639036a67674fb71795c2c0340bd73db27f97298 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 16:27:29 +0100 Subject: [PATCH 037/601] Fix renderer ref creation --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4ba8acb476..229ea31708 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1225,7 +1225,7 @@ ivas-conformance: - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - - python3 -m test_renderer_be_comparison.py # This run is needed for reference creation. renderer/cut/ can be ignored + - python3 -m tests/renderer/test_renderer_be_comparison.py # This run is needed for reference creation. renderer/cut/ can be ignored - rm -r tests/renderer/cut # Output creation -- GitLab From f08c585c7fb174f524bf7efe6b7ae5f7b354ce85 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 16:53:53 +0100 Subject: [PATCH 038/601] Fixes --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 229ea31708..d6f155e513 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1225,11 +1225,11 @@ ivas-conformance: - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - - python3 -m tests/renderer/test_renderer_be_comparison.py # This run is needed for reference creation. renderer/cut/ can be ignored + - python3 -m tests/renderer/test_renderer_be_comparison # This run is needed for reference creation. renderer/cut/ can be ignored - rm -r tests/renderer/cut # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer_be_comparison.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer_be_comparison -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true -- GitLab From 7022cf4ef0553af4545f7f2b848f12fcfa9d43d1 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 16:55:41 +0100 Subject: [PATCH 039/601] Fixes --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d6f155e513..2f9b14a128 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1225,11 +1225,11 @@ ivas-conformance: - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - - python3 -m tests/renderer/test_renderer_be_comparison # This run is needed for reference creation. renderer/cut/ can be ignored + - python3 -m pytest tests/renderer/test_renderer_be_comparison.py # This run is needed for reference creation. renderer/cut/ can be ignored - rm -r tests/renderer/cut # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer_be_comparison -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer_be_comparison.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true -- GitLab From 83c51156651bbad53ae1abedcf8049b788c0ccf8 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 17:20:06 +0100 Subject: [PATCH 040/601] Fixes --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f9b14a128..6c4925e56f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1226,7 +1226,6 @@ ivas-conformance: - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - python3 -m pytest tests/renderer/test_renderer_be_comparison.py # This run is needed for reference creation. renderer/cut/ can be ignored - - rm -r tests/renderer/cut # Output creation - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer_be_comparison.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? @@ -2089,3 +2088,4 @@ pull-from-3gpp-forge: # Push to mirror, include tags. Option `-o ci.skip` tells GitLab to skip CI for the pushed commits (assumed already tested upstream) - git push --tags -o ci.skip "https://${GITLAB_USER_LOGIN}:${MIRROR_ACCESS_TOKEN}@${CI_REPOSITORY_URL#*@}" "HEAD:${CI_COMMIT_BRANCH}" + \ No newline at end of file -- GitLab From aa556ad34633b9854daab11ba4124f0f321b1919 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 17:25:28 +0100 Subject: [PATCH 041/601] Fix strange character in .gitlab-ci.yml --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6c4925e56f..1f0e4b231d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2088,4 +2088,3 @@ pull-from-3gpp-forge: # Push to mirror, include tags. Option `-o ci.skip` tells GitLab to skip CI for the pushed commits (assumed already tested upstream) - git push --tags -o ci.skip "https://${GITLAB_USER_LOGIN}:${MIRROR_ACCESS_TOKEN}@${CI_REPOSITORY_URL#*@}" "HEAD:${CI_COMMIT_BRANCH}" - \ No newline at end of file -- GitLab From 5cc223590980ac98fafef85d6f5fd4ddf5e6e8b1 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 17:56:41 +0100 Subject: [PATCH 042/601] Use Nokia runner which has a later pytest version --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1f0e4b231d..9ab99ee86c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1196,6 +1196,7 @@ test-be-to-release: ivas-conformance: tags: - ivas-linux-fast + - test-nokia-linux-runner stage: test timeout: "60 minutes" rules: -- GitLab From d678a90bce7f746f40d3a7750c7be8cd68f48015 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 18:10:18 +0100 Subject: [PATCH 043/601] Add 26252 test --- dec_header.txt | 6 +-- enc_header.txt | 6 +-- rend_header.txt | 2 +- tests/test_26252.py | 128 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 tests/test_26252.py diff --git a/dec_header.txt b/dec_header.txt index 729186d351..bc7cf89a33 100644 --- a/dec_header.txt +++ b/dec_header.txt @@ -14,7 +14,7 @@ CUT_PATH="./TMP_DEC" rm -rf $CUT_PATH mkdir -p $CUT_PATH -mkdir -p $CUT_PATH/ref/masa_test/dec_output -mkdir -p $CUT_PATH/ref/param_file/dec -mkdir -p $CUT_PATH/ref/sba_bs/raw +mkdir -p $CUT_PATH/dut/masa_test/dec_output +mkdir -p $CUT_PATH/dut/param_file/dec +mkdir -p $CUT_PATH/dut/sba_bs/raw diff --git a/enc_header.txt b/enc_header.txt index 5208a95a6e..efd391d1bc 100644 --- a/enc_header.txt +++ b/enc_header.txt @@ -15,7 +15,7 @@ CUT_PATH="./TMP_ENC" rm -rf $CUT_PATH mkdir -p $CUT_PATH -mkdir -p $CUT_PATH/ref/masa_test/bitstreams -mkdir -p $CUT_PATH/ref/param_file/enc -mkdir -p $CUT_PATH/ref/sba_bs/pkt +mkdir -p $CUT_PATH/dut/masa_test/bitstreams +mkdir -p $CUT_PATH/dut/param_file/enc +mkdir -p $CUT_PATH/dut/sba_bs/pkt diff --git a/rend_header.txt b/rend_header.txt index 9102429eed..9e31939a5f 100644 --- a/rend_header.txt +++ b/rend_header.txt @@ -14,6 +14,6 @@ REF_PATH="./tests" CUT_PATH="./TMP_REND" rm -rf $CUT_PATH -mkdir -p $CUT_PATH/renderer/ref +mkdir -p $CUT_PATH/renderer/cut diff --git a/tests/test_26252.py b/tests/test_26252.py new file mode 100644 index 0000000000..603793c900 --- /dev/null +++ b/tests/test_26252.py @@ -0,0 +1,128 @@ +__copyright__ = """ +(C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository. All Rights Reserved. + +This software is protected by copyright law and by international treaties. +The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository retain full ownership rights in their respective contributions in +the software. This notice grants no license of any kind, including but not limited to patent +license, nor is any license granted by implication, estoppel or otherwise. + +Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +contributions. + +This software is provided "AS IS", without any express or implied warranties. The software is in the +development stage. It is intended exclusively for experts who have experience with such software and +solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +and fitness for a particular purpose are hereby disclaimed and excluded. + +Any dispute, controversy or claim arising under or in relation to providing this software shall be +submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +the United Nations Convention on Contracts on the International Sales of Goods. +""" + +__doc__ = """ +Execute tests specified via a parameter file. +""" + +import os +from pathlib import Path +import filecmp +import subprocess +import pytest + +def replace_paths(instr, testv_path, ref_path, cut_path): + outstr = instr + tmp = testv_path.split('=') + if len(tmp)>1: + outstr = instr.replace("$"+tmp[0], tmp[1].replace("\"","").strip()) + tmp = ref_path.split('=') + if len(tmp)>1: + outstr = outstr.replace("$"+tmp[0], tmp[1].replace("\"","").strip()) + tmp = cut_path.split('=') + if len(tmp)>1: + outstr = outstr.replace("$"+tmp[0], tmp[1].replace("\"","").strip()) + return outstr + +test_dict = {} +TEST_DIR = "." +scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt"] + +for s in scripts: + with open(os.path.join(TEST_DIR, s), "r", encoding="UTF-8") as fp: + tag = "" + enc_opts = "" + dec_opts = "" + diff_opts = "" + rend_opts = "" + testv_path = "" + ref_path = "" + cut_path = "" + preproc = [] + for line in fp.readlines(): + if line.startswith("rm") or line.startswith("mkdir"): + preproc.append(line.strip()) + if line.startswith("TESTV_PATH"): + testv_path = line + if line.startswith("REF_PATH"): + ref_path = line + if line.startswith("CUT_PATH"): + cut_path = line + if line.startswith("$CUT_ENC_BIN"): + enc_opts = line + if line.startswith("$CUT_DEC_BIN"): + dec_opts = line + if line.startswith("$CUT_REND_BIN"): + rend_opts = line + if line.startswith("$DIFF_BIN"): + diff_opts = line[9:] + tag = s + "--" + diff_opts.split()[1].split('/')[-1] + if tag in test_dict: + print("non-unique tag found - ignoring new entry") + continue + test_dict[tag] = (enc_opts, dec_opts, rend_opts, diff_opts, testv_path, ref_path, cut_path) + tag = "" + enc_opts = "" + dec_opts = "" + rend_opts = "" + diff_opts = "" + for proc in preproc: + proc = replace_paths(proc, testv_path, ref_path, cut_path) + subprocess.run(proc.split()) + +@pytest.mark.parametrize("test_tag", list(test_dict.keys())) +def test_26252(test_tag): + + enc_opts, dec_opts, rend_opts, diff_opts, testv_path, ref_path, cut_path = test_dict[test_tag] + + if enc_opts: + enc_opts = replace_paths(enc_opts, testv_path, ref_path, cut_path) + subprocess.run(["./IVAS_cod","-q"] + enc_opts.split()[1:]) + if dec_opts: + dec_opts = replace_paths(dec_opts, testv_path, ref_path, cut_path) + subprocess.run(["./IVAS_dec","-q"] + dec_opts.split()[1:]) + if rend_opts: + rend_opts = replace_paths(rend_opts, testv_path, ref_path, cut_path) + subprocess.run(["./IVAS_rend","-q"] + rend_opts.split()[1:]) + + diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) + if ';' in diff_opts: + cmd1, cmd2 = diff_opts.split(';') + cmd1 = cmd1.split() + cmd2 = cmd2.split() + result1 = filecmp.cmp(cmd1[0], cmd1[1]) + result2 = filecmp.cmp(cmd2[2], cmd2[3]) + else: + cmd1 = diff_opts.split() + result1 = filecmp.cmp(cmd1[0], cmd1[1]) + result2 = True + if not (result1 and result2): + assert False, "Output differs" + -- GitLab From 16b10e2bd0469618c21f4a6f8b8947ab36ffc29f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 18:12:36 +0100 Subject: [PATCH 044/601] Activate 26.252-test in job --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9ab99ee86c..6d28be77c9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1232,6 +1232,9 @@ ivas-conformance: - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer_be_comparison.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + + # Test run generated scripts + - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - *merge-request-comparison-check -- GitLab From a41236be24df5c19a751ba6edb721d6f5eefb64f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 18:29:30 +0100 Subject: [PATCH 045/601] Check failure in 26.252 --- .gitlab-ci.yml | 5 +++-- parse_commands.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6d28be77c9..9d628be9b0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1224,6 +1224,7 @@ ivas-conformance: # Reference creation - non_be_flag=0 - exit_code=0 + - python3 tests/create_short_testvectors.py - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - python3 -m pytest tests/renderer/test_renderer_be_comparison.py # This run is needed for reference creation. renderer/cut/ can be ignored @@ -1234,8 +1235,8 @@ ivas-conformance: - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true # Test run generated scripts - - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - + #- python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/test_26252.py - *merge-request-comparison-check artifacts: diff --git a/parse_commands.py b/parse_commands.py index a93c7a5e1a..a670bd7c69 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -47,7 +47,7 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH ) outfile.write(cmd+'\n') - bts = re.search(r"\s(([\S]+)(.bts|.192))$", cmd) + bts = re.search(r"\s(([\S]+)(.bts|.192|.pkt))$", cmd) if bts: outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+'\n') outfile.write('\n') -- GitLab From a59aae17483ecec22a4ef016772d5b09e7b6d6d2 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 18:43:22 +0100 Subject: [PATCH 046/601] Debug output --- tests/test_26252.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_26252.py b/tests/test_26252.py index 603793c900..5f21260245 100644 --- a/tests/test_26252.py +++ b/tests/test_26252.py @@ -67,6 +67,7 @@ for s in scripts: cut_path = "" preproc = [] for line in fp.readlines(): + print(line) if line.startswith("rm") or line.startswith("mkdir"): preproc.append(line.strip()) if line.startswith("TESTV_PATH"): -- GitLab From 92d5e9872da478a87a09b7a4744a1bba3cd1bd9e Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 18:45:42 +0100 Subject: [PATCH 047/601] Debug output --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9d628be9b0..52c5e31c90 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1236,6 +1236,7 @@ ivas-conformance: # Test run generated scripts #- python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 tests/test_26252.py - python3 -m pytest tests/test_26252.py - *merge-request-comparison-check -- GitLab From e3918c05d54d2d2293b80ce13434dbe0c78988b5 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 18:52:29 +0100 Subject: [PATCH 048/601] Remove Nokia tag --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 52c5e31c90..8684f22862 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1196,7 +1196,6 @@ test-be-to-release: ivas-conformance: tags: - ivas-linux-fast - - test-nokia-linux-runner stage: test timeout: "60 minutes" rules: -- GitLab From 51f3dfaaca170516140449ed1b5edc6a273df038 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 18:56:21 +0100 Subject: [PATCH 049/601] Hack to keep 26.252-test --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8684f22862..8dfbe3c647 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1216,6 +1216,7 @@ ivas-conformance: - cp -r scripts scripts_ref - git restore . - git checkout $source_branch_commit_sha + - cp tests/test_26252.py tests_ref/test_26252.py - rm -r tests scripts - mv tests_ref tests - mv scripts_ref scripts -- GitLab From 097f64881ead733c560638f85fcbb294d2aada9f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 18:57:00 +0100 Subject: [PATCH 050/601] Enable 26.252-test --- .gitlab-ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8dfbe3c647..a14aae28a2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1235,9 +1235,7 @@ ivas-conformance: - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true # Test run generated scripts - #- python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - - python3 tests/test_26252.py - - python3 -m pytest tests/test_26252.py + - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - *merge-request-comparison-check artifacts: -- GitLab From 6914ef5a59ab8abcc9df7934a8c31371ca968275 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 19:23:49 +0100 Subject: [PATCH 051/601] Remove double -q --- tests/test_26252.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/test_26252.py b/tests/test_26252.py index 5f21260245..d284cc4343 100644 --- a/tests/test_26252.py +++ b/tests/test_26252.py @@ -67,7 +67,6 @@ for s in scripts: cut_path = "" preproc = [] for line in fp.readlines(): - print(line) if line.startswith("rm") or line.startswith("mkdir"): preproc.append(line.strip()) if line.startswith("TESTV_PATH"): @@ -105,13 +104,13 @@ def test_26252(test_tag): if enc_opts: enc_opts = replace_paths(enc_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_cod","-q"] + enc_opts.split()[1:]) + subprocess.run(["./IVAS_cod"] + enc_opts.split()[1:]) if dec_opts: dec_opts = replace_paths(dec_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_dec","-q"] + dec_opts.split()[1:]) + subprocess.run(["./IVAS_dec"] + dec_opts.split()[1:]) if rend_opts: rend_opts = replace_paths(rend_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_rend","-q"] + rend_opts.split()[1:]) + subprocess.run(["./IVAS_rend"] + rend_opts.split()[1:]) diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) if ';' in diff_opts: -- GitLab From 16f0088c00b65209cfe7d399606eb27d688e0c89 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 19:46:54 +0100 Subject: [PATCH 052/601] Use new SBA tests --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a14aae28a2..eb8e28571d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1217,6 +1217,7 @@ ivas-conformance: - git restore . - git checkout $source_branch_commit_sha - cp tests/test_26252.py tests_ref/test_26252.py + - cp tests/codec_be_on_mr_nonselection/test_sba_bs_* tests_ref/codec_be_on_mr_nonselection - rm -r tests scripts - mv tests_ref tests - mv scripts_ref scripts -- GitLab From 61605ad458b2bf1795c607040032dfd46ce854b3 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 19:52:31 +0100 Subject: [PATCH 053/601] Exclude sba plc --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eb8e28571d..d9d753b94a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1217,7 +1217,7 @@ ivas-conformance: - git restore . - git checkout $source_branch_commit_sha - cp tests/test_26252.py tests_ref/test_26252.py - - cp tests/codec_be_on_mr_nonselection/test_sba_bs_* tests_ref/codec_be_on_mr_nonselection + - cp tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py tests_ref/codec_be_on_mr_nonselection - rm -r tests scripts - mv tests_ref tests - mv scripts_ref scripts -- GitLab From 5f0c306322748b8de05967207d1371dc45d3485c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 19:56:51 +0100 Subject: [PATCH 054/601] Exclude pca cases --- .gitlab-ci.yml | 1 - parse_commands.py | 13 +++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d9d753b94a..a14aae28a2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1217,7 +1217,6 @@ ivas-conformance: - git restore . - git checkout $source_branch_commit_sha - cp tests/test_26252.py tests_ref/test_26252.py - - cp tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py tests_ref/codec_be_on_mr_nonselection - rm -r tests scripts - mv tests_ref tests - mv scripts_ref scripts diff --git a/parse_commands.py b/parse_commands.py index a670bd7c69..a4e9ffe017 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -45,12 +45,13 @@ if __name__ == '__main__': cmd = cmd.replace(r'\\', '/') cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH ) - - outfile.write(cmd+'\n') - bts = re.search(r"\s(([\S]+)(.bts|.192|.pkt))$", cmd) - if bts: - outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+'\n') - outfile.write('\n') + + if not "pca" in cmd: + outfile.write(cmd+'\n') + bts = re.search(r"\s(([\S]+)(.bts|.192|.pkt))$", cmd) + if bts: + outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+'\n') + outfile.write('\n') with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile: with open('dec_header.txt','r') as header: -- GitLab From c182b60a803a2922af67d4fce00bb8e828dfc8f8 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 20:00:07 +0100 Subject: [PATCH 055/601] Use Ericsson runner --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a14aae28a2..6dcbd877e7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1196,6 +1196,7 @@ test-be-to-release: ivas-conformance: tags: - ivas-linux-fast + - test-ericsson-linux-runner stage: test timeout: "60 minutes" rules: -- GitLab From d5cc28ce4c406f42a19967795203a322a128612c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 20:24:40 +0100 Subject: [PATCH 056/601] Fix renderer input --- parse_commands.py | 14 ++++++++------ rend_header.txt | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/parse_commands.py b/parse_commands.py index a4e9ffe017..5d7b33fb3c 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -63,12 +63,13 @@ if __name__ == '__main__': cmd = cmd.replace(r'\\', '/') cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', 1) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) - - outfile.write(cmd+'\n') - out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) - if out: - outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+out.group(1)+'\n') - outfile.write('\n') + + if not "pca" in cmd: + outfile.write(cmd+'\n') + out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) + if out: + outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+out.group(1)+'\n') + outfile.write('\n') with open(txt_file.replace('.','_rend.'),'w', newline='\n') as outfile: with open('rend_header.txt','r') as header: @@ -81,6 +82,7 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/IVAS_rend', '$CUT_REND_BIN') cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH, 1) + cmd = cmd.replace(root_folder + r'/tests/renderer/', REF_PATH + r'renderer/') cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) if "cut" in cmd: diff --git a/rend_header.txt b/rend_header.txt index 9e31939a5f..fb72f4ddd8 100644 --- a/rend_header.txt +++ b/rend_header.txt @@ -14,6 +14,6 @@ REF_PATH="./tests" CUT_PATH="./TMP_REND" rm -rf $CUT_PATH -mkdir -p $CUT_PATH/renderer/cut +mkdir -p $CUT_PATH/renderer/cut $CUT_PATH/renderer/data -- GitLab From 5aed9f25c18043705d8fc0f4c91aeb1c0d0740ec Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 20:46:20 +0100 Subject: [PATCH 057/601] Fixes --- dec_header.txt | 1 + parse_commands.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dec_header.txt b/dec_header.txt index bc7cf89a33..bf91c72817 100644 --- a/dec_header.txt +++ b/dec_header.txt @@ -11,6 +11,7 @@ DIFF_BIN="diff" REF_PATH="./tests" CUT_PATH="./TMP_DEC" +TESTV_PATH="./scripts" rm -rf $CUT_PATH mkdir -p $CUT_PATH diff --git a/parse_commands.py b/parse_commands.py index 5d7b33fb3c..e9d4de8e6b 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -61,8 +61,10 @@ if __name__ == '__main__': root_folder = arg1[0:arg1.find("ivas-codec/")+10] cmd = cmd.replace(root_folder + r'/IVAS_dec', '$CUT_DEC_BIN') cmd = cmd.replace(r'\\', '/') - cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', 1) + inputs = cmd.count(root_folder) - 1 + cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', inputs) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) + cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) if not "pca" in cmd: outfile.write(cmd+'\n') -- GitLab From f03e890c927f2ba64671b30b667545825cde8f4e Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 21:14:24 +0100 Subject: [PATCH 058/601] Move output files. Exclude 2 failing cases --- .gitlab-ci.yml | 5 +++++ dec_header.txt | 4 ++-- enc_header.txt | 4 ++-- parse_commands.py | 2 +- rend_header.txt | 4 ++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6dcbd877e7..da2c524bb8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1218,6 +1218,7 @@ ivas-conformance: - git restore . - git checkout $source_branch_commit_sha - cp tests/test_26252.py tests_ref/test_26252.py + - rm -r tests scripts - mv tests_ref tests - mv scripts_ref scripts @@ -1235,6 +1236,10 @@ ivas-conformance: - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + # Move output data + - mv scripts/testv . + - mv tests/ref tests/renderer/data tests/renderer/ref testv + # Test run generated scripts - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - *merge-request-comparison-check diff --git a/dec_header.txt b/dec_header.txt index bf91c72817..8469dd4bfb 100644 --- a/dec_header.txt +++ b/dec_header.txt @@ -9,9 +9,9 @@ fi CUT_DEC_BIN=$1 DIFF_BIN="diff" -REF_PATH="./tests" +TESTV_PATH="." +REF_PATH="./testv" CUT_PATH="./TMP_DEC" -TESTV_PATH="./scripts" rm -rf $CUT_PATH mkdir -p $CUT_PATH diff --git a/enc_header.txt b/enc_header.txt index efd391d1bc..32e78419cc 100644 --- a/enc_header.txt +++ b/enc_header.txt @@ -9,8 +9,8 @@ fi CUT_ENC_BIN=$1 DIFF_BIN="diff" -TESTV_PATH="./scripts" -REF_PATH="./tests" +TESTV_PATH="." +REF_PATH="./testv" CUT_PATH="./TMP_ENC" rm -rf $CUT_PATH diff --git a/parse_commands.py b/parse_commands.py index e9d4de8e6b..2b1d01cafe 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -66,7 +66,7 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) - if not "pca" in cmd: + if not "pca" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd: outfile.write(cmd+'\n') out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) if out: diff --git a/rend_header.txt b/rend_header.txt index fb72f4ddd8..9e4adefc15 100644 --- a/rend_header.txt +++ b/rend_header.txt @@ -9,8 +9,8 @@ fi CUT_REND_BIN=$1 DIFF_BIN="diff" -TESTV_PATH="./scripts" -REF_PATH="./tests" +TESTV_PATH="." +REF_PATH="./testv" CUT_PATH="./TMP_REND" rm -rf $CUT_PATH -- GitLab From e0699d5c0655309643b210d501ca44833ea66a35 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 21:34:22 +0100 Subject: [PATCH 059/601] Fix move of files --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index da2c524bb8..78ac6f3572 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1238,7 +1238,10 @@ ivas-conformance: # Move output data - mv scripts/testv . - - mv tests/ref tests/renderer/data tests/renderer/ref testv + - mv tests/ref testv/ref + - mkdir testv/renderer + - mv tests/renderer/data testv/renderer/data + - mv tests/renderer/ref testv/renderer/ref # Test run generated scripts - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? -- GitLab From 6b554b48968a4bdbfcbe511ca5219aec1939df45 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 21:50:25 +0100 Subject: [PATCH 060/601] Fix move of data --- parse_commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parse_commands.py b/parse_commands.py index 2b1d01cafe..142942a9a4 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -84,7 +84,7 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/IVAS_rend', '$CUT_REND_BIN') cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH, 1) - cmd = cmd.replace(root_folder + r'/tests/renderer/', REF_PATH + r'renderer/') + cmd = cmd.replace(root_folder + r'/tests/renderer/data/', REF_PATH + r'renderer/data/') cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) if "cut" in cmd: -- GitLab From 98f8da440704b4b231f112bbb6ed0d78c198c0dc Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 23 Jan 2024 22:10:02 +0100 Subject: [PATCH 061/601] Fix renderer script --- .gitlab-ci.yml | 1 + parse_commands.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 78ac6f3572..1ed831091e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1238,6 +1238,7 @@ ivas-conformance: # Move output data - mv scripts/testv . + - mv scripts/ls_layouts . - mv tests/ref testv/ref - mkdir testv/renderer - mv tests/renderer/data testv/renderer/data diff --git a/parse_commands.py b/parse_commands.py index 142942a9a4..7f85313883 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -83,7 +83,7 @@ if __name__ == '__main__': cmd = cmd.replace(r'\\', '/') cmd = cmd.replace(root_folder + r'/IVAS_rend', '$CUT_REND_BIN') - cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH, 1) + cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) cmd = cmd.replace(root_folder + r'/tests/renderer/data/', REF_PATH + r'renderer/data/') cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) -- GitLab From bbe9444fbf616b9a881e2c59f673e3cf451466c0 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 24 Jan 2024 07:31:50 +0100 Subject: [PATCH 062/601] moved changes for the ISM BRIR rendering to explixit MR, connected to #968 --- lib_dec/ivas_ism_renderer.c | 144 +++++++++--------------------------- 1 file changed, 35 insertions(+), 109 deletions(-) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 7d2c815386..94060ae8ef 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -254,161 +254,87 @@ void ivas_ism_render_sf( int16_t tc_offset; int16_t interp_offset; float gain, prev_gain; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - int16_t ism_md_subframe_update_jbm, slots_to_render, first_sf, last_sf, subframe_idx; - int16_t n_samples_rendered_loop; -#endif num_objects = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) { num_objects = st_ivas->nchan_ism; } -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_to_render / st_ivas->hTcBuffer->n_samples_granularity ); - first_sf = st_ivas->hTcBuffer->subframes_rendered; - last_sf = first_sf; - n_samples_rendered_loop = 0; - while ( slots_to_render > 0 ) - { - slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; - last_sf++; - } - -#endif nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; tc_offset = st_ivas->hTcBuffer->n_samples_rendered; interp_offset = st_ivas->hTcBuffer->n_samples_rendered; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - /* Number of subframes to delay metadata to sync with audio */ - if ( st_ivas->hDecoderConfig->Opt_delay_comp ) - { - ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 ); - } - else - { - ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; - } -#endif for ( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) { set_f( output_f[i], 0.0f, n_samples_to_render ); } -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) - { - int16_t n_samples_in_subframe; - - n_samples_in_subframe = st_ivas->hTcBuffer->n_samples_granularity * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; -#endif - #ifdef NONBE_UNIFIED_DECODING_PATHS - if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) #else if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) #endif - { -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_in_subframe, n_samples_in_subframe, st_ivas->hIsmRendererData->interpolator ); -#else + { ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator ); -#endif - interp_offset = 0; - } + interp_offset = 0; + } - for ( i = 0; i < num_objects; i++ ) - { - /* Combined rotation: rotate the object positions depending the head and external orientations */ + for ( i = 0; i < num_objects; i++ ) + { + /* Combined rotation: rotate the object positions depending the head and external orientations */ #ifdef NONBE_UNIFIED_DECODING_PATHS - if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) #else if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) #endif - { -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - if ( subframe_idx >= ism_md_subframe_update_jbm ) - { - rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); - } - else - { - rotateAziEle( st_ivas->hIsmMetaData[i]->last_azimuth, st_ivas->hIsmMetaData[i]->last_elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); - } -#else + { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); -#endif - if ( st_ivas->hEFAPdata != NULL ) - { - efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); - } + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); } + } - lfe_index = 0; - for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + lfe_index = 0; + for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + { + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) { - if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) - { - ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; - } + ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; + } - gain = st_ivas->hIsmRendererData->gains[i][j]; - prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; - if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) - { - g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; - tc = &st_ivas->hTcBuffer->tc[i][tc_offset]; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - for ( k = 0; k < n_samples_in_subframe; k++ ) -#else + gain = st_ivas->hIsmRendererData->gains[i][j]; + prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; + if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) + { + g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; + tc = &st_ivas->hTcBuffer->tc[i][tc_offset]; for ( k = 0; k < n_samples_to_render; k++ ) -#endif - { - g2 = 1.0f - *g1; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - output_f[j2][k + n_samples_rendered_loop] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ ); -#else + { + g2 = 1.0f - *g1; output_f[j2][k] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ ); -#endif - } } + } - /* update here only in case of head rotation */ + /* update here only in case of head rotation */ #ifdef NONBE_UNIFIED_DECODING_PATHS - if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) #else if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) #endif - { - st_ivas->hIsmRendererData->prev_gains[i][j] = gain; - } + { + st_ivas->hIsmRendererData->prev_gains[i][j] = gain; } } + } #ifdef NONBE_UNIFIED_DECODING_PATHS - /* update combined orientation access index */ -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); -#else - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_to_render ); -#endif -#endif -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - n_samples_rendered_loop += n_samples_in_subframe; - if ( st_ivas->renderer_type == RENDERER_TD_PANNING ) - { - st_ivas->hTcBuffer->subframes_rendered += 1; - st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; - } - tc_offset += n_samples_in_subframe; - interp_offset += n_samples_in_subframe; - } + /* update combined orientation access index */ + ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_to_render ); #endif return; -- GitLab From 6d0f076ecc948448bc061c912c96abc10a4aa861 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 09:18:19 +0100 Subject: [PATCH 063/601] Disable DEBUGGING in reference --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 55ef9b209f..f6d8aa0a37 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1208,6 +1208,7 @@ ivas-conformance: # Prepare reference exec, TBD - source_branch_commit_sha=$(git rev-parse HEAD) - git checkout 20230815_RC02_SA4#125_delivery + - sed -i".bak" "s/\(#define DEBUGGING\)/\/\/\1/" lib_com/options.h - make -j - cp IVAS_cod IVAS_cod_ref - cp IVAS_dec IVAS_dec_ref @@ -1225,7 +1226,7 @@ ivas-conformance: - sed -i '420,422d' scripts/config/self_test.prm - sed -i '377,383d' scripts/config/self_test.prm - sed -i '321,329d' scripts/config/self_test.prm - # Remove unsupported -fr option from renderer tests + # Remove -fr option - sed -i '206,207d' tests/renderer/utils.py # Revert to -tf option used in old IVAS_rend - sed -i '187s/-T/-tf/' tests/renderer/utils.py -- GitLab From 91fa408a9a2b16252b6a1b26cc7d1485953529d8 Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Wed, 24 Jan 2024 08:33:15 +0000 Subject: [PATCH 064/601] Adding trigger as pipeline source for ivas-conformance pipeline. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1ed831091e..05255157c5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1200,7 +1200,7 @@ ivas-conformance: stage: test timeout: "60 minutes" rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'ivas-conformance' + - if: ($CI_PIPELINE_SOURCE == 'web' || $CI_PIPELINE_SOURCE == 'trigger') && $MANUAL_PIPELINE_TYPE == 'ivas-conformance' allow_failure: exit_codes: - 123 -- GitLab From 2cb61418208c4a4b22b80502a11fb81d31a2c541 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 09:41:03 +0100 Subject: [PATCH 065/601] Remove test case from self_test.prm --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f6d8aa0a37..b5199556ea 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1217,6 +1217,7 @@ ivas-conformance: - git checkout $source_branch_commit_sha # remove unsupported testcases, in reverse row order + - sed -i '1644,1647d' scripts/config/self_test.prm - sed -i '1623,1625d' scripts/config/self_test.prm - sed -i '1307,1321d' scripts/config/self_test.prm - sed -i '1205,1213d' scripts/config/self_test.prm -- GitLab From 362e66cff88648c550407c9850e0acbb5060c8aa Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 09:44:24 +0100 Subject: [PATCH 066/601] Added trigger source for ivas-conformance --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b5199556ea..725b3760a2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1199,7 +1199,7 @@ ivas-conformance: stage: test timeout: "60 minutes" rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'ivas-conformance' + - if: ($CI_PIPELINE_SOURCE == 'web' || $CI_PIPELINE_SOURCE == 'trigger') && $MANUAL_PIPELINE_TYPE == 'ivas-conformance' allow_failure: exit_codes: - 123 -- GitLab From f0c1f13de1672858b61b8c65f70cf68f7781170c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 10:47:38 +0100 Subject: [PATCH 067/601] Exclude tests from self_test.prm --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 725b3760a2..bdad57211f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1217,8 +1217,10 @@ ivas-conformance: - git checkout $source_branch_commit_sha # remove unsupported testcases, in reverse row order - - sed -i '1644,1647d' scripts/config/self_test.prm + - sed -i '1657,1659d' scripts/config/self_test.prm + - sed -i '1644,1655d' scripts/config/self_test.prm - sed -i '1623,1625d' scripts/config/self_test.prm + - sed -i '1350,1353d' scripts/config/self_test.prm - sed -i '1307,1321d' scripts/config/self_test.prm - sed -i '1205,1213d' scripts/config/self_test.prm - sed -i '849,851d' scripts/config/self_test.prm -- GitLab From 0bf479c73e3e152286420d6d2d93fec2adecd0ba Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 11:13:10 +0100 Subject: [PATCH 068/601] Exclude MASA1 from renderer tests --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bdad57211f..4ce9c8a90d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1233,6 +1233,8 @@ ivas-conformance: - sed -i '206,207d' tests/renderer/utils.py # Revert to -tf option used in old IVAS_rend - sed -i '187s/-T/-tf/' tests/renderer/utils.py + # Exclude MASA1 + - sed -i '195s/"MASA1", //' tests/renderer/constants.py # Reference creation - exit_code=0 -- GitLab From a049945acc5f4682e277e0b1381db3bea40f0f35 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 12:50:13 +0100 Subject: [PATCH 069/601] Change pca to old bypass 2 --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4ce9c8a90d..d264f70ce0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1235,6 +1235,8 @@ ivas-conformance: - sed -i '187s/-T/-tf/' tests/renderer/utils.py # Exclude MASA1 - sed -i '195s/"MASA1", //' tests/renderer/constants.py + # Change -pca to -bypass 2 + - sed -i '258s/-pca/-bypass 2/' tests/conftest.py # Reference creation - exit_code=0 -- GitLab From a09f0fa6ad890fd440c1afec1e5f19f52f3fa623 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 13:00:56 +0100 Subject: [PATCH 070/601] Remove masa prerenderer test --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d264f70ce0..01128623f9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1237,6 +1237,8 @@ ivas-conformance: - sed -i '195s/"MASA1", //' tests/renderer/constants.py # Change -pca to -bypass 2 - sed -i '258s/-pca/-bypass 2/' tests/conftest.py + # Remove tests/renderer/test_renderer::test_masa_prerend + - sed -i '239,246d' tests/renderer/test_renderer.py # Reference creation - exit_code=0 -- GitLab From 1f5aedca86a3781cf9375a08d92e655e7ef4fe46 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 13:37:17 +0100 Subject: [PATCH 071/601] Remove test_pca_enc --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 01128623f9..1248103513 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1239,6 +1239,9 @@ ivas-conformance: - sed -i '258s/-pca/-bypass 2/' tests/conftest.py # Remove tests/renderer/test_renderer::test_masa_prerend - sed -i '239,246d' tests/renderer/test_renderer.py + # Remove test_sba_pca + - sed -i '88,153d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py + # Reference creation - exit_code=0 -- GitLab From a10ef42050dcfdc047ac3c29724e1555c51171fd Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 14:13:22 +0100 Subject: [PATCH 072/601] Fix renderer test --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ec18aa990c..557b038786 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1249,10 +1249,10 @@ ivas-conformance: - python3 tests/create_short_testvectors.py - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - - python3 -m pytest tests/renderer/test_renderer_be_comparison.py # This run is needed for reference creation. renderer/cut/ can be ignored + - python3 -m pytest tests/renderer/test_renderer.py --create_ref || exit_code=$? # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --create_cut --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true -- GitLab From eaf749be33380097f0e81d80174214434a63c1f4 Mon Sep 17 00:00:00 2001 From: norvell Date: Wed, 24 Jan 2024 13:34:59 +0000 Subject: [PATCH 073/601] Update .gitlab-ci.yml file --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 557b038786..54c021ffc1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1265,7 +1265,7 @@ ivas-conformance: - mv tests/renderer/ref testv/renderer/ref # Test run generated scripts - - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + #- python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - *merge-request-comparison-check artifacts: -- GitLab From 2fd6d18a1626724c15b2f2e5034d29e964bd6784 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 24 Jan 2024 14:51:09 +0100 Subject: [PATCH 074/601] remove needs for 5ms test job --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8cb358e006..f39a619606 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -515,7 +515,6 @@ codec-5ms: - .test-job-linux - .rules-merge-request stage: test - needs: ["build-codec-linux"] script: - *print-common-info - *disable-limiter -- GitLab From 3c3ef09352c8fc665a6e8bc774c6486c382f79f0 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 24 Jan 2024 15:03:50 +0100 Subject: [PATCH 075/601] fix artifacts and pytest usage --- .gitlab-ci.yml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f39a619606..33bb177e0e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -510,7 +510,7 @@ codec-usan: expose_as: "usan selftest results" # compare bit-exactness between 5ms and 20 on the branch -codec-5ms: +pytest-compare-20ms-and-5ms-rendering: extends: - .test-job-linux - .rules-merge-request @@ -521,20 +521,29 @@ codec-5ms: - make clean - make -j ### prepare pytest + - cp IVAS_cod IVAS_cod_ref + - cp IVAS_dec IVAS_dec_ref # create short test vectors - python3 tests/create_short_testvectors.py + # create references + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -m create_ref + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -m create_ref_part2 ### run pytest - exit_code=0 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --update_ref 2 --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec --dut_fr5 || exit_code=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --dut_fr5 || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" expire_in: 1 week when: always + expose_as: "pytest 5ms vs 20ms results" paths: - - scripts/ref/logs/ - expose_as: "pytest IVAS 5ms results" + - report-junit.xml + - report.html + reports: + junit: + - report-junit.xml # test renderer executable renderer-smoke-test: -- GitLab From 42ab720d63d003a4bb35c3d47a2c7f8e7b2aa2c3 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 15:59:11 +0100 Subject: [PATCH 076/601] Debug file location --- .gitlab-ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 54c021ffc1..d4e2d0f2cf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1249,17 +1249,22 @@ ivas-conformance: - python3 tests/create_short_testvectors.py - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? + - ls ./tests/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt - python3 -m pytest tests/renderer/test_renderer.py --create_ref || exit_code=$? + - ls ./tests/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt # Output creation - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --create_cut --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - ls ./tests/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt - python3 parse_commands.py report.html Readme_IVAS.txt + - ls ./tests/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true # Move output data - mv scripts/testv . - mv scripts/ls_layouts . - mv tests/ref testv/ref + - ls ./testv/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt - mkdir testv/renderer - mv tests/renderer/data testv/renderer/data - mv tests/renderer/ref testv/renderer/ref -- GitLab From ae380fee109f8279c4854cb3a9d27f56733710eb Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 24 Jan 2024 16:30:44 +0100 Subject: [PATCH 077/601] define needed variable for using the comparison anchor --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a931c459a2..987b13772b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -530,6 +530,8 @@ pytest-compare-20ms-and-5ms-rendering: - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -m create_ref_part2 ### run pytest - exit_code=0 + # dummy, is needed for using the comparison anchor later + - non_be_flag=0 - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --dut_fr5 || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check -- GitLab From bc614546bd7ce7bf640744bd1889471b00bc0eba Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 17:17:26 +0100 Subject: [PATCH 078/601] Use dut output as ref output --- .gitlab-ci.yml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d4e2d0f2cf..c8a59697ab 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1249,28 +1249,23 @@ ivas-conformance: - python3 tests/create_short_testvectors.py - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - - ls ./tests/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt - python3 -m pytest tests/renderer/test_renderer.py --create_ref || exit_code=$? - - ls ./tests/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt # Output creation - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --create_cut --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - - ls ./tests/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt - python3 parse_commands.py report.html Readme_IVAS.txt - - ls ./tests/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - # Move output data - - mv scripts/testv . - - mv scripts/ls_layouts . - - mv tests/ref testv/ref - - ls ./testv/ref/sba_bs/pkt/stvFOA48c_ivasbr13k_DTX1_Gain0_SID.pkt + # Copy output data + - cp scripts/testv . + - cp scripts/ls_layouts . + - cp tests/dut testv/ref - mkdir testv/renderer - - mv tests/renderer/data testv/renderer/data - - mv tests/renderer/ref testv/renderer/ref + - cp tests/renderer/data testv/renderer/data + - cp tests/renderer/ref testv/renderer/ref # Test run generated scripts - #- python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - *merge-request-comparison-check artifacts: -- GitLab From f8eec29b38523eff9bade34c49255041fa68b349 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 17:25:56 +0100 Subject: [PATCH 079/601] Fix copying --- .gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c8a59697ab..fb6c2616ab 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1257,12 +1257,12 @@ ivas-conformance: - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true # Copy output data - - cp scripts/testv . - - cp scripts/ls_layouts . - - cp tests/dut testv/ref + - cp -r scripts/testv . + - cp -r scripts/ls_layouts . + - cp -r tests/dut testv/ref - mkdir testv/renderer - - cp tests/renderer/data testv/renderer/data - - cp tests/renderer/ref testv/renderer/ref + - cp -r tests/renderer/data testv/renderer/data + - cp -r tests/renderer/ref testv/renderer/ref # Test run generated scripts - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? -- GitLab From c96df1785c1dd1795a6de0b0bc1209c1b9d6af66 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 17:31:59 +0100 Subject: [PATCH 080/601] Keep files for DUT run --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb6c2616ab..fd7dbb7f1c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1252,7 +1252,7 @@ ivas-conformance: - python3 -m pytest tests/renderer/test_renderer.py --create_ref || exit_code=$? # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --create_cut --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true -- GitLab From 7110b1662f97c79c2b72e2c02479f51ecca988dd Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 18:10:19 +0100 Subject: [PATCH 081/601] Use cut output for renderer ref --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fd7dbb7f1c..6a8cea0e29 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1262,7 +1262,7 @@ ivas-conformance: - cp -r tests/dut testv/ref - mkdir testv/renderer - cp -r tests/renderer/data testv/renderer/data - - cp -r tests/renderer/ref testv/renderer/ref + - cp -r tests/renderer/ref testv/renderer/cut # Test run generated scripts - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? -- GitLab From 80a4da0423b33854ad4bfb3017d9ec2a118b6b1d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 18:36:26 +0100 Subject: [PATCH 082/601] Fix renderer refs --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6a8cea0e29..26dfb5e411 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1262,7 +1262,7 @@ ivas-conformance: - cp -r tests/dut testv/ref - mkdir testv/renderer - cp -r tests/renderer/data testv/renderer/data - - cp -r tests/renderer/ref testv/renderer/cut + - cp -r tests/renderer/cut testv/renderer/ref # Test run generated scripts - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? -- GitLab From 43d667349b87fdee459ba2d5d035bed084c55120 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 19:08:32 +0100 Subject: [PATCH 083/601] Add checking for errors in test_26252.py --- tests/test_26252.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_26252.py b/tests/test_26252.py index d284cc4343..ce38943862 100644 --- a/tests/test_26252.py +++ b/tests/test_26252.py @@ -104,13 +104,13 @@ def test_26252(test_tag): if enc_opts: enc_opts = replace_paths(enc_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_cod"] + enc_opts.split()[1:]) + subprocess.run(["./IVAS_cod"] + enc_opts.split()[1:], check = True) if dec_opts: dec_opts = replace_paths(dec_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_dec"] + dec_opts.split()[1:]) + subprocess.run(["./IVAS_dec"] + dec_opts.split()[1:], check = True) if rend_opts: rend_opts = replace_paths(rend_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_rend"] + rend_opts.split()[1:]) + subprocess.run(["./IVAS_rend"] + rend_opts.split()[1:], check = True) diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) if ';' in diff_opts: -- GitLab From 5ce34b4fb3758b5fd12f70a2c1832a59c7d74b13 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 19:13:33 +0100 Subject: [PATCH 084/601] Add copying of necessary input data --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 26dfb5e411..90618af996 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1256,9 +1256,11 @@ ivas-conformance: - python3 parse_commands.py report.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - # Copy output data + # Copy input data and output ref data - cp -r scripts/testv . - cp -r scripts/ls_layouts . + - cp -r scripts/switchPaths . + - cp -r scripts/trajectories . - cp -r tests/dut testv/ref - mkdir testv/renderer - cp -r tests/renderer/data testv/renderer/data -- GitLab From d77bc75343ec73cb17b158fe8090f92769d6abd9 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 19:26:36 +0100 Subject: [PATCH 085/601] Fix in parse_commands.py --- parse_commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parse_commands.py b/parse_commands.py index 7f85313883..31bab4dbaa 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -48,7 +48,7 @@ if __name__ == '__main__': if not "pca" in cmd: outfile.write(cmd+'\n') - bts = re.search(r"\s(([\S]+)(.bts|.192|.pkt))$", cmd) + bts = re.search(r"\s(([\S]+)(.bts|.192|.pkt|.fer))$", cmd) if bts: outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+'\n') outfile.write('\n') -- GitLab From 8187bf6e83adad4c4ad480cb5fc40547f483c5ab Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 21:31:14 +0100 Subject: [PATCH 086/601] Add artifact of report_cmd.html --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 90618af996..91212c2427 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1252,8 +1252,8 @@ ivas-conformance: - python3 -m pytest tests/renderer/test_renderer.py --create_ref || exit_code=$? # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - - python3 parse_commands.py report.html Readme_IVAS.txt + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --junit-xml=report-junit.xml --html=report_cmd.html --self-contained-html || exit_code=$? + - python3 parse_commands.py report_cmd.html Readme_IVAS.txt - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true # Copy input data and output ref data @@ -1276,6 +1276,7 @@ ivas-conformance: when: always paths: - report-junit.xml + - report_cmd.html - report.html - Readme_IVAS_dec.txt - Readme_IVAS_enc.txt -- GitLab From e532c86e983479d957af9c237685c8a0fa016c79 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 22:26:29 +0100 Subject: [PATCH 087/601] Fix parse_commands.py --- parse_commands.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/parse_commands.py b/parse_commands.py index 31bab4dbaa..a46b806eed 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -62,7 +62,10 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/IVAS_dec', '$CUT_DEC_BIN') cmd = cmd.replace(r'\\', '/') inputs = cmd.count(root_folder) - 1 - cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', inputs) + if ".fer " in cmd: + cmd = cmd.replace(root_folder + r'/tests/ref', REF_PATH + r'ref', 1) + else: + cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', inputs) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) -- GitLab From c63262f931f725b9948ec405917c93e90154448b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 24 Jan 2024 23:01:54 +0100 Subject: [PATCH 088/601] Fix of references --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91212c2427..a7ae07dee2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1261,7 +1261,7 @@ ivas-conformance: - cp -r scripts/ls_layouts . - cp -r scripts/switchPaths . - cp -r scripts/trajectories . - - cp -r tests/dut testv/ref + - cp -r tests/ref testv/ref - mkdir testv/renderer - cp -r tests/renderer/data testv/renderer/data - cp -r tests/renderer/cut testv/renderer/ref -- GitLab From 84d01ccf0fae1cbfe9a4820ed3dc9ebd83cb4f85 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 09:17:20 +0100 Subject: [PATCH 089/601] Disable removal of bitstreams in SBA tests --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a7ae07dee2..20d57ee8cb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1242,6 +1242,8 @@ ivas-conformance: - sed -i '239,246d' tests/renderer/test_renderer.py # Remove test_sba_pca - sed -i '88,153d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py + # Disable removal of output bitstreams + - sed -i 's/os.remove/#os.remove/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Reference creation - non_be_flag=0 -- GitLab From 6e0c54a284ffc6fdcb7f8849b5e5c5bfe200bb90 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 09:38:55 +0100 Subject: [PATCH 090/601] Fix report --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 20d57ee8cb..f4fe35c512 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1256,7 +1256,7 @@ ivas-conformance: # Output creation - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --junit-xml=report-junit.xml --html=report_cmd.html --self-contained-html || exit_code=$? - python3 parse_commands.py report_cmd.html Readme_IVAS.txt - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + # Copy input data and output ref data - cp -r scripts/testv . @@ -1269,7 +1269,9 @@ ivas-conformance: - cp -r tests/renderer/cut testv/renderer/ref # Test run generated scripts + - exit_code=0 - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check artifacts: -- GitLab From 25fe9395ed3068ec5579f219f17cb2fa09a9442d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 11:55:51 +0100 Subject: [PATCH 091/601] Remove one case failing in Windows. Create testvec folder for test package --- .gitlab-ci.yml | 25 ++++++++++++++++--------- tests/test_26252.py | 6 +++--- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f4fe35c512..edd3a581c4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1227,6 +1227,7 @@ ivas-conformance: - sed -i '849,851d' scripts/config/self_test.prm - sed -i '805,807d' scripts/config/self_test.prm - sed -i '684,686d' scripts/config/self_test.prm + - sed -i '505,508d' scripts/config/self_test.prm - sed -i '420,422d' scripts/config/self_test.prm - sed -i '377,383d' scripts/config/self_test.prm - sed -i '321,329d' scripts/config/self_test.prm @@ -1259,16 +1260,22 @@ ivas-conformance: # Copy input data and output ref data - - cp -r scripts/testv . - - cp -r scripts/ls_layouts . - - cp -r scripts/switchPaths . - - cp -r scripts/trajectories . - - cp -r tests/ref testv/ref - - mkdir testv/renderer - - cp -r tests/renderer/data testv/renderer/data - - cp -r tests/renderer/cut testv/renderer/ref + - mkdir testvec + - cp -r scripts/testv testvec + - cp -r scripts/ls_layouts testvec + - cp -r scripts/switchPaths testvec + - cp -r scripts/trajectories testvec + - cp -r tests/ref testvec/testv/ref + - mkdir testvec/testv/renderer + - mkdir testvec/bin + - cp -r tests/renderer/data testvec/testv/renderer/data + - cp -r tests/renderer/cut testvec/testv/renderer/ref + - cp tests/test_26252.py testvec + - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt testvec + - cp IVAS_cod IVAS_dec IVAS_rend testvec/bin - # Test run generated scripts + # Test run generated scripts in testvec + - cd testvec - exit_code=0 - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true diff --git a/tests/test_26252.py b/tests/test_26252.py index ce38943862..f91da1bbb2 100644 --- a/tests/test_26252.py +++ b/tests/test_26252.py @@ -104,13 +104,13 @@ def test_26252(test_tag): if enc_opts: enc_opts = replace_paths(enc_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_cod"] + enc_opts.split()[1:], check = True) + subprocess.run(["./bin/IVAS_cod"] + enc_opts.split()[1:], check = True) if dec_opts: dec_opts = replace_paths(dec_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_dec"] + dec_opts.split()[1:], check = True) + subprocess.run(["./bin/IVAS_dec"] + dec_opts.split()[1:], check = True) if rend_opts: rend_opts = replace_paths(rend_opts, testv_path, ref_path, cut_path) - subprocess.run(["./IVAS_rend"] + rend_opts.split()[1:], check = True) + subprocess.run(["./bin/IVAS_rend"] + rend_opts.split()[1:], check = True) diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) if ';' in diff_opts: -- GitLab From a36f8f1958197adfa8737c9a85baee942cb09941 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 13:25:09 +0100 Subject: [PATCH 092/601] Remove section on file cleanup which became empty --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index edd3a581c4..b08b56733a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1245,6 +1245,7 @@ ivas-conformance: - sed -i '88,153d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Disable removal of output bitstreams - sed -i 's/os.remove/#os.remove/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py + - sed -i '605,608d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Reference creation - non_be_flag=0 -- GitLab From c843e92a1aeab2c9ad24fad4010bcd4460b2be29 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 13:49:06 +0100 Subject: [PATCH 093/601] Correct xml report to only be output on the last test --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b08b56733a..8331ae9de6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1256,7 +1256,7 @@ ivas-conformance: - python3 -m pytest tests/renderer/test_renderer.py --create_ref || exit_code=$? # Output creation - - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --junit-xml=report-junit.xml --html=report_cmd.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --html=report_cmd.html --self-contained-html || exit_code=$? - python3 parse_commands.py report_cmd.html Readme_IVAS.txt -- GitLab From 52a297682e1b206a41940da4dcbb1b97268e5ffb Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Thu, 25 Jan 2024 14:02:13 +0100 Subject: [PATCH 094/601] FIX_976_USAN_PVQ_DEC_OMASA , corrected premature cast --- lib_com/options.h | 4 ++++ lib_dec/pvq_core_dec.c | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 820383e905..4d6953c941 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,6 +163,10 @@ #define FIX_956_DECODER_COMMAND_LINE_FIX /* VA: Output correct error message when the decoder command-line has too many mandatory arguments. */ #define FIX_955_FASTCONV_REND_IN_ISM /* VA: put FastConv rendering call under DEBUGGING */ + +#define FIX_976_USAN_PVQ_DEC_OMASA /* Ericsson: premature cast to unsigned detected by USAN corrected */ + + /* #################### End BE switches ################################## */ /* #################### Start NON-BE switches ############################ */ diff --git a/lib_dec/pvq_core_dec.c b/lib_dec/pvq_core_dec.c index 115d53ac57..1ef2bb0e59 100644 --- a/lib_dec/pvq_core_dec.c +++ b/lib_dec/pvq_core_dec.c @@ -415,11 +415,16 @@ static void densitySymbolIndexDecode( #undef WMC_TOOL_SKIP res_c = res - c; + if ( c == 0 ) { tot = res * ( res + 1 ) + 1; dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); - alpha = (int16_t) floor_sqrt_exact( (uint32_t) ( res + 1 ) * ( res + 1 ) - dec_freq ) + res + 1; +#ifdef FIX_976_USAN_PVQ_DEC_OMASA + alpha = (int16_t) floor_sqrt_exact( ( uint32_t )(( res + 1 ) * ( res + 1 ) - dec_freq )) + res + 1; +#else + alpha = (int16_t) floor_sqrt_exact( ( uint32_t )( res + 1 ) * ( res + 1 ) - dec_freq ) + res + 1; +#endif sym_freq = 2 * ( res - alpha ) + 1; cum_freq = alpha * ( 2 * ( res + 1 ) - alpha ); } @@ -437,7 +442,12 @@ static void densitySymbolIndexDecode( dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); if ( dec_freq < tot - ( res + 1 ) - ( res - ( c + 1 ) ) * ( res - c ) * c + c + 1 ) { - alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) / ( 2 * res_c ); +#ifdef FIX_976_USAN_PVQ_DEC_OMASA + alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) ( res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) ) / ( 2 * res_c ); +#else + alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) / ( 2 * res_c ); +#endif + sym_freq = 2 * alpha * res_c + 1; cum_freq = alpha * ( ( alpha - 1 ) * res_c + 1 ); } @@ -485,7 +495,7 @@ static int16_t get_pvq_splits( int16_t Np; uint32_t flag; - Np = (int16_t) ( intLimCDivPos( band_bits, 67 ) >> 2 ); + Np = ( int16_t )( intLimCDivPos( band_bits, 67 ) >> 2 ); if ( band_bits - 268 * Np != 0 || Np == 0 ) /* L_msu */ { Np++; /* ceil */ @@ -501,7 +511,7 @@ static int16_t get_pvq_splits( } } - Np = max( Np, (int16_t) ( ceil( (float) sfmsize / PVQ_MAX_BAND_SIZE ) ) ); + Np = max( Np, ( int16_t )( ceil( (float) sfmsize / PVQ_MAX_BAND_SIZE ) ) ); Np = min( MAX_SPLITS, Np ); Np = min( (int16_t) floor( (float) sfmsize / MIN_BAND_SIZE ), Np ); -- GitLab From 95dd215d81075275d0bde18ea5f6e9a9ba8969f3 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 25 Jan 2024 14:02:31 +0100 Subject: [PATCH 095/601] move conformance test to separate folder --- {tests => conformance-test}/test_26252.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {tests => conformance-test}/test_26252.py (100%) diff --git a/tests/test_26252.py b/conformance-test/test_26252.py similarity index 100% rename from tests/test_26252.py rename to conformance-test/test_26252.py -- GitLab From 7e1f24719400eea1bf2adaa58733a2eaffc24572 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 25 Jan 2024 14:59:54 +0100 Subject: [PATCH 096/601] add command line args for test_26252.py --- conformance-test/conftest.py | 71 ++++++++++++++++++++++++++++++++++ conformance-test/test_26252.py | 8 ++-- 2 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 conformance-test/conftest.py diff --git a/conformance-test/conftest.py b/conformance-test/conftest.py new file mode 100644 index 0000000000..0c5ca76062 --- /dev/null +++ b/conformance-test/conftest.py @@ -0,0 +1,71 @@ +__copyright__ = """ +(C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository. All Rights Reserved. + +This software is protected by copyright law and by international treaties. +The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository retain full ownership rights in their respective contributions in +the software. This notice grants no license of any kind, including but not limited to patent +license, nor is any license granted by implication, estoppel or otherwise. + +Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +contributions. + +This software is provided "AS IS", without any express or implied warranties. The software is in the +development stage. It is intended exclusively for experts who have experience with such software and +solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +and fitness for a particular purpose are hereby disclaimed and excluded. + +Any dispute, controversy or claim arising under or in relation to providing this software shall be +submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +the United Nations Convention on Contracts on the International Sales of Goods. +""" + +import pytest +import pathlib + + +def pytest_addoption(parser): + parser.addoption( + "--encoder_path", + action="store", + help="path to encoder binary IVAS_cod(.exe)", + required=True, + type=pathlib.Path, + ) + parser.addoption( + "--decoder_path", + action="store", + help="path to decoder binary IVAS_dec(.exe)", + required=True, + type=pathlib.Path, + ) + parser.addoption( + "--renderer_path", + action="store", + help="path to renderer binary IVAS_rend(.exe)", + required=True, + type=pathlib.Path, + ) + + +@pytest.fixture(scope="session") +def encoder_path(request) -> str: + return str(request.config.option.encoder_path.absolute()) + + +@pytest.fixture(scope="session") +def decoder_path(request) -> str: + return str(request.config.option.decoder_path.absolute()) + + +@pytest.fixture(scope="session") +def renderer_path(request) -> str: + return str(request.config.option.renderer_path.absolute()) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index f91da1bbb2..a691aa7df9 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -98,19 +98,19 @@ for s in scripts: subprocess.run(proc.split()) @pytest.mark.parametrize("test_tag", list(test_dict.keys())) -def test_26252(test_tag): +def test_26252(test_tag, encoder_path, decoder_path, renderer_path): enc_opts, dec_opts, rend_opts, diff_opts, testv_path, ref_path, cut_path = test_dict[test_tag] if enc_opts: enc_opts = replace_paths(enc_opts, testv_path, ref_path, cut_path) - subprocess.run(["./bin/IVAS_cod"] + enc_opts.split()[1:], check = True) + subprocess.run([encoder_path] + enc_opts.split()[1:], check = True) if dec_opts: dec_opts = replace_paths(dec_opts, testv_path, ref_path, cut_path) - subprocess.run(["./bin/IVAS_dec"] + dec_opts.split()[1:], check = True) + subprocess.run([decoder_path] + dec_opts.split()[1:], check = True) if rend_opts: rend_opts = replace_paths(rend_opts, testv_path, ref_path, cut_path) - subprocess.run(["./bin/IVAS_rend"] + rend_opts.split()[1:], check = True) + subprocess.run([renderer_path] + rend_opts.split()[1:], check = True) diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) if ';' in diff_opts: -- GitLab From a8136b8329b9f970db755a0ac29338fb4c59dd1e Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 25 Jan 2024 15:14:03 +0100 Subject: [PATCH 097/601] adjust ci file to new folder structure --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8331ae9de6..e4e2ef27a3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1271,14 +1271,14 @@ ivas-conformance: - mkdir testvec/bin - cp -r tests/renderer/data testvec/testv/renderer/data - cp -r tests/renderer/cut testvec/testv/renderer/ref - - cp tests/test_26252.py testvec + - cp -r conformance-test testvec/ - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt testvec - cp IVAS_cod IVAS_dec IVAS_rend testvec/bin # Test run generated scripts in testvec - cd testvec - exit_code=0 - - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest conformance-test/test_26252.py --encoder_path bin/IVAS_cod --decoder_path bin/IVAS_dec --renderer_path bin/IVAS_rend --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check -- GitLab From 250353f494303b66049e99a15e1c09268667efec Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Thu, 25 Jan 2024 15:15:47 +0100 Subject: [PATCH 098/601] clang format --- lib_dec/pvq_core_dec.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib_dec/pvq_core_dec.c b/lib_dec/pvq_core_dec.c index 1ef2bb0e59..fd212c3d49 100644 --- a/lib_dec/pvq_core_dec.c +++ b/lib_dec/pvq_core_dec.c @@ -420,10 +420,10 @@ static void densitySymbolIndexDecode( { tot = res * ( res + 1 ) + 1; dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); -#ifdef FIX_976_USAN_PVQ_DEC_OMASA - alpha = (int16_t) floor_sqrt_exact( ( uint32_t )(( res + 1 ) * ( res + 1 ) - dec_freq )) + res + 1; +#ifdef FIX_976_USAN_PVQ_DEC_OMASA + alpha = (int16_t) floor_sqrt_exact( (uint32_t) ( ( res + 1 ) * ( res + 1 ) - dec_freq ) ) + res + 1; #else - alpha = (int16_t) floor_sqrt_exact( ( uint32_t )( res + 1 ) * ( res + 1 ) - dec_freq ) + res + 1; + alpha = (int16_t) floor_sqrt_exact( (uint32_t) ( res + 1 ) * ( res + 1 ) - dec_freq ) + res + 1; #endif sym_freq = 2 * ( res - alpha ) + 1; cum_freq = alpha * ( 2 * ( res + 1 ) - alpha ); @@ -442,11 +442,11 @@ static void densitySymbolIndexDecode( dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); if ( dec_freq < tot - ( res + 1 ) - ( res - ( c + 1 ) ) * ( res - c ) * c + c + 1 ) { -#ifdef FIX_976_USAN_PVQ_DEC_OMASA - alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) ( res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) ) / ( 2 * res_c ); +#ifdef FIX_976_USAN_PVQ_DEC_OMASA + alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) ( res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) ) / ( 2 * res_c ); #else - alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) / ( 2 * res_c ); -#endif + alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) / ( 2 * res_c ); +#endif sym_freq = 2 * alpha * res_c + 1; cum_freq = alpha * ( ( alpha - 1 ) * res_c + 1 ); @@ -495,7 +495,7 @@ static int16_t get_pvq_splits( int16_t Np; uint32_t flag; - Np = ( int16_t )( intLimCDivPos( band_bits, 67 ) >> 2 ); + Np = (int16_t) ( intLimCDivPos( band_bits, 67 ) >> 2 ); if ( band_bits - 268 * Np != 0 || Np == 0 ) /* L_msu */ { Np++; /* ceil */ @@ -511,7 +511,7 @@ static int16_t get_pvq_splits( } } - Np = max( Np, ( int16_t )( ceil( (float) sfmsize / PVQ_MAX_BAND_SIZE ) ) ); + Np = max( Np, (int16_t) ( ceil( (float) sfmsize / PVQ_MAX_BAND_SIZE ) ) ); Np = min( MAX_SPLITS, Np ); Np = min( (int16_t) floor( (float) sfmsize / MIN_BAND_SIZE ), Np ); -- GitLab From 804695bac2b17f2d939e635a117c8f155711c47b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 15:31:41 +0100 Subject: [PATCH 099/601] Remove ivas-linux-fast tag from conf job --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8331ae9de6..3db54afcaa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1195,7 +1195,6 @@ test-be-to-release: ivas-conformance: tags: - - ivas-linux-fast - test-ericsson-linux-runner stage: test timeout: "60 minutes" @@ -1278,7 +1277,7 @@ ivas-conformance: # Test run generated scripts in testvec - cd testvec - exit_code=0 - - python3 -m pytest tests/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest tests/test_26252.py --junitxml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check -- GitLab From 47cf599c27e4a80a193900e63a565d0d8ad1a42b Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 25 Jan 2024 15:46:08 +0100 Subject: [PATCH 100/601] add pytest.ini with report-related options for standalone conf test --- conformance-test/pytest.ini | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 conformance-test/pytest.ini diff --git a/conformance-test/pytest.ini b/conformance-test/pytest.ini new file mode 100644 index 0000000000..6d179f0724 --- /dev/null +++ b/conformance-test/pytest.ini @@ -0,0 +1,15 @@ +# pytest.ini +[pytest] +# TODO remove ignore after tests are harmonized +addopts = -ra --tb=short --basetemp=./tmp -n auto -v +# Write captured system-out log messages to JUnit report. +junit_logging = system-out +# Do not capture log information for passing tests to JUnit report. +junit_log_passing_tests = False +junit_duration_report = call +junit_family = xunit1 +log_file_level = DEBUG +log_format = %(asctime)s %(levelname)s %(message)s +log_date_format = %Y-%m-%d %H:%M:%S +# for pytest-html report: do not log environment variables from the runners +environment_table_redact_list = .* -- GitLab From 1a41bfdbdc76c3573d64020ec624bb1337e3af50 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 15:56:56 +0100 Subject: [PATCH 101/601] Catch parsing of relative paths --- parse_commands.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/parse_commands.py b/parse_commands.py index a46b806eed..42e77141dc 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -44,6 +44,7 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/IVAS_cod', '$CUT_ENC_BIN') cmd = cmd.replace(r'\\', '/') cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) + cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH ) if not "pca" in cmd: @@ -68,6 +69,7 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', inputs) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) + cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths if not "pca" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd: outfile.write(cmd+'\n') -- GitLab From 395a85ad2b64f569e5a4f13fb937e7763b9daec7 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 16:18:47 +0100 Subject: [PATCH 102/601] Move reports up such that they are found by gitlab --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 711c3c5284..051791924f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1278,6 +1278,8 @@ ivas-conformance: - cd testvec - exit_code=0 - python3 -m pytest conformance-test/test_26252.py --encoder_path bin/IVAS_cod --decoder_path bin/IVAS_dec --renderer_path bin/IVAS_rend --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - mv report.html .. + - mv report-junit.xml .. - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check -- GitLab From 6a84b0ddb12d9c78027ab57a00bb330323a44028 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 16:31:23 +0100 Subject: [PATCH 103/601] Fix zero_errors check --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 051791924f..e1a92d0c01 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1278,9 +1278,9 @@ ivas-conformance: - cd testvec - exit_code=0 - python3 -m pytest conformance-test/test_26252.py --encoder_path bin/IVAS_cod --decoder_path bin/IVAS_dec --renderer_path bin/IVAS_rend --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - mv report.html .. - mv report-junit.xml .. - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check artifacts: -- GitLab From 1b475a9db12a1929f61618750ce0ae3eb45c218c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 17:09:53 +0100 Subject: [PATCH 104/601] Remove 2 tests failing on Windows --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e1a92d0c01..67672b551f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1226,6 +1226,7 @@ ivas-conformance: - sed -i '849,851d' scripts/config/self_test.prm - sed -i '805,807d' scripts/config/self_test.prm - sed -i '684,686d' scripts/config/self_test.prm + - sed -i '524,532d' scripts/config/self_test.prm - sed -i '505,508d' scripts/config/self_test.prm - sed -i '420,422d' scripts/config/self_test.prm - sed -i '377,383d' scripts/config/self_test.prm -- GitLab From 602a416958477bca8b4e784f56716cd59eabc475 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 25 Jan 2024 17:44:14 +0100 Subject: [PATCH 105/601] Remove binaural renderer tests --- .gitlab-ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 67672b551f..f2de4d27d1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1246,7 +1246,13 @@ ivas-conformance: # Disable removal of output bitstreams - sed -i 's/os.remove/#os.remove/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py - sed -i '605,608d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py - + # Remove binaural renderer tests + - sed -i '276,301d' tests/renderer/test_renderer.py + - sed -i '205,236d' tests/renderer/test_renderer.py + - sed -i '151,186d' tests/renderer/test_renderer.py + - sed -i '101,132d' tests/renderer/test_renderer.py + - sed -i '58,83d' tests/renderer/test_renderer.py + # Reference creation - non_be_flag=0 - exit_code=0 -- GitLab From bd8afbc1afb8dfd9f37d0deb8a1534a4165676a2 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 07:38:56 +0100 Subject: [PATCH 106/601] Remove random tag in fer cases --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f2de4d27d1..63e82f6367 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1251,7 +1251,9 @@ ivas-conformance: - sed -i '205,236d' tests/renderer/test_renderer.py - sed -i '151,186d' tests/renderer/test_renderer.py - sed -i '101,132d' tests/renderer/test_renderer.py - - sed -i '58,83d' tests/renderer/test_renderer.py + - sed -i '58,83d' tests/renderer/test_renderer.py + # Remove random tag in FER cases + - sed -i '438s/next(tempfile._get_candidate_names())/os.path.basename(plc_file)/' tests/conftest.py # Reference creation - non_be_flag=0 -- GitLab From 1a85dcb2857f4b427ff08618117c6a8eee2e0e52 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 07:59:26 +0100 Subject: [PATCH 107/601] Unify bitstream suffix to .192 --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 63e82f6367..a8e2d08418 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1254,6 +1254,10 @@ ivas-conformance: - sed -i '58,83d' tests/renderer/test_renderer.py # Remove random tag in FER cases - sed -i '438s/next(tempfile._get_candidate_names())/os.path.basename(plc_file)/' tests/conftest.py + # Unify to use .192 as bitstream suffix + - sed -i 's/.pkt/.192/g' tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py + - sed -i 's/.pkt/.192/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py + - sed -i 's/.bts/.192/g' tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py # Reference creation - non_be_flag=0 -- GitLab From 1ac703c17d99753feafa65808033542d1d7aac2c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 08:28:52 +0100 Subject: [PATCH 108/601] Fix substitution of bitstream suffixes --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a8e2d08418..9e5b27d455 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1255,9 +1255,9 @@ ivas-conformance: # Remove random tag in FER cases - sed -i '438s/next(tempfile._get_candidate_names())/os.path.basename(plc_file)/' tests/conftest.py # Unify to use .192 as bitstream suffix - - sed -i 's/.pkt/.192/g' tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py - - sed -i 's/.pkt/.192/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py - - sed -i 's/.bts/.192/g' tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py + - sed -i 's/\.pkt/\.192/g' tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py + - sed -i 's/\.pkt/\.192/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py + - sed -i 's/\.bts/\.192/g' tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py # Reference creation - non_be_flag=0 -- GitLab From ad601fc59ea9d1fad309475809077af28d5cd750 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 08:33:22 +0100 Subject: [PATCH 109/601] Add default bin path for test_26252.py --- .gitlab-ci.yml | 2 +- conformance-test/conftest.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9e5b27d455..0109682e02 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1290,7 +1290,7 @@ ivas-conformance: # Test run generated scripts in testvec - cd testvec - exit_code=0 - - python3 -m pytest conformance-test/test_26252.py --encoder_path bin/IVAS_cod --decoder_path bin/IVAS_dec --renderer_path bin/IVAS_rend --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? + - python3 -m pytest conformance-test/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - mv report.html .. - mv report-junit.xml .. diff --git a/conformance-test/conftest.py b/conformance-test/conftest.py index 0c5ca76062..7c37c3ad3f 100644 --- a/conformance-test/conftest.py +++ b/conformance-test/conftest.py @@ -39,6 +39,7 @@ def pytest_addoption(parser): help="path to encoder binary IVAS_cod(.exe)", required=True, type=pathlib.Path, + default='./bin/IVAS_cod', ) parser.addoption( "--decoder_path", @@ -46,6 +47,7 @@ def pytest_addoption(parser): help="path to decoder binary IVAS_dec(.exe)", required=True, type=pathlib.Path, + default='./bin/IVAS_dec', ) parser.addoption( "--renderer_path", @@ -53,6 +55,7 @@ def pytest_addoption(parser): help="path to renderer binary IVAS_rend(.exe)", required=True, type=pathlib.Path, + default='./bin/IVAS_rend', ) -- GitLab From 50a8493eb924f5138d597d9198f14e6f2ccaf7ef Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 08:41:28 +0100 Subject: [PATCH 110/601] Fix arguments in test_26252.py --- conformance-test/conftest.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/conformance-test/conftest.py b/conformance-test/conftest.py index 7c37c3ad3f..5eea228c45 100644 --- a/conformance-test/conftest.py +++ b/conformance-test/conftest.py @@ -37,7 +37,6 @@ def pytest_addoption(parser): "--encoder_path", action="store", help="path to encoder binary IVAS_cod(.exe)", - required=True, type=pathlib.Path, default='./bin/IVAS_cod', ) @@ -45,7 +44,6 @@ def pytest_addoption(parser): "--decoder_path", action="store", help="path to decoder binary IVAS_dec(.exe)", - required=True, type=pathlib.Path, default='./bin/IVAS_dec', ) @@ -53,7 +51,6 @@ def pytest_addoption(parser): "--renderer_path", action="store", help="path to renderer binary IVAS_rend(.exe)", - required=True, type=pathlib.Path, default='./bin/IVAS_rend', ) -- GitLab From f4309524e1c77aa0e9db7ec338eceae14016bbde Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 08:58:42 +0100 Subject: [PATCH 111/601] Unify to .wav output --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0109682e02..c69e8885a3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1258,6 +1258,10 @@ ivas-conformance: - sed -i 's/\.pkt/\.192/g' tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py - sed -i 's/\.pkt/\.192/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py - sed -i 's/\.bts/\.192/g' tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py + # Unify to use .wav as output suffix + - sed -i 's/\.raw/\.wav/g' tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py + - sed -i 's/\.raw/\.wav/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py + # Reference creation - non_be_flag=0 -- GitLab From 7774a9d284f1ef636a232370ee6b647b76872b2e Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 10:00:38 +0100 Subject: [PATCH 112/601] Add diff on metadata output and log diffs --- conformance-test/test_26252.py | 15 ++++----------- dec_header.txt | 1 + enc_header.txt | 1 + parse_commands.py | 20 +++++++++++++++----- rend_header.txt | 1 + script_footer.txt | 10 ++++++++++ 6 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 script_footer.txt diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index a691aa7df9..01efa36195 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -113,16 +113,9 @@ def test_26252(test_tag, encoder_path, decoder_path, renderer_path): subprocess.run([renderer_path] + rend_opts.split()[1:], check = True) diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) - if ';' in diff_opts: - cmd1, cmd2 = diff_opts.split(';') - cmd1 = cmd1.split() - cmd2 = cmd2.split() - result1 = filecmp.cmp(cmd1[0], cmd1[1]) - result2 = filecmp.cmp(cmd2[2], cmd2[3]) - else: - cmd1 = diff_opts.split() - result1 = filecmp.cmp(cmd1[0], cmd1[1]) - result2 = True - if not (result1 and result2): + result = True + for cmd in diff_opts.split(';') + result = result and filecmp.cmp(cmd.split()[0], cmd.split()[1]) + if not result: assert False, "Output differs" diff --git a/dec_header.txt b/dec_header.txt index 8469dd4bfb..6d7efe2d83 100644 --- a/dec_header.txt +++ b/dec_header.txt @@ -12,6 +12,7 @@ DIFF_BIN="diff" TESTV_PATH="." REF_PATH="./testv" CUT_PATH="./TMP_DEC" +LOG_FILE=Readme_IVAS_dec_log.txt rm -rf $CUT_PATH mkdir -p $CUT_PATH diff --git a/enc_header.txt b/enc_header.txt index 32e78419cc..fba31ea826 100644 --- a/enc_header.txt +++ b/enc_header.txt @@ -12,6 +12,7 @@ DIFF_BIN="diff" TESTV_PATH="." REF_PATH="./testv" CUT_PATH="./TMP_ENC" +LOG_FILE=Readme_IVAS_enc_log.txt rm -rf $CUT_PATH mkdir -p $CUT_PATH diff --git a/parse_commands.py b/parse_commands.py index 42e77141dc..d379b2149c 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -4,6 +4,7 @@ import argparse import re from os import path from pathlib import Path +import glob # Main routine if __name__ == '__main__': @@ -51,8 +52,10 @@ if __name__ == '__main__': outfile.write(cmd+'\n') bts = re.search(r"\s(([\S]+)(.bts|.192|.pkt|.fer))$", cmd) if bts: - outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+'\n') + outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+'>> $LOG_FILE 2>&1\n') outfile.write('\n') + with open('script_footer.txt','r') as footer: + outfile.write(footer.read()) with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile: with open('dec_header.txt','r') as header: @@ -75,8 +78,13 @@ if __name__ == '__main__': outfile.write(cmd+'\n') out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) if out: - outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+out.group(1)+'\n') - outfile.write('\n') + diff_cmds=[] + for output in glob.glob(out.group(1) + '*'): + diff_cmds.append('$DIFF_BIN '+output.replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+output+' >> $LOG_FILE 2>&1') + outfile.write(diff_cmds.join('; ')) + outfile.write('\n\n') + with open('script_footer.txt','r') as footer: + outfile.write(footer.read()) with open(txt_file.replace('.','_rend.'),'w', newline='\n') as outfile: with open('rend_header.txt','r') as header: @@ -96,5 +104,7 @@ if __name__ == '__main__': outfile.write(cmd+'\n') out = re.search(r"-o\s(([\S]+)(.wav|.raw|.pcm))", cmd) if out and "cut" in out.group(1): - outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH + r'renderer/cut',REF_PATH + r'renderer/ref')+' '+out.group(1)+'\n') - outfile.write('\n') \ No newline at end of file + outfile.write('$DIFF_BIN '+out.group(1).replace(CUT_PATH + r'renderer/cut',REF_PATH + r'renderer/ref')+' '+out.group(1)+' >> $LOG_FILE 2>&1\n') + outfile.write('\n') + with open('script_footer.txt','r') as footer: + outfile.write(footer.read()) \ No newline at end of file diff --git a/rend_header.txt b/rend_header.txt index 9e4adefc15..f95fb2e534 100644 --- a/rend_header.txt +++ b/rend_header.txt @@ -12,6 +12,7 @@ DIFF_BIN="diff" TESTV_PATH="." REF_PATH="./testv" CUT_PATH="./TMP_REND" +LOG_FILE=Readme_IVAS_rend_log.txt rm -rf $CUT_PATH mkdir -p $CUT_PATH/renderer/cut $CUT_PATH/renderer/data diff --git a/script_footer.txt b/script_footer.txt new file mode 100644 index 0000000000..ca6412e27c --- /dev/null +++ b/script_footer.txt @@ -0,0 +1,10 @@ +# test that log file is empty +if [ -s $LOG_FILE ] ; then + echo "TEST FAILED !!!" + echo "Please check the following conditions:" + cat $LOG_FILE + + echo "Summary: TEST FAILED !!!" +else + echo "TEST PASSED SUCCESSFULLY" +fi ; \ No newline at end of file -- GitLab From 31b53aa868d80281654840d8835d329a0846cd16 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 10:09:47 +0100 Subject: [PATCH 113/601] Fix diff cmds --- parse_commands.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parse_commands.py b/parse_commands.py index d379b2149c..e5b7ed477e 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -81,8 +81,8 @@ if __name__ == '__main__': diff_cmds=[] for output in glob.glob(out.group(1) + '*'): diff_cmds.append('$DIFF_BIN '+output.replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+output+' >> $LOG_FILE 2>&1') - outfile.write(diff_cmds.join('; ')) - outfile.write('\n\n') + outfile.write(('; ').join(diff_cmds)) + outfile.write('\n') with open('script_footer.txt','r') as footer: outfile.write(footer.read()) -- GitLab From 0433beaeab21600b1b6d5fdc577d3faabc6fe21c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 10:15:48 +0100 Subject: [PATCH 114/601] Fix syntax error in test_26252.py --- conformance-test/test_26252.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 01efa36195..895525fc07 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -114,7 +114,7 @@ def test_26252(test_tag, encoder_path, decoder_path, renderer_path): diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) result = True - for cmd in diff_opts.split(';') + for cmd in diff_opts.split(';'): result = result and filecmp.cmp(cmd.split()[0], cmd.split()[1]) if not result: assert False, "Output differs" -- GitLab From f8cba2da5f1145d627417d54b5837f5105a0c1b9 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 10:32:18 +0100 Subject: [PATCH 115/601] Add separate file for jbm tests --- conformance-test/test_26252.py | 2 +- jbm_header.txt | 22 ++++++++++++++++++++++ parse_commands.py | 15 ++++++++++++--- 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 jbm_header.txt diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 895525fc07..c0b8795e68 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -53,7 +53,7 @@ def replace_paths(instr, testv_path, ref_path, cut_path): test_dict = {} TEST_DIR = "." -scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt"] +scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt", "Readme_IVAS_jbm.txt"] for s in scripts: with open(os.path.join(TEST_DIR, s), "r", encoding="UTF-8") as fp: diff --git a/jbm_header.txt b/jbm_header.txt new file mode 100644 index 0000000000..466c82c654 --- /dev/null +++ b/jbm_header.txt @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -e + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit -1 +fi + +CUT_DEC_BIN=$1 +DIFF_BIN="diff" + +TESTV_PATH="." +REF_PATH="./testv" +CUT_PATH="./TMP_JBM" +LOG_FILE=Readme_IVAS_jbm_log.txt + +rm -rf $CUT_PATH +mkdir -p $CUT_PATH +mkdir -p $CUT_PATH/dut/masa_test/dec_output +mkdir -p $CUT_PATH/dut/param_file/dec +mkdir -p $CUT_PATH/dut/sba_bs/raw + diff --git a/parse_commands.py b/parse_commands.py index e5b7ed477e..aebfa30d06 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -57,9 +57,11 @@ if __name__ == '__main__': with open('script_footer.txt','r') as footer: outfile.write(footer.read()) - with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile: + with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile_dec, open(txt_file.replace('.','_jbm.'),'w', newline='\n') as outfile_jbm: with open('dec_header.txt','r') as header: - outfile.write(header.read()) + outfile_dec.write(header.read()) + with open('jbm_header.txt','r') as header: + outfile_jbm.write(header.read()) for cmd in cmds_dec: arg1 = cmd.split()[0] root_folder = arg1[0:arg1.find("ivas-codec/")+10] @@ -74,6 +76,11 @@ if __name__ == '__main__': cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths + if 'VOIP' in cmd: + outfile = outfile_jbm + else: + outfile = outfile_dec + if not "pca" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd: outfile.write(cmd+'\n') out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) @@ -84,7 +91,9 @@ if __name__ == '__main__': outfile.write(('; ').join(diff_cmds)) outfile.write('\n') with open('script_footer.txt','r') as footer: - outfile.write(footer.read()) + outfile_dec.write(footer.read()) + footer.seek(0) + outfile_jbm.write(footer.read()) with open(txt_file.replace('.','_rend.'),'w', newline='\n') as outfile: with open('rend_header.txt','r') as header: -- GitLab From 60c4bea2f525b8aa9d5421f0ede92fcb0a406c6d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 10:36:55 +0100 Subject: [PATCH 116/601] Add missing space --- parse_commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parse_commands.py b/parse_commands.py index aebfa30d06..d82a087d29 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -52,7 +52,7 @@ if __name__ == '__main__': outfile.write(cmd+'\n') bts = re.search(r"\s(([\S]+)(.bts|.192|.pkt|.fer))$", cmd) if bts: - outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+'>> $LOG_FILE 2>&1\n') + outfile.write('$DIFF_BIN '+bts.group(1).replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+bts.group(1)+' >> $LOG_FILE 2>&1\n') outfile.write('\n') with open('script_footer.txt','r') as footer: outfile.write(footer.read()) -- GitLab From 7e2d77db208dfaffc7fd3929a8620ca74d9c403e Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 10:39:40 +0100 Subject: [PATCH 117/601] Move jbm script to test package --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c69e8885a3..4dc8510015 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1288,7 +1288,7 @@ ivas-conformance: - cp -r tests/renderer/data testvec/testv/renderer/data - cp -r tests/renderer/cut testvec/testv/renderer/ref - cp -r conformance-test testvec/ - - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt testvec + - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt Readme_IVAS_jbm.txt testvec - cp IVAS_cod IVAS_dec IVAS_rend testvec/bin # Test run generated scripts in testvec -- GitLab From 6ccf7aaf4e4cbfe22949c103bfd19f4e5281e19b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 11:19:48 +0100 Subject: [PATCH 118/601] Fix multiple diff --- parse_commands.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/parse_commands.py b/parse_commands.py index d82a087d29..4defd5faf4 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -63,6 +63,7 @@ if __name__ == '__main__': with open('jbm_header.txt','r') as header: outfile_jbm.write(header.read()) for cmd in cmds_dec: + absolute_out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) arg1 = cmd.split()[0] root_folder = arg1[0:arg1.find("ivas-codec/")+10] cmd = cmd.replace(root_folder + r'/IVAS_dec', '$CUT_DEC_BIN') @@ -86,7 +87,8 @@ if __name__ == '__main__': out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) if out: diff_cmds=[] - for output in glob.glob(out.group(1) + '*'): + for output in glob.glob(absolute_out.group(1) + '*'): + output = output.replace(root_folder + r'/tests/', CUT_PATH) diff_cmds.append('$DIFF_BIN '+output.replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+output+' >> $LOG_FILE 2>&1') outfile.write(('; ').join(diff_cmds)) outfile.write('\n') -- GitLab From 404b2d9731826ec70198cdb660a6e8d8ca787677 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 11:31:27 +0100 Subject: [PATCH 119/601] Fix multiple diff 2 --- conformance-test/test_26252.py | 4 +- scripts/config/self_test.prm | 87 ---------- .../test_masa_enc_dec.py | 4 +- .../test_sba_bs_dec_plc.py | 12 +- .../test_sba_bs_enc.py | 96 ++--------- tests/conftest.py | 4 +- tests/renderer/constants.py | 2 +- tests/renderer/test_renderer.py | 160 ------------------ tests/renderer/utils.py | 4 +- 9 files changed, 27 insertions(+), 346 deletions(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index c0b8795e68..e338233034 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -82,7 +82,7 @@ for s in scripts: if line.startswith("$CUT_REND_BIN"): rend_opts = line if line.startswith("$DIFF_BIN"): - diff_opts = line[9:] + diff_opts = line tag = s + "--" + diff_opts.split()[1].split('/')[-1] if tag in test_dict: print("non-unique tag found - ignoring new entry") @@ -115,7 +115,7 @@ def test_26252(test_tag, encoder_path, decoder_path, renderer_path): diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) result = True for cmd in diff_opts.split(';'): - result = result and filecmp.cmp(cmd.split()[0], cmd.split()[1]) + result = result and filecmp.cmp(cmd.split()[1], cmd.split()[2]) if not result: assert False, "Output differs" diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 203c8dfc4d..839ae42b73 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -318,15 +318,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit_error testv/stv1ISM48s.wav_64000_48-48_FER5_binaural_room_HR_EXOF.tst -// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, random FER at 5% -../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit -eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error -../IVAS_dec -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit_error testv/stv1ISM48s.wav_80000_48-16_FER5_binaural_file_TDHR.tst - -// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, external orientation, random FER at 5% -../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit -eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error -../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit_error testv/stv1ISM48s.wav_80000_48-16_FER5_binaural_file_TDHR_EXOF.tst // 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, EXT out ../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit @@ -374,13 +365,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 80000 48 testv/stvST48n.wav bit ../IVAS_dec STEREO 48 bit testv/stvST48n.wav_2ISM_80000_48-48_DTX_STEREO.tst -// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst - -// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation, external orientation -../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -t testv/headrot_case01_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR_EXOF.tst // 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit @@ -417,9 +401,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec HOA3 32 bit_error testv/stv3ISM48s.wav_128000_48-32_HOA3_FER5.tst -// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out (Model from file) -../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binauralfile.tst // 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, random FER at 5% ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit @@ -502,10 +483,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec -t testv/headrot_case03_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR_EXOF.tst // 4 ISM with metadata at 512 kbps, 48 kHz in, 48 kHz out, 5_1 -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stv4ISM48s.wav bit -../IVAS_dec 5_1 48 bit testv/stv4ISM48s.wav_512000_48-48_5_1.tst - -// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, Orientation tracking ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_OtrAvg.tst @@ -521,15 +498,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48n.wav bit ../IVAS_dec HOA3 48 bit testv/stv4ISM48n.wav_brate_sw_48-48_DTX_hoa3.tst -// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, directivity configuration, random FER at 5% -../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error -../IVAS_dec -render_config testv/config_directivity_txt.cfg -t testv/headrot_case04_3000_q.csv BINAURAL 48 bit_error testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FER5.tst - -// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, external orientation, directivity configuration, random FER at 5% -../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error -../IVAS_dec -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit_error testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_EXOF_DirConfig_FER5.tst // 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, EXT out ../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48n.wav bit @@ -681,9 +649,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit ../IVAS_dec 5_1_2 48 bit testv/stv3OA48c.wav_SBA_48000_48-48_5_1_2.tst -// SBA at 48 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_48000_48-48_binaural_ht_fr5.tst // SBA at 64 kbps, 32kHz in, 32kHz out, FOA out, DTX, random FER at 5% ../IVAS_cod -dtx -sba 1 64000 32 testv/stvFOA32c.wav bit @@ -802,9 +767,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_Binaural_Headrot_EXOF.tst -// SBA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural_ht_fr5.tst // SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 48 testv/stvFOA48c.wav bit @@ -846,9 +808,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -sba 3 ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv3OA32c.wav bit ../IVAS_dec HOA3 32 bit testv/stv3OA32c.wav_sw_32-32_DTX_HOA3.tst -// SBA FOA bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, FOA out -../IVAS_cod -sba 1 -max_band fb ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvFOA48c.wav bit -../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_sw_48-48_FOA.tst // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out @@ -1202,15 +1161,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, fr 5ms ../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit -../IVAS_dec -fr 5 BINAURAL_ROOM_IR 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC_binaural_room_fr5.tst - -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, with headtracking, BINAURAL out, fr 5ms -../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_ht_fr5.tst - -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural_ht_fr5.tst // Multi-channel 5_1_2 at 32 kbps, 48kHz in, 48kHz out, STEREO out, random FER at 5% ../IVAS_cod -mc 5_1_2 32000 48 testv/stv512MC48c.wav bit @@ -1304,21 +1254,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_sw_48-48_BINAURAL.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out (Model from file) -../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_ROOM_IR 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst - -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 32kHz out, BINAURAL out (Model from file) -../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv714MC48c.wav_MC714_512000_48-32_MC_binaural.tst - -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) -../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural.tst - -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out (Model from file) -../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_IR 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst @@ -1347,10 +1282,6 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP HOA3 32 netsimoutput testv/stv3OA32c.wav_SBA_80000_32-32_HOA3_JBM5.tst -// SBA at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, JBM Prof 5 -../IVAS_cod -sba 1 13200 48 testv/stvFOA48c.wav bit -networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stvFOA32c.wav_SBA_13200_48-48_BINAURAL_JBM5.tst // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out, 7_1_4 out, JBM Prof 5 ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit @@ -1620,9 +1551,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 4 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_4ISM_3OA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvOSBA_4ISM_3OA48c.wav_BINAURAL_sw_13k2_512k_48-48.tst -// OSBA 3OA 2ISM at 256 kbps, 32kHz in, 32kHz out, HOA3 out -../IVAS_cod -ism_sba 2 3 testv/stvISM1.csv testv/stvISM2.csv 256000 32 testv/stvOSBA_2ISM_3OA32c.wav bit -../IVAS_dec HOA3 32 bit testv/stvOSBA_2ISM_3OA32c.wav_HOA3_256000_32-32.tst // OSBA 2OA 3ISM at 384 kbps, 16kHz in, 16kHz out, MONO out ../IVAS_cod -ism_sba 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 384000 16 testv/stvOSBA_3ISM_2OA16c.wav bit @@ -1641,19 +1569,4 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 48 bit_error testv/stvOSBA_4ISM_FOA48c.wav_BINAURAL_sw_48-48_FER5.tst -// OSBA 3ISM 2OA at bitrate switching 13.2 to 512 kbps, 48kHz in, 32kHz out, STEREO out, FER at 10% -../IVAS_cod -ism_sba 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_3ISM_2OA48c.wav bit -eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g192 bit_error -../IVAS_dec STEREO 32 bit_error testv/stvOSBA_3ISM_2OA48c.wav_STEREO_sw_48-32_FER10.tst - -// OSBA planar FOA 1ISM at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out -../IVAS_cod -ism_sba 1 -1 testv/stvISM1.csv 256000 48 testv/stvOSBA_1ISM_FOA48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stvOSBA_1ISM_pFOA48c.wav_BINAURAL_256000_48-48.tst - -// OSBA planar FOA 2ISM at 512 kbps, 48 kHz in, 48 kHz out, BINAURAL out -../IVAS_cod -ism_sba 2 -1 testv/stvISM1.csv testv/stvISM2.csv 512000 48 testv/stvOSBA_2ISM_FOA48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stvOSBA_2ISM_pFOA48c.wav_BINAURAL_512000_48-48.tst -// OSBA planar 3OA 4ISM at 512 kbps, 48 kHz in, 48 kHz out, BINAURAL out -../IVAS_cod -ism_sba 4 -3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stvOSBA_4ISM_3OA48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stvOSBA_4ISM_p3OA48c.wav_BINAURAL_512000_48-48.tst diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index 0614651653..af6d9cb86e 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -139,8 +139,8 @@ def test_masa_enc_dec( check_and_makedir(out_dir_dec_output_dut) # To avoid conflicting names in case of parallel test execution, differentiate all cases - output_bitstream_ref = f"{out_dir_bs_ref}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.bts" - output_bitstream_dut = f"{out_dir_bs_dut}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.bts" + output_bitstream_ref = f"{out_dir_bs_ref}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.192" + output_bitstream_dut = f"{out_dir_bs_dut}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.192" dec_output_ref = f"{out_dir_dec_output_ref}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.wav" dec_output_dut = f"{out_dir_dec_output_dut}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.wav" if output_mode == "EXT": diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py index 422f87d9c7..528f6b5d2f 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py @@ -157,14 +157,14 @@ def sba_dec_plc( check_and_makedir(ref_out_dir) plc_file = f"{test_vector_path}/{plc_pattern}.g192" - ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}.pkt" - ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_dutenc.pkt" + ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}.192" + ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_dutenc.192" if SID == 1: - ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_cut.pkt" - ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_dutenc_cut.pkt" + ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_cut.192" + ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_dutenc_cut.192" - dut_out_raw = f"{dut_out_dir}/{plc_tag_out}.raw" - ref_out_raw = f"{ref_out_dir}/{plc_tag_out}.raw" + dut_out_raw = f"{dut_out_dir}/{plc_tag_out}.wav" + ref_out_raw = f"{ref_out_dir}/{plc_tag_out}.wav" output_config = "FOA" if ref_decoder_path: diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index 3e84e6b283..a75c1ed7e9 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -85,72 +85,6 @@ def check_and_makedir(dir_path): raise # raises the error again -@pytest.mark.create_ref -@pytest.mark.parametrize("tag", tag_list) -@pytest.mark.parametrize("fs", sample_rate_list) -def test_pca_enc( - dut_encoder_frontend: EncoderFrontend, - dut_decoder_frontend: DecoderFrontend, - test_vector_path, - reference_path, - dut_base_path, - ref_encoder_frontend, - ref_decoder_frontend, - update_ref, - keep_files, - tag, - fs, - get_mld, -): - pca = True - tag = tag + fs + "c" - ivas_br = "256000" - dtx = "0" - max_bw = "FB" - gain_flag = -1 - sba_order = "+1" - output_config = "FOA" - - # enc - sba_enc( - dut_encoder_frontend, - test_vector_path, - ref_encoder_frontend, - reference_path, - dut_base_path, - None, - tag, - fs, - ivas_br, - dtx, - None, - max_bw, - sba_order, - update_ref, - gain_flag, - cut_testv=True, - pca=pca, - ) - - # dec - sba_dec( - dut_decoder_frontend, - ref_decoder_frontend, - reference_path, - dut_base_path, - tag, - fs, - ivas_br, - dtx, - None, - max_bw, - output_config, - update_ref, - gain_flag, - keep_files, - get_mld=get_mld, - pca=pca, - ) @pytest.mark.create_ref @@ -504,14 +438,14 @@ def sba_enc( long_tag_ext += f"_Gain{gain_flag}" if SID == 1: long_tag_ext += f"_SID" - dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.pkt" - ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.pkt" - ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.pkt" + dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.192" + ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.192" + ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.192" if SID == 1: - dut_pkt_file_cut = f"{dut_out_dir}/{tag_out}{long_tag_ext}_cut.pkt" - ref_pkt_file_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_cut.pkt" + dut_pkt_file_cut = f"{dut_out_dir}/{tag_out}{long_tag_ext}_cut.192" + ref_pkt_file_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_cut.192" ref_pkt_file_dutenc_cut = ( - f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc_cut.pkt" + f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc_cut.192" ) input_path = f"{test_vector_path}/{tag_in}{in_extension}" dtx_mode = dtx == "1" @@ -584,13 +518,13 @@ def sba_enc( with open(ref_pkt_file_dutenc, "rb") as fp_in: with open(ref_pkt_file_dutenc_cut, "wb") as fp_out: fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True) - os.remove(ref_pkt_file) - os.remove(ref_pkt_file_dutenc) + #os.remove(ref_pkt_file) + #os.remove(ref_pkt_file_dutenc) if update_ref == 0: with open(dut_pkt_file, "rb") as fp_in: with open(dut_pkt_file_cut, "wb") as fp_out: fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True) - os.remove(dut_pkt_file) + #os.remove(dut_pkt_file) def sba_dec( @@ -635,11 +569,11 @@ def sba_dec( dut_out_dir = f"{dut_base_path}/sba_bs/raw" ref_out_dir = f"{reference_path}/sba_bs/raw" - dut_in_pkt = f"{dut_base_path}/sba_bs/pkt/{tag_out}{long_tag_ext}.pkt" - ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}{short_tag_ext}.pkt" + dut_in_pkt = f"{dut_base_path}/sba_bs/pkt/{tag_out}{long_tag_ext}.192" + ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}{short_tag_ext}.192" - dut_out_raw = f"{dut_out_dir}/{tag_out}{long_tag_ext}.raw" - ref_out_raw = f"{ref_out_dir}/{tag_out}{short_tag_ext}.raw" + dut_out_raw = f"{dut_out_dir}/{tag_out}{long_tag_ext}.wav" + ref_out_raw = f"{ref_out_dir}/{tag_out}{short_tag_ext}.wav" check_and_makedir(dut_out_dir) check_and_makedir(ref_out_dir) @@ -668,7 +602,3 @@ def sba_dec( # report compare result assert cmp_result == 0, reason - # remove DUT output files when test result is OK (to save disk space) - if not keep_files: - os.remove(dut_in_pkt) - os.remove(dut_out_raw) diff --git a/tests/conftest.py b/tests/conftest.py index 5f7ed04a82..a542b12ff1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -255,7 +255,7 @@ class EncoderFrontend: command.extend(["-max_band", max_band]) if pca: - command.extend(["-pca"]) + command.extend(["-bypass 2"]) if quiet_mode: command.extend(["-q"]) @@ -435,7 +435,7 @@ class DecoderFrontend: eid_command = [eid_path] eid_command.extend(["-fer", "-vbr", "-bs", "g192", "-ep", "g192"]) - eid_output_suffix = "." + next(tempfile._get_candidate_names()) + ".fer" + eid_output_suffix = "." + os.path.basename(plc_file) + ".fer" eid_command += [ str(input_bitstream_path), str(plc_file), diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py index 056242bd3c..09fc0d74bb 100644 --- a/tests/renderer/constants.py +++ b/tests/renderer/constants.py @@ -192,7 +192,7 @@ FORMAT_TO_METADATA_FILES = { INPUT_FORMATS_AMBI = ["FOA", "HOA2", "HOA3"] INPUT_FORMATS_MC = ["MONO", "STEREO", "5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] INPUT_FORMATS_ISM = ["ISM1", "ISM2", "ISM3", "ISM4"] -INPUT_FORMATS_MASA = ["MASA1", "MASA2"] +INPUT_FORMATS_MASA = ["MASA2"] """ Non binaural / parametric output formats """ OUTPUT_FORMATS = [ diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index 1ddba22695..e481818045 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -55,32 +55,6 @@ def test_ambisonics(test_info, in_fmt, out_fmt, frame_size): ) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_ambisonics_binaural_static(test_info, in_fmt, out_fmt, frame_size): - run_renderer( - test_info, - in_fmt, - out_fmt, - frame_size=frame_size, - ) - - -@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_ambisonics_binaural_headrotation( - test_info, in_fmt, out_fmt, trj_file, frame_size -): - run_renderer( - test_info, - in_fmt, - out_fmt, - trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - frame_size=frame_size, - ) """ Multichannel """ @@ -98,38 +72,6 @@ def test_multichannel(test_info, in_fmt, out_fmt, frame_size): ) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, frame_size): - if in_fmt in ["MONO", "STEREO"]: - pytest.skip("MONO or STEREO to Binaural rendering unsupported") - - run_renderer( - test_info, - in_fmt, - out_fmt, - frame_size=frame_size, - ) - - -@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_multichannel_binaural_headrotation( - test_info, in_fmt, out_fmt, trj_file, frame_size -): - if in_fmt in ["MONO", "STEREO"]: - pytest.skip("MONO or STEREO to Binaural rendering unsupported") - - run_renderer( - test_info, - in_fmt, - out_fmt, - trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - frame_size=frame_size, - ) """ ISM """ @@ -148,42 +90,6 @@ def test_ism(test_info, in_fmt, out_fmt, frame_size): ) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_ism_binaural_static(test_info, in_fmt, out_fmt, frame_size): - try: - in_meta_files = FORMAT_TO_METADATA_FILES[in_fmt] - except KeyError: - in_meta_files = None - - run_renderer( - test_info, - in_fmt, - out_fmt, - in_meta_files=in_meta_files, - frame_size=frame_size, - ) - - -@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_ism_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file, frame_size): - try: - in_meta_files = FORMAT_TO_METADATA_FILES[in_fmt] - except KeyError: - in_meta_files = None - - run_renderer( - test_info, - in_fmt, - out_fmt, - trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - in_meta_files=in_meta_files, - frame_size=frame_size, - ) """ MASA """ @@ -202,48 +108,8 @@ def test_masa(test_info, in_fmt, out_fmt, frame_size): ) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_masa_binaural_static(test_info, in_fmt, out_fmt, frame_size): - if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: - pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") - - run_renderer( - test_info, - in_fmt, - out_fmt, - in_meta_files=FORMAT_TO_METADATA_FILES[in_fmt], - frame_size=frame_size, - ) - - -@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_masa_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file, frame_size): - if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: - pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") - - run_renderer( - test_info, - in_fmt, - out_fmt, - trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - in_meta_files=FORMAT_TO_METADATA_FILES[in_fmt], - frame_size=frame_size, - ) -@pytest.mark.parametrize("in_fmt", METADATA_SCENES_TO_TEST_MASA_PREREND) -def test_masa_prerend(test_info, in_fmt): - run_renderer( - test_info, - "META", - "MASA2", - metadata_input=TEST_VECTOR_DIR.joinpath(f"{in_fmt}.txt"), - ) """ Custom loudspeaker layouts """ @@ -281,32 +147,6 @@ def test_custom_ls_input_output(test_info, in_fmt, out_fmt): ) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_layout", CUSTOM_LS_TO_TEST) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_custom_ls_input_binaural(test_info, in_layout, out_fmt, frame_size): - run_renderer( - test_info, - CUSTOM_LAYOUT_DIR.joinpath(f"{in_layout}.txt"), - out_fmt, - frame_size=frame_size, - ) - - -@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_layout", CUSTOM_LS_TO_TEST) -@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -def test_custom_ls_input_binaural_headrotation( - test_info, in_layout, out_fmt, trj_file, frame_size -): - run_renderer( - test_info, - CUSTOM_LAYOUT_DIR.joinpath(f"{in_layout}.txt"), - out_fmt, - trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - frame_size=frame_size, - ) """ Metadata / scene description input """ diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index 5f724e16de..e4ab74683b 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -184,7 +184,7 @@ def run_renderer( cmd[5:5] = ["-im", *in_meta_files] if trj_file is not None: - cmd.extend(["-T", str(trj_file)]) + cmd.extend(["-tf", str(trj_file)]) if non_diegetic_pan is not None: cmd.extend(["-non_diegetic_pan", str(non_diegetic_pan)]) @@ -203,8 +203,6 @@ def run_renderer( if config_file is not None: cmd.extend(["-render_config", str(config_file)]) - if frame_size: - cmd.extend(["-fr", str(frame_size.replace("ms", ""))]) # Set env variables for UBSAN env = os.environ.copy() -- GitLab From b918e5cd46d419d38b73d0bf472625e281481251 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 11:33:26 +0100 Subject: [PATCH 120/601] Fix multiple diff 3 --- conformance-test/test_26252.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index e338233034..1c148bcc72 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -83,7 +83,7 @@ for s in scripts: rend_opts = line if line.startswith("$DIFF_BIN"): diff_opts = line - tag = s + "--" + diff_opts.split()[1].split('/')[-1] + tag = s + "--" + diff_opts.split()[2].split('/')[-1] if tag in test_dict: print("non-unique tag found - ignoring new entry") continue -- GitLab From b3224af2fb1dfddfb808cf85f727b9c3dc370a98 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 14:09:14 +0100 Subject: [PATCH 121/601] Revert "Fix multiple diff 3" This reverts commit b918e5cd46d419d38b73d0bf472625e281481251. --- conformance-test/test_26252.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 1c148bcc72..e338233034 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -83,7 +83,7 @@ for s in scripts: rend_opts = line if line.startswith("$DIFF_BIN"): diff_opts = line - tag = s + "--" + diff_opts.split()[2].split('/')[-1] + tag = s + "--" + diff_opts.split()[1].split('/')[-1] if tag in test_dict: print("non-unique tag found - ignoring new entry") continue -- GitLab From c92e2ba6aadc956c65a49757ad8f5202217c3ae7 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 14:09:24 +0100 Subject: [PATCH 122/601] Revert "Fix multiple diff 2" This reverts commit 404b2d9731826ec70198cdb660a6e8d8ca787677. --- conformance-test/test_26252.py | 4 +- scripts/config/self_test.prm | 87 ++++++++++ .../test_masa_enc_dec.py | 4 +- .../test_sba_bs_dec_plc.py | 12 +- .../test_sba_bs_enc.py | 96 +++++++++-- tests/conftest.py | 4 +- tests/renderer/constants.py | 2 +- tests/renderer/test_renderer.py | 160 ++++++++++++++++++ tests/renderer/utils.py | 4 +- 9 files changed, 346 insertions(+), 27 deletions(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index e338233034..c0b8795e68 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -82,7 +82,7 @@ for s in scripts: if line.startswith("$CUT_REND_BIN"): rend_opts = line if line.startswith("$DIFF_BIN"): - diff_opts = line + diff_opts = line[9:] tag = s + "--" + diff_opts.split()[1].split('/')[-1] if tag in test_dict: print("non-unique tag found - ignoring new entry") @@ -115,7 +115,7 @@ def test_26252(test_tag, encoder_path, decoder_path, renderer_path): diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) result = True for cmd in diff_opts.split(';'): - result = result and filecmp.cmp(cmd.split()[1], cmd.split()[2]) + result = result and filecmp.cmp(cmd.split()[0], cmd.split()[1]) if not result: assert False, "Output differs" diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 839ae42b73..203c8dfc4d 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -318,6 +318,15 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit_error testv/stv1ISM48s.wav_64000_48-48_FER5_binaural_room_HR_EXOF.tst +// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, random FER at 5% +../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit +eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error +../IVAS_dec -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit_error testv/stv1ISM48s.wav_80000_48-16_FER5_binaural_file_TDHR.tst + +// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, external orientation, random FER at 5% +../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit +eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error +../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit_error testv/stv1ISM48s.wav_80000_48-16_FER5_binaural_file_TDHR_EXOF.tst // 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, EXT out ../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit @@ -365,6 +374,13 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 80000 48 testv/stvST48n.wav bit ../IVAS_dec STEREO 48 bit testv/stvST48n.wav_2ISM_80000_48-48_DTX_STEREO.tst +// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit +../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst + +// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation, external orientation +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit +../IVAS_dec -t testv/headrot_case01_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR_EXOF.tst // 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit @@ -401,6 +417,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec HOA3 32 bit_error testv/stv3ISM48s.wav_128000_48-32_HOA3_FER5.tst +// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out (Model from file) +../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binauralfile.tst // 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, random FER at 5% ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit @@ -483,6 +502,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec -t testv/headrot_case03_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR_EXOF.tst // 4 ISM with metadata at 512 kbps, 48 kHz in, 48 kHz out, 5_1 +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stv4ISM48s.wav bit +../IVAS_dec 5_1 48 bit testv/stv4ISM48s.wav_512000_48-48_5_1.tst + +// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, Orientation tracking ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_OtrAvg.tst @@ -498,6 +521,15 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48n.wav bit ../IVAS_dec HOA3 48 bit testv/stv4ISM48n.wav_brate_sw_48-48_DTX_hoa3.tst +// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, directivity configuration, random FER at 5% +../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error +../IVAS_dec -render_config testv/config_directivity_txt.cfg -t testv/headrot_case04_3000_q.csv BINAURAL 48 bit_error testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FER5.tst + +// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, external orientation, directivity configuration, random FER at 5% +../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error +../IVAS_dec -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit_error testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_EXOF_DirConfig_FER5.tst // 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, EXT out ../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48n.wav bit @@ -649,6 +681,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit ../IVAS_dec 5_1_2 48 bit testv/stv3OA48c.wav_SBA_48000_48-48_5_1_2.tst +// SBA at 48 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms +../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit +../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_48000_48-48_binaural_ht_fr5.tst // SBA at 64 kbps, 32kHz in, 32kHz out, FOA out, DTX, random FER at 5% ../IVAS_cod -dtx -sba 1 64000 32 testv/stvFOA32c.wav bit @@ -767,6 +802,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_Binaural_Headrot_EXOF.tst +// SBA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms +../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit +../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural_ht_fr5.tst // SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 48 testv/stvFOA48c.wav bit @@ -808,6 +846,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -sba 3 ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv3OA32c.wav bit ../IVAS_dec HOA3 32 bit testv/stv3OA32c.wav_sw_32-32_DTX_HOA3.tst +// SBA FOA bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, FOA out +../IVAS_cod -sba 1 -max_band fb ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvFOA48c.wav bit +../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_sw_48-48_FOA.tst // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out @@ -1161,6 +1202,15 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, fr 5ms ../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit +../IVAS_dec -fr 5 BINAURAL_ROOM_IR 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC_binaural_room_fr5.tst + +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, with headtracking, BINAURAL out, fr 5ms +../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit +../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_ht_fr5.tst + +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms +../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit +../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural_ht_fr5.tst // Multi-channel 5_1_2 at 32 kbps, 48kHz in, 48kHz out, STEREO out, random FER at 5% ../IVAS_cod -mc 5_1_2 32000 48 testv/stv512MC48c.wav bit @@ -1254,6 +1304,21 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_sw_48-48_BINAURAL.tst +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out (Model from file) +../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_ROOM_IR 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst + +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 32kHz out, BINAURAL out (Model from file) +../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv714MC48c.wav_MC714_512000_48-32_MC_binaural.tst + +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) +../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural.tst + +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out (Model from file) +../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_IR 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst @@ -1282,6 +1347,10 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP HOA3 32 netsimoutput testv/stv3OA32c.wav_SBA_80000_32-32_HOA3_JBM5.tst +// SBA at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, JBM Prof 5 +../IVAS_cod -sba 1 13200 48 testv/stvFOA48c.wav bit +networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 +../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stvFOA32c.wav_SBA_13200_48-48_BINAURAL_JBM5.tst // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out, 7_1_4 out, JBM Prof 5 ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit @@ -1551,6 +1620,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 4 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_4ISM_3OA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvOSBA_4ISM_3OA48c.wav_BINAURAL_sw_13k2_512k_48-48.tst +// OSBA 3OA 2ISM at 256 kbps, 32kHz in, 32kHz out, HOA3 out +../IVAS_cod -ism_sba 2 3 testv/stvISM1.csv testv/stvISM2.csv 256000 32 testv/stvOSBA_2ISM_3OA32c.wav bit +../IVAS_dec HOA3 32 bit testv/stvOSBA_2ISM_3OA32c.wav_HOA3_256000_32-32.tst // OSBA 2OA 3ISM at 384 kbps, 16kHz in, 16kHz out, MONO out ../IVAS_cod -ism_sba 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 384000 16 testv/stvOSBA_3ISM_2OA16c.wav bit @@ -1569,4 +1641,19 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 48 bit_error testv/stvOSBA_4ISM_FOA48c.wav_BINAURAL_sw_48-48_FER5.tst +// OSBA 3ISM 2OA at bitrate switching 13.2 to 512 kbps, 48kHz in, 32kHz out, STEREO out, FER at 10% +../IVAS_cod -ism_sba 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_3ISM_2OA48c.wav bit +eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g192 bit_error +../IVAS_dec STEREO 32 bit_error testv/stvOSBA_3ISM_2OA48c.wav_STEREO_sw_48-32_FER10.tst + +// OSBA planar FOA 1ISM at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out +../IVAS_cod -ism_sba 1 -1 testv/stvISM1.csv 256000 48 testv/stvOSBA_1ISM_FOA48c.wav bit +../IVAS_dec BINAURAL 48 bit testv/stvOSBA_1ISM_pFOA48c.wav_BINAURAL_256000_48-48.tst + +// OSBA planar FOA 2ISM at 512 kbps, 48 kHz in, 48 kHz out, BINAURAL out +../IVAS_cod -ism_sba 2 -1 testv/stvISM1.csv testv/stvISM2.csv 512000 48 testv/stvOSBA_2ISM_FOA48c.wav bit +../IVAS_dec BINAURAL 48 bit testv/stvOSBA_2ISM_pFOA48c.wav_BINAURAL_512000_48-48.tst +// OSBA planar 3OA 4ISM at 512 kbps, 48 kHz in, 48 kHz out, BINAURAL out +../IVAS_cod -ism_sba 4 -3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stvOSBA_4ISM_3OA48c.wav bit +../IVAS_dec BINAURAL 48 bit testv/stvOSBA_4ISM_p3OA48c.wav_BINAURAL_512000_48-48.tst diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index af6d9cb86e..0614651653 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -139,8 +139,8 @@ def test_masa_enc_dec( check_and_makedir(out_dir_dec_output_dut) # To avoid conflicting names in case of parallel test execution, differentiate all cases - output_bitstream_ref = f"{out_dir_bs_ref}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.192" - output_bitstream_dut = f"{out_dir_bs_dut}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.192" + output_bitstream_ref = f"{out_dir_bs_ref}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.bts" + output_bitstream_dut = f"{out_dir_bs_dut}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.bts" dec_output_ref = f"{out_dir_dec_output_ref}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.wav" dec_output_dut = f"{out_dir_dec_output_dut}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.wav" if output_mode == "EXT": diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py index 528f6b5d2f..422f87d9c7 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py @@ -157,14 +157,14 @@ def sba_dec_plc( check_and_makedir(ref_out_dir) plc_file = f"{test_vector_path}/{plc_pattern}.g192" - ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}.192" - ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_dutenc.192" + ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}.pkt" + ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_dutenc.pkt" if SID == 1: - ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_cut.192" - ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_dutenc_cut.192" + ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_cut.pkt" + ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_dutenc_cut.pkt" - dut_out_raw = f"{dut_out_dir}/{plc_tag_out}.wav" - ref_out_raw = f"{ref_out_dir}/{plc_tag_out}.wav" + dut_out_raw = f"{dut_out_dir}/{plc_tag_out}.raw" + ref_out_raw = f"{ref_out_dir}/{plc_tag_out}.raw" output_config = "FOA" if ref_decoder_path: diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index a75c1ed7e9..3e84e6b283 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -85,6 +85,72 @@ def check_and_makedir(dir_path): raise # raises the error again +@pytest.mark.create_ref +@pytest.mark.parametrize("tag", tag_list) +@pytest.mark.parametrize("fs", sample_rate_list) +def test_pca_enc( + dut_encoder_frontend: EncoderFrontend, + dut_decoder_frontend: DecoderFrontend, + test_vector_path, + reference_path, + dut_base_path, + ref_encoder_frontend, + ref_decoder_frontend, + update_ref, + keep_files, + tag, + fs, + get_mld, +): + pca = True + tag = tag + fs + "c" + ivas_br = "256000" + dtx = "0" + max_bw = "FB" + gain_flag = -1 + sba_order = "+1" + output_config = "FOA" + + # enc + sba_enc( + dut_encoder_frontend, + test_vector_path, + ref_encoder_frontend, + reference_path, + dut_base_path, + None, + tag, + fs, + ivas_br, + dtx, + None, + max_bw, + sba_order, + update_ref, + gain_flag, + cut_testv=True, + pca=pca, + ) + + # dec + sba_dec( + dut_decoder_frontend, + ref_decoder_frontend, + reference_path, + dut_base_path, + tag, + fs, + ivas_br, + dtx, + None, + max_bw, + output_config, + update_ref, + gain_flag, + keep_files, + get_mld=get_mld, + pca=pca, + ) @pytest.mark.create_ref @@ -438,14 +504,14 @@ def sba_enc( long_tag_ext += f"_Gain{gain_flag}" if SID == 1: long_tag_ext += f"_SID" - dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.192" - ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.192" - ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.192" + dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.pkt" + ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.pkt" + ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.pkt" if SID == 1: - dut_pkt_file_cut = f"{dut_out_dir}/{tag_out}{long_tag_ext}_cut.192" - ref_pkt_file_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_cut.192" + dut_pkt_file_cut = f"{dut_out_dir}/{tag_out}{long_tag_ext}_cut.pkt" + ref_pkt_file_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_cut.pkt" ref_pkt_file_dutenc_cut = ( - f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc_cut.192" + f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc_cut.pkt" ) input_path = f"{test_vector_path}/{tag_in}{in_extension}" dtx_mode = dtx == "1" @@ -518,13 +584,13 @@ def sba_enc( with open(ref_pkt_file_dutenc, "rb") as fp_in: with open(ref_pkt_file_dutenc_cut, "wb") as fp_out: fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True) - #os.remove(ref_pkt_file) - #os.remove(ref_pkt_file_dutenc) + os.remove(ref_pkt_file) + os.remove(ref_pkt_file_dutenc) if update_ref == 0: with open(dut_pkt_file, "rb") as fp_in: with open(dut_pkt_file_cut, "wb") as fp_out: fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True) - #os.remove(dut_pkt_file) + os.remove(dut_pkt_file) def sba_dec( @@ -569,11 +635,11 @@ def sba_dec( dut_out_dir = f"{dut_base_path}/sba_bs/raw" ref_out_dir = f"{reference_path}/sba_bs/raw" - dut_in_pkt = f"{dut_base_path}/sba_bs/pkt/{tag_out}{long_tag_ext}.192" - ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}{short_tag_ext}.192" + dut_in_pkt = f"{dut_base_path}/sba_bs/pkt/{tag_out}{long_tag_ext}.pkt" + ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}{short_tag_ext}.pkt" - dut_out_raw = f"{dut_out_dir}/{tag_out}{long_tag_ext}.wav" - ref_out_raw = f"{ref_out_dir}/{tag_out}{short_tag_ext}.wav" + dut_out_raw = f"{dut_out_dir}/{tag_out}{long_tag_ext}.raw" + ref_out_raw = f"{ref_out_dir}/{tag_out}{short_tag_ext}.raw" check_and_makedir(dut_out_dir) check_and_makedir(ref_out_dir) @@ -602,3 +668,7 @@ def sba_dec( # report compare result assert cmp_result == 0, reason + # remove DUT output files when test result is OK (to save disk space) + if not keep_files: + os.remove(dut_in_pkt) + os.remove(dut_out_raw) diff --git a/tests/conftest.py b/tests/conftest.py index a542b12ff1..5f7ed04a82 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -255,7 +255,7 @@ class EncoderFrontend: command.extend(["-max_band", max_band]) if pca: - command.extend(["-bypass 2"]) + command.extend(["-pca"]) if quiet_mode: command.extend(["-q"]) @@ -435,7 +435,7 @@ class DecoderFrontend: eid_command = [eid_path] eid_command.extend(["-fer", "-vbr", "-bs", "g192", "-ep", "g192"]) - eid_output_suffix = "." + os.path.basename(plc_file) + ".fer" + eid_output_suffix = "." + next(tempfile._get_candidate_names()) + ".fer" eid_command += [ str(input_bitstream_path), str(plc_file), diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py index 09fc0d74bb..056242bd3c 100644 --- a/tests/renderer/constants.py +++ b/tests/renderer/constants.py @@ -192,7 +192,7 @@ FORMAT_TO_METADATA_FILES = { INPUT_FORMATS_AMBI = ["FOA", "HOA2", "HOA3"] INPUT_FORMATS_MC = ["MONO", "STEREO", "5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] INPUT_FORMATS_ISM = ["ISM1", "ISM2", "ISM3", "ISM4"] -INPUT_FORMATS_MASA = ["MASA2"] +INPUT_FORMATS_MASA = ["MASA1", "MASA2"] """ Non binaural / parametric output formats """ OUTPUT_FORMATS = [ diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index e481818045..1ddba22695 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -55,6 +55,32 @@ def test_ambisonics(test_info, in_fmt, out_fmt, frame_size): ) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_ambisonics_binaural_static(test_info, in_fmt, out_fmt, frame_size): + run_renderer( + test_info, + in_fmt, + out_fmt, + frame_size=frame_size, + ) + + +@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_ambisonics_binaural_headrotation( + test_info, in_fmt, out_fmt, trj_file, frame_size +): + run_renderer( + test_info, + in_fmt, + out_fmt, + trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), + frame_size=frame_size, + ) """ Multichannel """ @@ -72,6 +98,38 @@ def test_multichannel(test_info, in_fmt, out_fmt, frame_size): ) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, frame_size): + if in_fmt in ["MONO", "STEREO"]: + pytest.skip("MONO or STEREO to Binaural rendering unsupported") + + run_renderer( + test_info, + in_fmt, + out_fmt, + frame_size=frame_size, + ) + + +@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_multichannel_binaural_headrotation( + test_info, in_fmt, out_fmt, trj_file, frame_size +): + if in_fmt in ["MONO", "STEREO"]: + pytest.skip("MONO or STEREO to Binaural rendering unsupported") + + run_renderer( + test_info, + in_fmt, + out_fmt, + trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), + frame_size=frame_size, + ) """ ISM """ @@ -90,6 +148,42 @@ def test_ism(test_info, in_fmt, out_fmt, frame_size): ) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_ism_binaural_static(test_info, in_fmt, out_fmt, frame_size): + try: + in_meta_files = FORMAT_TO_METADATA_FILES[in_fmt] + except KeyError: + in_meta_files = None + + run_renderer( + test_info, + in_fmt, + out_fmt, + in_meta_files=in_meta_files, + frame_size=frame_size, + ) + + +@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_ism_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file, frame_size): + try: + in_meta_files = FORMAT_TO_METADATA_FILES[in_fmt] + except KeyError: + in_meta_files = None + + run_renderer( + test_info, + in_fmt, + out_fmt, + trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), + in_meta_files=in_meta_files, + frame_size=frame_size, + ) """ MASA """ @@ -108,8 +202,48 @@ def test_masa(test_info, in_fmt, out_fmt, frame_size): ) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_masa_binaural_static(test_info, in_fmt, out_fmt, frame_size): + if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: + pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") + + run_renderer( + test_info, + in_fmt, + out_fmt, + in_meta_files=FORMAT_TO_METADATA_FILES[in_fmt], + frame_size=frame_size, + ) + + +@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_masa_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file, frame_size): + if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: + pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") + + run_renderer( + test_info, + in_fmt, + out_fmt, + trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), + in_meta_files=FORMAT_TO_METADATA_FILES[in_fmt], + frame_size=frame_size, + ) +@pytest.mark.parametrize("in_fmt", METADATA_SCENES_TO_TEST_MASA_PREREND) +def test_masa_prerend(test_info, in_fmt): + run_renderer( + test_info, + "META", + "MASA2", + metadata_input=TEST_VECTOR_DIR.joinpath(f"{in_fmt}.txt"), + ) """ Custom loudspeaker layouts """ @@ -147,6 +281,32 @@ def test_custom_ls_input_output(test_info, in_fmt, out_fmt): ) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_layout", CUSTOM_LS_TO_TEST) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_custom_ls_input_binaural(test_info, in_layout, out_fmt, frame_size): + run_renderer( + test_info, + CUSTOM_LAYOUT_DIR.joinpath(f"{in_layout}.txt"), + out_fmt, + frame_size=frame_size, + ) + + +@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) +@pytest.mark.parametrize("in_layout", CUSTOM_LS_TO_TEST) +@pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) +def test_custom_ls_input_binaural_headrotation( + test_info, in_layout, out_fmt, trj_file, frame_size +): + run_renderer( + test_info, + CUSTOM_LAYOUT_DIR.joinpath(f"{in_layout}.txt"), + out_fmt, + trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), + frame_size=frame_size, + ) """ Metadata / scene description input """ diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index e4ab74683b..5f724e16de 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -184,7 +184,7 @@ def run_renderer( cmd[5:5] = ["-im", *in_meta_files] if trj_file is not None: - cmd.extend(["-tf", str(trj_file)]) + cmd.extend(["-T", str(trj_file)]) if non_diegetic_pan is not None: cmd.extend(["-non_diegetic_pan", str(non_diegetic_pan)]) @@ -203,6 +203,8 @@ def run_renderer( if config_file is not None: cmd.extend(["-render_config", str(config_file)]) + if frame_size: + cmd.extend(["-fr", str(frame_size.replace("ms", ""))]) # Set env variables for UBSAN env = os.environ.copy() -- GitLab From 4f658bde6a8fcb1f77232ea2f5d2f284604b9562 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 14:16:44 +0100 Subject: [PATCH 123/601] Fixes --- conformance-test/test_26252.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index c0b8795e68..1c148bcc72 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -82,8 +82,8 @@ for s in scripts: if line.startswith("$CUT_REND_BIN"): rend_opts = line if line.startswith("$DIFF_BIN"): - diff_opts = line[9:] - tag = s + "--" + diff_opts.split()[1].split('/')[-1] + diff_opts = line + tag = s + "--" + diff_opts.split()[2].split('/')[-1] if tag in test_dict: print("non-unique tag found - ignoring new entry") continue @@ -115,7 +115,7 @@ def test_26252(test_tag, encoder_path, decoder_path, renderer_path): diff_opts = replace_paths(diff_opts, testv_path, ref_path, cut_path) result = True for cmd in diff_opts.split(';'): - result = result and filecmp.cmp(cmd.split()[0], cmd.split()[1]) + result = result and filecmp.cmp(cmd.split()[1], cmd.split()[2]) if not result: assert False, "Output differs" -- GitLab From 09659a8c6ed70432059326ee7516ed05a33a2c7d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 15:16:31 +0100 Subject: [PATCH 124/601] Fixes in parse_commands.py --- .gitlab-ci.yml | 3 ++- conformance-test/test_26252.py | 2 +- parse_commands.py | 12 ++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4dc8510015..d358f707e5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1288,7 +1288,7 @@ ivas-conformance: - cp -r tests/renderer/data testvec/testv/renderer/data - cp -r tests/renderer/cut testvec/testv/renderer/ref - cp -r conformance-test testvec/ - - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt Readme_IVAS_jbm.txt testvec + - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt Readme_IVAS_JBM_dec.txt testvec - cp IVAS_cod IVAS_dec IVAS_rend testvec/bin # Test run generated scripts in testvec @@ -1311,6 +1311,7 @@ ivas-conformance: - Readme_IVAS_dec.txt - Readme_IVAS_enc.txt - Readme_IVAS_rend.txt + - Readme_IVAS_JBM_dec.txt expose_as: "Draft IVAS conformance" reports: junit: report-junit.xml diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 1c148bcc72..9e22ddf0a9 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -53,7 +53,7 @@ def replace_paths(instr, testv_path, ref_path, cut_path): test_dict = {} TEST_DIR = "." -scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt", "Readme_IVAS_jbm.txt"] +scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt", "Readme_IVAS_JBM_dec.txt"] for s in scripts: with open(os.path.join(TEST_DIR, s), "r", encoding="UTF-8") as fp: diff --git a/parse_commands.py b/parse_commands.py index 4defd5faf4..fe3d165c1a 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -57,25 +57,25 @@ if __name__ == '__main__': with open('script_footer.txt','r') as footer: outfile.write(footer.read()) - with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile_dec, open(txt_file.replace('.','_jbm.'),'w', newline='\n') as outfile_jbm: + with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile_dec, open(txt_file.replace('.','_JBM_dec.'),'w', newline='\n') as outfile_jbm: with open('dec_header.txt','r') as header: outfile_dec.write(header.read()) with open('jbm_header.txt','r') as header: outfile_jbm.write(header.read()) for cmd in cmds_dec: - absolute_out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) + absolute_out = re.search(r"\s(([\S]+)(.wav))$", cmd) arg1 = cmd.split()[0] root_folder = arg1[0:arg1.find("ivas-codec/")+10] cmd = cmd.replace(root_folder + r'/IVAS_dec', '$CUT_DEC_BIN') cmd = cmd.replace(r'\\', '/') + cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) + cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths inputs = cmd.count(root_folder) - 1 if ".fer " in cmd: cmd = cmd.replace(root_folder + r'/tests/ref', REF_PATH + r'ref', 1) else: cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', inputs) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) - cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) - cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths if 'VOIP' in cmd: outfile = outfile_jbm @@ -84,14 +84,14 @@ if __name__ == '__main__': if not "pca" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd: outfile.write(cmd+'\n') - out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) + out = re.search(r"\s(([\S]+)(.wav))$", cmd) if out: diff_cmds=[] for output in glob.glob(absolute_out.group(1) + '*'): output = output.replace(root_folder + r'/tests/', CUT_PATH) diff_cmds.append('$DIFF_BIN '+output.replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+output+' >> $LOG_FILE 2>&1') outfile.write(('; ').join(diff_cmds)) - outfile.write('\n') + outfile.write('\n\n') with open('script_footer.txt','r') as footer: outfile_dec.write(footer.read()) footer.seek(0) -- GitLab From 98ecfc53f1f1bddbacaa35003cab1a49a40460e7 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 20:22:45 +0100 Subject: [PATCH 125/601] Use os.remove/os.mkdirs instead of bash rm/mkdir --- conformance-test/test_26252.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 9e22ddf0a9..3e6a30ff1e 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -95,7 +95,13 @@ for s in scripts: diff_opts = "" for proc in preproc: proc = replace_paths(proc, testv_path, ref_path, cut_path) - subprocess.run(proc.split()) + if 'rm' in proc: + path = proc.split()[-1] + if os.path.exists(path): os.remove(path) + if 'mkdir' in proc: + path = proc.split()[-1] + os.mkdirs(path) + @pytest.mark.parametrize("test_tag", list(test_dict.keys())) def test_26252(test_tag, encoder_path, decoder_path, renderer_path): -- GitLab From 3ffdb45020fefc8db630126c16088490624a2953 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 20:29:53 +0100 Subject: [PATCH 126/601] Use os.remove/os.makedirs instead of bash rm/mkdir --- conformance-test/test_26252.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 3e6a30ff1e..4c6549186d 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -100,7 +100,7 @@ for s in scripts: if os.path.exists(path): os.remove(path) if 'mkdir' in proc: path = proc.split()[-1] - os.mkdirs(path) + os.makedirs(path) @pytest.mark.parametrize("test_tag", list(test_dict.keys())) -- GitLab From 8a3767a411a492c04bf9af8bd041d8e95b10ef23 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 26 Jan 2024 20:40:32 +0100 Subject: [PATCH 127/601] Fix --- conformance-test/test_26252.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 4c6549186d..dffe565ebf 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -33,6 +33,7 @@ Execute tests specified via a parameter file. """ import os +import shutil from pathlib import Path import filecmp import subprocess @@ -97,7 +98,7 @@ for s in scripts: proc = replace_paths(proc, testv_path, ref_path, cut_path) if 'rm' in proc: path = proc.split()[-1] - if os.path.exists(path): os.remove(path) + if os.path.exists(path): shutil.rmtree(path) if 'mkdir' in proc: path = proc.split()[-1] os.makedirs(path) -- GitLab From 31d4ac312ea7d0df5fcac7c323bc75f7d40732bb Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Fri, 26 Jan 2024 19:50:11 +0000 Subject: [PATCH 128/601] Revert "Fixes in parse_commands.py" This reverts commit 09659a8c6ed70432059326ee7516ed05a33a2c7d --- .gitlab-ci.yml | 3 +-- conformance-test/test_26252.py | 2 +- parse_commands.py | 12 ++++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d358f707e5..4dc8510015 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1288,7 +1288,7 @@ ivas-conformance: - cp -r tests/renderer/data testvec/testv/renderer/data - cp -r tests/renderer/cut testvec/testv/renderer/ref - cp -r conformance-test testvec/ - - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt Readme_IVAS_JBM_dec.txt testvec + - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt Readme_IVAS_jbm.txt testvec - cp IVAS_cod IVAS_dec IVAS_rend testvec/bin # Test run generated scripts in testvec @@ -1311,7 +1311,6 @@ ivas-conformance: - Readme_IVAS_dec.txt - Readme_IVAS_enc.txt - Readme_IVAS_rend.txt - - Readme_IVAS_JBM_dec.txt expose_as: "Draft IVAS conformance" reports: junit: report-junit.xml diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index dffe565ebf..47c3e10b4c 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -54,7 +54,7 @@ def replace_paths(instr, testv_path, ref_path, cut_path): test_dict = {} TEST_DIR = "." -scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt", "Readme_IVAS_JBM_dec.txt"] +scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt", "Readme_IVAS_jbm.txt"] for s in scripts: with open(os.path.join(TEST_DIR, s), "r", encoding="UTF-8") as fp: diff --git a/parse_commands.py b/parse_commands.py index fe3d165c1a..4defd5faf4 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -57,25 +57,25 @@ if __name__ == '__main__': with open('script_footer.txt','r') as footer: outfile.write(footer.read()) - with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile_dec, open(txt_file.replace('.','_JBM_dec.'),'w', newline='\n') as outfile_jbm: + with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile_dec, open(txt_file.replace('.','_jbm.'),'w', newline='\n') as outfile_jbm: with open('dec_header.txt','r') as header: outfile_dec.write(header.read()) with open('jbm_header.txt','r') as header: outfile_jbm.write(header.read()) for cmd in cmds_dec: - absolute_out = re.search(r"\s(([\S]+)(.wav))$", cmd) + absolute_out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) arg1 = cmd.split()[0] root_folder = arg1[0:arg1.find("ivas-codec/")+10] cmd = cmd.replace(root_folder + r'/IVAS_dec', '$CUT_DEC_BIN') cmd = cmd.replace(r'\\', '/') - cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) - cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths inputs = cmd.count(root_folder) - 1 if ".fer " in cmd: cmd = cmd.replace(root_folder + r'/tests/ref', REF_PATH + r'ref', 1) else: cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', inputs) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) + cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) + cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths if 'VOIP' in cmd: outfile = outfile_jbm @@ -84,14 +84,14 @@ if __name__ == '__main__': if not "pca" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd: outfile.write(cmd+'\n') - out = re.search(r"\s(([\S]+)(.wav))$", cmd) + out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) if out: diff_cmds=[] for output in glob.glob(absolute_out.group(1) + '*'): output = output.replace(root_folder + r'/tests/', CUT_PATH) diff_cmds.append('$DIFF_BIN '+output.replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+output+' >> $LOG_FILE 2>&1') outfile.write(('; ').join(diff_cmds)) - outfile.write('\n\n') + outfile.write('\n') with open('script_footer.txt','r') as footer: outfile_dec.write(footer.read()) footer.seek(0) -- GitLab From 2a5ffa69a7c7e1c0010a74a236becce72b0f9a82 Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Fri, 26 Jan 2024 19:54:00 +0000 Subject: [PATCH 129/601] Add report for first pytest reference creation. --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4dc8510015..5bad7bb4c5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1267,7 +1267,7 @@ ivas-conformance: - non_be_flag=0 - exit_code=0 - python3 tests/create_short_testvectors.py - - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref || exit_code=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref --html=report1.html --self-contained-html || exit_code=$? - python3 -m pytest tests/codec_be_on_mr_nonselection/ -v -n auto --update_ref 1 -m create_ref_part2 || exit_code=$? - python3 -m pytest tests/renderer/test_renderer.py --create_ref || exit_code=$? @@ -1306,6 +1306,7 @@ ivas-conformance: when: always paths: - report-junit.xml + - report1.html - report_cmd.html - report.html - Readme_IVAS_dec.txt -- GitLab From 55be30e053be87afd6a51dd1307413a39e07e2c5 Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Fri, 26 Jan 2024 20:08:34 +0000 Subject: [PATCH 130/601] Revert "Revert "Fixes in parse_commands.py"" This reverts commit 31d4ac312ea7d0df5fcac7c323bc75f7d40732bb --- .gitlab-ci.yml | 3 ++- conformance-test/test_26252.py | 2 +- parse_commands.py | 12 ++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5bad7bb4c5..6863d34e18 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1288,7 +1288,7 @@ ivas-conformance: - cp -r tests/renderer/data testvec/testv/renderer/data - cp -r tests/renderer/cut testvec/testv/renderer/ref - cp -r conformance-test testvec/ - - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt Readme_IVAS_jbm.txt testvec + - cp Readme_IVAS_dec.txt Readme_IVAS_enc.txt Readme_IVAS_rend.txt Readme_IVAS_JBM_dec.txt testvec - cp IVAS_cod IVAS_dec IVAS_rend testvec/bin # Test run generated scripts in testvec @@ -1312,6 +1312,7 @@ ivas-conformance: - Readme_IVAS_dec.txt - Readme_IVAS_enc.txt - Readme_IVAS_rend.txt + - Readme_IVAS_JBM_dec.txt expose_as: "Draft IVAS conformance" reports: junit: report-junit.xml diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 47c3e10b4c..dffe565ebf 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -54,7 +54,7 @@ def replace_paths(instr, testv_path, ref_path, cut_path): test_dict = {} TEST_DIR = "." -scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt", "Readme_IVAS_jbm.txt"] +scripts=["Readme_IVAS_enc.txt", "Readme_IVAS_dec.txt", "Readme_IVAS_rend.txt", "Readme_IVAS_JBM_dec.txt"] for s in scripts: with open(os.path.join(TEST_DIR, s), "r", encoding="UTF-8") as fp: diff --git a/parse_commands.py b/parse_commands.py index 4defd5faf4..fe3d165c1a 100644 --- a/parse_commands.py +++ b/parse_commands.py @@ -57,25 +57,25 @@ if __name__ == '__main__': with open('script_footer.txt','r') as footer: outfile.write(footer.read()) - with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile_dec, open(txt_file.replace('.','_jbm.'),'w', newline='\n') as outfile_jbm: + with open(txt_file.replace('.','_dec.'),'w', newline='\n') as outfile_dec, open(txt_file.replace('.','_JBM_dec.'),'w', newline='\n') as outfile_jbm: with open('dec_header.txt','r') as header: outfile_dec.write(header.read()) with open('jbm_header.txt','r') as header: outfile_jbm.write(header.read()) for cmd in cmds_dec: - absolute_out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) + absolute_out = re.search(r"\s(([\S]+)(.wav))$", cmd) arg1 = cmd.split()[0] root_folder = arg1[0:arg1.find("ivas-codec/")+10] cmd = cmd.replace(root_folder + r'/IVAS_dec', '$CUT_DEC_BIN') cmd = cmd.replace(r'\\', '/') + cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) + cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths inputs = cmd.count(root_folder) - 1 if ".fer " in cmd: cmd = cmd.replace(root_folder + r'/tests/ref', REF_PATH + r'ref', 1) else: cmd = cmd.replace(root_folder + r'/tests/dut', REF_PATH + r'ref', inputs) cmd = cmd.replace(root_folder + r'/tests/', CUT_PATH) - cmd = cmd.replace(root_folder + r'/scripts/', TESTV_PATH) - cmd = cmd.replace('scripts/', TESTV_PATH) # To catch relative paths if 'VOIP' in cmd: outfile = outfile_jbm @@ -84,14 +84,14 @@ if __name__ == '__main__': if not "pca" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd and not "stvFOA32c4chn_0.004.wav" in cmd: outfile.write(cmd+'\n') - out = re.search(r"\s(([\S]+)(.wav|.raw|.pcm))$", cmd) + out = re.search(r"\s(([\S]+)(.wav))$", cmd) if out: diff_cmds=[] for output in glob.glob(absolute_out.group(1) + '*'): output = output.replace(root_folder + r'/tests/', CUT_PATH) diff_cmds.append('$DIFF_BIN '+output.replace(CUT_PATH + r'dut',REF_PATH + r'ref')+' '+output+' >> $LOG_FILE 2>&1') outfile.write(('; ').join(diff_cmds)) - outfile.write('\n') + outfile.write('\n\n') with open('script_footer.txt','r') as footer: outfile_dec.write(footer.read()) footer.seek(0) -- GitLab From bb1b122a68df5b2a399bdd6aa5e8212d03f772b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Toftg=C3=A5rd?= Date: Fri, 26 Jan 2024 21:17:27 +0100 Subject: [PATCH 131/601] Revert 98ecfc53 --- conformance-test/test_26252.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index dffe565ebf..88e90b1c97 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -96,13 +96,7 @@ for s in scripts: diff_opts = "" for proc in preproc: proc = replace_paths(proc, testv_path, ref_path, cut_path) - if 'rm' in proc: - path = proc.split()[-1] - if os.path.exists(path): shutil.rmtree(path) - if 'mkdir' in proc: - path = proc.split()[-1] - os.makedirs(path) - + subprocess.run(proc.split()) @pytest.mark.parametrize("test_tag", list(test_dict.keys())) def test_26252(test_tag, encoder_path, decoder_path, renderer_path): -- GitLab From 74ec28974932b2400d370d2e3205fbe4b19de80f Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Sat, 27 Jan 2024 00:33:23 +0000 Subject: [PATCH 132/601] Fix for testv_file parsing for linux --- tests/codec_be_on_mr_nonselection/test_param_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codec_be_on_mr_nonselection/test_param_file.py b/tests/codec_be_on_mr_nonselection/test_param_file.py index 1dfda043d7..2a796488f7 100644 --- a/tests/codec_be_on_mr_nonselection/test_param_file.py +++ b/tests/codec_be_on_mr_nonselection/test_param_file.py @@ -163,7 +163,7 @@ def test_param_file_tests( not bitrate.isdigit() and "-dtx" in enc_split and "-sba" in enc_split - and testv_file.split("/")[1].startswith("stv") + and testv_file.split("/")[test_vector_path.count("/")+1].startswith("stv") ): sba_br_switching_dtx = 1 cut_file = pre_proc_input(testv_file, fs) -- GitLab From 29179c1c03f3600bec67bf96761c5ce5d83d7655 Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Sat, 27 Jan 2024 00:59:30 +0000 Subject: [PATCH 133/601] Disable removal of files also for test_param_file.py --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6863d34e18..9b9ba87804 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1245,6 +1245,7 @@ ivas-conformance: - sed -i '88,153d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Disable removal of output bitstreams - sed -i 's/os.remove/#os.remove/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py + - sed -i 's/os.remove/#os.remove/g' tests/codec_be_on_mr_nonselection/test_param_file.py - sed -i '605,608d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Remove binaural renderer tests - sed -i '276,301d' tests/renderer/test_renderer.py -- GitLab From 3d38635e34df5219a9bf3c3072554050188a6c7b Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Sat, 27 Jan 2024 02:18:33 +0000 Subject: [PATCH 134/601] Update os.remove code --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9b9ba87804..9980b981f7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1245,7 +1245,7 @@ ivas-conformance: - sed -i '88,153d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Disable removal of output bitstreams - sed -i 's/os.remove/#os.remove/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py - - sed -i 's/os.remove/#os.remove/g' tests/codec_be_on_mr_nonselection/test_param_file.py + - sed -i 's/os.remove/#os.remove print()/g' tests/codec_be_on_mr_nonselection/test_param_file.py - sed -i '605,608d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Remove binaural renderer tests - sed -i '276,301d' tests/renderer/test_renderer.py -- GitLab From cc69760ba1b06f58481ea350fc23ca6768e796ab Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Sat, 27 Jan 2024 02:25:10 +0000 Subject: [PATCH 135/601] Change sed for os.remove --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9980b981f7..0e5bc3f00c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1245,7 +1245,7 @@ ivas-conformance: - sed -i '88,153d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Disable removal of output bitstreams - sed -i 's/os.remove/#os.remove/g' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py - - sed -i 's/os.remove/#os.remove print()/g' tests/codec_be_on_mr_nonselection/test_param_file.py + - sed -i 's/os.remove/print()#os.remove/g' tests/codec_be_on_mr_nonselection/test_param_file.py - sed -i '605,608d' tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py # Remove binaural renderer tests - sed -i '276,301d' tests/renderer/test_renderer.py -- GitLab From c5879a977f60b08fe140dd33a710a3a4bf36875c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sat, 27 Jan 2024 10:17:11 +0100 Subject: [PATCH 136/601] New attempt: remove rm/mkdir --- conformance-test/test_26252.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index 88e90b1c97..ea69261a0c 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -96,7 +96,12 @@ for s in scripts: diff_opts = "" for proc in preproc: proc = replace_paths(proc, testv_path, ref_path, cut_path) - subprocess.run(proc.split()) + path_arg = proc.split()[-1] + if "rm" in proc: + if os.path.exists(path_arg) + shutil.rmtree(path_arg) + if "mkdir" in proc: + Path(path_arg).mkdir(parents=True, exist_ok=True) @pytest.mark.parametrize("test_tag", list(test_dict.keys())) def test_26252(test_tag, encoder_path, decoder_path, renderer_path): -- GitLab From e27248624ac79bc8591eeba26847f7d5a8068f93 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sat, 27 Jan 2024 10:22:46 +0100 Subject: [PATCH 137/601] Fix syntax error. Remove set -e from test scripts --- conformance-test/test_26252.py | 2 +- dec_header.txt | 1 - enc_header.txt | 1 - jbm_header.txt | 1 - rend_header.txt | 1 - 5 files changed, 1 insertion(+), 5 deletions(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index ea69261a0c..b620f15209 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -98,7 +98,7 @@ for s in scripts: proc = replace_paths(proc, testv_path, ref_path, cut_path) path_arg = proc.split()[-1] if "rm" in proc: - if os.path.exists(path_arg) + if os.path.exists(path_arg): shutil.rmtree(path_arg) if "mkdir" in proc: Path(path_arg).mkdir(parents=True, exist_ok=True) diff --git a/dec_header.txt b/dec_header.txt index 6d7efe2d83..110d7429a7 100644 --- a/dec_header.txt +++ b/dec_header.txt @@ -1,5 +1,4 @@ #!/usr/bin/env bash -set -e if [ "$#" -ne 1 ]; then echo "Usage: $0 " diff --git a/enc_header.txt b/enc_header.txt index fba31ea826..4f193b17c8 100644 --- a/enc_header.txt +++ b/enc_header.txt @@ -1,5 +1,4 @@ #!/usr/bin/env bash -set -e if [ "$#" -ne 1 ]; then echo "Usage: $0 " diff --git a/jbm_header.txt b/jbm_header.txt index 466c82c654..e1c0168434 100644 --- a/jbm_header.txt +++ b/jbm_header.txt @@ -1,5 +1,4 @@ #!/usr/bin/env bash -set -e if [ "$#" -ne 1 ]; then echo "Usage: $0 " diff --git a/rend_header.txt b/rend_header.txt index f95fb2e534..4088ff0101 100644 --- a/rend_header.txt +++ b/rend_header.txt @@ -1,5 +1,4 @@ #!/usr/bin/env bash -set -e if [ "$#" -ne 1 ]; then echo "Usage: $0 " -- GitLab From fec68d5cd41c4bc31ab34c5c7bcc9ab7e0d9996b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sat, 27 Jan 2024 10:44:41 +0100 Subject: [PATCH 138/601] Fix rend_header.txt --- rend_header.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rend_header.txt b/rend_header.txt index 4088ff0101..f6fe7cbe02 100644 --- a/rend_header.txt +++ b/rend_header.txt @@ -14,6 +14,7 @@ CUT_PATH="./TMP_REND" LOG_FILE=Readme_IVAS_rend_log.txt rm -rf $CUT_PATH -mkdir -p $CUT_PATH/renderer/cut $CUT_PATH/renderer/data +mkdir -p $CUT_PATH/renderer/cut +mkdir -p $CUT_PATH/renderer/data -- GitLab From 7047e552b12a4c1e342cf43f86572913002c3105 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sat, 27 Jan 2024 11:08:26 +0100 Subject: [PATCH 139/601] Fixes for file removal on Windows --- conformance-test/test_26252.py | 7 ++++++- dec_header.txt | 1 + enc_header.txt | 1 + jbm_header.txt | 1 + rend_header.txt | 1 + 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/conformance-test/test_26252.py b/conformance-test/test_26252.py index b620f15209..d8796b5ae7 100644 --- a/conformance-test/test_26252.py +++ b/conformance-test/test_26252.py @@ -34,11 +34,16 @@ Execute tests specified via a parameter file. import os import shutil +import stat from pathlib import Path import filecmp import subprocess import pytest +def remove_readonly(func, path, excinfo): + os.chmod(path, stat.S_IWRITE) + func(path) + def replace_paths(instr, testv_path, ref_path, cut_path): outstr = instr tmp = testv_path.split('=') @@ -99,7 +104,7 @@ for s in scripts: path_arg = proc.split()[-1] if "rm" in proc: if os.path.exists(path_arg): - shutil.rmtree(path_arg) + shutil.rmtree(path_arg, onerror=remove_readonly) # Needed for folder tree removal on Windows. if "mkdir" in proc: Path(path_arg).mkdir(parents=True, exist_ok=True) diff --git a/dec_header.txt b/dec_header.txt index 110d7429a7..599c7e73ed 100644 --- a/dec_header.txt +++ b/dec_header.txt @@ -13,6 +13,7 @@ REF_PATH="./testv" CUT_PATH="./TMP_DEC" LOG_FILE=Readme_IVAS_dec_log.txt +rm -rf tmp rm -rf $CUT_PATH mkdir -p $CUT_PATH mkdir -p $CUT_PATH/dut/masa_test/dec_output diff --git a/enc_header.txt b/enc_header.txt index 4f193b17c8..18387a9326 100644 --- a/enc_header.txt +++ b/enc_header.txt @@ -13,6 +13,7 @@ REF_PATH="./testv" CUT_PATH="./TMP_ENC" LOG_FILE=Readme_IVAS_enc_log.txt +rm -rf tmp rm -rf $CUT_PATH mkdir -p $CUT_PATH mkdir -p $CUT_PATH/dut/masa_test/bitstreams diff --git a/jbm_header.txt b/jbm_header.txt index e1c0168434..d244c83b3f 100644 --- a/jbm_header.txt +++ b/jbm_header.txt @@ -13,6 +13,7 @@ REF_PATH="./testv" CUT_PATH="./TMP_JBM" LOG_FILE=Readme_IVAS_jbm_log.txt +rm -rf tmp rm -rf $CUT_PATH mkdir -p $CUT_PATH mkdir -p $CUT_PATH/dut/masa_test/dec_output diff --git a/rend_header.txt b/rend_header.txt index f6fe7cbe02..c56eb17cb0 100644 --- a/rend_header.txt +++ b/rend_header.txt @@ -13,6 +13,7 @@ REF_PATH="./testv" CUT_PATH="./TMP_REND" LOG_FILE=Readme_IVAS_rend_log.txt +rm -rf tmp rm -rf $CUT_PATH mkdir -p $CUT_PATH/renderer/cut mkdir -p $CUT_PATH/renderer/data -- GitLab From dc5cea9dffe26bf81dbcf3ec0c80679b6a7228ad Mon Sep 17 00:00:00 2001 From: janssontoftg Date: Sat, 27 Jan 2024 21:39:33 +0000 Subject: [PATCH 140/601] Changed version to 20230817_Final_Upd02_SA4#125_delivery --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0e5bc3f00c..3719b74169 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1207,7 +1207,7 @@ ivas-conformance: - *print-common-info # Prepare reference exec, use tests and scripts from reference - source_branch_commit_sha=$(git rev-parse HEAD) - - git checkout 20230815_RC02_SA4#125_delivery + - git checkout 20230817_Final_Upd02_SA4#125_delivery - sed -i".bak" "s/\(#define DEBUGGING\)/\/\/\1/" lib_com/options.h - make -j - cp IVAS_cod IVAS_cod_ref -- GitLab From afc77096f4896d1996188b826421fb8ffd1ecd70 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Mon, 29 Jan 2024 17:20:01 +0100 Subject: [PATCH 141/601] renamed define and aligned ivas-float negations to BASOP and ALT-BASOP --- lib_com/options.h | 2 +- lib_dec/pvq_core_dec.c | 25 +++++++++++++++++++++---- lib_enc/pvq_core_enc.c | 6 ++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8de27e096a..339c02c82e 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,7 +163,7 @@ #define FIX_955_FASTCONV_REND_IN_ISM /* VA: put FastConv rendering call under DEBUGGING */ -#define FIX_976_USAN_PVQ_DEC_OMASA /* Ericsson: premature cast to unsigned detected by USAN corrected */ +#define FIX_976_USAN_PVQ_ENC_DEC_EVS_CR /* Ericsson: premature cast to unsigned detected by USAN corrected */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/pvq_core_dec.c b/lib_dec/pvq_core_dec.c index fd212c3d49..01fd496fd0 100644 --- a/lib_dec/pvq_core_dec.c +++ b/lib_dec/pvq_core_dec.c @@ -98,6 +98,7 @@ static void pvq_decode_band( } set_s( g_part_s, -32768, Np ); + if ( Np > 1 ) { decode_energies( st, hPVQ, Np, dim_part, bits_part, g_part_s, band_bits_tot, bits_left, sfmsize, strict_bits ); @@ -112,11 +113,27 @@ static void pvq_decode_band( for ( j = 0; j < Np; j++ ) { - g_part[j] = -( (float) g_part_s[j] ) / 32768; - g_part_s[j] = -g_part_s[j]; + g_part[j] = -( (float) g_part_s[j] ) / 32768; +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR + /* note: here g_part_s needs to be become exactly 1.0(float) esp. for Np==1 , thus g_part_s was initilized to (int16_t) -32768 */ +#endif + + if ( g_part_s[j] == -32768 ) + { + printf( "\n Error negative mag negative int16_t . Np=%2d in split j=%2d \n", Np, j ); + } +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR + /* aligned to BASOP to avoid ASAN undefined negation issue with -(-32768) */ + g_part_s[j] = negate(g_part_s[j]); +#else + g_part_s[j] = -g_part_s[j]; +#endif } + srt_vec_ind( g_part_s, sg_part, idx_sort, Np ); + + for ( j = 0; j < Np; j++ ) { js = idx_sort[Np - 1 - j]; @@ -420,7 +437,7 @@ static void densitySymbolIndexDecode( { tot = res * ( res + 1 ) + 1; dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); -#ifdef FIX_976_USAN_PVQ_DEC_OMASA +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR alpha = (int16_t) floor_sqrt_exact( (uint32_t) ( ( res + 1 ) * ( res + 1 ) - dec_freq ) ) + res + 1; #else alpha = (int16_t) floor_sqrt_exact( (uint32_t) ( res + 1 ) * ( res + 1 ) - dec_freq ) + res + 1; @@ -442,7 +459,7 @@ static void densitySymbolIndexDecode( dec_freq = rc_decode( &st->BER_detect, hPVQ, tot ); if ( dec_freq < tot - ( res + 1 ) - ( res - ( c + 1 ) ) * ( res - c ) * c + c + 1 ) { -#ifdef FIX_976_USAN_PVQ_DEC_OMASA +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) ( res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) ) / ( 2 * res_c ); #else alpha = ( res_c - 1 + (int16_t) floor_sqrt_exact( (uint32_t) res_c * ( res_c + 4 * dec_freq - 2 ) + 1 ) ) / ( 2 * res_c ); diff --git a/lib_enc/pvq_core_enc.c b/lib_enc/pvq_core_enc.c index 5876c8b44a..7c90fb082f 100644 --- a/lib_enc/pvq_core_enc.c +++ b/lib_enc/pvq_core_enc.c @@ -124,7 +124,13 @@ static void pvq_encode_band( for ( j = 0; j < Np; j++ ) { g_part[j] = -( (float) g_part_s[j] ) / 32768; +#ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR + /* aligned to BASOP to avoid ASAN undefined negation issue with -(-32768) */ + g_part_s[j] = negate( g_part_s[j] ); +#else g_part_s[j] = -g_part_s[j]; +#endif + } srt_vec_ind( g_part_s, sg_part, idx_sort, Np ); -- GitLab From 208717bac26fefcd47e51ae3d31417174bdc37d9 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Mon, 29 Jan 2024 17:47:10 +0100 Subject: [PATCH 142/601] format fix --- lib_dec/pvq_core_dec.c | 12 ++++++------ lib_enc/pvq_core_enc.c | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/lib_dec/pvq_core_dec.c b/lib_dec/pvq_core_dec.c index 01fd496fd0..96aa2aaf5c 100644 --- a/lib_dec/pvq_core_dec.c +++ b/lib_dec/pvq_core_dec.c @@ -113,10 +113,10 @@ static void pvq_decode_band( for ( j = 0; j < Np; j++ ) { - g_part[j] = -( (float) g_part_s[j] ) / 32768; + g_part[j] = -( (float) g_part_s[j] ) / 32768; #ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR - /* note: here g_part_s needs to be become exactly 1.0(float) esp. for Np==1 , thus g_part_s was initilized to (int16_t) -32768 */ -#endif + /* note: here g_part_s needs to be become exactly 1.0(float) esp. for Np==1 , thus g_part_s was initilized to (int16_t) -32768 */ +#endif if ( g_part_s[j] == -32768 ) { @@ -124,10 +124,10 @@ static void pvq_decode_band( } #ifdef FIX_976_USAN_PVQ_ENC_DEC_EVS_CR /* aligned to BASOP to avoid ASAN undefined negation issue with -(-32768) */ - g_part_s[j] = negate(g_part_s[j]); + g_part_s[j] = negate( g_part_s[j] ); #else - g_part_s[j] = -g_part_s[j]; -#endif + g_part_s[j] = -g_part_s[j]; +#endif } diff --git a/lib_enc/pvq_core_enc.c b/lib_enc/pvq_core_enc.c index 7c90fb082f..d6671c4c97 100644 --- a/lib_enc/pvq_core_enc.c +++ b/lib_enc/pvq_core_enc.c @@ -129,8 +129,7 @@ static void pvq_encode_band( g_part_s[j] = negate( g_part_s[j] ); #else g_part_s[j] = -g_part_s[j]; -#endif - +#endif } srt_vec_ind( g_part_s, sg_part, idx_sort, Np ); -- GitLab From 44ca1b3215f3bf0cd8f9f03c92a7c853a0a57386 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 29 Jan 2024 18:11:40 +0100 Subject: [PATCH 143/601] change file collection --- ci/collect_artifacts.py | 29 +++++------------------------ ci/run_scheduled_sanitizer_test.py | 4 +--- 2 files changed, 6 insertions(+), 27 deletions(-) diff --git a/ci/collect_artifacts.py b/ci/collect_artifacts.py index d3228ba2e8..49cf3565cb 100755 --- a/ci/collect_artifacts.py +++ b/ci/collect_artifacts.py @@ -15,39 +15,20 @@ def main(args): collect_for_sanitizer_test(file) -def find_failed_files_for_sanitizer_test( - console_log: list, subfolder: str, which="LOGS" -) -> dict(): +def find_failed_files_for_sanitizer_test(console_log: list) -> dict(): - assert which in ["LOGS", "FILE_BASENAMES"] - - pattern_line = "(Encoding|Decoding) failed .*for \/.*(CLANG.|VALGRIND)\/(.*)" - pattern_file = "(.*_b[0-9]*_.*_rs|.*_b[0-9]*_.*_cbr).*" + pattern_line = r"(CLANG.) reports . error\(s\) for (.*)" files_found = dict() for line in console_log: m_line = re.match(pattern_line, line) if m_line is not None: - _, test, filename = m_line.groups() - filename = pathlib.Path(filename).name - m_file = re.match(pattern_file, filename) - if m_file is None: - print(f"Unexpected: no match on {filename} with {pattern_file} - skip") - continue - filename_start = m_file.groups()[0] - - if which == "LOGS": - folder = pathlib.Path(f"{test}/{subfolder}/") - files = [ - f for f in folder.iterdir() if f.name.startswith(filename_start) - ] - elif which == "FILE_BASENAMES": - files = [filename_start] + test, filename = m_line.groups() if test in files_found: - files_found[test].extend(files) + files_found[test].append(filename) else: - files_found[test] = files + files_found[test] = [filename] return files_found diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 33148897ca..84601b1708 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -179,9 +179,7 @@ def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = Tr # delete bitstream files for all failed modes to prevent follow-up errors in decoder-only run with open(CONSOLE_OUT_FILE) as f: console_log = f.readlines() - failed_files = find_failed_files_for_sanitizer_test( - console_log, "logs", "FILE_BASENAMES" - ) + failed_files = find_failed_files_for_sanitizer_test(console_log) for t in failed_files.keys(): bs_folder = pathlib.Path(f"{t}/enc") file_starts = failed_files[t] -- GitLab From b0a5ea1b2ce27863b386969f1c20932853025bd2 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 31 Jan 2024 09:56:27 +0100 Subject: [PATCH 144/601] update year in IVAS PC copyright statement --- LICENSE.md | 2 +- apps/decoder.c | 2 +- apps/encoder.c | 2 +- apps/renderer.c | 2 +- ci/build_all_linux.sh | 2 +- ci/build_codec_instrumented_linux.sh | 2 +- ci/build_codec_sanitizers_linux.sh | 2 +- ci/combine_genpatt_and_jbm_profile.py | 2 +- ci/complexity_measurements/genWebpageData_Ram.csh | 2 +- ci/complexity_measurements/genWebpageData_Rom.csh | 2 +- ci/complexity_measurements/genWebpageData_WMOPS.csh | 2 +- .../genWebpageData_WmopPerOperatingpoint.csh | 2 +- ci/complexity_measurements/getWmops.sh | 2 +- ci/complexity_measurements/index_complexity.html | 2 +- ci/complexity_measurements/mergeNewsletterRam.py | 2 +- ci/complexity_measurements/mergeNewsletterRom.py | 2 +- ci/complexity_measurements/parseNewsletterRam.py | 2 +- ci/complexity_measurements/parseNewsletterRom.py | 2 +- ci/complexity_measurements/parseNewsletterWmops.py | 2 +- ci/get_id_of_last_job_occurence.py | 2 +- ci/ivas_voip_be_test.sh | 2 +- ci/run_evs_be_test.py | 2 +- ci/run_evs_be_win_test.py | 2 +- ci/run_scheduled_sanitizer_test.py | 2 +- ci/smoke_test.sh | 2 +- lib_com/ACcontextMapping.c | 2 +- lib_com/ari.c | 2 +- lib_com/ari_hm.c | 2 +- lib_com/arith_coder.c | 2 +- lib_com/basop32.c | 2 +- lib_com/basop32.h | 2 +- lib_com/basop_com_lpc.c | 2 +- lib_com/basop_lsf_tools.c | 2 +- lib_com/basop_mpy.c | 2 +- lib_com/basop_mpy.h | 2 +- lib_com/basop_proto_func.h | 2 +- lib_com/basop_settings.h | 2 +- lib_com/basop_tcx_utils.c | 2 +- lib_com/basop_util.c | 2 +- lib_com/basop_util.h | 2 +- lib_com/bitalloc.c | 2 +- lib_com/bitallocsum.c | 2 +- lib_com/bits_alloc.c | 2 +- lib_com/bitstream.c | 2 +- lib_com/calc_st_com.c | 2 +- lib_com/cb_shape.c | 2 +- lib_com/cldfb.c | 2 +- lib_com/cng_exc.c | 2 +- lib_com/cnst.h | 2 +- lib_com/codec_tcx_common.c | 2 +- lib_com/common_api_types.h | 2 +- lib_com/core_com_config.c | 2 +- lib_com/deemph.c | 2 +- lib_com/delay_comp.c | 2 +- lib_com/disclaimer.c | 2 +- lib_com/dlpc_bfi.c | 2 +- lib_com/edct.c | 2 +- lib_com/enh1632.c | 2 +- lib_com/enh1632.h | 2 +- lib_com/enh40.c | 2 +- lib_com/enh40.h | 2 +- lib_com/enhancer.c | 2 +- lib_com/enr_1_az.c | 2 +- lib_com/env_adj.c | 2 +- lib_com/env_stab.c | 2 +- lib_com/env_stab_trans.c | 2 +- lib_com/est_tilt.c | 2 +- lib_com/fd_cng_com.c | 2 +- lib_com/fft.c | 2 +- lib_com/fft_cldfb.c | 2 +- lib_com/fft_rel.c | 2 +- lib_com/fill_spectrum.c | 2 +- lib_com/findpulse.c | 2 +- lib_com/fine_gain_bits.c | 2 +- lib_com/frame_ener.c | 2 +- lib_com/get_gain.c | 2 +- lib_com/gs_bitallocation.c | 2 +- lib_com/gs_gains.c | 2 +- lib_com/gs_inact_switching.c | 2 +- lib_com/gs_noisefill.c | 2 +- lib_com/gs_preech.c | 2 +- lib_com/guided_plc_util.c | 2 +- lib_com/hp50.c | 2 +- lib_com/hq2_bit_alloc.c | 2 +- lib_com/hq2_core_com.c | 2 +- lib_com/hq2_noise_inject.c | 2 +- lib_com/hq_bit_allocation.c | 2 +- lib_com/hq_conf.c | 2 +- lib_com/hq_tools.c | 2 +- lib_com/hvq_pvq_bitalloc.c | 2 +- lib_com/ifft_rel.c | 2 +- lib_com/igf_base.c | 2 +- lib_com/index_pvq_opt.c | 2 +- lib_com/int_lsp.c | 2 +- lib_com/interleave_spectrum.c | 2 +- lib_com/interpol.c | 2 +- lib_com/isf_dec_amr_wb.c | 2 +- lib_com/ivas_agc_com.c | 2 +- lib_com/ivas_arith.c | 2 +- lib_com/ivas_avq_pos_reorder_com.c | 2 +- lib_com/ivas_cnst.h | 2 +- lib_com/ivas_cov_smooth.c | 2 +- lib_com/ivas_dirac_com.c | 2 +- lib_com/ivas_entropy_coder_common.c | 2 +- lib_com/ivas_error.h | 2 +- lib_com/ivas_error_utils.h | 2 +- lib_com/ivas_fb_mixer.c | 2 +- lib_com/ivas_filters.c | 2 +- lib_com/ivas_ism_com.c | 2 +- lib_com/ivas_lfe_com.c | 2 +- lib_com/ivas_masa_com.c | 2 +- lib_com/ivas_mc_com.c | 2 +- lib_com/ivas_mc_param_com.c | 2 +- lib_com/ivas_mcmasa_com.c | 2 +- lib_com/ivas_mct_com.c | 2 +- lib_com/ivas_mdct_core_com.c | 2 +- lib_com/ivas_mdct_imdct.c | 2 +- lib_com/ivas_mdft_imdft.c | 2 +- lib_com/ivas_omasa_com.c | 2 +- lib_com/ivas_pca_tools.c | 2 +- lib_com/ivas_prot.h | 2 +- lib_com/ivas_qmetadata_com.c | 2 +- lib_com/ivas_qspherical_com.c | 2 +- lib_com/ivas_rom_com.c | 2 +- lib_com/ivas_rom_com.h | 2 +- lib_com/ivas_sba_config.c | 2 +- lib_com/ivas_sns_com.c | 2 +- lib_com/ivas_spar_com.c | 2 +- lib_com/ivas_spar_com_quant_util.c | 2 +- lib_com/ivas_stat_com.h | 2 +- lib_com/ivas_stereo_dft_com.c | 2 +- lib_com/ivas_stereo_eclvq_com.c | 2 +- lib_com/ivas_stereo_ica_com.c | 2 +- lib_com/ivas_stereo_mdct_bands_com.c | 2 +- lib_com/ivas_stereo_mdct_stereo_com.c | 2 +- lib_com/ivas_stereo_psychlpc_com.c | 2 +- lib_com/ivas_stereo_td_bit_alloc.c | 2 +- lib_com/ivas_tools.c | 2 +- lib_com/ivas_transient_det.c | 2 +- lib_com/lag_wind.c | 2 +- lib_com/lerp.c | 2 +- lib_com/limit_t0.c | 2 +- lib_com/logqnorm.c | 2 +- lib_com/longarith.c | 2 +- lib_com/low_rate_band_att.c | 2 +- lib_com/lpc_tools.c | 2 +- lib_com/lsf_dec_bfi.c | 2 +- lib_com/lsf_msvq_ma.c | 2 +- lib_com/lsf_tools.c | 2 +- lib_com/lsp_conv_poly.c | 2 +- lib_com/mime.h | 2 +- lib_com/modif_fs.c | 2 +- lib_com/move.h | 2 +- lib_com/mslvq_com.c | 2 +- lib_com/nelp.c | 2 +- lib_com/options.h | 2 +- lib_com/parameter_bitmaping.c | 2 +- lib_com/phase_dispersion.c | 2 +- lib_com/ppp.c | 2 +- lib_com/pred_lt4.c | 2 +- lib_com/preemph.c | 2 +- lib_com/prot.h | 2 +- lib_com/pvq_com.c | 2 +- lib_com/range_com.c | 2 +- lib_com/re8_ppv.c | 2 +- lib_com/re8_util.c | 2 +- lib_com/realft.c | 2 +- lib_com/recovernorm.c | 2 +- lib_com/reordvct.c | 2 +- lib_com/residu.c | 2 +- lib_com/rom_com.c | 2 +- lib_com/rom_com.h | 2 +- lib_com/stab_est.c | 2 +- lib_com/stat_com.h | 2 +- lib_com/stat_noise_uv_mod.c | 2 +- lib_com/stl.h | 2 +- lib_com/swb_bwe_com.c | 2 +- lib_com/swb_bwe_com_hr.c | 2 +- lib_com/swb_bwe_com_lr.c | 2 +- lib_com/swb_tbe_com.c | 2 +- lib_com/syn_12k8.c | 2 +- lib_com/syn_filt.c | 2 +- lib_com/tcq_position_arith.c | 2 +- lib_com/tcx_ltp.c | 2 +- lib_com/tcx_mdct.c | 2 +- lib_com/tcx_mdct_window.c | 2 +- lib_com/tcx_utils.c | 2 +- lib_com/tec_com.c | 2 +- lib_com/tns_base.c | 2 +- lib_com/tools.c | 2 +- lib_com/trans_direct.c | 2 +- lib_com/trans_inv.c | 2 +- lib_com/typedef.h | 2 +- lib_com/vlpc_2st_com.c | 2 +- lib_com/weight.c | 2 +- lib_com/weight_a.c | 2 +- lib_com/wi.c | 2 +- lib_com/window.c | 2 +- lib_com/window_ola.c | 2 +- lib_com/wtda.c | 2 +- lib_debug/debug.c | 2 +- lib_debug/debug.h | 2 +- lib_debug/sba_debug.c | 2 +- lib_debug/sba_debug.h | 2 +- lib_debug/snr.c | 2 +- lib_dec/ACcontextMapping_dec.c | 2 +- lib_dec/FEC.c | 2 +- lib_dec/FEC_HQ_core.c | 2 +- lib_dec/FEC_HQ_phase_ecu.c | 2 +- lib_dec/FEC_adapt_codebook.c | 2 +- lib_dec/FEC_clas_estim.c | 2 +- lib_dec/FEC_lsf_estim.c | 2 +- lib_dec/FEC_pitch_estim.c | 2 +- lib_dec/FEC_scale_syn.c | 2 +- lib_dec/LD_music_post_filter.c | 2 +- lib_dec/TonalComponentDetection.c | 2 +- lib_dec/acelp_core_dec.c | 2 +- lib_dec/acelp_core_switch_dec.c | 2 +- lib_dec/amr_wb_dec.c | 2 +- lib_dec/ari_dec.c | 2 +- lib_dec/ari_hm_dec.c | 2 +- lib_dec/arith_coder_dec.c | 2 +- lib_dec/avq_dec.c | 2 +- lib_dec/bass_psfilter.c | 2 +- lib_dec/cng_dec.c | 2 +- lib_dec/core_dec_init.c | 2 +- lib_dec/core_dec_reconf.c | 2 +- lib_dec/core_dec_switch.c | 2 +- lib_dec/core_switching_dec.c | 2 +- lib_dec/d_gain2p.c | 2 +- lib_dec/dec2t32.c | 2 +- lib_dec/dec4t64.c | 2 +- lib_dec/dec_LPD.c | 2 +- lib_dec/dec_ace.c | 2 +- lib_dec/dec_acelp.c | 2 +- lib_dec/dec_acelp_tcx_main.c | 2 +- lib_dec/dec_amr_wb.c | 2 +- lib_dec/dec_gen_voic.c | 2 +- lib_dec/dec_higher_acelp.c | 2 +- lib_dec/dec_nelp.c | 2 +- lib_dec/dec_pit_exc.c | 2 +- lib_dec/dec_post.c | 2 +- lib_dec/dec_ppp.c | 2 +- lib_dec/dec_prm.c | 2 +- lib_dec/dec_tcx.c | 2 +- lib_dec/dec_tran.c | 2 +- lib_dec/dec_uv.c | 2 +- lib_dec/decision_matrix_dec.c | 2 +- lib_dec/dlpc_avq.c | 2 +- lib_dec/dlpc_stoch.c | 2 +- lib_dec/er_dec_acelp.c | 2 +- lib_dec/er_dec_tcx.c | 2 +- lib_dec/er_scale_syn.c | 2 +- lib_dec/er_sync_exc.c | 2 +- lib_dec/er_util.c | 2 +- lib_dec/evs_dec.c | 2 +- lib_dec/fd_cng_dec.c | 2 +- lib_dec/gain_dec.c | 2 +- lib_dec/gaus_dec.c | 2 +- lib_dec/gs_dec.c | 2 +- lib_dec/gs_dec_amr_wb.c | 2 +- lib_dec/hdecnrm.c | 2 +- lib_dec/hf_synth.c | 2 +- lib_dec/hq_classifier_dec.c | 2 +- lib_dec/hq_conf_fec.c | 2 +- lib_dec/hq_core_dec.c | 2 +- lib_dec/hq_env_dec.c | 2 +- lib_dec/hq_hr_dec.c | 2 +- lib_dec/hq_lr_dec.c | 2 +- lib_dec/igf_dec.c | 2 +- lib_dec/igf_scf_dec.c | 2 +- lib_dec/init_dec.c | 2 +- lib_dec/inov_dec.c | 2 +- lib_dec/ivas_agc_dec.c | 2 +- lib_dec/ivas_binRenderer_internal.c | 2 +- lib_dec/ivas_core_dec.c | 2 +- lib_dec/ivas_corecoder_dec_reconfig.c | 2 +- lib_dec/ivas_cpe_dec.c | 2 +- lib_dec/ivas_dec.c | 2 +- lib_dec/ivas_decision_matrix_dec.c | 2 +- lib_dec/ivas_dirac_dec.c | 2 +- lib_dec/ivas_dirac_output_synthesis_cov.c | 2 +- lib_dec/ivas_entropy_decoder.c | 2 +- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_ism_dec.c | 2 +- lib_dec/ivas_ism_dtx_dec.c | 2 +- lib_dec/ivas_ism_metadata_dec.c | 2 +- lib_dec/ivas_ism_param_dec.c | 2 +- lib_dec/ivas_ism_renderer.c | 2 +- lib_dec/ivas_jbm_dec.c | 2 +- lib_dec/ivas_lfe_dec.c | 2 +- lib_dec/ivas_lfe_plc.c | 2 +- lib_dec/ivas_ls_custom_dec.c | 2 +- lib_dec/ivas_masa_dec.c | 2 +- lib_dec/ivas_mc_param_dec.c | 2 +- lib_dec/ivas_mc_paramupmix_dec.c | 2 +- lib_dec/ivas_mcmasa_dec.c | 2 +- lib_dec/ivas_mct_core_dec.c | 2 +- lib_dec/ivas_mct_dec.c | 2 +- lib_dec/ivas_mct_dec_mct.c | 2 +- lib_dec/ivas_mdct_core_dec.c | 2 +- lib_dec/ivas_mono_dmx_renderer.c | 2 +- lib_dec/ivas_objectRenderer_internal.c | 2 +- lib_dec/ivas_omasa_dec.c | 2 +- lib_dec/ivas_osba_dec.c | 2 +- lib_dec/ivas_out_setup_conversion.c | 2 +- lib_dec/ivas_output_config.c | 2 +- lib_dec/ivas_pca_dec.c | 2 +- lib_dec/ivas_post_proc.c | 2 +- lib_dec/ivas_qmetadata_dec.c | 2 +- lib_dec/ivas_qspherical_dec.c | 2 +- lib_dec/ivas_range_uni_dec.c | 2 +- lib_dec/ivas_rom_dec.c | 2 +- lib_dec/ivas_rom_dec.h | 2 +- lib_dec/ivas_sba_dec.c | 2 +- lib_dec/ivas_sba_dirac_stereo_dec.c | 2 +- lib_dec/ivas_sba_rendering_internal.c | 2 +- lib_dec/ivas_sce_dec.c | 2 +- lib_dec/ivas_sns_dec.c | 2 +- lib_dec/ivas_spar_decoder.c | 2 +- lib_dec/ivas_spar_md_dec.c | 2 +- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/ivas_stereo_adapt_GR_dec.c | 2 +- lib_dec/ivas_stereo_cng_dec.c | 2 +- lib_dec/ivas_stereo_dft_dec.c | 2 +- lib_dec/ivas_stereo_dft_dec_dmx.c | 2 +- lib_dec/ivas_stereo_dft_plc.c | 2 +- lib_dec/ivas_stereo_eclvq_dec.c | 2 +- lib_dec/ivas_stereo_esf_dec.c | 2 +- lib_dec/ivas_stereo_ica_dec.c | 2 +- lib_dec/ivas_stereo_icbwe_dec.c | 2 +- lib_dec/ivas_stereo_mdct_core_dec.c | 2 +- lib_dec/ivas_stereo_mdct_stereo_dec.c | 2 +- lib_dec/ivas_stereo_switching_dec.c | 2 +- lib_dec/ivas_stereo_td_dec.c | 2 +- lib_dec/ivas_svd_dec.c | 2 +- lib_dec/ivas_tcx_core_dec.c | 2 +- lib_dec/ivas_td_low_rate_dec.c | 2 +- lib_dec/jbm_jb4_circularbuffer.c | 2 +- lib_dec/jbm_jb4_circularbuffer.h | 2 +- lib_dec/jbm_jb4_inputbuffer.c | 2 +- lib_dec/jbm_jb4_inputbuffer.h | 2 +- lib_dec/jbm_jb4_jmf.c | 2 +- lib_dec/jbm_jb4_jmf.h | 2 +- lib_dec/jbm_jb4sb.c | 2 +- lib_dec/jbm_jb4sb.h | 2 +- lib_dec/jbm_pcmdsp_apa.c | 2 +- lib_dec/jbm_pcmdsp_apa.h | 2 +- lib_dec/jbm_pcmdsp_fifo.c | 2 +- lib_dec/jbm_pcmdsp_fifo.h | 2 +- lib_dec/jbm_pcmdsp_similarityestimation.c | 2 +- lib_dec/jbm_pcmdsp_similarityestimation.h | 2 +- lib_dec/jbm_pcmdsp_window.c | 2 +- lib_dec/jbm_pcmdsp_window.h | 2 +- lib_dec/lead_deindexing.c | 2 +- lib_dec/lib_dec.c | 2 +- lib_dec/lib_dec.h | 2 +- lib_dec/lp_exc_d.c | 2 +- lib_dec/lsf_dec.c | 2 +- lib_dec/lsf_msvq_ma_dec.c | 2 +- lib_dec/nelp_dec.c | 2 +- lib_dec/peak_vq_dec.c | 2 +- lib_dec/pit_dec.c | 2 +- lib_dec/pitch_extr.c | 2 +- lib_dec/post_dec.c | 2 +- lib_dec/ppp_dec.c | 2 +- lib_dec/pvq_core_dec.c | 2 +- lib_dec/pvq_decode.c | 2 +- lib_dec/range_dec.c | 2 +- lib_dec/re8_dec.c | 2 +- lib_dec/rom_dec.c | 2 +- lib_dec/rom_dec.h | 2 +- lib_dec/rst_dec.c | 2 +- lib_dec/stat_dec.h | 2 +- lib_dec/stat_noise_uv_dec.c | 2 +- lib_dec/swb_bwe_dec.c | 2 +- lib_dec/swb_bwe_dec_hr.c | 2 +- lib_dec/swb_bwe_dec_lr.c | 2 +- lib_dec/swb_tbe_dec.c | 2 +- lib_dec/syn_outp.c | 2 +- lib_dec/tcq_core_dec.c | 2 +- lib_dec/tcx_utils_dec.c | 2 +- lib_dec/tns_base_dec.c | 2 +- lib_dec/tonalMDCTconcealment.c | 2 +- lib_dec/transition_dec.c | 2 +- lib_dec/updt_dec.c | 2 +- lib_dec/vlpc_1st_dec.c | 2 +- lib_dec/vlpc_2st_dec.c | 2 +- lib_dec/voiced_dec.c | 2 +- lib_dec/waveadjust_fec_dec.c | 2 +- lib_enc/ACcontextMapping_enc.c | 2 +- lib_enc/FEC_enc.c | 2 +- lib_enc/SNR_calc.c | 2 +- lib_enc/acelp_core_enc.c | 2 +- lib_enc/acelp_core_switch_enc.c | 2 +- lib_enc/acelp_enc_util.c | 2 +- lib_enc/amr_wb_enc.c | 2 +- lib_enc/analy_lp.c | 2 +- lib_enc/analy_sp.c | 2 +- lib_enc/ari_enc.c | 2 +- lib_enc/ari_hm_enc.c | 2 +- lib_enc/arith_coder_enc.c | 2 +- lib_enc/avq_cod.c | 2 +- lib_enc/bass_psfilter_enc.c | 2 +- lib_enc/bw_detect.c | 2 +- lib_enc/cng_enc.c | 2 +- lib_enc/cod2t32.c | 2 +- lib_enc/cod4t64.c | 2 +- lib_enc/cod4t64_fast.c | 2 +- lib_enc/cod_ace.c | 2 +- lib_enc/cod_tcx.c | 2 +- lib_enc/cod_uv.c | 2 +- lib_enc/comvad_decision.c | 2 +- lib_enc/cor_shif.c | 2 +- lib_enc/core_enc_2div.c | 2 +- lib_enc/core_enc_init.c | 2 +- lib_enc/core_enc_ol.c | 2 +- lib_enc/core_enc_reconf.c | 2 +- lib_enc/core_enc_switch.c | 2 +- lib_enc/core_enc_updt.c | 2 +- lib_enc/core_switching_enc.c | 2 +- lib_enc/corr_xh.c | 2 +- lib_enc/decision_matrix_enc.c | 2 +- lib_enc/detect_transient.c | 2 +- lib_enc/diffcod.c | 2 +- lib_enc/dtx.c | 2 +- lib_enc/enc_acelp.c | 2 +- lib_enc/enc_acelp_tcx_main.c | 2 +- lib_enc/enc_acelpx.c | 2 +- lib_enc/enc_amr_wb.c | 2 +- lib_enc/enc_gain.c | 2 +- lib_enc/enc_gen_voic.c | 2 +- lib_enc/enc_gen_voic_rf.c | 2 +- lib_enc/enc_higher_acelp.c | 2 +- lib_enc/enc_nelp.c | 2 +- lib_enc/enc_pit_exc.c | 2 +- lib_enc/enc_ppp.c | 2 +- lib_enc/enc_prm.c | 2 +- lib_enc/enc_tran.c | 2 +- lib_enc/enc_uv.c | 2 +- lib_enc/energy.c | 2 +- lib_enc/eval_pit_contr.c | 2 +- lib_enc/evs_enc.c | 2 +- lib_enc/ext_sig_ana.c | 2 +- lib_enc/fd_cng_enc.c | 2 +- lib_enc/find_tar.c | 2 +- lib_enc/find_tilt.c | 2 +- lib_enc/find_uv.c | 2 +- lib_enc/find_wsp.c | 2 +- lib_enc/frame_spec_dif_cor_rate.c | 2 +- lib_enc/gain_enc.c | 2 +- lib_enc/gaus_enc.c | 2 +- lib_enc/gp_clip.c | 2 +- lib_enc/gs_enc.c | 2 +- lib_enc/guided_plc_enc.c | 2 +- lib_enc/hf_cod_amrwb.c | 2 +- lib_enc/hq_classifier_enc.c | 2 +- lib_enc/hq_core_enc.c | 2 +- lib_enc/hq_env_enc.c | 2 +- lib_enc/hq_hr_enc.c | 2 +- lib_enc/hq_lr_enc.c | 2 +- lib_enc/hvq_enc.c | 2 +- lib_enc/igf_enc.c | 2 +- lib_enc/igf_scf_enc.c | 2 +- lib_enc/init_enc.c | 2 +- lib_enc/inov_enc.c | 2 +- lib_enc/isf_enc_amr_wb.c | 2 +- lib_enc/ivas_agc_enc.c | 2 +- lib_enc/ivas_core_enc.c | 2 +- lib_enc/ivas_core_pre_proc.c | 2 +- lib_enc/ivas_core_pre_proc_front.c | 2 +- lib_enc/ivas_corecoder_enc_reconfig.c | 2 +- lib_enc/ivas_cpe_enc.c | 2 +- lib_enc/ivas_decision_matrix_enc.c | 2 +- lib_enc/ivas_dirac_enc.c | 2 +- lib_enc/ivas_enc.c | 2 +- lib_enc/ivas_enc_cov_handler.c | 2 +- lib_enc/ivas_entropy_coder.c | 2 +- lib_enc/ivas_front_vad.c | 2 +- lib_enc/ivas_init_enc.c | 2 +- lib_enc/ivas_ism_dtx_enc.c | 2 +- lib_enc/ivas_ism_enc.c | 2 +- lib_enc/ivas_ism_metadata_enc.c | 2 +- lib_enc/ivas_ism_param_enc.c | 2 +- lib_enc/ivas_lfe_enc.c | 2 +- lib_enc/ivas_masa_enc.c | 2 +- lib_enc/ivas_mc_param_enc.c | 2 +- lib_enc/ivas_mc_paramupmix_enc.c | 2 +- lib_enc/ivas_mcmasa_enc.c | 2 +- lib_enc/ivas_mct_core_enc.c | 2 +- lib_enc/ivas_mct_enc.c | 2 +- lib_enc/ivas_mct_enc_mct.c | 2 +- lib_enc/ivas_mdct_core_enc.c | 2 +- lib_enc/ivas_omasa_enc.c | 2 +- lib_enc/ivas_osba_enc.c | 2 +- lib_enc/ivas_pca_enc.c | 2 +- lib_enc/ivas_qmetadata_enc.c | 2 +- lib_enc/ivas_qspherical_enc.c | 2 +- lib_enc/ivas_range_uni_enc.c | 2 +- lib_enc/ivas_rom_enc.c | 2 +- lib_enc/ivas_rom_enc.h | 2 +- lib_enc/ivas_sba_enc.c | 2 +- lib_enc/ivas_sce_enc.c | 2 +- lib_enc/ivas_sns_enc.c | 2 +- lib_enc/ivas_spar_encoder.c | 2 +- lib_enc/ivas_spar_md_enc.c | 2 +- lib_enc/ivas_stat_enc.h | 2 +- lib_enc/ivas_stereo_adapt_GR_enc.c | 2 +- lib_enc/ivas_stereo_classifier.c | 2 +- lib_enc/ivas_stereo_cng_enc.c | 2 +- lib_enc/ivas_stereo_dft_enc.c | 2 +- lib_enc/ivas_stereo_dft_enc_itd.c | 2 +- lib_enc/ivas_stereo_dft_td_itd.c | 2 +- lib_enc/ivas_stereo_dmx_evs.c | 2 +- lib_enc/ivas_stereo_eclvq_enc.c | 2 +- lib_enc/ivas_stereo_ica_enc.c | 2 +- lib_enc/ivas_stereo_icbwe_enc.c | 2 +- lib_enc/ivas_stereo_mdct_core_enc.c | 2 +- lib_enc/ivas_stereo_mdct_igf_enc.c | 2 +- lib_enc/ivas_stereo_mdct_stereo_enc.c | 2 +- lib_enc/ivas_stereo_switching_enc.c | 2 +- lib_enc/ivas_stereo_td_analysis.c | 2 +- lib_enc/ivas_stereo_td_enc.c | 2 +- lib_enc/ivas_tcx_core_enc.c | 2 +- lib_enc/ivas_td_low_rate_enc.c | 2 +- lib_enc/lead_indexing.c | 2 +- lib_enc/lib_enc.c | 2 +- lib_enc/lib_enc.h | 2 +- lib_enc/long_enr.c | 2 +- lib_enc/lp_exc_e.c | 2 +- lib_enc/lsf_enc.c | 2 +- lib_enc/lsf_msvq_ma_enc.c | 2 +- lib_enc/ltd_stable.c | 2 +- lib_enc/mdct_classifier.c | 2 +- lib_enc/mdct_selector.c | 2 +- lib_enc/mslvq_enc.c | 2 +- lib_enc/multi_harm.c | 2 +- lib_enc/nelp_enc.c | 2 +- lib_enc/nois_est.c | 2 +- lib_enc/noise_adjust.c | 2 +- lib_enc/normalizecoefs.c | 2 +- lib_enc/peak_vq_enc.c | 2 +- lib_enc/pit_enc.c | 2 +- lib_enc/pitch_ol.c | 2 +- lib_enc/pitch_ol2.c | 2 +- lib_enc/plc_enc_ext.c | 2 +- lib_enc/ppp_enc.c | 2 +- lib_enc/pre_proc.c | 2 +- lib_enc/pvq_core_enc.c | 2 +- lib_enc/pvq_encode.c | 2 +- lib_enc/q_gain2p.c | 2 +- lib_enc/qlpc_avq.c | 2 +- lib_enc/qlpc_stoch.c | 2 +- lib_enc/range_enc.c | 2 +- lib_enc/re8_cod.c | 2 +- lib_enc/reordernorm.c | 2 +- lib_enc/rom_enc.c | 2 +- lib_enc/rom_enc.h | 2 +- lib_enc/rst_enc.c | 2 +- lib_enc/set_impulse.c | 2 +- lib_enc/setmodeindex.c | 2 +- lib_enc/sig_clas.c | 2 +- lib_enc/spec_center.c | 2 +- lib_enc/spec_flatness.c | 2 +- lib_enc/speech_music_classif.c | 2 +- lib_enc/stat_enc.h | 2 +- lib_enc/stat_noise_uv_enc.c | 2 +- lib_enc/subband_fft.c | 2 +- lib_enc/swb_bwe_enc.c | 2 +- lib_enc/swb_bwe_enc_hr.c | 2 +- lib_enc/swb_bwe_enc_lr.c | 2 +- lib_enc/swb_pre_proc.c | 2 +- lib_enc/swb_tbe_enc.c | 2 +- lib_enc/tcq_core_enc.c | 2 +- lib_enc/tcx_ltp_enc.c | 2 +- lib_enc/tcx_utils_enc.c | 2 +- lib_enc/tfa_enc.c | 2 +- lib_enc/tns_base_enc.c | 2 +- lib_enc/transient_detection.c | 2 +- lib_enc/transition_enc.c | 2 +- lib_enc/update_decision.c | 2 +- lib_enc/updt_enc.c | 2 +- lib_enc/updt_tar.c | 2 +- lib_enc/vad.c | 2 +- lib_enc/vad_param_updt.c | 2 +- lib_enc/vad_proc.c | 2 +- lib_enc/vbr_average_rate.c | 2 +- lib_enc/vlpc_1st_cod.c | 2 +- lib_enc/vlpc_2st_cod.c | 2 +- lib_enc/voiced_enc.c | 2 +- lib_enc/waveadjust_fec_cod.c | 2 +- lib_rend/ivas_MSPred.c | 2 +- lib_rend/ivas_NoiseGen.c | 2 +- lib_rend/ivas_PerceptualModel.c | 2 +- lib_rend/ivas_PredDecoder.c | 2 +- lib_rend/ivas_PredEncoder.c | 2 +- lib_rend/ivas_RMSEnvGrouping.c | 2 +- lib_rend/ivas_allrad_dec.c | 2 +- lib_rend/ivas_crend.c | 2 +- lib_rend/ivas_dirac_ana.c | 2 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 2 +- lib_rend/ivas_dirac_decorr_dec.c | 2 +- lib_rend/ivas_dirac_onsets_dec.c | 2 +- lib_rend/ivas_dirac_output_synthesis_dec.c | 2 +- lib_rend/ivas_dirac_rend.c | 2 +- lib_rend/ivas_efap.c | 2 +- lib_rend/ivas_hrtf.c | 2 +- lib_rend/ivas_lc3plus_common.c | 2 +- lib_rend/ivas_lc3plus_common.h | 2 +- lib_rend/ivas_lc3plus_dec.c | 2 +- lib_rend/ivas_lc3plus_dec.h | 2 +- lib_rend/ivas_lc3plus_enc.c | 2 +- lib_rend/ivas_lc3plus_enc.h | 2 +- lib_rend/ivas_lcld_decoder.c | 2 +- lib_rend/ivas_lcld_encoder.c | 2 +- lib_rend/ivas_lcld_prot.h | 2 +- lib_rend/ivas_lcld_rom_tables.c | 2 +- lib_rend/ivas_lcld_rom_tables.h | 2 +- lib_rend/ivas_limiter.c | 2 +- lib_rend/ivas_masa_merge.c | 2 +- lib_rend/ivas_mcmasa_ana.c | 2 +- lib_rend/ivas_objectRenderer.c | 2 +- lib_rend/ivas_objectRenderer_hrFilt.c | 2 +- lib_rend/ivas_objectRenderer_mix.c | 2 +- lib_rend/ivas_objectRenderer_sfx.c | 2 +- lib_rend/ivas_objectRenderer_sources.c | 2 +- lib_rend/ivas_objectRenderer_vec.c | 2 +- lib_rend/ivas_omasa_ana.c | 2 +- lib_rend/ivas_orient_trk.c | 2 +- lib_rend/ivas_output_init.c | 2 +- lib_rend/ivas_prot_rend.h | 2 +- lib_rend/ivas_reflections.c | 2 +- lib_rend/ivas_render_config.c | 2 +- lib_rend/ivas_reverb.c | 2 +- lib_rend/ivas_reverb_delay_line.c | 2 +- lib_rend/ivas_reverb_fft_filter.c | 2 +- lib_rend/ivas_reverb_filter_design.c | 2 +- lib_rend/ivas_reverb_iir_filter.c | 2 +- lib_rend/ivas_reverb_utils.c | 2 +- lib_rend/ivas_rom_TdBinauralRenderer.c | 2 +- lib_rend/ivas_rom_TdBinauralRenderer.h | 2 +- lib_rend/ivas_rom_binauralRenderer.c | 2 +- lib_rend/ivas_rom_binauralRenderer.h | 2 +- lib_rend/ivas_rom_binaural_crend_head.c | 2 +- lib_rend/ivas_rom_binaural_crend_head.h | 2 +- lib_rend/ivas_rom_rend.c | 2 +- lib_rend/ivas_rom_rend.h | 2 +- lib_rend/ivas_rotation.c | 2 +- lib_rend/ivas_sba_rendering.c | 2 +- lib_rend/ivas_shoebox.c | 2 +- lib_rend/ivas_splitRend_lcld_dec.c | 2 +- lib_rend/ivas_splitRend_lcld_enc.c | 2 +- lib_rend/ivas_splitRendererPLC.c | 2 +- lib_rend/ivas_splitRendererPost.c | 2 +- lib_rend/ivas_splitRendererPre.c | 2 +- lib_rend/ivas_splitRenderer_utils.c | 2 +- lib_rend/ivas_stat_rend.h | 2 +- lib_rend/ivas_td_decorr.c | 2 +- lib_rend/ivas_vbap.c | 2 +- lib_rend/lib_rend.c | 2 +- lib_rend/lib_rend.h | 2 +- lib_util/audio_file_reader.c | 2 +- lib_util/audio_file_reader.h | 2 +- lib_util/audio_file_writer.c | 2 +- lib_util/audio_file_writer.h | 2 +- lib_util/bitstream_reader.c | 2 +- lib_util/bitstream_reader.h | 2 +- lib_util/bitstream_writer.c | 2 +- lib_util/bitstream_writer.h | 2 +- lib_util/cmdl_tools.c | 2 +- lib_util/cmdl_tools.h | 2 +- lib_util/cmdln_parser.c | 2 +- lib_util/cmdln_parser.h | 2 +- lib_util/evs_rtp_payload.c | 2 +- lib_util/evs_rtp_payload.h | 2 +- lib_util/g192.c | 2 +- lib_util/g192.h | 2 +- lib_util/hrtf_file_reader.c | 2 +- lib_util/hrtf_file_reader.h | 2 +- lib_util/ism_file_reader.c | 2 +- lib_util/ism_file_reader.h | 2 +- lib_util/ism_file_writer.c | 2 +- lib_util/ism_file_writer.h | 2 +- lib_util/jbm_file_reader.c | 2 +- lib_util/jbm_file_reader.h | 2 +- lib_util/jbm_file_writer.c | 2 +- lib_util/jbm_file_writer.h | 2 +- lib_util/ls_custom_file_reader.c | 2 +- lib_util/ls_custom_file_reader.h | 2 +- lib_util/masa_file_reader.c | 2 +- lib_util/masa_file_reader.h | 2 +- lib_util/masa_file_writer.c | 2 +- lib_util/masa_file_writer.h | 2 +- lib_util/mime_io.c | 2 +- lib_util/mime_io.h | 2 +- lib_util/render_config_reader.c | 2 +- lib_util/render_config_reader.h | 2 +- lib_util/rotation_file_reader.c | 2 +- lib_util/rotation_file_reader.h | 2 +- lib_util/rtpdump.c | 2 +- lib_util/rtpdump.h | 2 +- lib_util/split_rend_bfi_file_reader.c | 2 +- lib_util/split_rend_bfi_file_reader.h | 2 +- lib_util/split_render_file_read_write.c | 2 +- lib_util/split_render_file_read_write.h | 2 +- lib_util/tinywavein_c.h | 2 +- lib_util/tinywaveout_c.h | 2 +- lib_util/tsm_scale_file_reader.c | 2 +- lib_util/tsm_scale_file_reader.h | 2 +- lib_util/vector3_pair_file_reader.c | 2 +- lib_util/vector3_pair_file_reader.h | 2 +- readme.txt | 2 +- readme_split_rendering.txt | 2 +- scripts/IvasBuildAndRun.py | 2 +- scripts/IvasBuildAndRunChecks.py | 2 +- scripts/README.md | 2 +- scripts/batch_comp_audio.py | 2 +- scripts/binauralRenderer_interface/README.md | 2 +- .../Table_Format_Converter/generate_tables_from_rom_to_bin.c | 2 +- .../Table_Format_Converter/tables_format_converter_readme.txt | 2 +- scripts/binauralRenderer_interface/config_reader.c | 2 +- scripts/binauralRenderer_interface/config_reader.h | 2 +- .../fastconv/generate_BRIR_CLDFB_FASTCONV.m | 2 +- .../fastconv/generate_tables_for_fastconv.m | 2 +- .../fastconv/get_ivas_binary_header.m | 2 +- scripts/binauralRenderer_interface/fastconv/td2cldfb.m | 2 +- .../fastconv/write_fastconv_binary_data.m | 2 +- .../fastconv/write_fastconv_rom_table.m | 2 +- .../generate_crend_ivas_tables_from_sofa.c | 2 +- .../generate_ivas_binauralizer_tables_from_sofa.m | 2 +- ...e_ivas_binauralizer_tables_from_sofa_test_other_database.m | 2 +- .../ivas_crend_binaural_filter_design.c | 2 +- .../ivas_crend_binaural_filter_design.h | 2 +- .../binauralRenderer_interface/ivas_license_header.template | 2 +- .../ivas_rom_binaural_crend_head.template | 2 +- .../matlab_hrir_generation_scripts/SD_2_ROM.m | 2 +- .../matlab_hrir_generation_scripts/SHD_2_ROM.m | 2 +- .../matlab_hrir_generation_scripts/SOFA_save.m | 2 +- .../matlab_hrir_generation_scripts/SOFA_save_to_mat.m | 2 +- .../compute_lr_energies_and_iac.m | 2 +- .../matlab_hrir_generation_scripts/convert_SD2SHD_HRIRs.m | 2 +- .../matlab_hrir_generation_scripts/fir_to_cldfb_fir.m | 2 +- .../generate_HOA_HRIRs_MOD_lens.m | 2 +- .../generate_lr_energies_and_iac.m | 2 +- .../matlab_hrir_generation_scripts/generate_rom_tables.m | 4 ++-- .../matlab_hrir_generation_scripts/get_allpass_IRs.m | 2 +- .../matlab_hrir_generation_scripts/get_cldfb_filter.m | 2 +- .../matlab_hrir_generation_scripts/get_ls_layout_config.m | 2 +- .../matlab_hrir_generation_scripts/hrtf_library_loader.m | 2 +- .../matlab_hrir_generation_scripts/m_dft.m | 2 +- .../matlab_hrir_generation_scripts/m_hilbert.m | 2 +- .../matlab_hrir_generation_scripts/m_idft.m | 2 +- .../matlab_hrir_generation_scripts/mag2min_phase.m | 2 +- .../matlab_hrir_generation_scripts/make_unit_vectors.m | 2 +- .../matlab_hrir_generation_scripts/writeData3L.m | 2 +- .../mixer_conv_sofa_to_rom_table_converter_readme.txt | 2 +- .../binauralRenderer_interface/param_bin/SH_GainComputation.m | 2 +- .../param_bin/generate_BRIR_in_SHD_CLDFB_PARAMETRIC.m | 2 +- .../param_bin/generate_HRIR_in_SHD_CLDFB_PARAMETRIC.m | 2 +- .../param_bin/generate_tables_for_parametric_binauralizer.m | 2 +- .../param_bin/write_parametric_binauralizer_binary_data.m | 2 +- scripts/check-format.sh | 2 +- scripts/cut_bs.py | 2 +- scripts/find_unused_symbols.sh | 2 +- scripts/parse_options_h.sh | 2 +- scripts/parse_selftest_summary.py | 2 +- scripts/patch_code_headers.sh | 4 ++-- scripts/plot_meta_data.py | 2 +- scripts/prepare_combined_format_inputs.py | 2 +- scripts/prepare_delivery.sh | 2 +- scripts/prepare_instrumentation.sh | 2 +- scripts/pyaudio3dtools/__init__.py | 2 +- scripts/pyaudio3dtools/audio3dtools.py | 2 +- scripts/pyaudio3dtools/audioarray.py | 2 +- scripts/pyaudio3dtools/audiofile.py | 2 +- scripts/pyaudio3dtools/constants.py | 2 +- scripts/pyaudio3dtools/spatialaudioformat.py | 2 +- scripts/pyivastest/IvasBaseClass.py | 2 +- scripts/pyivastest/IvasModeAnalyzer.py | 2 +- scripts/pyivastest/IvasModeCollector.py | 2 +- scripts/pyivastest/IvasModeRunner.py | 2 +- scripts/pyivastest/IvasScriptsCommon.py | 2 +- scripts/pyivastest/IvasSvnBuilder.py | 2 +- scripts/pyivastest/__init__.py | 2 +- scripts/pyivastest/constants.py | 2 +- scripts/pyivastest/ivas_svn.py | 2 +- scripts/reverb/generate_acoustic_environments_metadata.py | 2 +- scripts/reverb/text_to_binary_payload.py | 2 +- scripts/runIvasCodec.py | 2 +- scripts/self_test.py | 2 +- scripts/split_rendering/lc3plus/ivas_lc3plus_unit_test.c | 2 +- .../lc3plus/ivas_lc3plus_unit_test_selective_decoding.c | 2 +- scripts/strip_defines_cppp.sh | 2 +- scripts/strip_split_rendering.py | 2 +- scripts/strip_split_rendering.sh | 2 +- .../td_object_renderer/modeling_tool/Gen_Hrf_IVAS_Binary.m | 4 ++-- scripts/td_object_renderer/modeling_tool/HrfModBsp_Config.m | 2 +- scripts/td_object_renderer/modeling_tool/HrfModBsp_InitPath.m | 2 +- scripts/td_object_renderer/modeling_tool/Mod_Hrf_Itd_Main.m | 2 +- scripts/td_object_renderer/modeling_tool/README.md | 2 +- .../modeling_tool/evaluation/HrfModBspTdFir_InterpHrf.m | 2 +- .../modeling_tool/evaluation/evaluation_BspTdFir.m | 2 +- .../modeling_tool/modeling/BSplineAngCircFun.m | 2 +- .../td_object_renderer/modeling_tool/modeling/BSplineAngFun.m | 2 +- .../td_object_renderer/modeling_tool/modeling/BSplineFunc.m | 2 +- .../td_object_renderer/modeling_tool/modeling/BSplineItdFun.m | 2 +- .../modeling_tool/modeling/BSplineLSMod_HrfInterpTdFir.m | 2 +- .../modeling_tool/modeling/BSplineLSMod_ItdInterpTdFir.m | 2 +- .../modeling_tool/modeling/BSplineRemoveZeroBasis.m | 2 +- .../modeling_tool/modeling/BSplineSampMat.m | 2 +- .../modeling_tool/modeling/BSplineSampVec.m | 2 +- .../modeling_tool/modeling/BSplineSampVecITD.m | 2 +- .../td_object_renderer/modeling_tool/modeling/Mod_Hrf_Itd.m | 2 +- .../modeling_tool/modeling/SplitAngleData.m | 2 +- .../td_object_renderer/modeling_tool/modeling/frac_delay.m | 2 +- .../modeling_tool/modeling/modeling_BspTdFir.m | 2 +- .../td_object_renderer/modeling_tool/preprocessing/EstDelay.m | 2 +- .../modeling_tool/preprocessing/data_SOFA.m | 2 +- .../modeling_tool/spat_area/SpatArea_EvalElevAzimSet.m | 2 +- .../modeling_tool/spat_area/SpatArea_EvalInnProdWeights.m | 2 +- .../modeling_tool/spat_area/SpatArea_EvalSetDistr.m | 2 +- .../modeling_tool/spat_area/SpatArea_EvalSpatArea.m | 2 +- .../modeling_tool/spat_area/SpatArea_EvalTrainTestSets.m | 2 +- tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py | 2 +- tests/codec_be_on_mr_nonselection/test_param_file.py | 2 +- tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py | 2 +- tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py | 2 +- tests/codec_be_on_mr_selection/__init__.py | 2 +- tests/codec_be_on_mr_selection/constants.py | 2 +- tests/codec_be_on_mr_selection/test_experiments.py | 2 +- tests/conftest.py | 2 +- tests/create_short_testvectors.py | 2 +- tests/cut_pcm.py | 2 +- tests/hrtf_binary_loading/__init__.py | 2 +- tests/hrtf_binary_loading/conftest.py | 2 +- tests/hrtf_binary_loading/constants.py | 2 +- tests/hrtf_binary_loading/test_codec_ROM_vs_file.py | 2 +- tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py | 2 +- tests/hrtf_binary_loading/utils.py | 2 +- tests/prepare_pytests.py | 2 +- tests/renderer/__init__.py | 2 +- tests/renderer/compare_audio.py | 2 +- tests/renderer/conftest.py | 2 +- tests/renderer/constants.py | 2 +- tests/renderer/data/renderer_config_format_readme.txt | 2 +- tests/renderer/test_renderer.py | 2 +- tests/renderer/utils.py | 2 +- tests/run_pytests.py | 2 +- tests/split_rendering/__init__.py | 2 +- tests/split_rendering/conftest.py | 2 +- tests/split_rendering/constants.py | 2 +- tests/split_rendering/test_split_rendering.py | 2 +- tests/split_rendering/utils.py | 2 +- tests/test_26444.py | 2 +- tests/test_param_file_ltv.py | 2 +- tests/testconfig.py | 2 +- 856 files changed, 859 insertions(+), 859 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index aa9c35e4f9..1c60a85b1a 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ /****************************************************************************************************** - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/apps/decoder.c b/apps/decoder.c index c93d717250..2db008afa5 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1,6 +1,6 @@ /****************************************************************************************************** - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/apps/encoder.c b/apps/encoder.c index 21aa5d0b1d..882187601b 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -1,6 +1,6 @@ /****************************************************************************************************** - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/apps/renderer.c b/apps/renderer.c index e230082ca8..d3c4c2c60f 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1,6 +1,6 @@ /****************************************************************************************************** - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/build_all_linux.sh b/ci/build_all_linux.sh index 47ad54dc42..63beef18f0 100755 --- a/ci/build_all_linux.sh +++ b/ci/build_all_linux.sh @@ -1,6 +1,6 @@ #! /usr/bin/bash -# (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, # Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., # Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, # Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/build_codec_instrumented_linux.sh b/ci/build_codec_instrumented_linux.sh index 7c4da0a7f5..2ff293c613 100755 --- a/ci/build_codec_instrumented_linux.sh +++ b/ci/build_codec_instrumented_linux.sh @@ -1,6 +1,6 @@ #! /usr/bin/bash -# (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, # Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., # Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, # Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/build_codec_sanitizers_linux.sh b/ci/build_codec_sanitizers_linux.sh index d352fa32ec..f599d607ca 100755 --- a/ci/build_codec_sanitizers_linux.sh +++ b/ci/build_codec_sanitizers_linux.sh @@ -1,6 +1,6 @@ #! /usr/bin/bash -# (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, # Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., # Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, # Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/combine_genpatt_and_jbm_profile.py b/ci/combine_genpatt_and_jbm_profile.py index b039ceb990..dd3ffe5858 100644 --- a/ci/combine_genpatt_and_jbm_profile.py +++ b/ci/combine_genpatt_and_jbm_profile.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/complexity_measurements/genWebpageData_Ram.csh b/ci/complexity_measurements/genWebpageData_Ram.csh index d6e5a842e3..c0e3eab411 100755 --- a/ci/complexity_measurements/genWebpageData_Ram.csh +++ b/ci/complexity_measurements/genWebpageData_Ram.csh @@ -1,6 +1,6 @@ #!/bin/tcsh -# (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, # Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., # Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, # Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/complexity_measurements/genWebpageData_Rom.csh b/ci/complexity_measurements/genWebpageData_Rom.csh index 801dfda724..d2ed0b3f94 100755 --- a/ci/complexity_measurements/genWebpageData_Rom.csh +++ b/ci/complexity_measurements/genWebpageData_Rom.csh @@ -1,6 +1,6 @@ #!/bin/tcsh -# (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, # Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., # Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, # Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/complexity_measurements/genWebpageData_WMOPS.csh b/ci/complexity_measurements/genWebpageData_WMOPS.csh index 4993ae81f2..8e052210c8 100755 --- a/ci/complexity_measurements/genWebpageData_WMOPS.csh +++ b/ci/complexity_measurements/genWebpageData_WMOPS.csh @@ -1,6 +1,6 @@ #!/bin/tcsh -# (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, # Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., # Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, # Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh b/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh index 3d9d9d448c..906d08c949 100755 --- a/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh +++ b/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh @@ -1,6 +1,6 @@ #!/bin/tcsh -# (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, # Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., # Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, # Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh index e81575892b..22ca8335fb 100755 --- a/ci/complexity_measurements/getWmops.sh +++ b/ci/complexity_measurements/getWmops.sh @@ -1,6 +1,6 @@ #! /bin/bash -# (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, # Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., # Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, # Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index 0e2ec822fa..c4972eff5d 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -1,7 +1,7 @@ gains [ 1.0, 32767/32768.0(first table value used) , first muted, .... ]*/ + /* burst_att_thresh ==5 --> gains [ 1.0, 1.0, 1,0 1,0, 32767/32768.0(first table value used) , first muted,... ]*/ + /* beta_mute_thr ==4 --> start of final attenuation attenuate AvgMix */ +#endif + /* tabled {att_per_frame_idx_p3dB , burst_att_thresh, beta_mute_thr } */ + { 1, 2, 0 + 2 + 2 }, /* 30 ms, 0.3 dB delta att in slow mutephase nominal_fadeout=0 */ + { 1, 3, 0 + 3 + 2 }, /* 40 ms, 0.3 dB delta att in slow mutephase */ + { 3, 3, 1 + 3 + 1 }, /* 50 ms, 0.3 dB delta att in slow mutephase */ + { 3, 4, 1 + 4 + 1}, /* 60 ms, 0.3 dB delta att in slow mutephase */ + { 5, 4, 3 + 4 + 1 }, /* 70 ms, 0.3 dB delta att in slow mutephase */ + { 5, 5, 3 + 5 + 1 }, /* 80 ms, 0.3 dB delta att in slow mutephase */ + { 7, 5, 7 + 5 }, /* 90 ms, 0.3 dB delta att in slow mutephase */ + { 7, 5, 7 + 5 + 1}, /* 100 ms, 0.3 dB delta att in slow mutephase */ + { 9, 5, 9 + 5 }, /* 110 ms, 0.3 dB delta att in slow mutephase */ + { 9, 5, 9 + 5 + 1}, /* 120 ms, 0.3 dB delta att in slow mutephase nominal_fadeout=1 */ + { 11, 5, 15 + 5 },/* 130 ms, 0.3 dB delta att in slow mutephase */ + { 11, 6, 15 + 6 },/* 140 ms, 0.3 dB delta att in slow mutephase nominal 3GPP */ + +}; +#if 0 +/*fade_scheme_tab[ind][0] att_per _fram_index , "points" to first column in POW_ATT TABLES */ +/*fade_scheme_tab[ind][1] is burst_att_thresh, the number of non_muted 1.0 gain frames */ +/*fade_scheme_tab[ind][2] is beta_mute_thr, the location of the start of final muting */ +#endif + + + +/*compressed ATH Abolute hearing THreshold function weights at band borders */ +const LC3_FLOAT scATHFx[MAX_LGW - 2] = { .455444335937500 , 0.930755615234375 , 0.973083496093750 , 0.999969482421875 , 0.908508300781250 , 0.775665283203125 , 0.5 }; +#endif + const LC3_FLOAT PhECU_whr16ms_NB[128]={ 8.000000000000002e-02, 8.393536376804722e-02, 9.567411990702857e-02, 1.150154150448081e-01, 1.416283142591582e-01, 1.750574634660318e-01, 2.147308806541882e-01, 2.599697426559885e-01, 3.099999999999999e-01, 3.639656211120587e-01, @@ -3801,3 +6340,7 @@ const LC3_INT* ACC_COEFF_PER_BAND_PLC_5ms[] = { const LC3_INT32 mdct_grp_bins[10] = { 4, 14, 24, 44, 84, 164, 244, 324, 404, 484 }; +#if defined(CR8_A_PLC_FADEOUT_TUNING) +const LC3_INT16 plc_fadeout_param_maxlen[4] = {800, 400, 266, 200}; +const LC3_INT16 plc_fadeout_param_maxbytes[4] = {27, 14, 9, 7}; +#endif diff --git a/lib_lc3plus/constants.h b/lib_lc3plus/constants.h index c0c9e286e5..6d58a5798a 100644 --- a/lib_lc3plus/constants.h +++ b/lib_lc3plus/constants.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef CONSTANTS_H #define CONSTANTS_H +#include "options.h" #include "defines.h" #include "structs.h" @@ -18,13 +19,15 @@ extern const Complex dct2_16[16]; /* Ari coder */ -extern const LC3_INT ari_tns_order_cf[2][9]; -extern const LC3_INT ari_tns_freq_cf[8][18]; +extern const LC3_INT16 ari_tns_order_cf[2][9]; +extern const LC3_INT16 ari_tns_freq_cf[8][18]; extern const LC3_INT ari_spec_lookup_fl[4096]; -extern const LC3_INT ari_spec_cumfreq_fl[64][18]; +extern const LC3_INT16 ari_spec_cumfreq_fl[64][18]; extern const LC3_INT ari_spec_bits_fl[64][17]; /* SNS */ +extern const LC3_FLOAT sns_W[6]; +extern const LC3_FLOAT *sns_preemph_all[6]; extern const LC3_FLOAT sns_LFCB[8][32]; extern const LC3_FLOAT sns_HFCB[8][32]; extern const LC3_INT pvq_enc_A[16][11]; @@ -128,6 +131,16 @@ extern const LC3_INT BW_cutoff_bin_all_5ms_HR[MAX_BW_BANDS_NUMBER]; extern const LC3_INT BW_cutoff_bin_all[MAX_BW_BANDS_NUMBER]; extern const LC3_INT BW_cutoff_bits_all[MAX_BW_BANDS_NUMBER]; +#ifdef CR8_G_ADD_75MS +extern const LC3_INT BW_cutoff_bin_all_7_5ms[MAX_BW_BANDS_NUMBER]; +extern const LC3_INT bands_number_7_5ms[6]; +extern const LC3_INT bands_number_7_5ms_HR[6]; +extern const LC3_INT* BW_warp_idx_start_all_7_5ms[4]; +extern const LC3_INT* BW_warp_idx_stop_all_7_5ms[4]; +extern const LC3_INT brickwall_dist_7_5ms[4]; +extern const LC3_INT* ACC_COEFF_PER_BAND_PLC_7_5ms[]; +#endif + /* Arithmetic coding */ extern const LC3_INT tns_cf[8][18]; extern const LC3_INT tns_freq_cf[2][9]; @@ -150,7 +163,6 @@ extern const LC3_FLOAT MDCT_WINDOW_480_2_5ms[240]; extern const LC3_FLOAT* MDCT_WINS_2_5ms[2][6]; extern const LC3_INT MDCT_la_zeroes_2_5ms[6]; - extern const LC3_FLOAT MDCT_WINDOW_80_5ms[80]; extern const LC3_FLOAT MDCT_WINDOW_160_5ms[160]; extern const LC3_FLOAT MDCT_WINDOW_240_5ms[240]; @@ -159,12 +171,15 @@ extern const LC3_FLOAT MDCT_WINDOW_480_5ms[480]; extern const LC3_FLOAT* MDCT_WINS_5ms[2][6]; extern const LC3_INT MDCT_la_zeroes_5ms[6]; -extern const LC3_INT MDCT_WINDOWS_LENGTHS_10ms[6]; - -extern const LC3_INT MDCT_WINDOWS_LENGTHS_2_5ms[6]; - +#ifdef CR8_G_ADD_75MS +extern const LC3_FLOAT* MDCT_WINS_7_5ms[2][6]; +extern const LC3_INT32 MDCT_la_zeroes_7_5ms[6]; +#endif +extern const LC3_INT MDCT_WINDOWS_LENGTHS_10ms[6]; +extern const LC3_INT MDCT_WINDOWS_LENGTHS_7_5ms[6]; extern const LC3_INT MDCT_WINDOWS_LENGTHS_5ms[6]; +extern const LC3_INT MDCT_WINDOWS_LENGTHS_2_5ms[6]; /* Per band energy */ extern const LC3_INT* ACC_COEFF_PER_BAND[6]; @@ -173,17 +188,31 @@ extern const LC3_INT* ACC_COEFF_PER_BAND_HR[6]; extern const LC3_INT* ACC_COEFF_PER_BAND_2_5ms_HR[6]; extern const LC3_INT* ACC_COEFF_PER_BAND_2_5ms[5]; +#ifdef CR8_G_ADD_75MS +extern const LC3_INT* ACC_COEFF_PER_BAND_7_5ms_HR[6]; +extern const LC3_INT* ACC_COEFF_PER_BAND_7_5ms[5]; +#endif extern const LC3_INT* ACC_COEFF_PER_BAND_5ms_HR[6]; extern const LC3_INT* ACC_COEFF_PER_BAND_5ms[5]; /* Near Nyquist detector */ extern const LC3_INT NN_thresh; - +/* Tone detector */ +#ifdef CR8_E_TONE_DETECTOR +extern const LC3_INT32 TD_HR_thresh_10ms; +extern const LC3_INT32 TD_HR_thresh_7_5ms; +extern const LC3_INT32 TD_HR_thresh_5ms; +extern const LC3_INT32 TD_HR_thresh_2_5ms; +#endif // CR8_E_TONE_DETECTOR extern const LC3_INT32 xavg_N_grp[5]; extern const LC3_FLOAT *hannOla_wins[5]; extern const LC3_INT32 gwlpr[MAX_LGW+1]; +#ifdef CR8_A_PLC_FADEOUT_TUNING +extern const LC3_INT16 fade_scheme_tab[24 / 2][3]; +extern const LC3_FLOAT scATHFx[MAX_LGW - 2]; +#endif extern const LC3_INT32 mdct_grp_bins[10]; extern const LC3_FLOAT* PhECU_whr16ms_wins[5]; @@ -200,4 +229,9 @@ extern const LC3_FLOAT plc_tdc_lpc_48[17]; extern const LC3_FLOAT plc_tdc_lpc_96[17]; extern const LC3_FLOAT plc_tdc_lpc_8_25ms[9]; +#if defined(CR8_A_PLC_FADEOUT_TUNING) +extern const LC3_INT16 plc_fadeout_param_maxlen[4]; +extern const LC3_INT16 plc_fadeout_param_maxbytes[4]; #endif + +#endif /* CONSTANTS_H */ diff --git a/lib_lc3plus/cutoff_bandwidth.c b/lib_lc3plus/cutoff_bandwidth.c index 642b2afda2..c2d37312eb 100644 --- a/lib_lc3plus/cutoff_bandwidth.c +++ b/lib_lc3plus/cutoff_bandwidth.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,7 +13,7 @@ void process_cutoff_bandwidth(LC3_FLOAT *d_fl, LC3_INT len, LC3_INT bw_bin) { - LC3_INT i = 0; + LC3_INT i; if (len > bw_bin){ for (i = -1; i < 3; i++) { diff --git a/lib_lc3plus/dct4.c b/lib_lc3plus/dct4.c index 8fd5784b28..9b12627d71 100644 --- a/lib_lc3plus/dct4.c +++ b/lib_lc3plus/dct4.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -30,18 +30,17 @@ void dct2_apply(Dct2* dct, const LC3_FLOAT* input, LC3_FLOAT* output) { Complex tmp1[MAX_LEN]; Complex tmp2[MAX_LEN]; - int i = 0; - const int len = dct->length; + int i; assert(input != output); - for (i = 0; i < len / 2; i++) { + for (i = 0; i < 8; i++) { tmp1[i] = cmplx(input[i * 2], 0); - tmp1[len - i - 1] = cmplx(input[i * 2 + 1], 0); + tmp1[16 - i - 1] = cmplx(input[i * 2 + 1], 0); } fft_apply(&dct->fft, tmp1, tmp2); - for (i = 0; i < len; i++) { + for (i = 0; i < 16; i++) { output[i] = cmul(tmp2[i], dct2_16[i]).r; } output[0] /= (LC3_FLOAT)1.414213562373095; /* SQRT(2) */ @@ -50,7 +49,7 @@ void dct2_apply(Dct2* dct, const LC3_FLOAT* input, LC3_FLOAT* output) void dct4_init(Dct4* dct, int length) { - int i = 0; + int i; assert(length <= MAX_LEN); dct->length = length; dct->twid1 = calloc(sizeof(*dct->twid1), length / 2); @@ -81,13 +80,13 @@ void dct4_apply(Dct4* dct, const LC3_FLOAT* input, LC3_FLOAT* output) const LC3_FLOAT norm = (LC3_FLOAT)1.0 / LC3_SQRT((LC3_FLOAT)(len >> 1)); assert(input != output); - for (i = 0; i < len / 2; i++) { + for (i = 0; i < len >> 1; i++) { tmp1[i] = cmul(cmplx(input[i * 2], input[len - i * 2 - 1]), dct->twid1[i]); } fft_apply(&dct->fft, tmp1, tmp2); - for (i = 0; i < len / 2; i++) { + for (i = 0; i < len >> 1; i++) { Complex t = cmul(tmp2[i], dct->twid2[i]); output[i * 2] = t.r * norm; output[len - i * 2 - 1] = -t.i * norm; diff --git a/lib_lc3plus/dec_entropy.c b/lib_lc3plus/dec_entropy.c index d8512a1068..f072b82d6f 100644 --- a/lib_lc3plus/dec_entropy.c +++ b/lib_lc3plus/dec_entropy.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -32,7 +32,7 @@ void read_bit_fl(LC3_UINT8* ptr, LC3_INT* mask_side, LC3_INT* bp_side, LC3_INT* void read_uint_fl(LC3_INT nbits, LC3_UINT8* ptr, LC3_INT* mask_side, LC3_INT* bp_side, LC3_INT* val) { - LC3_INT bit = 0, i = 0; + LC3_INT bit, i; read_bit_fl(ptr, mask_side, bp_side, val); @@ -131,8 +131,8 @@ void processDecoderEntropy_fl(LC3_UINT8* bytes, LC3_INT numbytes, LC3_INT* mask_ LC3_INT* lsbMode, LC3_INT frame_dms) { - LC3_INT plc_trigger_bw = 0, plc_trigger_last_nz = 0, plc_trigger_SNS1 = 0, plc_trigger_SNS2 = 0, tmp = 0, bit = 0, - submodeMSB = 0, i = 0, ltpf_tmp[3] = {0}, ind = 0, submodeLSB = 0, bp_side_local = 0, mask_side_local = 0; + LC3_INT plc_trigger_bw, plc_trigger_last_nz, plc_trigger_SNS1, plc_trigger_SNS2, tmp, bit, + submodeMSB, i, ltpf_tmp[3], ind, submodeLSB, bp_side_local, mask_side_local; LC3_UINT8* ptr; LC3_INT gainMSBbits[4] = {1, 1, 2, 2}; @@ -174,7 +174,7 @@ void processDecoderEntropy_fl(LC3_UINT8* bytes, LC3_INT numbytes, LC3_INT* mask_ } /* Last non-zero tuple */ - read_uint_fl(ceil(LC3_LOGTWO(N / 2)), ptr, &mask_side_local, &bp_side_local, lastnz); + read_uint_fl(ceil(LC3_LOGTWO(N >> 1)), ptr, &mask_side_local, &bp_side_local, lastnz); *lastnz = (*lastnz + 1) * 2; if (*lastnz > N) { diff --git a/lib_lc3plus/dec_lc3_fl.c b/lib_lc3plus/dec_lc3_fl.c index 88c528b0f6..7389ffa53e 100644 --- a/lib_lc3plus/dec_lc3_fl.c +++ b/lib_lc3plus/dec_lc3_fl.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -58,17 +58,13 @@ static int Dec_LC3PLUS_Channel_fl(LC3PLUS_Dec* decoder, int channel, uint8_t* bs bfi = 2; switch (decoder->frame_dms) { -# ifdef ENABLE_025_DMS_MODE case 25: max_bw_stopband = max_bw_stopband >> 2; break; -# endif -# ifdef ENABLE_050_DMS_MODE case 50: max_bw_stopband = max_bw_stopband >> 1; break; -# endif -# ifdef ENABLE_075_DMS_MODE +# ifdef CR8_G_ADD_75MS case 75: max_bw_stopband = 3 * (max_bw_stopband >> 2); break; @@ -151,7 +147,11 @@ static int Dec_LC3PLUS_Channel_fl(LC3PLUS_Dec* decoder, int channel, uint8_t* bs &h_DecSetup->PlcAdvSetup->cum_fading_slow, &h_DecSetup->PlcAdvSetup->cum_fading_fast, h_DecSetup->PlcSetup.q_d_prev, h_DecSetup->sqQdec_fl, h_DecSetup->spec_inv_idx, decoder->yLen, bfi, decoder->frame_dms, h_DecSetup->concealMethod, h_DecSetup->ltpf_mem_pitch, h_DecSetup->ltpf_param[0], - &h_DecSetup->PlcAdvSetup->cum_fflcAtten); + &h_DecSetup->PlcAdvSetup->cum_fflcAtten +#ifdef CR8_A_PLC_FADEOUT_TUNING + , h_DecSetup->PlcAdvSetup->plc_fadeout_type +#endif + ); /* IMDCT */ if (h_DecSetup->concealMethod == 4 || bfi != 1 ) @@ -171,6 +171,9 @@ static int Dec_LC3PLUS_Channel_fl(LC3PLUS_Dec* decoder, int channel, uint8_t* bs bfi, h_DecSetup->ltpf_param, h_DecSetup->ltpf_param_mem, h_DecSetup->ltpf_conf_beta_idx, h_DecSetup->ltpf_conf_beta, h_DecSetup->concealMethod, h_DecSetup->alpha , &h_DecSetup->ltpf_mem_active +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + , &h_DecSetup->rel_pitch_change, decoder->hrmode, decoder->frame_dms +#endif ); { diff --git a/lib_lc3plus/defines.h b/lib_lc3plus/defines.h index d978fa4e15..d9251c0181 100644 --- a/lib_lc3plus/defines.h +++ b/lib_lc3plus/defines.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef DEFINES_H #define DEFINES_H +#include "options.h" #include "stdint.h" @@ -24,13 +25,14 @@ typedef int8_t LC3_INT8; typedef uint32_t LC3_UINT32; /* Release defines */ -// #define ENABLE_2_5MS_MODE +#define ENABLE_2_5MS_MODE #define ENABLE_5MS_MODE +#define ENABLE_075_DMS_MODE #define ENABLE_10_MS_MODE #define ENABLE_ADVANCED_PLC_FL #define ENABLE_ADVANCED_PLC_FL_DEFAULT #define ENABLE_BW_CONTROLLER -//#define ENABLE_HR_MODE_FL +#define ENABLE_HR_MODE_FL #define ENABLE_PADDING #define ENABLE_RFRAME_FL #define ENABLE_PLC @@ -41,20 +43,89 @@ typedef uint32_t LC3_UINT32; #define ENABLE_FRAME_MS_FLAG #define ENABLE_HR_MODE_FL_FLAG +#define CR8_G_ADD_75MS + #ifndef NO_POST_REL_CHANGES /* Post-release non-bitexact changes */ +#define CR8_A_PLC_FADEOUT_TUNING /* Adapt PLC fadeout to avoid gaps in signal */ +#define CR9_D_FLOATING_POINT_CODE_SIMPLIFICATIONS +#define CR9_F_PITCH_WIN_LEN_FIX /* Increase window length for pitch calculation */ +#define CR9_G_IMPROVE_TDC /* summarize G,H,J,L,N */ +#ifdef CR9_G_IMPROVE_TDC +# define CR9_G_PLC_NS_TDC_FIX /* Always use TDC if pitch > 0 */ +# define CR9_H_REMOVE_SWITCH_TO_PLC_NS +# define CR9_J_SLOW_TDC_FADEOUT +# define CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER +# ifdef ENABLE_HR_MODE_FL +# ifdef PLC_TUNING_SHORT_FADEOUT +# define CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH +# endif +# endif +#endif /* CR9_G_IMPROVE_TDC */ +#define CR9_I_INC_TDC_FADEOUT_LEN +#define CR9_K_REDUCE_NORM_CORR_TH #endif /* NO_POST_REL_CHANGES */ +#ifdef CR9_D_FLOATING_POINT_CODE_SIMPLIFICATIONS +# define CR9_SIMPLIFY_LOOP +# define CR9_LTPF_REWRITE +# define CR9_QUANT_SPEC_REWRITE +# define CR9_SIMPLIFY_ARI_DECODER +#endif + +#ifdef CR8_A_PLC_FADEOUT_TUNING +#define MAX_UINT8 255 +# ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER +# ifdef CR9_K_REDUCE_NORM_CORR_TH +# define THRESH_100_DMS_TDC_CNT 9 +# define THRESH_100_DMS_NS_CNT 7 +# define THRESH_100_DMS_TDC_NS_CNT 73 +# define THRESH_075_DMS_TDC_CNT 7 +# define THRESH_075_DMS_NS_CNT 7 +# define THRESH_075_DMS_TDC_NS_CNT 87 +# define THRESH_050_DMS_TDC_CNT 22 +# define THRESH_050_DMS_NS_CNT 15 +# define THRESH_050_DMS_TDC_NS_CNT 141 +# define THRESH_025_DMS_TDC_CNT 20 +# define THRESH_025_DMS_NS_CNT 21 +# define THRESH_025_DMS_TDC_NS_CNT 278 +# else +# define THRESH_100_DMS_TDC_CNT 3 +# define THRESH_100_DMS_NS_CNT 35 +# define THRESH_100_DMS_TDC_NS_CNT 114 +# define THRESH_075_DMS_TDC_CNT 6 +# define THRESH_075_DMS_NS_CNT 37 +# define THRESH_075_DMS_TDC_NS_CNT 130 +# define THRESH_050_DMS_TDC_CNT 12 +# define THRESH_050_DMS_NS_CNT 55 +# define THRESH_050_DMS_TDC_NS_CNT 227 +# define THRESH_025_DMS_TDC_CNT 10 +# define THRESH_025_DMS_NS_CNT 138 +# define THRESH_025_DMS_TDC_NS_CNT 431 +# endif +# else +# define FAC1_FADEOUT 0.2 +# define FAC2_FADEOUT 1.5 +# define FAC3_FADEOUT 1.75 +# endif +#define REL_PITCH_THRESH 0.36 +#define PLC_LONGTERM_ANALYSIS_MS 200 /* Analysis window 2000 ms / 10 ms */ + +#define PLC_LONGTERM_ANALYSIS_STARTUP_FILL 0.5f /* required buffer fill amount, set to 0.0 to not require any fill at all */ + + +#endif + /* Precision Defines */ -#define LC3_FABS(x) (fabsf(x)) -#define LC3_POW(x, y) (powf(x, y)) +#define LC3_FABS(x) (fabsf(x)) +#define LC3_POW(x, y) (powf(x, y)) #define LC3_LOGTEN(x) (log10f(x)) -#define LC3_LOGTWO(x) (log2f(x)) -# define LC3_COS(x) (cos(x)) -# define LC3_SIN(x) (sin(x)) -#define LC3_SQRT(x) (sqrtf(x)) -#define LC3_EXP(x) (expf(x)) +#define LC3_LOGTWO(x) (log2f(x)) +#define LC3_COS(x) (cos(x)) +#define LC3_SIN(x) (sin(x)) +#define LC3_SQRT(x) (sqrtf(x)) +#define LC3_EXP(x) (expf(x)) # define MAX_BR 320000 /* 400 * 800 */ # define MIN_BR_100DMS 16000 /* 20 * 800 * 100/100 */ @@ -62,10 +133,20 @@ typedef uint32_t LC3_UINT32; # define MIN_BR_050DMS 32000 /* 20 * 800 * 100/ 50 */ # define MAX_BR_050DMS_NB 260800 /* 163 * 800 * 100/ 50 */ # define MAX_BR_100DMS_NB 114400 /* for 100ms at 8kHz */ - # define MAX_BR_100DMS_WB 221600 /* for 100ms at 16kHz */ # define MAX_BR_100DMS_SSWB 314400 /* for 100ms at 24kHz */ +#ifdef CR8_G_ADD_75MS +# define MIN_BR_075DMS_48KHZ_HR ((int)124800/ 800/2)* 800 +# define MIN_BR_075DMS_96KHZ_HR ((int)149600/ 800/2)* 800 +# define MIN_BR_075DMS 21334 /* ceil( 20 * 800 * 100/ 75) */ +# define MAX_BR_075DMS 426667 /* ceil(400 * 800 * 100/ 75) */ +# define MAX_BR_075DMS_NB 152534 /* ceil(143 * 800 * 100/ 75) */ +# define MAX_BR_075DMS_WB 295467 /* ceil(277 * 800 * 100/ 75) */ +# define MAX_BR_075DMS_SSWB 419200 /* ceil(393 * 800 * 100/ 75) */ +#endif +# define CR8_E_TONE_DETECTOR /* Tone detector for hrmode to deactivate TNS - improves SNR and THD+N */ + typedef int32_t LC3_INT32; # if defined(__xtensa__) @@ -76,7 +157,26 @@ typedef int32_t LC3_INT32; # define ALIGNMENT_BALLOC_RED 7 # endif +#ifndef CR8_A_PLC_FADEOUT_TUNING # define PLC2_FADEOUT_IN_MS 30 +#endif + +#ifdef CR8_A_PLC_FADEOUT_TUNING +/* PLC2/PhEcu fading settings */ +/* PLC2/PHEcu muting Table setup settings */ +# define PLC2_FADEOUT_IN_MS_MIN 30 /* Table min */ +# define PLC2_FADEOUT_IN_MS_MAX 140 /* Table max */ +# define PLC2_FADEOUT_RES 10 /* 10 ms steps used in fadeout constant tables */ + +/* current active settings */ +# define PLC2_FADEOUT_IN_MS 30 /* 30 P800 fadeout optimized */ +#if 0 +# define PLC2_FADEOUT_LONG_IN_MS 50 /* 50 ABBA test */ +#endif +# define PLC2_FADEOUT_LONG_IN_MS 120 /* 120 MUSHRA, && stable tonal fadeout optimized */ + +#endif + # define PHECU_FRES 62.5 # define PHECU_C_JACOB 1.1429 # define MAX_LGW 9 /* LGW48K + 1 !! */ @@ -108,16 +208,21 @@ typedef int32_t LC3_INT32; # define TDC_L_FIR_HP 11 # define PLC3_HPBLENDTHROTTLE 30 /* higher numbers increase throttled blending from hp filtered to unfiltered uv excitation (0 is no throttle) */ +#ifdef CR9_I_INC_TDC_FADEOUT_LEN +# define PLC_FADEOUT_TYPE_1_IN_MS 200 +#endif # define PLC_FADEOUT_IN_MS 60 /* fade-out to zero in ms for TD-PLC and NS, minimum value is 20 */ # define PLC4_TRANSIT_START_IN_MS 20 /* begin of transition time for noise substitution for voiced signals */ # define PLC4_TRANSIT_END_IN_MS PLC_FADEOUT_IN_MS /* end of transition time for noise substitution */ # define PLC34_ATTEN_FAC_100 0.5000 /* attenuation factor for NS and TDC @ 10 ms*/ +#ifdef CR8_G_ADD_75MS +# define PLC34_ATTEN_FAC_075 0.5946 /* attenuation factor for NS and TDC @ 7.5 ms */ +#endif # define PLC34_ATTEN_FAC_050 0.7071 /* attenuation factor for NS and TDC @ 5.0 ms*/ # define PLC34_ATTEN_FAC_025 0.8409 /* attenuation factor for NS and TDC @ 2.5 ms*/ # define FEC_SLOT_BYTES_MIN 40 -# define FEC_SLOT_BYTES_MAX 400 - +# define FEC_SLOT_BYTES_MAX 400 # define LC3_CONST_POW_2_M15 3.051757812500000e-05 # define LC3_CONST_POW_2_23 8388608 @@ -134,16 +239,30 @@ typedef int32_t LC3_INT32; #define G192_ONE 0x0081 #define READ_G192FER /* Allow C executable to also read G192 formatted FER files */ +#ifdef DEBUG +#ifdef READ_G192FER +# define READ_G192_FER_BYTE /* Allow C executable to also read G192 byte formatted FER files 0x20=BAD , 0x21=Good */ +#endif +#endif + + # define LC3_EPS (1.1e-7f) #define M_PI 3.14159265358979323846 /* FUNCTION MACROS */ #define CEILING(x, y) (((x) + (y)-1) / (y)) + + +#ifdef CR8_A_PLC_FADEOUT_TUNING +#define FRAME2FS_IDX_10MS(x) (x<500 ? (x/100) : 5) /* 80 -> 0, 160 -> 1, 240 -> 2, 320 -> 3, 480 -> 4 , 960 -> 5*/ +#define FS2FS_IDX(x) ((x) == 96000 ? 5 : (x) / 10000) /* 8000 -> 0, 16000 -> 1, 24000 -> 2, 32000 -> 3, 48000 -> 4, 96000 -> 5 */ +#else #define FRAME2FS_IDX(x) (x / 100) /* 80 -> 0, 160 -> 1, 240 -> 2, 320 -> 3, 480 -> 4*/ #define FS2FS_IDX(x) \ (x / 10000) /* 8000 -> 0, 16000 -> 1, 24000 -> 2, 32000 -> 3, 48000 -> 4 \ */ +#endif #define UNUSED(x) (void)(x) /* silence unused parameter warning */ #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) @@ -159,6 +278,7 @@ typedef int32_t LC3_INT32; /* OPTIONS */ +#define MAX_LEN_NR 480 #define MAX_SR 96000 #define EXT_RES_ITER_MAX 20 #define MAX_BW_BANDS_NUMBER 6 diff --git a/lib_lc3plus/detect_cutoff_warped.c b/lib_lc3plus/detect_cutoff_warped.c index 9392867208..239da4255f 100644 --- a/lib_lc3plus/detect_cutoff_warped.c +++ b/lib_lc3plus/detect_cutoff_warped.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,10 +13,10 @@ void processDetectCutoffWarped_fl(LC3_FLOAT* d2, LC3_INT fs_idx, LC3_INT frame_dms, LC3_INT* bw_idx) { - const LC3_INT *warp_idx_start = NULL, *warp_idx_stop = NULL; - LC3_INT counter = 0, brickwall = 0, i = 0, stop = 0, dist = 0; - LC3_FLOAT d2_mean = 0, d2_sum = 0, e_diff = 0, thr = 0; - const LC3_INT *bw_dist = NULL; + const LC3_INT *warp_idx_start, *warp_idx_stop; + LC3_INT counter, brickwall = 0, i, stop, dist; + LC3_FLOAT d2_mean, d2_sum, e_diff, thr; + const LC3_INT *bw_dist; warp_idx_start = BW_warp_idx_start_all[fs_idx - 1]; warp_idx_stop = BW_warp_idx_stop_all[fs_idx - 1]; @@ -33,6 +33,13 @@ void processDetectCutoffWarped_fl(LC3_FLOAT* d2, LC3_INT fs_idx, LC3_INT frame_d warp_idx_stop = BW_warp_idx_stop_all_5ms[fs_idx - 1]; bw_dist = brickwall_dist; break; +#ifdef CR8_G_ADD_75MS + case 75: + warp_idx_start = BW_warp_idx_start_all_7_5ms[fs_idx - 1]; + warp_idx_stop = BW_warp_idx_stop_all_7_5ms[fs_idx - 1]; + bw_dist = brickwall_dist_7_5ms; + break; +#endif case 100: warp_idx_start = BW_warp_idx_start_all[fs_idx - 1]; warp_idx_stop = BW_warp_idx_stop_all[fs_idx - 1]; diff --git a/lib_lc3plus/enc_entropy.c b/lib_lc3plus/enc_entropy.c index a7ff8cd700..23423b5d80 100644 --- a/lib_lc3plus/enc_entropy.c +++ b/lib_lc3plus/enc_entropy.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,9 @@ #include "options.h" #include "functions.h" +static const LC3_INT gainMSBbits[4] = {1, 1, 2, 2}; +static const LC3_INT gainLSBbits[4] = {0, 1, 0, 1}; + void processEncoderEntropy_fl(LC3_UINT8* bytes, LC3_INT* bp_side, LC3_INT* mask_side, LC3_INT numbytes, LC3_INT bw_cutoff_bits, LC3_INT bw_cutoff_idx, LC3_INT lastnz, LC3_INT N, LC3_INT lsbMode, LC3_INT gg_idx, LC3_INT num_tns_filters, LC3_INT* tns_order, LC3_INT* ltpf_idx, LC3_INT* scf_idx, LC3_INT fac_ns_idx @@ -18,8 +21,8 @@ void processEncoderEntropy_fl(LC3_UINT8* bytes, LC3_INT* bp_side, LC3_INT* mask_ ) { LC3_UINT8* ptr; - LC3_INT i = 0, submodeMSB = 0, submodeLSB = 0, tmp = 0, gainMSB = 0, gainLSB = 0; - LC3_INT gainMSBbits[4] = {1, 1, 2, 2}, gainLSBbits[4] = {0, 1, 0, 1}; + LC3_INT i, submodeMSB, submodeLSB, tmp, gainMSB, gainLSB; + LC3_INT16 lastnzTrigger[5] = {63, 127, 127, 255, 255}; @@ -38,7 +41,7 @@ void processEncoderEntropy_fl(LC3_UINT8* bytes, LC3_INT* bp_side, LC3_INT* mask_ } else { - write_uint_backward_fl(ptr, bp_side, mask_side, lastnz / 2 - 1, ceil(LC3_LOGTWO(N / 2))); + write_uint_backward_fl(ptr, bp_side, mask_side, lastnz / 2 - 1, ceil(LC3_LOGTWO(N >> 1))); } /* LSB mode bit */ @@ -100,27 +103,25 @@ void processEncoderEntropy_fl(LC3_UINT8* bytes, LC3_INT* bp_side, LC3_INT* mask_ void write_uint_backward_fl(LC3_UINT8* ptr, LC3_INT* bp_side, LC3_INT* mask_side, LC3_INT val, LC3_INT numbits) { - LC3_INT k = 0, bit = 0; + LC3_INT k, bit; for (k = 0; k < numbits; k++) { bit = val & 1; write_bit_backward_fl(ptr, bp_side, mask_side, bit); - val = val / 2; + val = val >> 1; } } void write_bit_backward_fl(LC3_UINT8* ptr, LC3_INT* bp_side, LC3_INT* mask_side, LC3_INT bit) { - if (bit == 0) { - ptr[*bp_side] = ptr[*bp_side] & (255 - *mask_side); - } else { + if (bit != 0) { ptr[*bp_side] = ptr[*bp_side] | *mask_side; - } + } if (*mask_side == 128) { *mask_side = 1; *bp_side = *bp_side - 1; } else { - *mask_side = *mask_side * 2; + *mask_side = *mask_side << 1; } } diff --git a/lib_lc3plus/enc_lc3_fl.c b/lib_lc3plus/enc_lc3_fl.c index c89f7244ca..404b80fb4b 100644 --- a/lib_lc3plus/enc_lc3_fl.c +++ b/lib_lc3plus/enc_lc3_fl.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -62,14 +62,22 @@ static void Enc_LC3PLUS_Channel_fl(LC3PLUS_Enc* encoder, int channel, int32_t* s /* Pitch estimation */ processOlpa_fl(h_EncSetup->s_12k8, h_EncSetup->olpa_mem_s12k8, h_EncSetup->olpa_mem_s6k4, - &h_EncSetup->olpa_mem_pitch, &T0_out, &normcorr, s_12k8_len, encoder->frame_dms); + &h_EncSetup->olpa_mem_pitch, +#ifdef CR9_F_PITCH_WIN_LEN_FIX + &h_EncSetup->pitch_flag, +#endif + &T0_out, &normcorr, s_12k8_len, encoder->frame_dms); /* LTPF encoder */ process_ltpf_coder_fl(h_EncSetup->s_12k8, s_12k8_len + 1, h_EncSetup->ltpf_enable, T0_out, normcorr, encoder->frame_dms, h_EncSetup->ltpf_mem_in, encoder->ltpf_mem_in_len, &h_EncSetup->ltpf_mem_normcorr, &h_EncSetup->ltpf_mem_ltpf_on, &h_EncSetup->ltpf_mem_pitch, h_EncSetup->ltpf_param, &h_EncSetup->ltpf_mem_mem_normcorr, - <pfBits); + <pfBits +#ifdef CR9_K_REDUCE_NORM_CORR_TH + ,encoder->hrmode +#endif +); /* Attack detector */ attack_detector_fl(h_EncSetup->s_in_scaled, encoder->frame_length, encoder->fs, &h_EncSetup->attdec_position, @@ -79,8 +87,12 @@ static void Enc_LC3PLUS_Channel_fl(LC3PLUS_Enc* encoder, int channel, int32_t* s /* Per-band energy */ processPerBandEnergy_fl(encoder->bands_number, encoder->bands_offset, encoder->hrmode, encoder->frame_dms, h_EncSetup->ener, d_fl); /* Near Nyquist detector */ - processNearNyquistdetector_fl(&encoder->near_nyquist_flag, encoder->fs_idx, encoder->near_nyquist_index, encoder->bands_number, h_EncSetup->ener); - + processNearNyquistdetector_fl(&encoder->near_nyquist_flag, encoder->fs_idx, encoder->near_nyquist_index, encoder->bands_number, h_EncSetup->ener +#ifdef CR8_E_TONE_DETECTOR + , encoder->frame_dms, encoder->hrmode ); +#else + ); +#endif /* Disable LTPF if nyquist detector triggers or -lfe mode is active*/ if (encoder->near_nyquist_flag != 0 || h_EncSetup->lfe == 1) { @@ -100,8 +112,8 @@ static void Enc_LC3PLUS_Channel_fl(LC3PLUS_Enc* encoder, int channel, int32_t* s BW_cutoff_idx = 0; } - processSnsComputeScf_fl(h_EncSetup->ener, encoder->tilt, encoder->bands_number, h_EncSetup->scf, - h_EncSetup->attdec_detected, encoder->sns_damping, encoder->attdec_damping); + processSnsComputeScf_fl(h_EncSetup->ener, encoder->bands_number, h_EncSetup->scf, + h_EncSetup->attdec_detected, encoder->sns_damping, encoder->attdec_damping, encoder->fs_idx); /* SNS Quantizer */ process_snsQuantizesScf_Enc(h_EncSetup->scf, h_EncSetup->L_scf_idx, h_EncSetup->scf_q, h_EncSetup->dct2StructSNS); diff --git a/lib_lc3plus/estimate_global_gain.c b/lib_lc3plus/estimate_global_gain.c index df9b1f5f23..fdaa977c06 100644 --- a/lib_lc3plus/estimate_global_gain.c +++ b/lib_lc3plus/estimate_global_gain.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -19,9 +19,9 @@ void processEstimateGlobalGain_fl(LC3_FLOAT x[], LC3_INT lg, LC3_INT nbitsSQ, LC ) { - LC3_INT i = 0, N = 0, offset = 0, j = 0, iszero = 0; - LC3_FLOAT g_min = 0, x_max = 0, tmp = 0, ind = 0, ind_min = 0, target = 0, fac = 0, ener = 0; - LC3_FLOAT en[MAX_LEN / 4] = {0}; + LC3_INT i, N, offset, j, iszero, fac; + LC3_FLOAT g_min, x_max, tmp, ind, ind_min, target, ener; + LC3_FLOAT en[MAX_LEN / 4]; LC3_FLOAT reg_val = 4.656612873077393e-10; if (*old_targetBits < 0) { @@ -61,7 +61,7 @@ void processEstimateGlobalGain_fl(LC3_FLOAT x[], LC3_INT lg, LC3_INT nbitsSQ, LC } else { g_min = x_max / (32767 - 0.375); } - /* Prevent positive rounding errors from LC3_LOGTEN function */ + /* Prevent positive rounding errors from LC3_LOG10 function */ ind_min = 28.0 * LC3_LOGTEN(g_min); ind_min = ceil(ind_min + LC3_FABS(ind_min) * LC3_EPS); @@ -85,8 +85,9 @@ void processEstimateGlobalGain_fl(LC3_FLOAT x[], LC3_INT lg, LC3_INT nbitsSQ, LC fac = 256; offset = 255 + quantizedGainOff; - for (i = 0; i < 8; i++) { - fac = fac * 0.5; + for (i = 0; i < 8; i++) + { + fac = fac >> 1; offset = offset - fac; ener = 0; iszero = 1; diff --git a/lib_lc3plus/fft/cfft.c b/lib_lc3plus/fft/cfft.c index 4bd8d29ade..e8a6304ee1 100644 --- a/lib_lc3plus/fft/cfft.c +++ b/lib_lc3plus/fft/cfft.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -8,6 +8,7 @@ ******************************************************************************/ + #include "options.h" #include "cfft.h" #include "iisfft.h" /* for M_PIl */ diff --git a/lib_lc3plus/fft/cfft.h b/lib_lc3plus/fft/cfft.h index 3902b4c396..6ba8dfccd3 100644 --- a/lib_lc3plus/fft/cfft.h +++ b/lib_lc3plus/fft/cfft.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -9,6 +9,7 @@ +#include "options.h" #include "../functions.h" #ifndef CFFT_H diff --git a/lib_lc3plus/fft/fft_15_16.h b/lib_lc3plus/fft/fft_15_16.h index 83ca77353b..c527f1bf56 100644 --- a/lib_lc3plus/fft/fft_15_16.h +++ b/lib_lc3plus/fft/fft_15_16.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/fft/fft_240_480.h b/lib_lc3plus/fft/fft_240_480.h index c1d96c87b8..18a0c8707a 100644 --- a/lib_lc3plus/fft/fft_240_480.h +++ b/lib_lc3plus/fft/fft_240_480.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/fft/fft_2_9.h b/lib_lc3plus/fft/fft_2_9.h index 54f4f839df..55fe84f3b7 100644 --- a/lib_lc3plus/fft/fft_2_9.h +++ b/lib_lc3plus/fft/fft_2_9.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/fft/fft_32.h b/lib_lc3plus/fft/fft_32.h index 48b891108b..803923a015 100644 --- a/lib_lc3plus/fft/fft_32.h +++ b/lib_lc3plus/fft/fft_32.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/fft/fft_384_768.h b/lib_lc3plus/fft/fft_384_768.h index 47f42e90d6..bd89393c17 100644 --- a/lib_lc3plus/fft/fft_384_768.h +++ b/lib_lc3plus/fft/fft_384_768.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/fft/fft_60_128.h b/lib_lc3plus/fft/fft_60_128.h index 75f1aaef45..e5a88ccad8 100644 --- a/lib_lc3plus/fft/fft_60_128.h +++ b/lib_lc3plus/fft/fft_60_128.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/fft/fft_generic.h b/lib_lc3plus/fft/fft_generic.h index e517ffb250..903875ab5a 100644 --- a/lib_lc3plus/fft/fft_generic.h +++ b/lib_lc3plus/fft/fft_generic.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/fft/iis_fft.c b/lib_lc3plus/fft/iis_fft.c index b1f8ab5ab8..30ae240200 100644 --- a/lib_lc3plus/fft/iis_fft.c +++ b/lib_lc3plus/fft/iis_fft.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -15,8 +15,8 @@ #include #include #include - #include "iis_fft.h" + /**************************************************************************************************/ /* AFFT uses two fft implementations @@ -25,7 +25,6 @@ fast lengths, check the fft_n function. */ - #define FFT_COMPLEX 1 #define FFT_REAL 2 diff --git a/lib_lc3plus/fft/iis_fft.h b/lib_lc3plus/fft/iis_fft.h index b658930fa7..b70a3719d3 100644 --- a/lib_lc3plus/fft/iis_fft.h +++ b/lib_lc3plus/fft/iis_fft.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef IIS_FFT_H #define IIS_FFT_H +#include "options.h" #include "../structs.h" #include "../defines.h" #include "cfft.h" diff --git a/lib_lc3plus/fft/iisfft.c b/lib_lc3plus/fft/iisfft.c index 227d2b6037..cdf7f8d2a8 100644 --- a/lib_lc3plus/fft/iisfft.c +++ b/lib_lc3plus/fft/iisfft.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -8,8 +8,8 @@ ******************************************************************************/ -#include "options.h" +#include "options.h" #include #include /* for mmove */ #include diff --git a/lib_lc3plus/fft/iisfft.h b/lib_lc3plus/fft/iisfft.h index 7b448e2bbe..b45e73cdec 100644 --- a/lib_lc3plus/fft/iisfft.h +++ b/lib_lc3plus/fft/iisfft.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef IISFFT_H #define IISFFT_H +#include "options.h" #include "../defines.h" #ifndef M_PIl diff --git a/lib_lc3plus/functions.h b/lib_lc3plus/functions.h index 7a529a25d7..b0997e85fa 100644 --- a/lib_lc3plus/functions.h +++ b/lib_lc3plus/functions.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef FUNCTIONS_H #define FUNCTIONS_H +#include "options.h" #include "clib.h" #include "defines.h" #include "float.h" @@ -106,8 +107,11 @@ void processNoiseFactor_fl(LC3_INT* fac_ns_idx, LC3_FLOAT x[], LC3_INT xq[], LC3 void processNoiseFilling_fl(LC3_FLOAT xq[], LC3_INT nfseed, LC3_INT fac_ns_idx, LC3_INT bw_stopband, LC3_INT frame_dms, LC3_FLOAT fac_ns_pc, LC3_INT spec_inv_idx); -void processOlpa_fl(LC3_FLOAT* s_12k8, LC3_FLOAT* mem_s12k8, LC3_FLOAT* mem_s6k4, LC3_INT* mem_old_T0, LC3_INT* T0_out, - LC3_FLOAT* normcorr_out, LC3_INT len, LC3_INT frame_dms); +void processOlpa_fl(LC3_FLOAT* s_12k8, LC3_FLOAT* mem_s12k8, LC3_FLOAT* mem_s6k4, LC3_INT* mem_old_T0, +#ifdef CR9_F_PITCH_WIN_LEN_FIX + LC3_INT* pitch_flag, +#endif + LC3_INT* T0_out,LC3_FLOAT* normcorr_out, LC3_INT len, LC3_INT frame_dms); void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, LC3_INT fs, LC3_INT N, LC3_INT frame_dms, LC3_INT nBits, LC3_INT* order_out, LC3_INT* rc_idx, LC3_INT* tns_numfilters, LC3_INT* bits_out @@ -117,14 +121,18 @@ void levinsonDurbin(LC3_FLOAT* r, LC3_FLOAT* out_lev, LC3_FLOAT* rc_unq, LC3_FLO void processTnsDecoder_fl(LC3_FLOAT* x, LC3_INT* rc_idx, LC3_INT* order, LC3_INT numfilters, LC3_INT bw_fcbin, LC3_INT N, LC3_INT fs); -void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT tilt, LC3_INT xLen, LC3_FLOAT* gains, LC3_INT smooth, LC3_FLOAT sns_damping, LC3_FLOAT attdec_damping_factor); +void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* gains, LC3_INT smooth, LC3_FLOAT sns_damping, LC3_FLOAT attdec_damping_factor, LC3_INT fs_idx); void processSnsInterpolateScf_fl(LC3_FLOAT* gains, LC3_INT encoder_side, LC3_INT bands_number, LC3_FLOAT* gains_LC3_INT); void processDetectCutoffWarped_fl(LC3_FLOAT* d2, LC3_INT fs_idx, LC3_INT frame_dms, LC3_INT* bw_idx); void processNearNyquistdetector_fl(LC3_INT16* near_nyquist_flag, const LC3_INT fs_idx, const LC3_INT near_nyquist_index, - const LC3_INT bands_number, const LC3_FLOAT* ener); - + const LC3_INT bands_number, const LC3_FLOAT* ener +#ifdef CR8_E_TONE_DETECTOR + , const LC3_INT16 frame_dms, const LC3_INT16 hrmode ); +#else + ); +#endif void processPerBandEnergy_fl(LC3_INT bands_number, const LC3_INT* acc_coeff_per_band, LC3_INT16 hrmode, LC3_INT16 frame_dms, LC3_FLOAT* d2, LC3_FLOAT* d); void ProcessingIMDCT_fl(LC3_FLOAT* y, LC3_INT yLen, const LC3_FLOAT* win, LC3_INT winLen, LC3_INT last_zeros, LC3_FLOAT* mem, LC3_FLOAT* x, @@ -134,12 +142,19 @@ void ProcessingITDA_WIN_OLA_fl(LC3_FLOAT* x_tda, LC3_INT32 yLen, const LC3_FLOAT void process_ltpf_coder_fl(LC3_FLOAT* xin, LC3_INT xLen, LC3_INT ltpf_enable, LC3_INT pitch_ol, LC3_FLOAT pitch_ol_norm_corr, LC3_INT frame_dms, LC3_FLOAT* mem_old_x, LC3_INT memLen, LC3_FLOAT* mem_norm_corr_past, LC3_INT* mem_on, LC3_FLOAT* mem_pitch, - LC3_INT* param, LC3_FLOAT* mem_norm_corr_past_past, LC3_INT* bits); + LC3_INT* param, LC3_FLOAT* mem_norm_corr_past_past, LC3_INT* bits +#ifdef CR9_K_REDUCE_NORM_CORR_TH + ,LC3_INT16 hrmode +#endif +); void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT fs, LC3_FLOAT* mem_old_x, LC3_FLOAT* mem_old_y, LC3_INT* mem_pitch_LC3_INT, LC3_INT* mem_pitch_fr, LC3_FLOAT* mem_gain, LC3_INT* mem_beta_idx, LC3_INT bfi, LC3_INT* param, LC3_INT* mem_param, LC3_INT conf_beta_idx, LC3_FLOAT conf_beta, LC3_INT concealMethod, LC3_FLOAT damping , LC3_INT *mem_ltpf_active +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + , LC3_FLOAT *rel_pitch_change, LC3_INT hrmode, LC3_INT frame_dms +#endif ); void process_resamp12k8_fl(LC3_FLOAT x[], LC3_INT x_len, LC3_FLOAT mem_in[], LC3_INT mem_in_len, LC3_FLOAT mem_50[], LC3_FLOAT mem_out[], @@ -225,10 +240,19 @@ void processPlcDampingScramblingMain_fl(LC3_INT32 *ns_seed, LC3_INT32 ns_nbLostCmpt, LC3_FLOAT *stabFac, LC3_FLOAT *cum_fading_slow, LC3_FLOAT *cum_fading_fast, LC3_FLOAT *spec_prev, LC3_FLOAT *spec, LC3_INT32 spec_inv_idx, LC3_INT32 yLen, LC3_INT32 bfi, LC3_INT32 frame_dms, LC3_INT32 concealMethod, LC3_INT32 pitch_present_bfi1, LC3_INT32 pitch_present_bfi2, - LC3_FLOAT *cum_fflcAtten); + LC3_FLOAT *cum_fflcAtten +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type +#endif + ); + void processPlcDampingScrambling_fl(LC3_FLOAT *spec, LC3_INT32 yLen, LC3_INT32 nbLostCmpt, LC3_FLOAT *stabFac, LC3_INT32 processDampScramb, LC3_FLOAT *cum_fflcAtten, LC3_INT32 pitch_present, LC3_INT32 frame_dms, LC3_FLOAT *cum_fading_slow, - LC3_FLOAT *cum_fading_fast, LC3_INT32 *seed, LC3_INT32 spec_inv_idx); + LC3_FLOAT *cum_fading_fast, LC3_INT32 *seed, LC3_INT32 spec_inv_idx +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type +#endif + ); void plc_phEcu_F0_refine_first(LC3_INT32 *plocs, LC3_INT32 n_plocs, LC3_FLOAT *f0est, const LC3_INT32 Xabs_len, LC3_FLOAT *f0binPtr, LC3_FLOAT *f0gainPtr, const LC3_INT32 nSubm); @@ -253,7 +277,12 @@ void plc_phEcu_spec_ana(LC3_FLOAT* xfp, LC3_INT32 xfp_len, const LC3_FLOAT* LC3_FLOAT* f0hzLtpBinPtr, LC3_FLOAT* f0gainLtpPtr, LC3_INT32 bw_idx, Fft* PhEcu_Fft); void plc_phEcu_subst_spec(LC3_INT32* plocs, LC3_INT32 n_plocs, LC3_FLOAT* f0est, LC3_INT32 time_offs, Complex* X, LC3_INT32 X_len, LC3_FLOAT* mag_chg_gr, LC3_INT32 *seed, LC3_FLOAT* alpha, LC3_FLOAT* beta, LC3_FLOAT* Xavg, - LC3_INT32 t_adv_in, LC3_INT32 Lprot, LC3_INT32 delta_corr, LC3_FLOAT *corr_phase_dbg, + LC3_INT32 t_adv_in, LC3_INT32 Lprot, LC3_INT32 delta_corr, +#ifdef CR8_A_PLC_FADEOUT_TUNING + LC3_INT16 fadeout, /* needed for DC muting */ + LC3_INT16* nonpure_tone_flag_ptr, /* i/o: flag */ +#endif + LC3_FLOAT *corr_phase_dbg, LC3_FLOAT *X_i_new_re_dbg, LC3_FLOAT *X_i_new_im_dbg); void plc_phEcu_rec_frame(Complex *X_in, LC3_INT32 xfp_len, LC3_INT32 Lecu, const LC3_FLOAT *whr, const LC3_FLOAT *winMDCT, LC3_INT32 Lprot, LC3_FLOAT *xfp, LC3_INT32 time_offs, LC3_FLOAT *x_out, @@ -268,12 +297,21 @@ void plc_phEcu_tba_per_band_gain(LC3_INT32 n_grp, LC3_FLOAT *gr_pow_left, LC3_FL void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FLOAT *grp_pow_change, LC3_FLOAT *stPhECU_beta_mute, LC3_FLOAT *stPhECU_mag_chg_1st, LC3_FLOAT *alpha, LC3_FLOAT *beta, LC3_FLOAT *mag_chg, LC3_FLOAT *ph_dith, LC3_INT32 *tr_dec, - LC3_FLOAT *att_val, LC3_INT32 *attDegreeFrames, LC3_FLOAT *thresh_dbg); + LC3_FLOAT *att_val, LC3_INT32 *attDegreeFrames, + LC3_FLOAT *thresh_dbg +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type +#endif + ); void plc_phEcu_trans_burst_ana_sub(LC3_INT32 fs_idx, LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FLOAT *oold_spect_shape, LC3_FLOAT *oold_EwPtr, LC3_FLOAT *old_spect_shape, LC3_FLOAT *old_EwPtr, LC3_FLOAT *stPhECU_beta_mute, LC3_FLOAT *stPhECU_mag_chg_1st, LC3_FLOAT *stPhECU_Xavg, LC3_FLOAT *alpha, LC3_FLOAT *beta, LC3_FLOAT *mag_chg, - LC3_INT32 *tr_dec_dbg, LC3_FLOAT *gpc_dbg); + LC3_INT32 *tr_dec_dbg, LC3_FLOAT *gpc_dbg +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type +#endif + ); void plc_phEcu_hq_ecu( LC3_FLOAT *f0binPtr, LC3_FLOAT *f0ltpGainPtr, LC3_FLOAT *xfp, LC3_INT16 prev_bfi, LC3_INT32 *short_flag_prev, @@ -287,6 +325,10 @@ void plc_phEcu_hq_ecu( LC3_FLOAT *st_beta_mute, LC3_FLOAT *st_mag_chg_1st, LC3_FLOAT *st_Xavg, LC3_INT32 LA_ZEROS, LC3_FLOAT *x_tda, LC3_FLOAT *xsubst_dbg, Complex *X_out_m_dbg, LC3_INT32 *seed_dbg, LC3_FLOAT *mag_chg_dbg, LC3_INT32 *tr_dec_dbg, LC3_FLOAT *gpc_dbg, LC3_FLOAT *X_i_new_re_dbg, LC3_FLOAT *X_i_new_im_dbg, LC3_FLOAT *corr_phase_dbg ,Fft* PhEcu_Fft,Fft* PhEcu_Ifft +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type, + LC3_INT16 *nonpure_tone_flag_ptr +#endif ); void processTdcPreemphasis_fl(LC3_FLOAT *in, LC3_FLOAT *pre_emph_factor, LC3_INT32 n_bands); @@ -296,7 +338,11 @@ void processTdcInverseOdft_fl(LC3_FLOAT *in, LC3_INT32 n_bands, LC3_FLOAT *out, void processTdcApply_fl(const LC3_INT32 pitch_LC3_INT, const LC3_FLOAT *preemphFac, const LC3_FLOAT* A, const LC3_INT32 lpc_order, const LC3_FLOAT* pcmbufHist, const LC3_INT32 max_len_pcm_plc, const LC3_INT32 N, const LC3_INT32 frame_dms, const LC3_INT32 SampRate, const LC3_INT32 nbLostCmpt, const LC3_INT32 overlap, const LC3_FLOAT *stabFac, LC3_FLOAT harmonicBuf[MAX_PITCH], LC3_FLOAT synthHist[M], - LC3_INT32* fract, LC3_INT16* seed, LC3_FLOAT* gain_c, LC3_FLOAT* alpha, LC3_FLOAT* synth); + LC3_INT32* fract, LC3_INT16* seed, LC3_FLOAT* gain_c, LC3_FLOAT* alpha, LC3_FLOAT* synth +#ifdef CR9_I_INC_TDC_FADEOUT_LEN + ,LC3_UINT8 plc_fadeout_type +#endif +); void* balloc(void* base, size_t* base_size, size_t size); diff --git a/lib_lc3plus/imdct.c b/lib_lc3plus/imdct.c index 5d38aa6cc7..b1b5d4b43b 100644 --- a/lib_lc3plus/imdct.c +++ b/lib_lc3plus/imdct.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -14,8 +14,8 @@ /* Function expects already flipped window */ void ProcessingIMDCT_fl(LC3_FLOAT* y, LC3_INT yLen, const LC3_FLOAT* win, LC3_INT winLen, LC3_INT last_zeros, LC3_FLOAT* mem, LC3_FLOAT* x, Dct4* dct) { - LC3_FLOAT x_tda[MAX_LEN] = {0}, x_ov[2 * MAX_LEN] = {0}; - LC3_INT i = 0, j = 0; + LC3_FLOAT x_tda[MAX_LEN], x_ov[2 * MAX_LEN]; + LC3_INT i, j; /* Flip imdct window up to down */ i = winLen - 1; @@ -61,7 +61,7 @@ void ProcessingIMDCT_fl(LC3_FLOAT* y, LC3_INT yLen, const LC3_FLOAT* win, LC3_IN void ProcessingITDA_WIN_OLA_fl(LC3_FLOAT* x_tda, LC3_INT32 yLen, const LC3_FLOAT* win, LC3_INT32 winLen, LC3_INT32 last_zeros, LC3_FLOAT* mem, LC3_FLOAT* x) { - LC3_FLOAT x_ov[2 * MAX_LEN] = {0}; + LC3_FLOAT x_ov[2 * MAX_LEN]; LC3_INT32 i, j; move_float(x_ov, &x_tda[yLen / 2], yLen / 2); diff --git a/lib_lc3plus/lc3.c b/lib_lc3plus/lc3.c index 17d2ccb712..f09c53a538 100644 --- a/lib_lc3plus/lc3.c +++ b/lib_lc3plus/lc3.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -71,6 +71,9 @@ static int lc3plus_frame_size_supported(float frame_ms) { case 25: /* fallthru */ case 50: /* fallthru */ +#ifdef CR8_G_ADD_75MS + case 75: /* fallthru */ +#endif case 100: return 1; default: break; } @@ -102,7 +105,6 @@ int32_t lc3_enc_supported_lfe(void) LC3PLUS_Error lc3plus_enc_init(LC3PLUS_Enc *encoder, int samplerate, int channels, int hrmode, int32_t lfe_channel_array[]) { int ch = 0; - RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); RETURN_IF((uintptr_t)encoder % 4 != 0, LC3PLUS_ALIGN_ERROR); RETURN_IF(!lc3plus_samplerate_supported(samplerate), LC3PLUS_SAMPLERATE_ERROR); @@ -198,7 +200,6 @@ LC3PLUS_Error lc3plus_enc_set_frame_dms(LC3PLUS_Enc *encoder, int frame_dms) LC3PLUS_Error lc3plus_enc_set_bandwidth(LC3PLUS_Enc *encoder, int bandwidth) { LC3_INT effective_fs; - RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); #ifdef ENABLE_HR_MODE_FL_FLAG RETURN_IF(encoder->hrmode == 1, LC3PLUS_HRMODE_BW_ERROR); @@ -359,7 +360,7 @@ LC3PLUS_Error lc3plus_free_encoder_structs(LC3PLUS_Enc* encoder) LC3PLUS_Error lc3plus_free_decoder_structs(LC3PLUS_Dec* decoder) { - int ch = 0; + int ch = 0; RETURN_IF(!decoder, LC3PLUS_NULL_ERROR); for (ch = 0; ch < decoder->channels; ch++) { @@ -388,7 +389,6 @@ LC3PLUS_Error lc3plus_enc_set_ep_mode(LC3PLUS_Enc *encoder, LC3PLUS_EpMode epmod { LC3PLUS_EpMode oldEpmode; LC3PLUS_Error error; - RETURN_IF(encoder == NULL, LC3PLUS_NULL_ERROR); RETURN_IF((unsigned)epmode > LC3PLUS_EP_HIGH, LC3PLUS_EPMODE_ERROR); oldEpmode = encoder->epmode; diff --git a/lib_lc3plus/lc3.h b/lib_lc3plus/lc3.h index 3e45438fed..95dff9eb84 100644 --- a/lib_lc3plus/lc3.h +++ b/lib_lc3plus/lc3.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -25,6 +25,7 @@ #define LC3PLUS_H #ifndef _MSC_VER +#include "options.h" #include #else typedef unsigned char uint8_t; @@ -36,7 +37,7 @@ typedef __int32 int32_t; #define LC3PLUS_VERSION_INT(major, minor, micro) (((major) << 16) | ((minor) << 8) | (micro)) /*! Version number to ensure header and binary are matching. */ -#define LC3PLUS_VERSION LC3PLUS_VERSION_INT(1, 6, 9) +#define LC3PLUS_VERSION LC3PLUS_VERSION_INT(1, 7, 1) /*! Maximum number of supported channels. The actual binary might support * less, use lc3plus_channels_supported() to check. */ diff --git a/lib_lc3plus/lc3plus_fft.c b/lib_lc3plus/lc3plus_fft.c index 14f443f860..f1fc8fe714 100644 --- a/lib_lc3plus/lc3plus_fft.c +++ b/lib_lc3plus/lc3plus_fft.c @@ -1,12 +1,12 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * * Rights Policy, 3rd April 2019. No patent licence is granted by implication, * * estoppel or otherwise. * ******************************************************************************/ - + #include "options.h" #include "functions.h" @@ -19,11 +19,11 @@ void fft_init(Fft* fft, int length) HANDLE_IIS_FFT handle = NULL; IIS_FFT_ERROR error = 0; assert(length % 2 == 0); - + fft->length = length; - + error = LC3_IIS_CFFT_Create(&handle, length, IIS_FFT_FWD); - + assert(error == IIS_FFT_NO_ERROR); fft->handle = handle; } @@ -31,10 +31,10 @@ void fft_init(Fft* fft, int length) void fft_free(Fft* fft) { IIS_FFT_ERROR error = 0; - + if (fft) { error = LC3_IIS_CFFT_Destroy((HANDLE_IIS_FFT *) &fft->handle); - + assert(error == IIS_FFT_NO_ERROR); memset(fft, 0, sizeof(*fft)); } @@ -82,7 +82,7 @@ void fft_apply(Fft* fft, const Complex* input, Complex* output) { IIS_FFT_ERROR error = 0; error = LC3_IIS_FFT_Apply_CFFT(fft->handle, input, output); - + assert(error == IIS_FFT_NO_ERROR); } @@ -90,10 +90,11 @@ void fft_apply(Fft* fft, const Complex* input, Complex* output) void real_fft_apply(Fft* fft, const LC3_FLOAT* input, LC3_FLOAT* output) { IIS_FFT_ERROR error = IIS_FFT_NO_ERROR; - + UNUSED(error); - error = LC3_IIS_FFT_Apply_RFFT(fft->handle, input, output); + error = LC3_IIS_FFT_Apply_RFFT(fft->handle, input, output); assert(error == IIS_FFT_NO_ERROR); } + diff --git a/lib_lc3plus/license.h b/lib_lc3plus/license.h index d9d6c89675..266f91a165 100644 --- a/lib_lc3plus/license.h +++ b/lib_lc3plus/license.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -8,11 +8,12 @@ ******************************************************************************/ +#include "options.h" #include "defines.h" static const char *const LICENSE = "*******************************************************************************\n" - "* ETSI TS 103 634 V1.4.1 *\n" + "* ETSI TS 103 634 V1.4.3 *\n" "* Low Complexity Communication Codec Plus (LC3plus) *\n" "* Floating Point Software V%i.%i.%iETSI, " __DATE__ " *\n" "* Copyright licence is solely granted through ETSI Intellectual Property *\n" diff --git a/lib_lc3plus/ltpf_coder.c b/lib_lc3plus/ltpf_coder.c index fac8c481c0..286d8fa166 100644 --- a/lib_lc3plus/ltpf_coder.c +++ b/lib_lc3plus/ltpf_coder.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -15,7 +15,7 @@ static LC3_INT searchMaxIndice(LC3_FLOAT* in, LC3_INT len); LC3_INT searchMaxIndice(LC3_FLOAT* in, LC3_INT len) { - LC3_INT max_i = 0, i = 0; + LC3_INT max_i = 0, i; LC3_FLOAT max = 0; if (len <= 0) { @@ -34,16 +34,29 @@ LC3_INT searchMaxIndice(LC3_FLOAT* in, LC3_INT len) void process_ltpf_coder_fl(LC3_FLOAT* xin, LC3_INT xLen, LC3_INT ltpf_enable, LC3_INT pitch_ol, LC3_FLOAT pitch_ol_norm_corr, LC3_INT frame_dms, LC3_FLOAT* mem_old_x, LC3_INT memLen, LC3_FLOAT* mem_norm_corr_past, LC3_INT* mem_on, LC3_FLOAT* mem_pitch, - LC3_INT* param, LC3_FLOAT* mem_norm_corr_past_past, LC3_INT* bits) + LC3_INT* param, LC3_FLOAT* mem_norm_corr_past_past, LC3_INT* bits +#ifdef CR9_K_REDUCE_NORM_CORR_TH + , LC3_INT16 hrmode +#endif +) { - LC3_FLOAT buffer[LTPF_MEMIN_LEN + LEN_12K8 + 1 + (LEN_12K8 >> 2)] = {0}, sum = 0, buf_tmp[MAX_LEN] = {0}, cor_up[MAX_LEN] = {0}, *x; - LC3_INT i = 0, j = 0, k = 0, n = 0, step = 0, N = 0, ltpf_active = 0, pitch_search_delta = 0, + LC3_FLOAT buffer[LTPF_MEMIN_LEN + LEN_12K8 + 1 + (LEN_12K8 >> 2)], sum = 0, cor_up[(MAX_PITCH_12K8 - MIN_PITCH_12K8) / 2] = {0}, *x; + LC3_INT i, j, n, step, N, ltpf_active, pitch_search_delta, pitch_search_upsamp = 0, pitch_search_L_interpol1 = 0, t0_min = 0, t0_max = 0, t_min = 0, t_max = 0, temp2 = 0, t1 = 0, pitch_int = 0, pitch_fr = 0, midpoint = 0, delta_up = 0, delta_down = 0, pitch_index = 0, gain = 0, acflen = 0; - LC3_FLOAT norm_corr = 0, cor[MAX_LEN] = {0}, cor_int[MAX_LEN] = {0}, currFrame[MAX_LEN] = {0}, predFrame[MAX_LEN] = {0}, sum1 = 0, sum2 = 0, sum3 = 0; + LC3_FLOAT cor_tmp, cor_int_tmp, norm_corr = 0, cor[MAX_LEN_NR], cor_int[MAX_LEN_NR], sum1 = 0, sum2 = 0, sum3 = 0; LC3_FLOAT pitch = 0; +#ifdef CR9_K_REDUCE_NORM_CORR_TH + LC3_FLOAT normCorrTh = 0.0f; + if (hrmode) { + normCorrTh = 0.4; + } else { + normCorrTh = 0.6; + } +#endif + /* Signal Buffer */ N = xLen - 1; x = &buffer[memLen]; @@ -59,7 +72,11 @@ void process_ltpf_coder_fl(LC3_FLOAT* xin, LC3_INT xLen, LC3_INT ltpf_enable, LC pitch_search_upsamp = 4; pitch_search_L_interpol1 = 4; +#ifdef CR9_K_REDUCE_NORM_CORR_TH + if (pitch_ol_norm_corr > normCorrTh) { +#else if (pitch_ol_norm_corr > 0.6) { +#endif /* Search Bounds */ t0_min = pitch_ol - pitch_search_delta; t0_max = pitch_ol + pitch_search_delta; @@ -83,19 +100,24 @@ void process_ltpf_coder_fl(LC3_FLOAT* xin, LC3_INT xLen, LC3_INT ltpf_enable, LC sum1 += x[j] * x[j]; sum2 += x[j - t_min] * x[j - t_min]; } + + /* Do first iteration outside of loop */ + sum = mac_loop(x, &x[-t_min], acflen); + + sum3 = LC3_SQRT(sum1 * sum2) + 1.00e-05; + norm_corr = sum / sum3; + + norm_corr = MAX(0, norm_corr); + cor[0] = norm_corr; /* Compute Cross-Correlation */ - for (i = t_min; i <= t_max; i++) { - sum = 0; - for (j = 0; j < acflen; j++) { - sum += x[j] * x[j - i]; - } + for (i = t_min + 1; i <= t_max; i++) { + sum = mac_loop(x, &x[-i], acflen); - if (i > t_min) { - sum2 = sum2 + x[-i]*x[-i] + sum2 = sum2 + x[-i]*x[-i] - x[acflen - 1 - ( i - 1 )]*x[acflen - 1 - ( i - 1 )]; - } - sum3 = LC3_SQRT(sum1 * sum2) + LC3_POW(10, -5); + + sum3 = LC3_SQRT(sum1 * sum2) + 1.00e-05; norm_corr = sum / sum3; norm_corr = MAX(0, norm_corr); @@ -104,13 +126,7 @@ void process_ltpf_coder_fl(LC3_FLOAT* xin, LC3_INT xLen, LC3_INT ltpf_enable, LC } /* Find Integer Pitch-Lag */ - j = 0; - for (i = pitch_search_L_interpol1; i <= t_max - t_min - pitch_search_L_interpol1; i++) { - buf_tmp[j] = cor[i]; - j++; - } - - temp2 = searchMaxIndice(buf_tmp, j); + temp2 = searchMaxIndice(&cor[pitch_search_L_interpol1], t_max - t_min - pitch_search_L_interpol1 - pitch_search_L_interpol1 + 1); t1 = temp2 + t0_min; assert(t1 >= t0_min && t1 <= t0_max); @@ -128,13 +144,7 @@ void process_ltpf_coder_fl(LC3_FLOAT* xin, LC3_INT xLen, LC3_INT ltpf_enable, LC } for (i = 0; i < pitch_search_upsamp * (t0_max - t0_min + 1); i++) { - sum = 0; - - k = 0; - for (j = i; j < i + 32; j++) { - sum += cor_up[j] * inter4_1[k]; - k++; - } + sum = mac_loop(&cor_up[i], (const LC3_FLOAT *)inter4_1, 32); cor_int[i] = sum; } @@ -153,14 +163,15 @@ void process_ltpf_coder_fl(LC3_FLOAT* xin, LC3_INT xLen, LC3_INT ltpf_enable, LC } else { delta_down = pitch_search_upsamp - step; } - + j = 0; for (i = midpoint - delta_down - 1; i <= midpoint + delta_up; i = i + step) { - buf_tmp[j] = cor_int[i]; + cor[j] = cor_int[i]; j++; } - temp2 = searchMaxIndice(buf_tmp, ((midpoint + delta_up) - (midpoint - delta_down)) / step + 1); + + temp2 = searchMaxIndice(cor, ((midpoint + delta_up) - (midpoint - delta_down)) / step + 1); pitch_fr = temp2 * step - delta_down; if (pitch_fr >= 0) { @@ -188,34 +199,25 @@ void process_ltpf_coder_fl(LC3_FLOAT* xin, LC3_INT xLen, LC3_INT ltpf_enable, LC pitch = (LC3_FLOAT) pitch_int + (LC3_FLOAT) pitch_fr / 4.0; + /* Normalized Correlation */ + sum1 = sum2 = sum3 = 0; for (n = 0; n < acflen; n++) { - currFrame[n] = x[n + 1] * enc_inter_filter[0][0] + + cor_tmp = x[n + 1] * enc_inter_filter[0][0] + x[n] * enc_inter_filter[0][1] + x[n - 1] * enc_inter_filter[0][2]; - predFrame[n] = x[n - pitch_int + 1] * enc_inter_filter[pitch_fr][0] + + cor_int_tmp = x[n - pitch_int + 1] * enc_inter_filter[pitch_fr][0] + x[n - pitch_int] * enc_inter_filter[pitch_fr][1] + x[n - pitch_int - 1] * enc_inter_filter[pitch_fr][2] + x[n - pitch_int - 2] * enc_inter_filter[pitch_fr][3]; + + sum1 += cor_tmp * cor_int_tmp; + sum2 += cor_tmp * cor_tmp; + sum3 += cor_int_tmp * cor_int_tmp; } - /* Normalized Correlation */ - sum1 = sum2 = sum3 = 0; - - for (i = 0; i < acflen; i++) { - sum1 += currFrame[i] * predFrame[i]; - } - - for (i = 0; i < acflen; i++) { - sum2 += currFrame[i] * currFrame[i]; - } - - for (i = 0; i < acflen; i++) { - sum3 += predFrame[i] * predFrame[i]; - } - - sum2 = LC3_SQRT(sum2 * sum3) + LC3_POW(10, -5); + sum2 = LC3_SQRT(sum2 * sum3) + 1.00e-05; norm_corr = sum1 / sum2; assert(norm_corr >= -1.00001 && norm_corr <= 1.00001); diff --git a/lib_lc3plus/ltpf_decoder.c b/lib_lc3plus/ltpf_decoder.c index a40c85213a..e95a274a46 100644 --- a/lib_lc3plus/ltpf_decoder.c +++ b/lib_lc3plus/ltpf_decoder.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -16,18 +16,31 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f LC3_INT* param, LC3_INT* mem_param, LC3_INT conf_beta_idx, LC3_FLOAT conf_beta, LC3_INT concealMethod, LC3_FLOAT damping , LC3_INT *mem_ltpf_active +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + , LC3_FLOAT *rel_pitch_change, LC3_INT hrmode, LC3_INT frame_dms +#endif ) { - LC3_INT i = 0, j = 0, n = 0, N = 0, L_past_x = 0, N4 = 0, N34 = 0, - pitch_int = 0, pitch_fr = 0, p1 = 0, p2 = 0, L_past_y = 0, inter_len = 0, tilt_len = 0, - tilt_len_r = 0, inter_len_r = 0, old_x_len = 0, old_y_len = 0; - - LC3_FLOAT conf_alpha = 0, gain = 0, a1[MAX_LEN] = {0}, a2[MAX_LEN] = {0}, b1[MAX_LEN] = {0}, b2[MAX_LEN] = {0}, - buf_x[4 * MAX_LEN] = {0}, buf_y[4 * MAX_LEN] = {0}, buf_z[4 * MAX_LEN] = {0}, pitch = 0, sum1 = 0, sum2 = 0; - + LC3_INT i, j, n, N, L_past_x, N4, N34, + pitch_int, pitch_fr, p1, p2, L_past_y, inter_len, tilt_len = 0, + tilt_len_r, inter_len_r, old_x_len, old_y_len; + + LC3_FLOAT conf_alpha, gain, a1[12], a2[12], b1[11], b2[11], + buf_x[4 * MAX_LEN], buf_y[4 * MAX_LEN], buf_z[4 * MAX_LEN], pitch, sum1, sum2; +#ifdef CR9_LTPF_REWRITE + LC3_FLOAT *p_x, *p_y, *p_y2, *p_x_init, *p_y_init, *p_a1, *p_b1, *p_a2, *p_b2, fade_fac, current_fade_fac_up, current_fade_fac_down; +#endif +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + LC3_FLOAT pitch_fl_c_old, pitch_delta; +#endif const LC3_FLOAT *inter_filter[4], *tilt_filter[4]; - +#ifdef WMOPS + push_wmops("process_ltpf_decoder_fl"); +#endif +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + pitch_fl_c_old = (LC3_FLOAT) *mem_pitch_int + (LC3_FLOAT)*mem_pitch_fr / 4.0; +#endif conf_alpha = 0.85; if (bfi != 1) { @@ -213,6 +226,13 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f } /* First quarter of the current frame: cross-fading */ +#ifdef CR9_LTPF_REWRITE + fade_fac = 1. / (LC3_FLOAT) N4; + current_fade_fac_up = 0.f; + current_fade_fac_down = 1.f; + (void) p_x; (void) p_y; (void) p_a1; (void) p_b1; +#endif + if (mem_param[1] == 0 && param[1] == 0) { memmove(&buf_y[L_past_y], &buf_x[L_past_x], sizeof(LC3_FLOAT) * N4); @@ -232,8 +252,14 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f j++; } +#ifdef CR9_LTPF_REWRITE + buf_y[L_past_y + n] = buf_x[L_past_x + n] - current_fade_fac_down * sum1 + + current_fade_fac_down * sum2; + current_fade_fac_down -= fade_fac; +#else buf_y[L_past_y + n] = buf_x[L_past_x + n] - (((LC3_FLOAT)N4 - (LC3_FLOAT)n) / (LC3_FLOAT)N4) * sum1 + (((LC3_FLOAT)N4 - (LC3_FLOAT)n) / (LC3_FLOAT)N4) * sum2; +#endif } } else if (mem_param[1] == 0 && param[1] == 1) { @@ -252,7 +278,12 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f j++; } +#ifdef CR9_LTPF_REWRITE + buf_y[L_past_y + n] = buf_x[L_past_x + n] - current_fade_fac_up * sum1 + current_fade_fac_up * sum2; + current_fade_fac_up += fade_fac; +#else buf_y[L_past_y + n] = buf_x[L_past_x + n] - ((LC3_FLOAT)n / (LC3_FLOAT)N4) * sum1 + ((LC3_FLOAT)n / (LC3_FLOAT)N4) * sum2; +#endif } } else if (*mem_pitch_int == pitch_int && *mem_pitch_fr == pitch_fr) { for (n = 0; n < N4; n++) { @@ -273,6 +304,69 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f buf_y[L_past_y + n] = buf_x[L_past_x + n] - sum1 + sum2; } } else { +#ifdef CR9_LTPF_REWRITE + p_x_init = &buf_x[L_past_x]; + p_y_init = &buf_y[L_past_y - p1 + inter_len - 1]; + p_y2 = &buf_y[L_past_y]; + for (n = 0; n < N4; n++) { + sum1 = 0; + sum2 = 0; + p_b1 = b1; + p_x = p_x_init; + for (i = tilt_len; i >= 0; i--) { + sum1 += *p_b1 * *p_x; + p_b1++; + p_x--; + } + + p_y = p_y_init; + p_a1 = a1; + for (i = 2*inter_len - 1; i >= 0; i--) { + sum2 += *p_a1 * *p_y; + p_a1++; + p_y--; + } + + *p_y2 = *p_x_init - current_fade_fac_down * sum1 + + current_fade_fac_down * sum2; + current_fade_fac_down -= fade_fac; + p_x_init++; + p_y_init++; + p_y2++; + } + + move_float(buf_z, buf_y, (old_y_len + xLen)); + p_x_init = &buf_z[L_past_y]; /* buf z in this case */ + p_y_init = &buf_y[L_past_y - p2 + inter_len - 1]; + p_y2 = &buf_y[L_past_y]; + + for (n = 0; n < N4; n++) { + sum1 = 0; + sum2 = 0; + j = 0; + p_x = p_x_init; + p_b2 = b2; + for (i = tilt_len; i >= 0; i--) { + sum1 += *p_b2 * *p_x; + p_b2++; + p_x--; + } + + p_y = p_y_init; + p_a2 = a2; + for (i = 2*inter_len - 1; i >= 0; i--) { + sum2 += *p_a2 * *p_y; + p_a2++; + p_y--; + } + + *p_y2 = *p_x_init - current_fade_fac_up * sum1 + current_fade_fac_up * sum2; + current_fade_fac_up += fade_fac; + p_x_init++; + p_y_init++; + p_y2++; + } +#else for (n = 0; n < N4; n++) { sum1 = 0; sum2 = 0; @@ -292,7 +386,7 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f (((LC3_FLOAT)N4 - (LC3_FLOAT)n) / (LC3_FLOAT)N4) * sum2; } - memmove(buf_z, buf_y, sizeof(LC3_FLOAT) * 4 * MAX_LEN); + memmove(buf_z, buf_y, sizeof(LC3_FLOAT) * (old_y_len + xLen)); for (n = 0; n < N4; n++) { sum1 = 0; @@ -311,8 +405,45 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f buf_y[L_past_y + n] = buf_z[L_past_y + n] - ((LC3_FLOAT)n / (LC3_FLOAT)N4) * sum1 + ((LC3_FLOAT)n / (LC3_FLOAT)N4) * sum2; } +#endif } +#ifdef CR9_LTPF_REWRITE + /* Second quarter of the current frame */ + if (param[1] == 0) { + move_float(&buf_y[L_past_y + N4], &buf_x[L_past_x + N4], + ((L_past_x + N4 + N34) - (L_past_x + N4))); + } else { + p_x_init = &buf_x[L_past_x + N4]; + p_y_init = &buf_y[L_past_y + N4 - p2 + inter_len - 1]; + p_y2 = &buf_y[L_past_y + N4]; + for (n = 0; n < N34; n++) { + sum1 = 0; + sum2 = 0; + p_b2 = b2; + p_x = p_x_init; + + for (i = 0; i <= tilt_len; i++) { + sum1 += *p_b2 * *p_x; + p_b2++; + p_x--; + } + + p_a2 = a2; + p_y = p_y_init; + + for (i = 2*inter_len - 1; i >= 0; i--) { + sum2 += *p_a2 * *p_y; + p_a2++; + p_y--; + } + p_y_init++; + *p_y2 = *p_x_init - sum1 + sum2; + p_x_init++; + p_y2++; + } + } +#else /* Second quarter of the current frame */ if (param[1] == 0) { memmove(&buf_y[L_past_y + N4], &buf_x[L_past_x + N4], @@ -336,7 +467,7 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f buf_y[L_past_y + N4 + n] = buf_x[L_past_x + N4 + n] - sum1 + sum2; } } - +#endif /* Output */ move_float(y, &buf_y[L_past_y], N); @@ -353,4 +484,14 @@ void process_ltpf_decoder_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* y, LC3_INT f *mem_pitch_fr = pitch_fr; *mem_gain = gain; *mem_beta_idx = conf_beta_idx; +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + if (bfi == 0 && hrmode == 1 && (frame_dms == 50 || frame_dms == 25)){ + pitch_delta = LC3_FABS(pitch_fl_c_old - (LC3_FLOAT)pitch_int - (LC3_FLOAT)(pitch_fr / 4.0)); + *rel_pitch_change = pitch_delta / MAX(pitch_fl_c_old, 1); + } +#endif + +#ifdef WMOPS + pop_wmops(); +#endif } diff --git a/lib_lc3plus/mdct.c b/lib_lc3plus/mdct.c index 11618b9465..ff4075977d 100644 --- a/lib_lc3plus/mdct.c +++ b/lib_lc3plus/mdct.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -31,6 +31,26 @@ static const LC3_FLOAT* mdct_window(LC3_INT length, LC3_INT frame_dms, LC3_INT h return NULL; } } +#ifdef CR8_G_ADD_75MS + else if (frame_dms == 75) { + switch (length) { + case 60: + return MDCT_WINS_7_5ms[hrmode][0]; + case 120: + return MDCT_WINS_7_5ms[hrmode][1]; + case 180: + return MDCT_WINS_7_5ms[hrmode][2]; + case 240: + return MDCT_WINS_7_5ms[hrmode][3]; + case 360: + return MDCT_WINS_7_5ms[hrmode][4]; + case 720: + return MDCT_WINS_7_5ms[hrmode][5]; + default: + return NULL; + } + } +#endif else if (frame_dms == 50) { switch (length) { case 40: @@ -74,10 +94,15 @@ void mdct_init(Mdct* mdct, LC3_INT length, LC3_INT frame_dms, LC3_INT fs_idx, LC { if (frame_dms == 100) { mdct->leading_zeros = MDCT_la_zeroes[fs_idx]; - } + } +#ifdef CR8_G_ADD_75MS + else if (frame_dms == 75) { + mdct->leading_zeros = MDCT_la_zeroes_7_5ms[fs_idx]; + } +#endif else if (frame_dms == 50) { mdct->leading_zeros = MDCT_la_zeroes_5ms[fs_idx]; - } + } else if (frame_dms == 25) { mdct->leading_zeros = MDCT_la_zeroes_2_5ms[fs_idx]; } @@ -103,8 +128,8 @@ void mdct_free(Mdct* mdct) void mdct_apply(const LC3_FLOAT* input, LC3_FLOAT* output, Mdct* mdct) { - LC3_FLOAT tmp[MAX_LEN * 2] = {0}; - LC3_INT i = 0; + LC3_FLOAT tmp[MAX_LEN * 2]; + LC3_INT i; LC3_INT hlen; move_float(tmp, mdct->mem, mdct->mem_length); diff --git a/lib_lc3plus/mdct_shaping.c b/lib_lc3plus/mdct_shaping.c index 1876192504..d3ca7dd953 100644 --- a/lib_lc3plus/mdct_shaping.c +++ b/lib_lc3plus/mdct_shaping.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,11 +13,15 @@ void processMdctShaping_fl(LC3_FLOAT x[], LC3_FLOAT scf[], const LC3_INT bands_offset[], LC3_INT fdns_npts) { - LC3_INT i = 0, j = 0; + LC3_INT i, j; + LC3_FLOAT val; + j = 0; for (i = 0; i < fdns_npts; i++) { + val = scf[i]; + for (; j < bands_offset[i + 1]; j++) { - x[j] = x[j] * scf[i]; + x[j] = x[j] * val; } } } diff --git a/lib_lc3plus/near_nyquist_detector.c b/lib_lc3plus/near_nyquist_detector.c index ce94351302..e18eb52112 100644 --- a/lib_lc3plus/near_nyquist_detector.c +++ b/lib_lc3plus/near_nyquist_detector.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -7,32 +7,86 @@ * estoppel or otherwise. * ******************************************************************************/ -#include "functions.h" #include "options.h" +#include "functions.h" void processNearNyquistdetector_fl(LC3_INT16* near_nyquist_flag, const LC3_INT fs_idx, const LC3_INT near_nyquist_index, - const LC3_INT bands_number, const LC3_FLOAT* ener) + const LC3_INT bands_number, const LC3_FLOAT* ener +#ifdef CR8_E_TONE_DETECTOR + , const LC3_INT16 frame_dms, const LC3_INT16 hrmode) +#else +) +#endif { *near_nyquist_flag = 0; +#ifdef CR8_E_TONE_DETECTOR + if (hrmode == 0){ +#endif + if (fs_idx < 4) + { + LC3_INT i = 0; + LC3_FLOAT ener_low = FLT_EPSILON, ener_high = 0; + + for (i=0; i NN_thresh * ener_low){ + *near_nyquist_flag = 1; + } + } +#ifdef CR8_E_TONE_DETECTOR + } + else // hrmode == 1 { - LC3_INT i = 0; - LC3_FLOAT ener_low = FLT_EPSILON, ener_high = 0; + // inverse spectral flatness = mean(energy) ./ 2^(mean(log2(energy))); + LC3_INT32 td_thresh, i = 0; + LC3_FLOAT mean_ener = 0, mean_ener_log2 = 0, inv_flatness = 0; - for (i=0; i NN_thresh * ener_low){ - *near_nyquist_flag = 1; + // calculate geometric mean + for (i = 0; i < bands_number; i++) + { + if (ener[i] != 0) { + mean_ener_log2 += LC3_LOGTWO(ener[i]); + } } + mean_ener_log2 = mean_ener_log2 / bands_number; + + inv_flatness = mean_ener / LC3_POW(2,mean_ener_log2); + + if (inv_flatness > td_thresh) { + *near_nyquist_flag = 1; + } } +#endif // CR8_E_TONE_DETECTOR } diff --git a/lib_lc3plus/noise_factor.c b/lib_lc3plus/noise_factor.c index c5aa582e45..9cf130348f 100644 --- a/lib_lc3plus/noise_factor.c +++ b/lib_lc3plus/noise_factor.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -15,94 +15,111 @@ void processNoiseFactor_fl(LC3_INT* fac_ns_idx, LC3_FLOAT x[], LC3_INT xq[], LC3 LC3_INT target_bytes ) { - LC3_INT sumZeroLines = 0, kZeroLines = 0, startOffset = 0, nTransWidth = 0, end = 0, start = 0, i = 0, j = 0, k = 0, - allZeros = 0, m = 0; - LC3_FLOAT fac_ns_unq = 0, mean = 0, idx = 0, nsf1 = 0, nsf2 = 0; - LC3_INT zeroLines[MAX_LEN] = {0}, zL1[MAX_LEN] = {0}, zL2[MAX_LEN] = {0}; + LC3_INT sumZeroLines = 0, kZeroLines = 0, startOffset = 0, nTransWidth = 0, i = 0, j = 0, k = 0, m = 0, nzeros = 0; + LC3_FLOAT fac_ns_unq = 0, idx = 0, nsf1 = 0, nsf2 = 0; + LC3_INT zeroLines[MAX_LEN]; switch (frame_dms) { case 25: - nTransWidth = 4; + nTransWidth = 1; startOffset = 6; break; case 50: - nTransWidth = 4; + nTransWidth = 1; startOffset = 12; break; +#ifdef CR8_G_ADD_75MS + case 75: + nTransWidth = 2; + startOffset = 18; + break; +#endif case 100: - nTransWidth = 8; + nTransWidth = 3; startOffset = 24; break; } - for (k = startOffset; k < BW_cutoff_idx; k++) { - allZeros = 1; - - start = k - (nTransWidth - 2) / 2; - end = MIN(BW_cutoff_idx - 1, k + (nTransWidth - 2) / 2); - - for (i = start; i <= end; i++) { - if (xq[i] != 0) { - allZeros = 0; - } + for (k = startOffset - nTransWidth; k < startOffset + nTransWidth; k++) + { + if (xq[k] != 0) + { + nzeros = -2 * nTransWidth - 1; + } + if (xq[k] == 0) + { + nzeros ++; + } + } + for (k = startOffset; k < BW_cutoff_idx - nTransWidth; k++) + { + if (xq[k + nTransWidth] != 0) + { + nzeros = -2 * nTransWidth - 1; } + if (xq[k + nTransWidth] == 0) + { + nzeros ++; + } + if (nzeros >= 0) + { + zeroLines[j++] = k; + } + } - if (allZeros == 1) { - zeroLines[j] = k + 1; - kZeroLines++; - j++; + for (k = BW_cutoff_idx - nTransWidth; k < BW_cutoff_idx; k++) + { + nzeros ++; + if (nzeros >= 0) + { + zeroLines[j++] = k; } } - for (i = 0; i < kZeroLines; i++) { - sumZeroLines += zeroLines[i]; + if (j == 0) { + fac_ns_unq = 0; } + else + { + kZeroLines = j; - if (sumZeroLines > 0) { + fac_ns_unq = 0; for (j = 0; j < kZeroLines; j++) { - mean += LC3_FABS(x[zeroLines[j] - 1]); + fac_ns_unq += LC3_FABS(x[zeroLines[j]]); } - fac_ns_unq = mean / (gg * kZeroLines); - } else { - fac_ns_unq = 0; - } + fac_ns_unq /= (gg) * kZeroLines; + + + + if (kZeroLines > 1 && target_bytes <= 20 && frame_dms == 100) { + + j = 0, k = 0, nsf1 = 0, nsf2 = 0, sumZeroLines = 0; + + for (i = 0; i < kZeroLines; i++) { + sumZeroLines += zeroLines[i]; + } - if (kZeroLines > 0) - { - if (target_bytes <= 20 && frame_dms == 100) { - j = 0, k = 0; m = floor(sumZeroLines / kZeroLines); for (i = 0; i < kZeroLines; i++) { if (zeroLines[i] <= m) { - zL1[j] = zeroLines[i]; j++; + nsf1 += LC3_FABS(x[zeroLines[i]]); } - - if (zeroLines[i] > m) { - zL2[k] = zeroLines[i]; + else { + nsf2 += LC3_FABS(x[zeroLines[i]]); k++; } } - mean = 0; - for (i = 0; i < j; i++) { - mean += LC3_FABS(x[zL1[i] - 1]) / gg; - } - - nsf1 = mean / j; - - mean = 0; - for (i = 0; i < k; i++) { - mean += LC3_FABS(x[zL2[i] - 1]) / gg; - } - - nsf2 = mean / k; + nsf1 /= (gg) * j; + nsf2 /= (gg) * k; fac_ns_unq = MIN(nsf1, nsf2); } + } idx = round(8 - 16 * fac_ns_unq); diff --git a/lib_lc3plus/noise_filling.c b/lib_lc3plus/noise_filling.c index 7fac5e0f72..1ae4c8ab8c 100644 --- a/lib_lc3plus/noise_filling.c +++ b/lib_lc3plus/noise_filling.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,8 +13,8 @@ void processNoiseFilling_fl(LC3_FLOAT xq[], LC3_INT nfseed, LC3_INT fac_ns_idx, LC3_INT bw_stopband, LC3_INT frame_dms, LC3_FLOAT fac_ns_pc, LC3_INT spec_inv_idx) { - LC3_INT zeroLines[MAX_LEN] = {0}; - LC3_INT nTransWidth = 0, startOffset = 0, i = 0, j = 0, k = 0, start = 0, end = 0, allZeros = 0, kZeroLines = 0; + LC3_INT zeroLines[MAX_LEN]; + LC3_INT nTransWidth, startOffset, j, k, nzeros = 0, kZeroLines; LC3_FLOAT fac_ns = 0; switch (frame_dms) @@ -27,6 +27,12 @@ void processNoiseFilling_fl(LC3_FLOAT xq[], LC3_INT nfseed, LC3_INT fac_ns_idx, nTransWidth = 1; startOffset = 12; break; +#ifdef CR8_G_ADD_75MS + case 75: + nTransWidth = 2; + startOffset = 18; + break; +#endif case 100: nTransWidth = 3; startOffset = 24; @@ -37,25 +43,44 @@ void processNoiseFilling_fl(LC3_FLOAT xq[], LC3_INT nfseed, LC3_INT fac_ns_idx, j = 0; - for (k = startOffset; k < bw_stopband; k++) { - allZeros = 1; - - start = k - nTransWidth; - end = MIN(bw_stopband - 1, k + nTransWidth); - - for (i = start; i <= end; i++) { - if (xq[i] != 0) { - allZeros = 0; - } + for (k = startOffset - nTransWidth; k < startOffset + nTransWidth; k++) + { + if (xq[k] != 0) + { + nzeros = -2 * nTransWidth - 1; + } + if (xq[k] == 0) + { + nzeros ++; + } + } + for (k = startOffset; k < bw_stopband - nTransWidth; k++) + { + if (xq[k + nTransWidth] != 0) + { + nzeros = -2 * nTransWidth - 1; + } + if (xq[k + nTransWidth] == 0) + { + nzeros ++; + } + if (nzeros >= 0) + { + zeroLines[j++] = k; } + } - if (allZeros == 1) { - zeroLines[j] = k; - kZeroLines++; - j++; + for (k = bw_stopband - nTransWidth; k < bw_stopband; k++) + { + nzeros ++; + if (nzeros >= 0) + { + zeroLines[j++] = k; } } + kZeroLines = j; + for (k = 0; k < kZeroLines; k++) { nfseed = (13849 + (nfseed + 32768) * 31821) & 65535; nfseed -= 32768; diff --git a/lib_lc3plus/olpa.c b/lib_lc3plus/olpa.c index 6bec50952e..b1b8f2171c 100644 --- a/lib_lc3plus/olpa.c +++ b/lib_lc3plus/olpa.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,29 +11,24 @@ #include "options.h" #include "functions.h" -static void filter_olpa(LC3_FLOAT* in, LC3_FLOAT* out, const LC3_FLOAT* buf, LC3_FLOAT len_buf, LC3_INT len_input); -static LC3_INT searchMaxIndice(LC3_FLOAT* in, LC3_INT len); +static void filter_olpa(LC3_FLOAT* in, LC3_FLOAT* out, const LC3_FLOAT* buf, LC3_INT32 len_input); +static LC3_INT searchMaxIndice(LC3_FLOAT* in, LC3_INT32 len); -void filter_olpa(LC3_FLOAT* in, LC3_FLOAT* out, const LC3_FLOAT* buf, LC3_FLOAT len_buf, LC3_INT len_input) +void filter_olpa(LC3_FLOAT* in, LC3_FLOAT* out, const LC3_FLOAT* buf, LC3_INT32 len_input) { - LC3_INT i = 0, j = 0; - LC3_FLOAT sum = 0; /* a = 1, so denominator == 1, nothing to do here */ + LC3_INT32 i, j; - for (i = 0; i < len_input; i++) { - j = 0; - sum = 0; - for (j = 0; (j < len_buf) && (j <= i); j++) { - sum += buf[j] * in[i - j]; - } - out[i] = sum; + j = 0; + for (i = 4; i < len_input; i += 2) { + out[j++] = (buf[0] * in[i]) + (buf[1] * in[i - 1]) + (buf[2] * in[i - 2]) + (buf[3] * in[i - 3]) + (buf[4] * in[i - 4]); } } LC3_INT searchMaxIndice(LC3_FLOAT* in, LC3_INT len) { - LC3_INT max_i = 0, i = 0; + LC3_INT max_i = 0, i; LC3_FLOAT max = in[0]; if (len <= 0) { @@ -50,52 +45,84 @@ LC3_INT searchMaxIndice(LC3_FLOAT* in, LC3_INT len) return max_i; } -void processOlpa_fl(LC3_FLOAT* s_12k8, LC3_FLOAT* mem_s12k8, LC3_FLOAT* mem_s6k4, LC3_INT* mem_old_T0, LC3_INT* T0_out, - LC3_FLOAT* normcorr_out, LC3_INT len, LC3_INT frame_dms) +void processOlpa_fl(LC3_FLOAT* s_12k8, LC3_FLOAT* mem_s12k8, LC3_FLOAT* mem_s6k4, LC3_INT* mem_old_T0, +#ifdef CR9_F_PITCH_WIN_LEN_FIX + LC3_INT* pitch_flag, +#endif + LC3_INT* T0_out, LC3_FLOAT* normcorr_out, LC3_INT len, LC3_INT frame_dms) { LC3_FLOAT norm_corr = 0, sum = 0, sum0 = 0, sum1 = 0, sum2 = 0, norm_corr2 = 0, *s6k4; - LC3_FLOAT buf[LEN_6K4 + MAX_PITCH_6K4] = {0}, filt_out[LEN_12K8 + 3] = {0}, d_wsp[LEN_6K4] = {0}, R0[RANGE_PITCH_6K4] = {0}, R[RANGE_PITCH_6K4] = {0}; /* constant length */ - LC3_INT i = 0, j = 0, len2 = 0, T0 = 0, T02 = 0, min_pitch = 0, max_pitch = 0, L = 0, mem_in_len = 0, acflen = 0; - + LC3_FLOAT buf[LEN_6K4 + MAX_PITCH_6K4 + MAX_LEN], R0[RANGE_PITCH_6K4]; /* constant length */ + LC3_INT i = 0, len2 = 0, T0 = 0, T02 = 0, min_pitch = 0, max_pitch = 0, L = 0, mem_in_len = 0, acflen = 0, delta = 0; - mem_in_len = MAX_PITCH_6K4; len2 = len / 2; +#ifdef CR9_F_PITCH_WIN_LEN_FIX + switch(frame_dms) + { + case 50: + delta = len / 2; + acflen = len2 * 2; + break; + + case 25: + delta = 3*(len /2); + acflen = len2*4; + break; + + default: +#endif + delta = 0; acflen = len2; +#ifdef CR9_F_PITCH_WIN_LEN_FIX + } +#endif + + mem_in_len = MAX_PITCH_6K4 + delta; + +#ifndef CR9_F_PITCH_WIN_LEN_FIX if (frame_dms == 25) { mem_in_len += 16; acflen += 16; } +#endif /* Downsampling */ move_float(buf, mem_s12k8, 3); move_float(&buf[3], s_12k8, len); move_float(mem_s12k8, &buf[len], 3); - filter_olpa(buf, filt_out, olpa_down2, 5, len + 3); - for (i = 4, j = 0; i < len + 3; i = i + 2) { - d_wsp[j] = filt_out[i]; - j++; - } + filter_olpa(buf, R0, olpa_down2, len + 3); /* Compute autocorrelation */ +#ifdef CR9_F_PITCH_WIN_LEN_FIX + s6k4 = &buf[mem_in_len - delta]; + move_float(&buf[mem_in_len], R0, len2); + move_float(buf, mem_s6k4, mem_in_len); + move_float(mem_s6k4, &buf[len2], mem_in_len); +#else s6k4 = &buf[mem_in_len]; move_float(buf, mem_s6k4, mem_in_len); - move_float(s6k4, d_wsp, len2); + move_float(s6k4, R0, len2); move_float(mem_s6k4, &buf[len2], mem_in_len); if (frame_dms == 25) { s6k4 = s6k4 - 16; } +#endif for (i = MIN_PITCH_6K4; i <= MAX_PITCH_6K4; i++) { - sum = 0; - for (j = 0; j < acflen; j++) { - sum += s6k4[j] * s6k4[j - i]; - } + sum = mac_loop(s6k4, &s6k4[-i], acflen); R0[i - MIN_PITCH_6K4] = sum; } /* Weight autocorrelation and find maximum */ - move_float(R, R0, RANGE_PITCH_6K4); + + /* Second try in the neighborhood of the previous pitch */ + min_pitch = MAX(MIN_PITCH_6K4, *mem_old_T0 - 4); + max_pitch = MIN(MAX_PITCH_6K4, *mem_old_T0 + 4); + + L = searchMaxIndice(&R0[min_pitch - MIN_PITCH_6K4], max_pitch - min_pitch + 1 ); + T02 = L + min_pitch; + for (i = 0; i < RANGE_PITCH_6K4; i++) { R0[i] = R0[i] * olpa_acw[i]; } @@ -104,22 +131,17 @@ void processOlpa_fl(LC3_FLOAT* s_12k8, LC3_FLOAT* mem_s12k8, LC3_FLOAT* mem_s6k4 /* Compute normalized correlation */ sum0 = sum1 = sum2 = 0; + for (i = 0; i < acflen; i++) { sum0 += s6k4[i] * s6k4[i - T0]; sum1 += s6k4[i - T0] * s6k4[i - T0]; sum2 += s6k4[i] * s6k4[i]; } sum1 = sum1 * sum2; - sum1 = LC3_SQRT(sum1) + LC3_POW(10.0, -5.0); + sum1 = LC3_SQRT(sum1) + 1.00e-05; norm_corr = sum0 / sum1; norm_corr = MAX(0, norm_corr); - /* Second try in the neighborhood of the previous pitch */ - min_pitch = MAX(MIN_PITCH_6K4, *mem_old_T0 - 4); - max_pitch = MIN(MAX_PITCH_6K4, *mem_old_T0 + 4); - L = searchMaxIndice(&R[min_pitch - MIN_PITCH_6K4], max_pitch - min_pitch + 1 ); - T02 = L + min_pitch; - if (T02 != T0) { sum0 = sum1 = sum2 = 0; for (i = 0; i < acflen; i++) { @@ -128,7 +150,7 @@ void processOlpa_fl(LC3_FLOAT* s_12k8, LC3_FLOAT* mem_s12k8, LC3_FLOAT* mem_s6k4 sum2 += s6k4[i] * s6k4[i]; } sum1 = sum1 * sum2; - sum1 = LC3_SQRT(sum1) + LC3_POW(10.0, -5.0); + sum1 = LC3_SQRT(sum1) + 1.00e-05; norm_corr2 = sum0 / sum1; norm_corr2 = MAX(0, norm_corr2); @@ -138,7 +160,41 @@ void processOlpa_fl(LC3_FLOAT* s_12k8, LC3_FLOAT* mem_s12k8, LC3_FLOAT* mem_s6k4 } } +#ifdef CR9_F_PITCH_WIN_LEN_FIX + switch(frame_dms) + { + case 50: + if (*pitch_flag == 1) + { + *mem_old_T0 = T0; + *pitch_flag = 0; + } + else + { + *pitch_flag += 1; + } + break; + + case 25: + if (*pitch_flag == 3) + { + *mem_old_T0 = T0; + *pitch_flag = 0; + } + else + { + *pitch_flag += 1; + } + break; + + default: +#endif *mem_old_T0 = T0; +#ifdef CR9_F_PITCH_WIN_LEN_FIX + } +#endif + *T0_out = T0 * 2.0; *normcorr_out = norm_corr; + } diff --git a/lib_lc3plus/pc_apply.c b/lib_lc3plus/pc_apply.c index 1d1bc40005..4ca871f2fc 100644 --- a/lib_lc3plus/pc_apply.c +++ b/lib_lc3plus/pc_apply.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/pc_classify.c b/lib_lc3plus/pc_classify.c index 71196edb89..9fa5f38d9c 100644 --- a/lib_lc3plus/pc_classify.c +++ b/lib_lc3plus/pc_classify.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/pc_main.c b/lib_lc3plus/pc_main.c index 268ee94d2a..ead43deefe 100644 --- a/lib_lc3plus/pc_main.c +++ b/lib_lc3plus/pc_main.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/pc_update.c b/lib_lc3plus/pc_update.c index 57539b5079..214ced77d0 100644 --- a/lib_lc3plus/pc_update.c +++ b/lib_lc3plus/pc_update.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/per_band_energy.c b/lib_lc3plus/per_band_energy.c index db1b5b2d0f..ec34c3d7da 100644 --- a/lib_lc3plus/per_band_energy.c +++ b/lib_lc3plus/per_band_energy.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,8 +13,8 @@ void processPerBandEnergy_fl(LC3_INT bands_number, const LC3_INT* acc_coeff_per_band, LC3_INT16 hrmode, LC3_INT16 frame_dms, LC3_FLOAT* d2, LC3_FLOAT* d) { - LC3_INT i = 0, j = 0, start = 0, stop = 0, maxBwBin = 0; - LC3_FLOAT sum = 0; + LC3_INT i, j, start, stop, maxBwBin; + LC3_FLOAT sum; # ifdef ENABLE_HR_MODE_FL if (hrmode) @@ -40,6 +40,11 @@ void processPerBandEnergy_fl(LC3_INT bands_number, const LC3_INT* acc_coeff_per_ maxBwBin = maxBwBin >> 1; break; # endif +#ifdef CR8_G_ADD_75MS + case 75: + maxBwBin = (maxBwBin >> 2) * 3; + break; +#endif } for (i = 0; i < bands_number; i++) { diff --git a/lib_lc3plus/plc_classify.c b/lib_lc3plus/plc_classify.c index 619a1f7419..e45f08747d 100644 --- a/lib_lc3plus/plc_classify.c +++ b/lib_lc3plus/plc_classify.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,87 @@ #include "options.h" #include "functions.h" +#ifdef CR8_A_PLC_FADEOUT_TUNING + +static LC3_INT32 change_bit_at_position(LC3_INT32 value, LC3_UINT8 bit_position, LC3_INT8 bit) +{ + LC3_INT32 helper_mask = ~(1 << bit_position); + LC3_INT32 tmp = value & helper_mask; + tmp = tmp | (bit << bit_position); + return tmp; +} + +static void update_bit_and_byte_positions(LC3_INT16 longterm_analysis_counter_max_bytebuffer, LC3_INT8 *byte_position, LC3_INT8 *bit_position) +{ + if (*bit_position == 30) + { + *bit_position = 0; + + if ((*byte_position - longterm_analysis_counter_max_bytebuffer) < -1) + { + *byte_position = *byte_position + 1; + } else { + *byte_position = 0; + } + } else { + *bit_position = *bit_position + 1; + } +} + +static void array_insert_and_shift(LC3_INT32 *array, LC3_UINT8 value, LC3_INT16 longterm_analysis_counter_max, LC3_INT16 *overall_counter, LC3_INT8 *byte_position, LC3_INT8 *bit_position) +{ + LC3_INT32 current_byte = 0; + + if (overall_counter != NULL) + { + *overall_counter = MIN(*overall_counter + 1, longterm_analysis_counter_max); + } + + current_byte = array[*byte_position]; + + current_byte = change_bit_at_position(current_byte, *bit_position, value); + + array[*byte_position] = current_byte; +} + +#ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER +static void array_calculate(LC3_INT32 *array_tdc, LC3_INT32 *array_ns, int length, LC3_INT16 *counter_tdc, LC3_INT16 *counter_ns, LC3_INT16 longterm_analysis_counter_max) +#else +static void array_calculate(LC3_INT32 *array_tdc, LC3_INT32 *array_ns, int length, LC3_INT16 *counter_tdc, LC3_INT16 *counter_ns, LC3_INT16 *counter_phecu, LC3_INT16 overall_counter, LC3_INT16 longterm_analysis_counter_max) +#endif +{ + int i, k; + LC3_INT32 current_byte_tdc = 0, current_byte_ns = 0; + LC3_INT16 counter_loc_tdc = 0, counter_loc_ns = 0, counter_tmp = 0; + + for (i = length - 1; i >= 0; i--) + { + current_byte_tdc = array_tdc[i]; + current_byte_ns = array_ns[i]; + + for (k = 0; k < 30; k++) + { + counter_loc_tdc += ((current_byte_tdc >> k) & 1); + counter_loc_ns += ((current_byte_ns >> k) & 1); + counter_tmp++; + + /* Break from both loops if full 2s buffer has been evaluated */ + if (counter_tmp >= longterm_analysis_counter_max) + { + i = -1; + k = 30; + break; + } + } + } + + *counter_tdc = counter_loc_tdc; + *counter_ns = counter_loc_ns; +#ifndef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + *counter_phecu = overall_counter - counter_loc_tdc - counter_loc_ns; +#endif +} +#endif static void plc_xcorr_lc(LC3_FLOAT *pcmbufHist, LC3_INT32 max_len_pcm_plc, LC3_INT32 pitch_int, LC3_INT32 framelength, LC3_INT32 frame_dms, LC3_INT32 fs, LC3_FLOAT *xcorr); static void spectral_centroid_lc(LC3_FLOAT *gains, LC3_INT32 tilt, const LC3_INT *bands_offset, LC3_INT32 bands_number, LC3_INT32 framelength, LC3_INT32 fs, LC3_FLOAT *sc); @@ -22,21 +103,46 @@ void processPlcClassify_fl(LC3_INT plcMeth, LC3_INT *concealMethod, LC3_INT32 *n ) { LC3_FLOAT sc, class; - +#ifdef CR8_A_PLC_FADEOUT_TUNING + int fs_idx_tmp; +#endif + if (plcAd) { *xcorr = 0; } +#ifdef CR8_A_PLC_FADEOUT_TUNING + fs_idx_tmp = FS2FS_IDX(fs); + /* Save statistics for 24 kHz, 48 kHz and 96 kHz */ + if ((bfi == 1) || ((bfi >= 0) && (bfi <= 2) && ((fs_idx_tmp == 2) || (fs_idx_tmp == 4) || (fs_idx_tmp == 5)))) /* Partial Concealment PC(bfi==2) requires allowing value 2 to pass thru as well */ +#else if (bfi == 1) +#endif { +#ifdef CR8_A_PLC_FADEOUT_TUNING + if (bfi == 1) + { + *nbLostCmpt = *nbLostCmpt + 1; + } +#else *nbLostCmpt = *nbLostCmpt + 1; +#endif /* Use pitch correlation at ltpf integer lag if available */ +#ifdef CR8_A_PLC_FADEOUT_TUNING + if ((*nbLostCmpt == 1) || (bfi != 1) )/* PC(bfi==2) requires allowing 2 to pass thru as well */ +#else if (*nbLostCmpt == 1) +#endif { +#ifdef CR8_A_PLC_FADEOUT_TUNING + *concealMethod = 4; /* Noise Substitution */ + UNUSED(plcMeth); +#else *concealMethod = plcMeth; // this is a dangerous mapping! - +#endif + /* Advanced PLC */ if (pitch_int > 0) { @@ -44,24 +150,53 @@ void processPlcClassify_fl(LC3_INT plcMeth, LC3_INT *concealMethod, LC3_INT32 *n plc_xcorr_lc(plcAd->pcmbufHist, plcAd->max_len_pcm_plc, pitch_int, framelength, frame_dms, fs, xcorr); spectral_centroid_lc(plcAd->scf_q_old, tilt, band_offsets, bands_number, framelength, fs, &sc); - class = *xcorr * 7640.0/32768.0 - sc - 5112.0/32768.0; - + class = *xcorr * 7640.0 / 32768.0 - sc - 5112.0 / 32768.0; + if (class <= 0) { if (frame_dms == 100 && hrmode == 0) { *concealMethod = 2; /* PhaseEcu selected */ +#ifdef CR8_A_PLC_FADEOUT_TUNING + array_insert_and_shift(plcAd->plc_longterm_advc_tdc, 0, plcAd->longterm_analysis_counter_max, &plcAd->overall_counter, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + array_insert_and_shift(plcAd->plc_longterm_advc_ns, 0, plcAd->longterm_analysis_counter_max, NULL, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); +#endif } else { +#ifndef CR9_G_PLC_NS_TDC_FIX *concealMethod = 4; /* Noise Substitution */ +#endif +#ifdef CR8_A_PLC_FADEOUT_TUNING + array_insert_and_shift(plcAd->plc_longterm_advc_tdc, 0, plcAd->longterm_analysis_counter_max, &plcAd->overall_counter, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + array_insert_and_shift(plcAd->plc_longterm_advc_ns, 0, plcAd->longterm_analysis_counter_max, NULL, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); +#endif } } +#ifdef CR8_A_PLC_FADEOUT_TUNING + else { + array_insert_and_shift(plcAd->plc_longterm_advc_tdc, 1, plcAd->longterm_analysis_counter_max, &plcAd->overall_counter, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + array_insert_and_shift(plcAd->plc_longterm_advc_ns, 0, plcAd->longterm_analysis_counter_max, NULL, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + } +#endif } else { *concealMethod = 4; /* Noise Substitution */ +#ifdef CR8_A_PLC_FADEOUT_TUNING + array_insert_and_shift(plcAd->plc_longterm_advc_tdc, 0, plcAd->longterm_analysis_counter_max, &plcAd->overall_counter, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); + array_insert_and_shift(plcAd->plc_longterm_advc_ns, 1, plcAd->longterm_analysis_counter_max, NULL, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); +#endif } + +#ifdef CR8_A_PLC_FADEOUT_TUNING +# ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + array_calculate(plcAd->plc_longterm_advc_tdc, plcAd->plc_longterm_advc_ns, plcAd->longterm_analysis_counter_max_bytebuffer, &plcAd->longterm_counter_plcTdc, &plcAd->longterm_counter_plcNsAdv, plcAd->longterm_analysis_counter_max); +# else + array_calculate(plcAd->plc_longterm_advc_tdc, plcAd->plc_longterm_advc_ns, plcAd->longterm_analysis_counter_max_bytebuffer, &plcAd->longterm_counter_plcTdc, &plcAd->longterm_counter_plcNsAdv, &plcAd->longterm_counter_plcPhaseEcu, plcAd->overall_counter, plcAd->longterm_analysis_counter_max); +# endif + update_bit_and_byte_positions(plcAd->longterm_analysis_counter_max_bytebuffer, &plcAd->longterm_counter_byte_position, &plcAd->longterm_counter_bit_position); +#endif } } } diff --git a/lib_lc3plus/plc_compute_stab_fac.c b/lib_lc3plus/plc_compute_stab_fac.c index 4a1111a2c7..a81af2218b 100644 --- a/lib_lc3plus/plc_compute_stab_fac.c +++ b/lib_lc3plus/plc_compute_stab_fac.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_damping_scrambling.c b/lib_lc3plus/plc_damping_scrambling.c index ecea32be5f..a863c1621a 100644 --- a/lib_lc3plus/plc_damping_scrambling.c +++ b/lib_lc3plus/plc_damping_scrambling.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -17,7 +17,11 @@ void processPlcDampingScramblingMain_fl(LC3_INT32 *ns_seed, LC3_INT32 ns_nbLostCmpt, LC3_FLOAT *stabFac, LC3_FLOAT *cum_fading_slow, LC3_FLOAT *cum_fading_fast, LC3_FLOAT *spec_prev, LC3_FLOAT *spec, LC3_INT32 spec_inv_idx, LC3_INT32 yLen, LC3_INT32 bfi, LC3_INT32 frame_dms, LC3_INT32 concealMethod, LC3_INT32 pitch_present_bfi1, LC3_INT32 pitch_present_bfi2, - LC3_FLOAT *cum_fflcAtten) + LC3_FLOAT *cum_fflcAtten +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type +#endif + ) { LC3_INT32 processDampScramb; @@ -31,15 +35,33 @@ void processPlcDampingScramblingMain_fl(LC3_INT32 *ns_seed, { processDampScramb = 1; } + +#ifdef CR8_A_PLC_FADEOUT_TUNING + if (ns_nbLostCmpt == 1) + { + *cum_fading_slow = 1; + *cum_fading_fast = 1; + *cum_fflcAtten = 1; + } +#endif + if ( bfi == 1 ) { processPlcDampingScrambling_fl(spec, yLen, ns_nbLostCmpt, stabFac, processDampScramb, cum_fflcAtten, - pitch_present_bfi1, frame_dms, cum_fading_slow, cum_fading_fast, ns_seed, 0); + pitch_present_bfi1, frame_dms, cum_fading_slow, cum_fading_fast, ns_seed, 0 +#ifdef CR8_A_PLC_FADEOUT_TUNING + , plc_fadeout_type +#endif + ); } else /* bfi == 2 */ { processPlcDampingScrambling_fl(spec, yLen, ns_nbLostCmpt_pc, stabFac, processDampScramb, cum_fflcAtten, - pitch_present_bfi2, frame_dms, cum_fading_slow, cum_fading_fast, pc_seed, spec_inv_idx); + pitch_present_bfi2, frame_dms, cum_fading_slow, cum_fading_fast, pc_seed, spec_inv_idx +#ifdef CR8_A_PLC_FADEOUT_TUNING + , plc_fadeout_type +#endif + ); processPlcUpdateSpec_fl(spec_prev, spec, yLen); } } @@ -47,13 +69,18 @@ void processPlcDampingScramblingMain_fl(LC3_INT32 *ns_seed, void processPlcDampingScrambling_fl(LC3_FLOAT *spec, LC3_INT32 yLen, LC3_INT32 nbLostCmpt, LC3_FLOAT *stabFac, LC3_INT32 processDampScramb, LC3_FLOAT *cum_fflcAtten, LC3_INT32 pitch_present, LC3_INT32 frame_dms, LC3_FLOAT *cum_fading_slow, - LC3_FLOAT *cum_fading_fast, LC3_INT32 *seed, LC3_INT32 spec_inv_idx) + LC3_FLOAT *cum_fading_fast, LC3_INT32 *seed, LC3_INT32 spec_inv_idx +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type +#endif + ) { LC3_INT32 plc_start_inFrames, plc_end_inFrames, plc_duration_inFrames, x, b, i, ad_ThreshFac_start; LC3_FLOAT slow, fast, linFuncStartStop, randThreshold, ad_ThreshFac_end, ad_threshFac, frame_energy, mean_energy, energThreshold, fac, m, n, fflcAtten, cum_fading_slow_local, cum_fading_fast_local; frame_energy = 0; +#ifndef CR8_A_PLC_FADEOUT_TUNING /* Main process */ if (nbLostCmpt == 1) { @@ -61,6 +88,7 @@ void processPlcDampingScrambling_fl(LC3_FLOAT *spec, LC3_INT32 yLen, LC3_INT32 n *cum_fading_fast = 1; *cum_fflcAtten = 1; } +#endif slow = 0.8 + 0.2 * (*stabFac); fast = 0.3 + 0.2 * (*stabFac); @@ -75,64 +103,104 @@ void processPlcDampingScrambling_fl(LC3_FLOAT *spec, LC3_INT32 yLen, LC3_INT32 n slow = LC3_SQRT(slow); fast = LC3_SQRT(fast); break; +#ifdef CR8_G_ADD_75MS + case 75: + slow = LC3_SQRT(LC3_SQRT(slow*slow*slow)); + fast = LC3_SQRT(LC3_SQRT(fast*fast*fast)); + break; +#endif } - *cum_fading_slow = *cum_fading_slow * slow; - *cum_fading_fast = *cum_fading_fast * fast; - - if (processDampScramb == 1) +#ifdef CR8_A_PLC_FADEOUT_TUNING + if (plc_fadeout_type == 0) { - fflcAtten = 1; - cum_fading_slow_local = *cum_fading_slow; - cum_fading_fast_local = *cum_fading_fast; - - if (spec_inv_idx == 0) - { - if (nbLostCmpt * frame_dms > PLC_FADEOUT_IN_MS * 10) - { - fflcAtten = 0; - *cum_fflcAtten = 0; - } - else if (nbLostCmpt * frame_dms > 200) - { - switch(frame_dms) - { - case 25: fflcAtten = PLC34_ATTEN_FAC_025; break; - case 50: fflcAtten = PLC34_ATTEN_FAC_050; break; - case 100: fflcAtten = PLC34_ATTEN_FAC_100; break; - } - } - - - *cum_fflcAtten = *cum_fflcAtten * fflcAtten; - cum_fading_slow_local = *cum_fading_slow * *cum_fflcAtten; - cum_fading_fast_local = *cum_fading_fast * *cum_fflcAtten; - } +#endif + *cum_fading_slow = *cum_fading_slow * slow; + *cum_fading_fast = *cum_fading_fast * fast; +#ifdef CR8_A_PLC_FADEOUT_TUNING + } +#endif + + if (processDampScramb == 1) + { +#ifdef CR8_A_PLC_FADEOUT_TUNING + if (plc_fadeout_type != 0) + { + if (nbLostCmpt < (4 * (100.0 / (LC3_FLOAT)frame_dms))) { + cum_fading_slow_local = 1.0; + } + else if (nbLostCmpt < (8 * (100.0 / (LC3_FLOAT)frame_dms))) { + cum_fading_slow_local = 0.9; + } + else { + cum_fading_slow_local = 0.85; + } - if (pitch_present == 0) - { - plc_start_inFrames = 1; - } else { - plc_start_inFrames = floor(PLC4_TRANSIT_START_IN_MS / (frame_dms / 10.0)); - } + *cum_fading_slow = *cum_fading_slow * cum_fading_slow_local; + cum_fading_slow_local = *cum_fading_slow; + } + else { +#endif + fflcAtten = 1; + cum_fading_slow_local = *cum_fading_slow; + cum_fading_fast_local = *cum_fading_fast; - plc_end_inFrames = floor(PLC4_TRANSIT_END_IN_MS / (frame_dms / 10.0)); - plc_duration_inFrames = plc_end_inFrames - plc_start_inFrames; + if (spec_inv_idx == 0) + { + if (nbLostCmpt * frame_dms > PLC_FADEOUT_IN_MS * 10) + { + fflcAtten = 0; + *cum_fflcAtten = 0; + } + else if (nbLostCmpt * frame_dms > 200) + { + switch (frame_dms) + { + case 25: fflcAtten = PLC34_ATTEN_FAC_025; break; + case 50: fflcAtten = PLC34_ATTEN_FAC_050; break; +#ifdef CR8_G_ADD_75MS + case 75: fflcAtten = PLC34_ATTEN_FAC_075; break; +#endif + case 100: fflcAtten = PLC34_ATTEN_FAC_100; break; + } + } - if (nbLostCmpt <= plc_start_inFrames) - { - linFuncStartStop = 1; - } else if (nbLostCmpt >= plc_end_inFrames) - { - linFuncStartStop = 0; - } else { - x = nbLostCmpt; - m = -1.0 / plc_duration_inFrames; - b = -plc_end_inFrames; - linFuncStartStop = m * (x + b); - } - - randThreshold = -32768 * linFuncStartStop; + + *cum_fflcAtten = *cum_fflcAtten * fflcAtten; + cum_fading_slow_local = *cum_fading_slow * *cum_fflcAtten; + cum_fading_fast_local = *cum_fading_fast * *cum_fflcAtten; + } + + if (pitch_present == 0) + { + plc_start_inFrames = 1; + } + else { + plc_start_inFrames = floor(PLC4_TRANSIT_START_IN_MS / (frame_dms / 10.0)); + } + + plc_end_inFrames = floor(PLC4_TRANSIT_END_IN_MS / (frame_dms / 10.0)); + plc_duration_inFrames = plc_end_inFrames - plc_start_inFrames; + + if (nbLostCmpt <= plc_start_inFrames) + { + linFuncStartStop = 1; + } + else if (nbLostCmpt >= plc_end_inFrames) + { + linFuncStartStop = 0; + } + else { + x = nbLostCmpt; + m = -1.0 / plc_duration_inFrames; + b = -plc_end_inFrames; + linFuncStartStop = m * (x + b); + } + + randThreshold = -32768 * linFuncStartStop; +#ifdef CR8_A_PLC_FADEOUT_TUNING + } +#endif for (i = spec_inv_idx; i < yLen; i++) { @@ -146,37 +214,52 @@ void processPlcDampingScrambling_fl(LC3_FLOAT *spec, LC3_INT32 yLen, LC3_INT32 n if (*seed < 0) { +#ifdef CR8_A_PLC_FADEOUT_TUNING + if (plc_fadeout_type != 0 || pitch_present == 0 || *seed < randThreshold ) +#else if (pitch_present == 0 || *seed < randThreshold) +#endif { spec[i] = -spec[i]; } } } - ad_ThreshFac_start = 10; - ad_ThreshFac_end = 1.2; - ad_threshFac = (ad_ThreshFac_start - ad_ThreshFac_end) * linFuncStartStop + ad_ThreshFac_end; - - if (spec_inv_idx < yLen) +#ifdef CR8_A_PLC_FADEOUT_TUNING + if (plc_fadeout_type == 0) { - for (i = spec_inv_idx; i < yLen; i++) +#endif + ad_ThreshFac_start = 10; + ad_ThreshFac_end = 1.2; + ad_threshFac = (ad_ThreshFac_start - ad_ThreshFac_end) * linFuncStartStop + ad_ThreshFac_end; + + if (spec_inv_idx < yLen) + { + for (i = spec_inv_idx; i < yLen; i++) + { + frame_energy = frame_energy + (spec[i] * spec[i]); + } + + mean_energy = frame_energy * 1 / (yLen - spec_inv_idx); + } + else { - frame_energy = frame_energy + (spec[i] * spec[i]); + mean_energy = 0; } - mean_energy = frame_energy * 1 / (yLen - spec_inv_idx); + energThreshold = LC3_SQRT(ad_threshFac * mean_energy); + fac = (cum_fading_slow_local - cum_fading_fast_local) * energThreshold; +#ifdef CR8_A_PLC_FADEOUT_TUNING } - else - { - mean_energy = 0; - } - - energThreshold = LC3_SQRT(ad_threshFac * mean_energy); - fac = (cum_fading_slow_local - cum_fading_fast_local) * energThreshold; +#endif for (i = spec_inv_idx; i < yLen; i++) { +#ifdef CR8_A_PLC_FADEOUT_TUNING + if (plc_fadeout_type != 0 || LC3_FABS(spec[i]) < energThreshold ) +#else if (LC3_FABS(spec[i]) < energThreshold) +#endif { m = cum_fading_slow_local; n = 0; diff --git a/lib_lc3plus/plc_main.c b/lib_lc3plus/plc_main.c index df3fd184d9..4fc19f6053 100644 --- a/lib_lc3plus/plc_main.c +++ b/lib_lc3plus/plc_main.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -24,6 +24,16 @@ void processPlcMain_fl(LC3_FLOAT *q_d_fl_c, LC3_FLOAT *syntM_fl_c, LC3PLUS_Dec* LC3_INT16 prev_bfi_plc2; LC3_FLOAT phEcu_env_stab_local[1]; LC3_FLOAT phEcu_pfind_sens[1]; + +#ifdef CR8_A_PLC_FADEOUT_TUNING + LC3_INT16 consecutiveLostThreshold = 0; +#endif + +#ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + LC3_INT16 thresh_tdc_cnt; + LC3_INT16 thresh_ns_cnt; + LC3_INT16 thresh_tdc_ns_cnt; +#endif prev_bfi_plc2 = 1; if (PlcSetup->nbLostCmpt == 0) @@ -53,14 +63,114 @@ void processPlcMain_fl(LC3_FLOAT *q_d_fl_c, LC3_FLOAT *syntM_fl_c, LC3PLUS_Dec* if (bfi == 1) { +# ifdef CR8_A_PLC_FADEOUT_TUNING + switch(decoder->frame_dms) + { + case 25: + consecutiveLostThreshold = 16; +#ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + thresh_tdc_cnt = THRESH_025_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_025_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_025_DMS_TDC_NS_CNT; +#endif + break; + case 50: consecutiveLostThreshold = 8; +#ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + thresh_tdc_cnt = THRESH_050_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_050_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_050_DMS_TDC_NS_CNT; +#endif + break; + case 75: consecutiveLostThreshold = 6; +#ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + thresh_tdc_cnt = THRESH_075_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_075_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_075_DMS_TDC_NS_CNT; +#endif + break; + case 100: consecutiveLostThreshold = 4; +#ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + thresh_tdc_cnt = THRESH_100_DMS_TDC_CNT; + thresh_ns_cnt = THRESH_100_DMS_NS_CNT; + thresh_tdc_ns_cnt = THRESH_100_DMS_TDC_NS_CNT; +#endif + break; + default: assert(0); + } + + if (decoder->fs_idx == 2 || decoder->fs_idx >= 4) + { +#ifdef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + if (PlcAdvSetup->longterm_counter_plcTdc < thresh_tdc_cnt){ + PlcAdvSetup->plc_fadeout_type = 1; + } + else if (PlcAdvSetup->longterm_counter_plcNsAdv < thresh_ns_cnt){ + PlcAdvSetup->plc_fadeout_type = 1; + } + else if (PlcAdvSetup->longterm_counter_plcTdc + PlcAdvSetup->longterm_counter_plcNsAdv < thresh_tdc_ns_cnt){ + PlcAdvSetup->plc_fadeout_type = 1; + } + else { + PlcAdvSetup->plc_fadeout_type = 0; + } +#else + if (((PlcAdvSetup->longterm_counter_plcPhaseEcu < PlcAdvSetup->longterm_counter_plcTdc*FAC1_FADEOUT) || + (PlcAdvSetup->longterm_counter_plcPhaseEcu < PlcAdvSetup->longterm_counter_plcNsAdv*FAC1_FADEOUT)) && + (PlcAdvSetup->longterm_counter_plcTdc / (PlcAdvSetup->longterm_counter_plcNsAdv + LC3_EPS) < FAC2_FADEOUT)) + { + PlcAdvSetup->plc_fadeout_type = 0; + } else { + if ((PlcAdvSetup->longterm_counter_plcPhaseEcu > FAC3_FADEOUT * PlcAdvSetup->longterm_counter_plcTdc) || + (PlcAdvSetup->longterm_counter_plcPhaseEcu > FAC3_FADEOUT * PlcAdvSetup->longterm_counter_plcNsAdv)) + { + PlcAdvSetup->plc_fadeout_type = 1; + } else { + PlcAdvSetup->plc_fadeout_type = 0; + } + } +#endif + + if ((PlcAdvSetup->overall_counter - (int)(PLC_LONGTERM_ANALYSIS_STARTUP_FILL * PlcAdvSetup->longterm_analysis_counter_max)) < 0) + { + PlcAdvSetup->plc_fadeout_type = 0; + } +#ifndef CR9_H_REMOVE_SWITCH_TO_PLC_NS + if (PlcSetup->nbLostCmpt >= consecutiveLostThreshold && PlcAdvSetup->plc_fadeout_type == 1) + { + if ( h_DecSetup->concealMethod == 3 ) + { + h_DecSetup->concealMethod = 4; + } + } +#endif +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + if (h_DecSetup->rel_pitch_change > REL_PITCH_THRESH && hrmode == 1 && (decoder->frame_dms == 50 || decoder->frame_dms == 25) ){ + PlcAdvSetup->plc_fadeout_type = 2; + } else +#endif + if ( h_DecSetup->concealMethod != 2 ) { + /* not PhECU */ + if (PlcSetup->nbLostCmpt < consecutiveLostThreshold ) + { + PlcAdvSetup->plc_fadeout_type = 0; + } + } + } else { + PlcAdvSetup->plc_fadeout_type = 0; + } +# endif + +#ifdef PLC_CR8_A_PRINTF + printf("plc_fadeout_type = %d\n", PlcAdvSetup->plc_fadeout_type); +#endif switch (h_DecSetup->concealMethod) { case 2: { LC3_FLOAT pitch_fl_c; - + assert(decoder->fs_idx == floor(decoder->fs / 10000)); - // phaseECU supports only 10ms framing + /* phaseECU supports only 10ms framing*/ assert(PlcSetup->nbLostCmpt != 0 || decoder->frame_dms == 100); if (decoder->frame_dms != 100) @@ -155,6 +265,10 @@ void processPlcMain_fl(LC3_FLOAT *q_d_fl_c, LC3_FLOAT *syntM_fl_c, LC3PLUS_Dec* , &(PlcAdvSetup->PlcPhEcuSetup.PhEcu_Fft), &(PlcAdvSetup->PlcPhEcuSetup.PhEcu_Ifft) +#ifdef CR8_A_PLC_FADEOUT_TUNING + ,PlcAdvSetup->plc_fadeout_type, + &(PlcAdvSetup->PlcPhEcuSetup.PhECU_nonpure_tone_flag) /* nonpure tone flag */ +#endif ); @@ -162,8 +276,7 @@ void processPlcMain_fl(LC3_FLOAT *q_d_fl_c, LC3_FLOAT *syntM_fl_c, LC3PLUS_Dec* h_DecSetup->imdct_mem, synth); move_float(syntM_fl_c, synth, decoder->frame_length); - - + } } break; @@ -180,7 +293,11 @@ void processPlcMain_fl(LC3_FLOAT *q_d_fl_c, LC3_FLOAT *syntM_fl_c, LC3PLUS_Dec* processTdcApply_fl(ltpf_pitch_int, &PlcAdvSetup->PlcTdcSetup.preemphFac, A, PlcAdvSetup->PlcTdcSetup.lpcorder, PlcAdvSetup->pcmbufHist, PlcAdvSetup->max_len_pcm_plc, decoder->frame_length, decoder->frame_dms, decoder->fs, PlcSetup->nbLostCmpt, decoder->frame_length - decoder->la_zeroes, &PlcAdvSetup->stabFac, PlcAdvSetup->PlcTdcSetup.harmonicBuf, PlcAdvSetup->PlcTdcSetup.synthHist, &PlcAdvSetup->PlcTdcSetup.fract, &PlcAdvSetup->PlcTdcSetup.seed, &PlcAdvSetup->PlcTdcSetup.gain_c, - &h_DecSetup->alpha, synth); + &h_DecSetup->alpha, synth +#ifdef CR9_I_INC_TDC_FADEOUT_LEN + ,PlcAdvSetup->plc_fadeout_type +#endif +); processTdcTdac_fl(synth, decoder->imdct_win, decoder->frame_length, decoder->la_zeroes, h_DecSetup->imdct_mem); memmove(syntM_fl_c, synth, sizeof(LC3_FLOAT) * decoder->frame_length); diff --git a/lib_lc3plus/plc_noise_substitution.c b/lib_lc3plus/plc_noise_substitution.c index 4913ee53e5..92f8b3cf21 100644 --- a/lib_lc3plus/plc_noise_substitution.c +++ b/lib_lc3plus/plc_noise_substitution.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_phecu_f0_refine_first.c b/lib_lc3plus/plc_phecu_f0_refine_first.c index 11ebf276b1..2a580024f0 100644 --- a/lib_lc3plus/plc_phecu_f0_refine_first.c +++ b/lib_lc3plus/plc_phecu_f0_refine_first.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_phecu_fec_hq.c b/lib_lc3plus/plc_phecu_fec_hq.c index c25466c3e9..4aebbfa885 100644 --- a/lib_lc3plus/plc_phecu_fec_hq.c +++ b/lib_lc3plus/plc_phecu_fec_hq.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_phecu_hq_ecu.c b/lib_lc3plus/plc_phecu_hq_ecu.c index 5b1978bcab..112d965a49 100644 --- a/lib_lc3plus/plc_phecu_hq_ecu.c +++ b/lib_lc3plus/plc_phecu_hq_ecu.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,6 +13,7 @@ #include "functions.h" + void plc_phEcu_hq_ecu( LC3_FLOAT *f0binPtr, LC3_FLOAT *f0ltpGainPtr, LC3_FLOAT *xfp, LC3_INT16 prev_bfi, LC3_INT32 *short_flag_prev, LC3_INT32 fs, @@ -24,7 +25,12 @@ void plc_phEcu_hq_ecu( LC3_FLOAT *xsubst_dbg, Complex *X_out_m_dbg, LC3_INT32 *seed_dbg, LC3_FLOAT *mag_chg_dbg, LC3_INT32 *tr_dec_dbg, LC3_FLOAT *gpc_dbg, LC3_FLOAT *X_i_new_re_dbg, LC3_FLOAT *X_i_new_im_dbg, LC3_FLOAT *corr_phase_dbg, - Fft *PhEcu_Fft, Fft *PhEcu_Ifft) + Fft *PhEcu_Fft, Fft *PhEcu_Ifft +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type, LC3_INT16 *nonpure_tone_flag_ptr /* nonpure tone flag */ +#endif + + ) { LC3_INT32 i; LC3_INT32 fs_idx, L, Lprot, n_grp, Lecu, LXsav, Lxfp_inuse; @@ -48,6 +54,8 @@ void plc_phEcu_hq_ecu( Lxfp_inuse = (LC3_INT32)(L*(3.75/10.0)); } + + UNUSED(env_stabPtr); UNUSED(xsubst_dbg); UNUSED(X_out_m_dbg); @@ -69,12 +77,20 @@ void plc_phEcu_hq_ecu( xfp_local_rnd[i] = 0.0; } } +#ifdef CR8_A_PLC_FADEOUT_TUNING + *nonpure_tone_flag_ptr = -1; /* set nonpure tone flag for new analysis */ +#endif *time_offs = 0; burst_len = (*time_offs / L + 1); plc_phEcu_trans_burst_ana_sub(fs_idx, burst_len, n_grp, oold_grp_shape, oold_EwPtr , old_grp_shape, old_EwPtr, st_beta_mute, - st_mag_chg_1st, st_Xavg, alpha, beta, mag_chg, NULL, NULL); + st_mag_chg_1st, st_Xavg, alpha, beta, mag_chg, NULL, NULL + +#ifdef CR8_A_PLC_FADEOUT_TUNING + ,plc_fadeout_type +#endif + ); plc_phEcu_spec_ana(xfp_local_rnd, Lprot, winWhr, pfind_sensPtr, plocs, n_plocs, f0est, X_sav_m, &LXsav, f0binPtr, f0ltpGainPtr, fs_idx, PhEcu_Fft); } @@ -85,7 +101,11 @@ void plc_phEcu_hq_ecu( burst_len = ((*time_offs / L) + 1); plc_phEcu_trans_burst_ana_sub(fs_idx, burst_len, n_grp, oold_grp_shape, oold_EwPtr, old_grp_shape, old_EwPtr, st_beta_mute, - st_mag_chg_1st, st_Xavg, alpha, beta, mag_chg, NULL, NULL); + st_mag_chg_1st, st_Xavg, alpha, beta, mag_chg, NULL, NULL +#ifdef CR8_A_PLC_FADEOUT_TUNING + ,plc_fadeout_type +#endif + ); } @@ -100,6 +120,12 @@ void plc_phEcu_hq_ecu( /* inplace X_out_m update */ plc_phEcu_subst_spec(plocs, *n_plocs, f0est, *time_offs, X_out_m, LXsav, mag_chg, &seed, alpha, beta, st_Xavg, t_adv, Lprot, delta_corr, +#ifdef CR8_A_PLC_FADEOUT_TUNING + plc_fadeout_type, + nonpure_tone_flag_ptr, /* nonpure_tone_flag , a state updated here */ +#endif + + NULL, NULL, NULL); diff --git a/lib_lc3plus/plc_phecu_lf_peak_analysis.c b/lib_lc3plus/plc_phecu_lf_peak_analysis.c index 0bcc98d7a4..225aa52560 100644 --- a/lib_lc3plus/plc_phecu_lf_peak_analysis.c +++ b/lib_lc3plus/plc_phecu_lf_peak_analysis.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_phecu_rec_frame.c b/lib_lc3plus/plc_phecu_rec_frame.c index 0e6570743a..e56cb3dd75 100644 --- a/lib_lc3plus/plc_phecu_rec_frame.c +++ b/lib_lc3plus/plc_phecu_rec_frame.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -51,7 +51,12 @@ void plc_phEcu_rec_frame(Complex *X_in, UNUSED(ifft_out_dbg); UNUSED(xsubst_dbg); UNUSED(xsubst_LL); - fs_idx = FRAME2FS_IDX(L); + +#ifdef CR8_A_PLC_FADEOUT_TUNING + fs_idx = FRAME2FS_IDX_10MS(L); +#else + fs_idx = FRAME2FS_IDX(L); +#endif hannOla = hannOla_wins[fs_idx]; X_in[0].i = X_in[Lprot / 2].r; /* move fs/2 real to imag part of X_in[0]*/ diff --git a/lib_lc3plus/plc_phecu_setf0hz.c b/lib_lc3plus/plc_phecu_setf0hz.c index b14327e2b2..7bdb0a8c5c 100644 --- a/lib_lc3plus/plc_phecu_setf0hz.c +++ b/lib_lc3plus/plc_phecu_setf0hz.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_phecu_spec_ana.c b/lib_lc3plus/plc_phecu_spec_ana.c index b496900305..313b338777 100644 --- a/lib_lc3plus/plc_phecu_spec_ana.c +++ b/lib_lc3plus/plc_phecu_spec_ana.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_phecu_subst_spec.c b/lib_lc3plus/plc_phecu_subst_spec.c index 43f806339b..d494af826f 100644 --- a/lib_lc3plus/plc_phecu_subst_spec.c +++ b/lib_lc3plus/plc_phecu_subst_spec.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,35 +13,47 @@ #include "functions.h" #include "constants.h" - static LC3_INT32 own_rand(LC3_INT32 seed); static Complex valley_magnitude_adj(Complex X_i_in, LC3_INT32 uni_seed, LC3_FLOAT cos_F); static LC3_INT32 rand_phase(LC3_INT32 seed_in, LC3_FLOAT* cos_F); +#ifdef CR8_A_PLC_FADEOUT_TUNING + +#define ONE_SIDED_SINE_WIDTH (4) /* expected pure sine main lobe maximum width (4+1+4) bins *62.5 hz/bin => approx 560 Hz total width */ + +static LC3_INT16 plc_phEcu_nonpure_tone_ana(const LC3_INT32* plocs, const LC3_INT32 n_plocs, const Complex* X, const LC3_FLOAT* Xavg, const LC3_INT32 Lprot); +#endif + void plc_phEcu_subst_spec(LC3_INT32* plocs, LC3_INT32 n_plocs, LC3_FLOAT* f0est, LC3_INT32 time_offs, Complex* X, LC3_INT32 X_len, LC3_FLOAT* mag_chg_gr, LC3_INT32 *seed, LC3_FLOAT* alpha, LC3_FLOAT* beta, LC3_FLOAT* Xavg, - LC3_INT32 t_adv_in, LC3_INT32 Lprot, LC3_INT32 delta_corr, LC3_FLOAT *corr_phase_dbg, + LC3_INT32 t_adv_in, LC3_INT32 Lprot, LC3_INT32 delta_corr, +#ifdef CR8_A_PLC_FADEOUT_TUNING + LC3_INT16 fadeout, /* need for DC muting */ + LC3_INT16* nonpure_tone_flag_ptr, +#endif + LC3_FLOAT *corr_phase_dbg, LC3_FLOAT *X_i_new_re_dbg, LC3_FLOAT *X_i_new_im_dbg) { LC3_INT32 i, i2, lprotBy2Minus1, one_peak_flag_mask, noise_mag_scale; LC3_INT32 t_adv; - LC3_FLOAT corr_phase[MAX_PLC_NPLOCS] = {0}; - LC3_FLOAT cos_F, mag_chg_local, alpha_local, beta_local, tmp; + LC3_FLOAT corr_phase[MAX_PLC_NPLOCS] = {0}; + LC3_FLOAT cos_F, mag_chg_local, alpha_local, beta_local, tmp; Complex X_i, X_i_new; LC3_INT32 segmentLen, e; LC3_FLOAT Xph; LC3_FLOAT seed_local; - LC3_INT32 binCounter, subInd; - + LC3_INT32 binCounter = 1, subInd = 0; +#ifdef CR8_A_PLC_FADEOUT_TUNING + LC3_INT16 fs_idx; +#endif + UNUSED(corr_phase_dbg); UNUSED(X_i_new_re_dbg); UNUSED(X_i_new_im_dbg); seed_local = (LC3_FLOAT) *seed; - - lprotBy2Minus1 = imin(320, Lprot/2 - 1); /* limit to 20 KHz */ - + lprotBy2Minus1 = imin(320, Lprot/2 - 1); /* limit to 20 KHz */ t_adv = t_adv_in + time_offs; @@ -49,15 +61,33 @@ void plc_phEcu_subst_spec(LC3_INT32* plocs, LC3_INT32 n_plocs, LC3_FLOAT* f0est, corr_phase[i] = (LC3_FLOAT)2.0 * (LC3_FLOAT)M_PI * (f0est[i]/Lprot)*(LC3_FLOAT)t_adv; } - // EVOLVE PHASE ----------------- - binCounter = 1; - subInd = 0; one_peak_flag_mask = -1; +#ifdef CR8_A_PLC_FADEOUT_TUNING + fs_idx = (LC3_INT16)LC3_FLOOR((LC3_FLOAT)Lprot / 160.0); /* aquire, fs_idx for 10 ms frame sizes */ + if (n_plocs < 3 && n_plocs > 0) + { + one_peak_flag_mask = 0; /* initial crude single tone detection, only using n_plocs as a result from peak_locator() dynamics as input */ + + if ( (*nonpure_tone_flag_ptr < 0 ) + && ( (fs_idx == 2) /*SemiSWB 24 kHz */ || (fs_idx >= 4) /* FB 48 kHz */ ) + ) + { + /* in the first lost frame analyze spectra to possibly reverse initial pure sine assumption */ + *nonpure_tone_flag_ptr = plc_phEcu_nonpure_tone_ana(plocs, n_plocs, X, Xavg, Lprot ); + } + + if ( *nonpure_tone_flag_ptr > 0 ) { + one_peak_flag_mask = -1; /* actually revert single pure tone detection */ /* 0-> mute all surrounding valley bins in evolution , 0xff -> generate noise in all valleys */ + } + + } +#else if (n_plocs < 3 && n_plocs > 0) { one_peak_flag_mask = 0; } +#endif noise_mag_scale = 0; if (n_plocs == 0 || time_offs != 0) { @@ -69,6 +99,32 @@ void plc_phEcu_subst_spec(LC3_INT32* plocs, LC3_INT32 n_plocs, LC3_FLOAT* f0est, X[X_len-1] = realtoc(0); } +#ifdef CR8_A_PLC_FADEOUT_TUNING +#if 0 + /* align DC fs/2 muting to BASOP */ +#endif + /* binary selection of fadeout scheme */ + assert(PLC2_FADEOUT_LONG_IN_MS >= PLC2_FADEOUT_IN_MS_MIN && PLC2_FADEOUT_IN_MS >= PLC2_FADEOUT_IN_MS_MIN); + assert(PLC2_FADEOUT_LONG_IN_MS <= PLC2_FADEOUT_IN_MS_MAX && PLC2_FADEOUT_IN_MS <= PLC2_FADEOUT_IN_MS_MAX); + i = (PLC2_FADEOUT_IN_MS - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES; + + if (fadeout != 0) + { + i = (PLC2_FADEOUT_LONG_IN_MS - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES; + } + + /* calculate local burst_len for securing DC and fs/2 muting */ + i2 = (time_offs / ((Lprot * 100) / 160)) + 1; /* burst_len */ + + if (i2 > (fade_scheme_tab[i][1] + 1)) + { + /* start DC scaling attenuation */ + X[0].r = alpha[0] * X[0].r; + + /* start fs/by2 attenuation */ + X[X_len - 1].r = alpha[(xavg_N_grp[fs_idx] - 1)] * X[X_len - 1].r; + } +#endif if (n_plocs != 0) { for (i = 0; i < n_plocs; i++) { @@ -221,11 +277,11 @@ void plc_phEcu_subst_spec(LC3_INT32* plocs, LC3_INT32 n_plocs, LC3_FLOAT* f0est, } static LC3_INT32 own_rand(LC3_INT32 seed) { - LC3_INT32 retSeed; - assert(seed <= 32767 && seed >= -32768); - retSeed = (13849 + (seed + 32768) * 31821) & 65535; - retSeed -= 32768; - assert(retSeed <= 32767 && retSeed >= -32768); + LC3_INT32 retSeed; + assert(seed <= 32767 && seed >= -32768); + retSeed = (13849 + (seed + 32768) * 31821) & 65535; + retSeed -= 32768; + assert(retSeed <= 32767 && retSeed >= -32768); return retSeed; } @@ -245,3 +301,164 @@ static LC3_INT32 rand_phase(LC3_INT32 seed_in, LC3_FLOAT* cos_F) { return (LC3_INT32) seed; } + +#ifdef CR8_A_PLC_FADEOUT_TUNING + +static LC3_INT16 plc_phEcu_nonpure_tone_ana(const LC3_INT32* plocs, const LC3_INT32 n_plocs, const Complex* X, const LC3_FLOAT* Xavg, const LC3_INT32 Lprot) +{ + + LC3_INT16 nonpure_tone_detect; + LC3_INT16 n_ind, tone_ind, low_ind, high_ind; + LC3_FLOAT peak_amp, peak_amp2, valley_amp, x_abs[(1 + 2 * ONE_SIDED_SINE_WIDTH + 2 * 1)]; + LC3_INT16 sineband_ind_low, sineband_ind_high; + LC3_INT16 i, fs_idx, N_grp; + LC3_FLOAT tmp, tmp_dB, tot_inc_HF, tot_inc_LF; + + + + /* use compressed hearing sensitivity curve to allow more deviation in highest and lowest bands */ + /* ROM table LC3_FLOAT scATHFx[MAX_LGW - 1] */ + + /* init */ + nonpure_tone_detect = 0; + tot_inc_HF = 0.0; + tot_inc_LF = 0.0; + + /* limit single sine optimization to when 2 peaks are close enough to represent a single sinusoid */ + if (n_plocs == 2 && (plocs[1] - plocs[0]) >= ONE_SIDED_SINE_WIDTH) /* NB, plocs is an ordered vector */ + { + nonpure_tone_detect |= 0x1; + } + + /* local bin wise dynamics analysis, if 2 peaks, we do the analysis based on the location of the largest peak */ + { + tone_ind = 0; + plc_phEcu_fft_spec2_sqrt_approx(&(X[plocs[0]]), 1, &peak_amp); /* get 1st peak amplitude = approx_sqrt(Re^2+Im^2) */ + + + if ((n_plocs - 2) == 0) + { + plc_phEcu_fft_spec2_sqrt_approx(&(X[plocs[1]]), 1, &peak_amp2); /* get 2nd peak amplitude */ + if (peak_amp2 > peak_amp) + { + tone_ind = 1; + peak_amp = peak_amp2; + } + } + + low_ind = MAX(1, plocs[tone_ind] - (ONE_SIDED_SINE_WIDTH + 1)); /* DC is not allowed as valley */ + high_ind = MIN((Lprot >> 1) - 2, plocs[tone_ind] + (ONE_SIDED_SINE_WIDTH + 1)); /* Fs/2 is not allowed as valley */ + + n_ind = high_ind - low_ind + 1; + + /* find lowest amplitudes around the assumed main lobe center location */ + plc_phEcu_fft_spec2_sqrt_approx(&(X[low_ind]), n_ind, x_abs); + valley_amp = peak_amp; + for (i = 0; i < n_ind; i++) { + valley_amp = MIN(x_abs[i], valley_amp); + } + + /* at least a localized amplitude ratio of 16 (24 dB) required to declare a pure sinusoid */ + if (peak_amp < 16 * valley_amp) /* 1/16 easily implemented in BASOP */ + { + + nonpure_tone_detect |= 0x2;/* not a pure tone due to too low local SNR */ + + } + } + + /* analyze LF/ HF bands energy dynamics vs the assumed single tone band ( one or two peaks found) */ + { + fs_idx = (LC3_INT16)floor(Lprot / 160); /* fs_idx */ + assert(fs_idx < 5); + + /* Xavg , is a vector of rather rough MDCT based band energy estimates in perceptually motivated bands. from approx the last 26 ms of synthesis */ + + /* eval amplitude relations for assumed tonal band vs lower and higher bands */ + N_grp = xavg_N_grp[fs_idx]; /* { 4 NB , 5 WB , 6 SSWB , 7 SWB, 8 FB }; */ + + /* establish band(s) with assumed sinusoid tone */ + /* if tone freq location is below first MDCT-band definition, use first band as location anyway */ + i = 0; /* band 0 , 1 , 2 , 3 , ...*/ + while (plocs[tone_ind] >= gwlpr[i + 1]) { /* gwplr= [ 1, 12(750Hz), 20(1250Hz) , 36 , .. */ + /* dct-inds "0"...11, 12...19, 20...35, 36 ... */ + i++; + } + sineband_ind_low = i; + sineband_ind_high = i; /* typically in the same band as low */ + + /* a single tone may end up on a band border + , handle case when assumed tone is more or less right in between two perceptual bands +/-4 62.5 Hz */ + if ((sineband_ind_high > 0) && + (plocs[tone_ind] - ONE_SIDED_SINE_WIDTH) >= gwlpr[sineband_ind_high + 1] + ) { + sineband_ind_low = sineband_ind_high - 1; + } + + if ( (sineband_ind_low < (N_grp - 1)) && + (plocs[tone_ind] + ONE_SIDED_SINE_WIDTH) >= gwlpr[sineband_ind_low + 1] + ) { + sineband_ind_high = sineband_ind_low + 1; + } + } + + + + /* intraframe(26 ms), weighted LB and HB envelope dynamics/variation analysis */ + /* envelope analysis , + require at least two HF or two LF bands in the envelope taper/roll-off analysis , otherwise skip this condition */ + + + if (nonpure_tone_detect == 0 && + (((sineband_ind_high + 2) < N_grp) || + ((sineband_ind_low - 2) >= 1) + ) + ) + { + /* delta taper-off analysis solution, less sensitive to input bandwidth limitation and levels */ + +#if 0 + /* note: in BASOP the Xavg ratios below are calculated in log2 domain on a maximally upshifted Xavg vector. + if Xavg is an all zero vector in BASOP, then the nonpure_tone_detect flag is or'ed with 0x100 , + to trigger normal valley noise generation */ +#endif + + /* verify that an assumed clean sine does not have any odd HF content indications by thresholding the accumulated delta rise in LF/HF side lobes */ + for (i = (sineband_ind_high + 1); i < (N_grp - 1); i++) { + tmp = (Xavg[i + 1] + LC3_EPS) / (Xavg[i] + LC3_EPS); + tmp_dB = 20.0*LC3_LOGTEN(tmp); + if ((Xavg[i] + LC3_EPS) > (Xavg[i + 1] + LC3_EPS)) { + tmp_dB = 0; + } + tot_inc_HF += scATHFx[i] * tmp_dB; /* i is ATH factor between band i, i+1 based on Hearing sensitivity */ + } + + /* verify that an assumed clean sine does not have any odd LF content by thresholding the accumulated LF reverse up tilt */ + for (i = MAX(0, (sineband_ind_low - 1)); i > 0; i--) { + tmp = (Xavg[i - 1] + LC3_EPS) / (Xavg[i] + LC3_EPS); + tmp_dB = 20.0*LC3_LOGTEN(tmp); /* switch to log2() to simplify BASOP */ + + if ((Xavg[i - 1] + LC3_EPS) < (Xavg[i] + LC3_EPS)) { + tmp_dB = 0; + } + tot_inc_LF += scATHFx[i - 1] * tmp_dB; /* "psycho" scale using i-1 is ATH factor between band i-1, i , based on Hearing sensitivity */ + } + + if (tot_inc_HF > 4.5){ /* 4.5 dB in log2 is 0.7474 */ + nonpure_tone_detect |= 0x10; /* still not a pure tone, too great HF side increase */ + } + + if (tot_inc_LF > 4.5) { /* 4.5 dB limit in 4.5 = 20log10(x) corresponds to limit value 0.7474 in log2(x) */ + nonpure_tone_detect |= 0x20; /* still not a pure tone, too great accumulated LF side increase */ + } + + /* verify that an assumed clean sine does not have any odd LF+HF content by thresholding the accumulated LF+HF unexpected tilt */ + if ((tot_inc_LF + tot_inc_HF) > 6.0) { /* 6 dB limit in 20log10(x) corresponds to limit value 1.0 in log2(x) */ + nonpure_tone_detect |= 0x40; /* still not a pure tone, to great LF+HF side variation/increase */ + } + } /* bands available*/ + + return nonpure_tone_detect; +} +#endif /* CR8_A_PLC_FADEOUT_TUNING */ + diff --git a/lib_lc3plus/plc_phecu_tba_per_band_gain.c b/lib_lc3plus/plc_phecu_tba_per_band_gain.c index 9f585f28dd..507f45a647 100644 --- a/lib_lc3plus/plc_phecu_tba_per_band_gain.c +++ b/lib_lc3plus/plc_phecu_tba_per_band_gain.c @@ -1,19 +1,19 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * * Rights Policy, 3rd April 2019. No patent licence is granted by implication, * * estoppel or otherwise. * ******************************************************************************/ - + #include "options.h" #include "defines.h" #include "functions.h" -void plc_phEcu_tba_per_band_gain(LC3_INT32 n_grp, LC3_FLOAT *gr_pow_left, LC3_FLOAT *gr_pow_right, LC3_FLOAT *trans, LC3_FLOAT *grp_pow_change) +void plc_phEcu_tba_per_band_gain(LC3_INT32 n_grp, LC3_FLOAT *gr_pow_left, LC3_FLOAT *gr_pow_right, LC3_FLOAT *trans, LC3_FLOAT *grp_pow_change) { LC3_INT32 i; @@ -39,6 +39,5 @@ void plc_phEcu_tba_per_band_gain(LC3_INT32 n_grp, LC3_FLOAT *gr_pow_left, LC3_FL } - return; + return; } - diff --git a/lib_lc3plus/plc_phecu_tba_spect_Xavg.c b/lib_lc3plus/plc_phecu_tba_spect_Xavg.c index 600b9714e4..b4727cfd4c 100644 --- a/lib_lc3plus/plc_phecu_tba_spect_Xavg.c +++ b/lib_lc3plus/plc_phecu_tba_spect_Xavg.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_phecu_tba_trans_dect_gains.c b/lib_lc3plus/plc_phecu_tba_trans_dect_gains.c index e5f0d3caae..3b58d92b42 100644 --- a/lib_lc3plus/plc_phecu_tba_trans_dect_gains.c +++ b/lib_lc3plus/plc_phecu_tba_trans_dect_gains.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -40,11 +40,29 @@ const LC3_INT32 POW_ATT_TABLE0[OFF_FRAMES_LIMIT + 1] = { 32767, 31293, 29885, 28 #ifdef PLC2_FADEOUT_IN_MS #if PLC2_FADEOUT_IN_MS == 0 -/* default setting only requieres two tables */ +#ifndef CR8_A_PLC_FADEOUT_TUNING +/* default setting only requires two tables */ const Word16* const POW_ATT_TABLES[1 + 2] = { NULL, POW_ATT_TABLE1/*1 0.3dB steps */ , POW_ATT_TABLE0/*2 0.4 dB steps*/, }; +#endif #else + +#ifdef CR8_A_PLC_FADEOUT_TUNING +const LC3_INT32 POW_ATT_TABLE_p3x9_14_7[OFF_FRAMES_LIMIT + 1] = { + 32767, + 31656, 30581, 29543, 28540, 27571, 26635, 25731, 24857, 24013, /* 9 times .3dB steps , 14 6 dB steps, 7 muted steps */ + 12007, 6003, 3002, 1501, 750, 375, 188, 94, 47, 23, 12, 6, 3, 1, + 0, 0, 0, 0, 0, 0, 0 }; + +const LC3_INT32 POW_ATT_TABLE_p4x9_14_7[OFF_FRAMES_LIMIT + 1] = +{ 32767, + 31293, 29885, 28540, 27255, 26029, 24857, 23738, 22670, 21650, /* 9 times .4dB steps , 14 6 dB steps, 7 muted steps */ + 10825, 5413, 2706, 1353, 677, 338, 169, 85, 42, 21, 11, 5, 3, 1, + 0, 0,0,0,0,0,0 }; +#endif + + const LC3_INT32 POW_ATT_TABLE_p3x8_6[] = { 32767, 31656, 30581, 29543, 28540, 27571, 26635, 25731, 12865, 6433, 3216, 1608, 804, 402, 201, 101, 50, 25, 13, 6, @@ -81,6 +99,23 @@ const LC3_INT32 POW_ATT_TABLE_p4x1_6[OFF_FRAMES_LIMIT + 1] = { 32, 16, 8, 4, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +#ifdef CR8_A_PLC_FADEOUT_TUNING +#if 0 +/* POW_ATT_TABLES now ordered logically based on initial slow muting phase time */ +/* POW_ATT_TABLES[ind] is used after the initial gain==1.0 no energy muting phase */ +#endif +const LC3_INT32 *const POW_ATT_TABLES[1 + 12] = +{ NULL, +/*0.3dB col , 0.4dB col */ +/* 1*/POW_ATT_TABLE_p3x1_6, POW_ATT_TABLE_p4x1_6, /* 0 0.3dB, 16 6dB, 14mute */ /* 0.4dB version */ /* old short mute tabs */ +/* 3*/POW_ATT_TABLE_p3x2_6, POW_ATT_TABLE_p4x2_6, /* 1 0.3dB, 15 6dB ,14mute */ /* 0.4dB version */ +/* 5*/POW_ATT_TABLE_p3x4_6, POW_ATT_TABLE_p4x4_6, /* 3 0.3dB, 15 6dB , 12 mute */ /* 0.4dB version */ +/* 7*/POW_ATT_TABLE_p3x8_6, POW_ATT_TABLE_p4x8_6, /* 7 0.3dB, 15 6dB , 8 mute */ /* 0.4dB version */ +/* 9*/POW_ATT_TABLE_p3x9_14_7, POW_ATT_TABLE_p4x9_14_7, /* 9 0.3dB, 14 6dB , 7 mute */ /* 0.4dB version */ /* opt 120 ms */ +/*11*/POW_ATT_TABLE1, POW_ATT_TABLE0, /* 15 0.3dB, 14 6dB , 1 mute */ /* 0.4dB version */ /* original curves */ +}; + +#else const LC3_INT32* const POW_ATT_TABLES[1 + 10] = { NULL, @@ -90,13 +125,18 @@ const LC3_INT32* const POW_ATT_TABLES[1 + 10] = POW_ATT_TABLE_p3x2_6, POW_ATT_TABLE_p4x2_6, /* .3dB x2, 30 6dB steps */ /* .4dB x2, 30 6dB steps */ POW_ATT_TABLE_p3x1_6, POW_ATT_TABLE_p4x1_6 /* .3dB x1, 30 6dB steps */ /* .4dB x1, 30 6dB steps */ }; +#endif #endif #endif void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FLOAT *grp_pow_change, LC3_FLOAT *stPhECU_beta_mute, LC3_FLOAT *stPhECU_mag_chg_1st, LC3_FLOAT *alpha, LC3_FLOAT *beta, LC3_FLOAT *mag_chg, LC3_FLOAT *ph_dith, LC3_INT32 *tr_dec, - LC3_FLOAT *att_val, LC3_INT32 *attDegreeFrames_dbg, LC3_FLOAT *thresh_dbg) + LC3_FLOAT *att_val, LC3_INT32 *attDegreeFrames_dbg, LC3_FLOAT *thresh_dbg +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type +#endif + ) { LC3_INT32 i; @@ -108,14 +148,19 @@ void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FL LC3_INT32 burst_att_thresh; LC3_INT32 att_per_frame_idx; LC3_INT32 att_always, attDegreeFrames; - +#ifndef CR8_A_PLC_FADEOUT_TUNING LC3_INT32 FADEOUT_IN_MS, PLC_P800_SPEECH_FADEOUT_IN_FRAMES, PLC2_FADEOUT_IN_FRAMES, BURST_ATT_THRESH_PRE; +#endif const LC3_INT32 *TABLEQ15; +#ifdef CR8_A_PLC_FADEOUT_TUNING + LC3_INT32 beta_mute_thr; /* time threshold in 10 ms frames to start beta - noise attenuation */ +#endif +#ifndef CR8_A_PLC_FADEOUT_TUNING LC3_INT32 BURST_ATT_THRESH; /* start attenuate with losses in a row, also starts FADE2AVG actions */ - LC3_INT32 ATT_PER_FRAME; /* initial msuic attenuation table ptr, actually implemented in table lookup! */ + LC3_INT32 ATT_PER_FRAME; /* initial msuic attenuation table ptr, actually implemented in table lookup! */ LC3_INT32 BETA_MUTE_THR; /* time threshold in 10 ms frames to start beta - noise attenuation */ - +#endif UNUSED(attDegreeFrames_dbg); /* constants setup */ @@ -123,32 +168,31 @@ void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FL XavgFadeinFactor = -1.0; - if (PLC2_FADEOUT_IN_MS != 0) +#ifndef CR8_A_PLC_FADEOUT_TUNING + if (PLC2_FADEOUT_IN_MS < 0) { - if (PLC2_FADEOUT_IN_MS < 0) - { - FADEOUT_IN_MS = PLC_FADEOUT_IN_MS; /* % use TDC - SETTING as input */ - } - else - { - FADEOUT_IN_MS = PLC2_FADEOUT_IN_MS; /* % use a PLC2 individual settinsg */ - } - - PLC_P800_SPEECH_FADEOUT_IN_FRAMES = (LC3_INT32) LC3_FLOOR((LC3_FLOAT)FADEOUT_IN_MS / (LC3_FLOAT)10.0); /* % nominal svaleu for speech */ + FADEOUT_IN_MS = PLC_FADEOUT_IN_MS; /* % use TDC - SETTING as basic input */ + } + else + { + FADEOUT_IN_MS = PLC2_FADEOUT_IN_MS; /* % use a PLC2 individual settings */ + } +#endif - PLC2_FADEOUT_IN_FRAMES = MIN(OFF_FRAMES_LIMIT, MAX(6, 3 * PLC_P800_SPEECH_FADEOUT_IN_FRAMES)); /* for PLC2 we typically maintain energy 3x longer */ +#ifndef CR8_A_PLC_FADEOUT_TUNING + PLC_P800_SPEECH_FADEOUT_IN_FRAMES = (LC3_INT32)LC3_FLOOR((LC3_FLOAT)FADEOUT_IN_MS / (LC3_FLOAT)10.0); /* % nominal value for speech */ - BURST_ATT_THRESH_PRE = MIN(5, MAX(1, (1 * PLC2_FADEOUT_IN_FRAMES) / 6)); /* nominal 20-40 ms to start actual muting, will be thresh +1 fot assumed music */ + PLC2_FADEOUT_IN_FRAMES = MIN(OFF_FRAMES_LIMIT, MAX(6, 3 * PLC_P800_SPEECH_FADEOUT_IN_FRAMES)); /* for PLC2 we typically maintain energy 3x longer */ - ATT_PER_FRAME = MIN(10, MAX(2, 2 * (6 - BURST_ATT_THRESH_PRE))); /* % we let the BURST_ATT_thresh control the initial table selection */ - BURST_ATT_THRESH = MIN(BURST_ATT_THRESH_PRE, 4); - BETA_MUTE_THR = MIN(4 + (OFF_FRAMES_LIMIT / 2) + 1, MAX(4, BURST_ATT_THRESH + 1 + (LC3_INT32)LC3_POW((LC3_FLOAT)2.0,BURST_ATT_THRESH_PRE - (LC3_FLOAT)1))); /* nominal time to start mandatory decrease of Xavg */ - } + BURST_ATT_THRESH_PRE = MIN(5, MAX(1, (1 * PLC2_FADEOUT_IN_FRAMES) / 6)); /* nominal 20-40 ms to start actual muting, will be thresh +1 */ + ATT_PER_FRAME = MIN(10, MAX(2, 2 * (6 - BURST_ATT_THRESH_PRE))); /* % we let the BURST_ATT_thresh control the initial table selection */ + BURST_ATT_THRESH = MIN(BURST_ATT_THRESH_PRE, 4); + BETA_MUTE_THR = MIN(4 + (OFF_FRAMES_LIMIT / 2) + 1, MAX(4, BURST_ATT_THRESH + 1 + (LC3_INT32)LC3_POW((LC3_FLOAT)2.0, BURST_ATT_THRESH_PRE - (LC3_FLOAT)1))); /* nominal time to start mandatory decrease of Xavg */ - - /* Initialize in the same way as done in trans_burst_ana_fx(), even though this is not really needed */ +/* Initialize in the same way as done in trans_burst_ana_fx(), even though this is not really needed */ burst_att_thresh = BURST_ATT_THRESH; att_per_frame_idx = ATT_PER_FRAME; +#endif /* 10ms constants */ @@ -158,10 +202,26 @@ void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FL max_increase_grp_pow_lin = (LC3_FLOAT)1.0*LC3_POW((LC3_FLOAT)10.0, max_increase_grp_pow / (LC3_FLOAT)10.0)*(LC3_FLOAT)(32767.0 / 32768.0); +#ifndef CR8_A_PLC_FADEOUT_TUNING /* envelope setting */ burst_att_thresh = BURST_ATT_THRESH + 1; att_per_frame_idx = ATT_PER_FRAME - 1; +#endif +#ifdef CR8_A_PLC_FADEOUT_TUNING + if (plc_fadeout_type != 0) + { + i = (PLC2_FADEOUT_LONG_IN_MS - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES; /*a long fading table entry in fade_scheme_tab */ + } else { + i = (PLC2_FADEOUT_IN_MS - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES; /* a shorter fading entry in fade_scheme_tab */ + } + assert(i >= 0 && i <= ((PLC2_FADEOUT_IN_MS_MAX - PLC2_FADEOUT_IN_MS_MIN) / PLC2_FADEOUT_RES) && "fade_scheme_tab index error"); + + att_per_frame_idx = fade_scheme_tab[i][0]; + burst_att_thresh = fade_scheme_tab[i][1]; /* number of 1.0 frames before muting/mixing phase */ + /* band gain muting may can take place earlier due to a band transient */ + beta_mute_thr = fade_scheme_tab[i][2]; /* muting of Xavg contribution start when slow fadeout is over */ +#endif attDegreeFrames = 0; if (burst_len > burst_att_thresh) @@ -203,7 +263,6 @@ void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FL /* transient processing */ /* transients may be both rise and decay transients !! */ - if(LC3_FABS(grp_pow_change[i]) >= thresh_tr_dB) { @@ -233,13 +292,20 @@ void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FL assert(burst_len >= 2); /* states used here */ tr_dec[i] = 0; +#ifndef CR8_A_PLC_FADEOUT_TUNING if (PLC_FADEOUT_IN_MS > 0) +#endif { +#ifdef CR8_A_PLC_FADEOUT_TUNING + assert(att_per_frame_idx >= 1 && att_per_frame_idx <= (10+2)); +#else assert(att_per_frame_idx >= 1 && att_per_frame_idx <= 10); +#endif TABLEQ15 = POW_ATT_TABLES[att_per_frame_idx]; att_val[i] = (LC3_FLOAT)1.0 * ( (LC3_FLOAT) TABLEQ15[MIN(OFF_FRAMES_LIMIT, attDegreeFrames )] / (LC3_FLOAT)32768.0); /* Table idx 0...N-1 therefore no + 1 */ att_val[i] = att_val[i]; } +#ifndef CR8_A_PLC_FADEOUT_TUNING else { @@ -252,7 +318,7 @@ void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FL att_val[i] = (LC3_FLOAT)1.0 * ( (LC3_FLOAT)POW_ATT_TABLE1[MIN(OFF_FRAMES_LIMIT, attDegreeFrames)] / (LC3_FLOAT)32768.0); } } - +#endif if ( (att_val[i] != 0) && (att_val[i] * (LC3_FLOAT)32768.0 < (LC3_FLOAT)0.5) ) { @@ -270,8 +336,12 @@ void plc_phEcu_tba_trans_dect_gains(LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FL } - +#ifdef CR8_A_PLC_FADEOUT_TUNING + /* note beta_mute decreased once per frame, not once per band */ + if (i == 0 && burst_len > beta_mute_thr) +#else if(burst_len > BETA_MUTE_THR) +#endif { *stPhECU_beta_mute = *stPhECU_beta_mute * (LC3_FLOAT)BETA_MUTE_FAC; } diff --git a/lib_lc3plus/plc_phecu_trans_burst_ana_sub.c b/lib_lc3plus/plc_phecu_trans_burst_ana_sub.c index c860cd6ce3..d4d8f15e20 100644 --- a/lib_lc3plus/plc_phecu_trans_burst_ana_sub.c +++ b/lib_lc3plus/plc_phecu_trans_burst_ana_sub.c @@ -1,22 +1,28 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * * Rights Policy, 3rd April 2019. No patent licence is granted by implication, * * estoppel or otherwise. * ******************************************************************************/ - + #include "options.h" #include "defines.h" #include "functions.h" -void plc_phEcu_trans_burst_ana_sub(LC3_INT32 fs_idx, LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FLOAT *oold_spect_shape, - LC3_FLOAT *oold_EwPtr, LC3_FLOAT *old_spect_shape, + + +void plc_phEcu_trans_burst_ana_sub(LC3_INT32 fs_idx, LC3_INT32 burst_len, LC3_INT32 n_grp, LC3_FLOAT *oold_spect_shape, + LC3_FLOAT *oold_EwPtr, LC3_FLOAT *old_spect_shape, LC3_FLOAT *old_EwPtr, LC3_FLOAT *stPhECU_beta_mute, - LC3_FLOAT *stPhECU_mag_chg_1st, LC3_FLOAT *stPhECU_Xavg, LC3_FLOAT *alpha, LC3_FLOAT *beta, LC3_FLOAT *mag_chg, LC3_INT32 *tr_dec_dbg, LC3_FLOAT *gpc_dbg) + LC3_FLOAT *stPhECU_mag_chg_1st, LC3_FLOAT *stPhECU_Xavg, LC3_FLOAT *alpha, LC3_FLOAT *beta, LC3_FLOAT *mag_chg, LC3_INT32 *tr_dec_dbg, LC3_FLOAT *gpc_dbg +#ifdef CR8_A_PLC_FADEOUT_TUNING + , LC3_UINT8 plc_fadeout_type +#endif +) { LC3_FLOAT gr_pow_left[MAX_LGW]; LC3_FLOAT gr_pow_right[MAX_LGW]; @@ -28,7 +34,7 @@ void plc_phEcu_trans_burst_ana_sub(LC3_INT32 fs_idx, LC3_INT32 burst_len, LC3_IN LC3_INT32 attDegreeFrames; LC3_FLOAT thresh_dbg; - + UNUSED(tr_dec_dbg); UNUSED(gpc_dbg); @@ -40,8 +46,13 @@ void plc_phEcu_trans_burst_ana_sub(LC3_INT32 fs_idx, LC3_INT32 burst_len, LC3_IN } + plc_phEcu_tba_trans_dect_gains(burst_len, n_grp, grp_pow_change, stPhECU_beta_mute, stPhECU_mag_chg_1st, alpha, beta, mag_chg, ph_dith, tr_dec, att_val, &attDegreeFrames, &thresh_dbg +#ifdef CR8_A_PLC_FADEOUT_TUNING + , plc_fadeout_type +#endif + ); + - plc_phEcu_tba_trans_dect_gains(burst_len, n_grp, grp_pow_change, stPhECU_beta_mute, stPhECU_mag_chg_1st, alpha, beta, mag_chg, ph_dith, tr_dec, att_val, &attDegreeFrames, &thresh_dbg); return; } diff --git a/lib_lc3plus/plc_tdc.c b/lib_lc3plus/plc_tdc.c index 1a1a408f4d..89d7455433 100644 --- a/lib_lc3plus/plc_tdc.c +++ b/lib_lc3plus/plc_tdc.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -8,11 +8,11 @@ ******************************************************************************/ -#include "options.h" /***************************************************************************\ * contents/description: Main function for Time domain concealment \***************************************************************************/ +#include "options.h" #include #include "functions.h" @@ -61,6 +61,9 @@ void processTdcApply_fl(const LC3_INT32 pitch_int, LC3_FLOAT* gain_c, LC3_FLOAT* alpha, LC3_FLOAT* synth +#ifdef CR9_I_INC_TDC_FADEOUT_LEN + ,LC3_UINT8 plc_fadeout_type +#endif ) { LC3_FLOAT step, step_n; @@ -77,6 +80,9 @@ void processTdcApply_fl(const LC3_INT32 pitch_int, LC3_FLOAT alphaPrev; LC3_FLOAT throttle; LC3_INT32 frame_dms_idx, nbLostFramesInRow_mod; +#ifdef CR9_I_INC_TDC_FADEOUT_LEN + LC3_INT32 plc_fadeout_len = 0; +#endif memset(synth_mem, 0, M * sizeof(LC3_FLOAT)); memset(scratchSpace, 0, (MAX_LEN_PCM_PLC + MDCT_MEM_LEN_MAX + MAX_LEN_PCM_PLC + 1 + M) * sizeof(LC3_FLOAT)); @@ -91,7 +97,20 @@ void processTdcApply_fl(const LC3_INT32 pitch_int, beforeNextInc = beforeNextIncArray[frame_dms_idx][nbLostFramesInRow_mod]; nextInc = nextIncArray [frame_dms_idx][nbLostFramesInRow_mod]; +#ifdef CR9_I_INC_TDC_FADEOUT_LEN + if (plc_fadeout_type == 1){ + plc_fadeout_len = PLC_FADEOUT_TYPE_1_IN_MS; + } + else{ + plc_fadeout_len = PLC_FADEOUT_IN_MS; + } +#endif + +#ifdef CR9_I_INC_TDC_FADEOUT_LEN + if (nbLostCmpt_loc > plc_fadeout_len/10) +#else if (nbLostCmpt_loc > PLC_FADEOUT_IN_MS/10) +#endif { gain_p = 0; *gain_c = 0; @@ -198,7 +217,14 @@ void processTdcApply_fl(const LC3_INT32 pitch_int, { alphaPrev = *alpha; } - + +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + if (plc_fadeout_type == 2){ + *alpha = LC3_POW(0.5,(nbLostFramesInRow + LC3_ROUND(100.0/frame_dms) - 1) * frame_dms/100.0); + } + else{ +#endif + if (nextInc != 0) { switch (nbLostCmpt_loc) @@ -231,7 +257,14 @@ void processTdcApply_fl(const LC3_INT32 pitch_int, switch (frame_dms) { case 25: *alpha *= PLC34_ATTEN_FAC_025; break; +#ifdef CR9_J_SLOW_TDC_FADEOUT + case 50: *alpha *= PLC34_ATTEN_FAC_025; break; +#else case 50: *alpha *= PLC34_ATTEN_FAC_050; break; +#endif +#ifdef CR8_G_ADD_75MS + case 75: *alpha *= PLC34_ATTEN_FAC_075; break; +#endif case 100: *alpha *= PLC34_ATTEN_FAC_100; break; } } @@ -240,7 +273,9 @@ void processTdcApply_fl(const LC3_INT32 pitch_int, { gain_p = *alpha; } - +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + } +#endif /*---------------------------------------------------------------* * Construct the harmonic part * * Last pitch cycle of the previous frame is repeatedly copied. * @@ -377,7 +412,11 @@ void processTdcApply_fl(const LC3_INT32 pitch_int, *----------------------------------------------------------*/ if (beforeNextInc != 0) { +#ifdef CR9_I_INC_TDC_FADEOUT_LEN + if (nbLostCmpt_loc == plc_fadeout_len/10) +#else if (nbLostCmpt_loc == PLC_FADEOUT_IN_MS/10) +#endif { gain_h = 1; step = 1.0f/(LC3_FLOAT)N; diff --git a/lib_lc3plus/plc_tdc_tdac.c b/lib_lc3plus/plc_tdc_tdac.c index 329361b14c..3c8e99b0e6 100644 --- a/lib_lc3plus/plc_tdc_tdac.c +++ b/lib_lc3plus/plc_tdc_tdac.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/plc_update.c b/lib_lc3plus/plc_update.c index a151420eb7..4ec4e86341 100644 --- a/lib_lc3plus/plc_update.c +++ b/lib_lc3plus/plc_update.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -7,8 +7,8 @@ * estoppel or otherwise. * ******************************************************************************/ -#include "functions.h" #include "options.h" +#include "functions.h" void processPlcUpdate_fl(PlcAdvSetup *PlcAdvSetup, LC3_INT32 frame_length, LC3_FLOAT *syntM, LC3_FLOAT *scf_q, diff --git a/lib_lc3plus/quantize_spec.c b/lib_lc3plus/quantize_spec.c index 7886b4586d..01339f99bd 100644 --- a/lib_lc3plus/quantize_spec.c +++ b/lib_lc3plus/quantize_spec.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,80 +11,143 @@ #include "options.h" #include "functions.h" -static LC3_INT sign(LC3_FLOAT x); - -LC3_INT sign(LC3_FLOAT x) +LC3_INT32 find_last_nz_pair(LC3_INT32 x[], LC3_INT32 length); +LC3_INT32 find_last_nz_pair(LC3_INT32 x[], LC3_INT32 length) { - if (x > 0) - return 1; + LC3_INT32 last_nz, lobs[4]; LC3_INT32 stage, i; + + lobs[0] = 4; + + lobs[1] = (length >> 1); /* length/2 */ + + lobs[2] = (lobs[1]+ (length >> 2)); + + lobs[3] = (lobs[2]+ (length >> 3)); + - if (x < 0) - return -1; + last_nz = 0; + + i = length; + + for (stage = 3; stage >= 0; --stage) + { + /* unmapped kernel */ + for (; i >= lobs[stage]; i -= 2) + { + if (x[i - 2] != 0) + { + last_nz = MAX(last_nz, i); + } + if (x[i - 1] != 0) + { + last_nz = MAX(last_nz, i); + } + } + if (last_nz > 0) + { + break; + } + } - return 0; + return MAX(last_nz, 2); } + void processQuantizeSpec_fl(LC3_FLOAT x[], LC3_FLOAT gain, LC3_INT xq[], LC3_INT nt, LC3_INT totalBits, LC3_INT* nbits, LC3_INT* nbits2, LC3_INT fs, LC3_INT* lastnzout, LC3_INT* codingdata, LC3_INT* lsbMode, LC3_INT mode, LC3_INT target, LC3_INT hrmode) { - LC3_INT rateFlag = 0, i = 0, lastnz2 = 0, m = 0, maxlev = 0, k = 0; - LC3_INT nbits_lsb = 0; - LC3_INT c = 0; - LC3_INT a = 0, b = 0, lev1 = 0, sym = 0, t = 0, pki = 0; - LC3_INT a1_msb = 0, b1_msb = 0; - LC3_INT lastnz = 1; + LC3_INT rateFlag, i, lastnz2, m, maxlev, k; + LC3_INT nbits_lsb; + LC3_INT c; + LC3_INT a, b, lev1, sym, t, pki; + LC3_INT a1_msb, b1_msb; + LC3_INT lastnz = 1, nt_half; LC3_FLOAT offset = 0.375; + LC3_INT32 bits, bits2; +#ifdef CR9_QUANT_SPEC_REWRITE + LC3_FLOAT inv_gain; +#endif + + assert(target >= 0); + + nbits_lsb = 0; + + nt_half = nt >> 1; + rateFlag = 0; c = 0; + if (hrmode) { offset = 0.5; } - /* Quantization */ + +#ifdef CR9_QUANT_SPEC_REWRITE + inv_gain = 1.0 / gain; +#endif + for (i = 0; i < nt; i++) { - xq[i] = trunc(x[i] / gain + offset * sign(x[i])); + if (x[i] > 0) + { +#ifdef CR9_QUANT_SPEC_REWRITE + xq[i] = (LC3_INT32) ( x[i] * inv_gain + offset); +#else + xq[i] = (LC3_INT32) ( x[i] / gain + offset); +#endif + } + else + { +#ifdef CR9_QUANT_SPEC_REWRITE + xq[i] = -((LC3_INT32) (-x[i] * inv_gain + offset)); +#else + xq[i] = -((LC3_INT32) (-x[i] / gain + offset)); +#endif + } if (hrmode == 0) { assert(xq[i] <= 32767 && xq[i] >= -32768); } } /* Rate flag */ - - if ((fs < 48000 && totalBits > 320 + (fs / 8000 - 2) * 160) || (fs == 48000 && totalBits > 800)) { + if (fs != 96000 && (totalBits > (160 + FS2FS_IDX(fs) * 160))) + { rateFlag = 512; } /* Init */ - if (mode == 0 && ((fs < 48000 && totalBits >= 640 + (fs / 8000 - 2) * 160) || (fs == 48000 && totalBits >= 1120))) { + if (fs != 96000 && (mode == 0 && (totalBits >= (480 + FS2FS_IDX(fs) * 160)))) + { mode = 1; } /* Last non-zero 2-tuple */ - for (i = nt - 2; i >= 2; i = i - 2) { if (xq[i + 1] != 0 || xq[i] != 0) { - lastnz = i + 1; + lastnz = i+2; break; } } - - if (mode < 0) { - lastnz2 = lastnz + 1; - } else { + if (mode < 0) + { + lastnz2 = lastnz; + } + else + { lastnz2 = 2; } - *nbits = 0; - *nbits2 = 0; + bits = bits2 = 0; /* Calculate number of estimated bits */ - for (k = 0; k < lastnz; k = k + 2) { + for (k = 0; k < lastnz; k = k + 2) + { t = c + rateFlag; - if (k > nt / 2) { + if (k > nt_half) + { t += 256; } @@ -94,29 +157,36 @@ void processQuantizeSpec_fl(LC3_FLOAT x[], LC3_FLOAT gain, LC3_INT xq[], LC3_INT b = abs(xq[k + 1]); m = MAX(a, b); - if (m == 0) { + if (m == 0) + { maxlev = -1; - } else { + } + else + { maxlev = 29 - (clz_func(MAX(m, 3)) - 1); } codingdata[1] = maxlev; if (mode <= 0) { - *nbits = *nbits + MIN(a, 1) * 2048; - *nbits = *nbits + MIN(b, 1) * 2048; + bits = bits + (MIN(a, 1) << 11); + bits = bits + (MIN(b, 1) << 11); } lev1 = 0; - while (MAX(a, b) >= 4) { - pki = ari_spec_lookup_fl[t + lev1 * 1024]; - *nbits = *nbits + ari_spec_bits_fl[pki][16]; + while (MAX(a, b) >= 4) + { + pki = ari_spec_lookup_fl[t + lev1 * 1024]; + bits = bits + ari_spec_bits_fl[pki][16]; - if (lev1 == 0 && mode > 0) { + if (lev1 == 0 && mode > 0) + { nbits_lsb += 2; - } else { - *nbits = *nbits + 2 * 2048; + } + else + { + bits = bits + 2 * 2048; } a = a >> 1; @@ -127,68 +197,84 @@ void processQuantizeSpec_fl(LC3_FLOAT x[], LC3_FLOAT gain, LC3_INT xq[], LC3_INT pki = ari_spec_lookup_fl[t + lev1 * 1024]; sym = a + 4 * b; codingdata[2] = sym; - codingdata += 3; - *nbits = *nbits + ari_spec_bits_fl[pki][sym]; + codingdata += 3; + bits = bits + ari_spec_bits_fl[pki][sym]; - if (mode > 0) { + if (mode > 0) + { a1_msb = abs(xq[k]); b1_msb = abs(xq[k + 1]); - if (lev1 > 0) { + if (lev1 > 0) + { a1_msb = a1_msb >> 1; b1_msb = b1_msb >> 1; - if (a1_msb == 0 && xq[k] != 0) { + if (a1_msb == 0 && xq[k] != 0) + { nbits_lsb++; } - if (b1_msb == 0 && xq[k + 1] != 0) { + if (b1_msb == 0 && xq[k + 1] != 0) + { nbits_lsb++; } } - *nbits = *nbits + MIN(a1_msb, 1) * 2048; - *nbits = *nbits + MIN(b1_msb, 1) * 2048; + bits = bits + (MIN(a1_msb, 1) << 11); + bits = bits + (MIN(b1_msb, 1) << 11); } - if (mode >= 0 && (abs(xq[k]) != 0 || abs(xq[k + 1]) != 0) && *nbits <= target * 2048) { + if (mode >= 0 && (abs(xq[k]) != 0 || abs(xq[k + 1]) != 0) && bits <= target * 2048) + { lastnz2 = k + 2; - *nbits2 = *nbits; + bits2 = bits; } lev1 = lev1 - 1; - if (lev1 <= 0) { + + if (lev1 <= 0) + { t = 1 + (a + b) * (lev1 + 2); - } else { + } + else + { t = 13 + lev1; } c = (c & 15) * 16 + t; } - /* Number of bits */ - *nbits = ceil((LC3_FLOAT)*nbits / 2048.0); + *nbits = (bits + 2047) >> 11; // Exactly same as ceil((LC3_FLOAT)*nbits / 2048.0); - if (mode >= 0) { - *nbits2 = ceil((LC3_FLOAT)*nbits2 / 2048.0); - } else { + if (mode >= 0) + { + *nbits2 = (bits2 + 2047) >> 11; //ceil((LC3_FLOAT)*nbits2 / 2048.0); + } + else + { *nbits2 = *nbits; } - if (mode > 0) { - *nbits += nbits_lsb; + if (mode > 0) + { + *nbits += nbits_lsb; *nbits2 += nbits_lsb; } /* Truncation of high-frequency coefficients */ - for (i = lastnz2; i <= lastnz; i++) { - xq[i] = 0; + if (lastnz > lastnz2) + { + memset(&xq[lastnz2], 0, (lastnz - lastnz2) * sizeof(*xq)); } /* Truncation of LSBs */ - if (mode > 0 && *nbits > target) { + if (mode > 0 && *nbits > target) + { *lsbMode = 1; - } else { + } + else + { *lsbMode = 0; } diff --git a/lib_lc3plus/reorder_bitstream.c b/lib_lc3plus/reorder_bitstream.c index 77b50d7a13..61880dbd09 100644 --- a/lib_lc3plus/reorder_bitstream.c +++ b/lib_lc3plus/reorder_bitstream.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * diff --git a/lib_lc3plus/resamp12k8.c b/lib_lc3plus/resamp12k8.c index 0cab5daae9..fd8caad7c0 100644 --- a/lib_lc3plus/resamp12k8.c +++ b/lib_lc3plus/resamp12k8.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -16,15 +16,13 @@ void process_resamp12k8_fl(LC3_FLOAT x[], LC3_INT x_len, LC3_FLOAT mem_in[], LC3 { - LC3_INT len_12k8 = 0, N12k8 = 0, i = 0, k = 0; - LC3_FLOAT mac = 0, buf_out[120 + MAX_LEN] = {0}, bufdown[128] = {0}, buf[120 + MAX_LEN] = {0}; + LC3_INT len_12k8, N12k8, i, k; + LC3_FLOAT mac, bufdown[128], buf[120 + MAX_LEN]; LC3_INT32 index_int, index_frac, resamp_upfac, resamp_delay, resamp_off_int, resamp_off_frac; LC3_FLOAT u_11, u_21, u_1, u_2; - const LC3_FLOAT *filter; const LC3_FLOAT *filt_input, *filt_coeff; - switch (frame_dms) { case 25: @@ -33,6 +31,11 @@ void process_resamp12k8_fl(LC3_FLOAT x[], LC3_INT x_len, LC3_FLOAT mem_in[], LC3 case 50: len_12k8 = LEN_12K8 / 2; break; +#ifdef CR8_G_ADD_75MS + case 75: + len_12k8 = (LEN_12K8 / 4) * 3; + break; +#endif case 100: len_12k8 = LEN_12K8; break; @@ -46,8 +49,6 @@ void process_resamp12k8_fl(LC3_FLOAT x[], LC3_INT x_len, LC3_FLOAT mem_in[], LC3 memmove(&buf[mem_in_len], x, x_len * sizeof(LC3_FLOAT)); memmove(mem_in, &buf[x_len], mem_in_len * sizeof(LC3_FLOAT)); - - filter = lp_filter[fs_idx]; /* Upsampling & Low-pass Filtering & Downsampling */ @@ -97,11 +98,11 @@ void process_resamp12k8_fl(LC3_FLOAT x[], LC3_INT x_len, LC3_FLOAT mem_in[], LC3 mem_50[1] = (LC3_FLOAT)u_21; /* Output Buffer */ - memmove(buf_out, mem_out, mem_out_len * sizeof(LC3_FLOAT)); + memmove(buf, mem_out, mem_out_len * sizeof(LC3_FLOAT)); - memmove(&buf_out[mem_out_len], bufdown, len_12k8 * sizeof(LC3_FLOAT)); + memmove(&buf[mem_out_len], bufdown, len_12k8 * sizeof(LC3_FLOAT)); - memmove(y, buf_out, (*y_len + 1) * sizeof(LC3_FLOAT)); + memmove(y, buf, (*y_len + 1) * sizeof(LC3_FLOAT)); - memmove(mem_out, &buf_out[N12k8], mem_out_len * sizeof(LC3_FLOAT)); + memmove(mem_out, &buf[N12k8], mem_out_len * sizeof(LC3_FLOAT)); } diff --git a/lib_lc3plus/residual_coding.c b/lib_lc3plus/residual_coding.c index 42094d275f..bcd6637310 100644 --- a/lib_lc3plus/residual_coding.c +++ b/lib_lc3plus/residual_coding.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -19,7 +19,7 @@ void processResidualCoding_fl(LC3_FLOAT x[], LC3_INT xq[], LC3_FLOAT gain, LC3_I LC3_INT iter=0; LC3_FLOAT offset; LC3_INT iter_max = 1; - LC3_INT nz_idx[MAX_LEN] = {0}; + LC3_INT nz_idx[MAX_LEN]; LC3_INT N_nz = 0, idx = 0; diff --git a/lib_lc3plus/residual_decoding.c b/lib_lc3plus/residual_decoding.c index 97fd94afc3..5085d999af 100644 --- a/lib_lc3plus/residual_decoding.c +++ b/lib_lc3plus/residual_decoding.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -18,7 +18,7 @@ void processResidualDecoding_fl(LC3_INT* bitsRead, LC3_FLOAT x[], LC3_INT L_spec LC3_INT k = 0, n = 0; LC3_FLOAT offset1 = 0, offset2 = 0; LC3_FLOAT offset = 0; - LC3_INT nz_idx[MAX_LEN] = {0}; + LC3_INT nz_idx[MAX_LEN]; LC3_INT N_nz = 0, idx = 0; LC3_INT iter = 0, iter_max = 1; @@ -65,7 +65,7 @@ void processResidualDecoding_fl(LC3_INT* bitsRead, LC3_FLOAT x[], LC3_INT L_spec break; } } - offset /= 2; + offset *= 0.5; iter ++; } } diff --git a/lib_lc3plus/setup_com_lc3.c b/lib_lc3plus/setup_com_lc3.c index 17054d1ffc..cecbfd7762 100644 --- a/lib_lc3plus/setup_com_lc3.c +++ b/lib_lc3plus/setup_com_lc3.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -7,8 +7,8 @@ * estoppel or otherwise. * ******************************************************************************/ -#include "functions.h" #include "options.h" +#include "functions.h" LC3_FLOAT array_max_abs(LC3_FLOAT *in, LC3_INT32 len) { diff --git a/lib_lc3plus/setup_dec_lc3.c b/lib_lc3plus/setup_dec_lc3.c index c14309720e..517a48b492 100644 --- a/lib_lc3plus/setup_dec_lc3.c +++ b/lib_lc3plus/setup_dec_lc3.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -19,8 +19,8 @@ int alloc_decoder(LC3PLUS_Dec* decoder, int samplerate, int channels) { - int ch = 0; - size_t size = sizeof(LC3PLUS_Dec); + int ch = 0; + size_t size = sizeof(LC3PLUS_Dec); size_t frame_len = DYN_MAX_LEN_EXT(samplerate); void *PlcAdvSetup = NULL; @@ -34,6 +34,11 @@ int alloc_decoder(LC3PLUS_Dec* decoder, int samplerate, int channels) HANDLE_IIS_FFT handle_fft_phaseecu; HANDLE_IIS_FFT handle_ifft_phaseecu; LC3_FLOAT *q_old_res; + +#ifdef CR8_A_PLC_FADEOUT_TUNING + LC3_INT32 * plc_longterm_advc_tdc = NULL, *plc_longterm_advc_ns = NULL; + LC3_INT16 longterm_analysis_counter_max = 0, longterm_analysis_counter_max_bytebuffer = 0; +#endif for (ch = 0; ch < channels; ch++) { DecSetup* setup = balloc(decoder, &size, sizeof(DecSetup)); @@ -57,6 +62,15 @@ int alloc_decoder(LC3PLUS_Dec* decoder, int samplerate, int channels) sine_table1_phecu = balloc(decoder, &size, sizeof(LC3_FLOAT) * (((CODEC_FS(samplerate) * 16) / 1000) / 2 + 1)); sine_table2_phecu = balloc(decoder, &size, sizeof(LC3_FLOAT) * (((CODEC_FS(samplerate) * 16) / 1000) / 2 + 1)); + +#ifdef CR8_A_PLC_FADEOUT_TUNING + longterm_analysis_counter_max = plc_fadeout_param_maxlen[0]; + longterm_analysis_counter_max_bytebuffer = plc_fadeout_param_maxbytes[0]; + + + plc_longterm_advc_tdc = balloc(decoder, &size, sizeof(LC3_INT32) * longterm_analysis_counter_max_bytebuffer); + plc_longterm_advc_ns = balloc(decoder, &size, sizeof(LC3_INT32) * longterm_analysis_counter_max_bytebuffer); +#endif q_old_res = balloc(decoder, &size, sizeof(LC3_FLOAT) * frame_len); @@ -80,6 +94,14 @@ int alloc_decoder(LC3PLUS_Dec* decoder, int samplerate, int channels) setup->PlcAdvSetup->PlcPhEcuSetup.handle_fft_phaseecu->sine_table = sine_table1_phecu; setup->PlcAdvSetup->PlcPhEcuSetup.handle_ifft_phaseecu->sine_table = sine_table2_phecu; + +#ifdef CR8_A_PLC_FADEOUT_TUNING + setup->PlcAdvSetup->longterm_analysis_counter_max = longterm_analysis_counter_max; + setup->PlcAdvSetup->longterm_analysis_counter_max_bytebuffer = longterm_analysis_counter_max_bytebuffer; + + setup->PlcAdvSetup->plc_longterm_advc_tdc = plc_longterm_advc_tdc; + setup->PlcAdvSetup->plc_longterm_advc_ns = plc_longterm_advc_ns; +#endif setup->PlcAdvSetup->PlcPhEcuSetup.PhECU_Lprot = (CODEC_FS(samplerate) * 16) / 1000; real_fft_init(&(setup->PlcAdvSetup->PlcPhEcuSetup.PhEcu_Fft), setup->PlcAdvSetup->PlcPhEcuSetup.PhECU_Lprot, &(setup->PlcAdvSetup->PlcPhEcuSetup.handle_fft_phaseecu)); @@ -104,10 +126,12 @@ LC3PLUS_Error FillDecSetup(LC3PLUS_Dec* decoder, int samplerate, int channels, L decoder->plcMeth = plc_mode; decoder->hrmode = hrmode != 0; - + +#ifndef CR8_A_PLC_FADEOUT_TUNING if (decoder->fs_idx > 4) { decoder->fs_idx = 5; } +#endif decoder->channels = channels; decoder->frame_ms = 10; decoder->frame_dms = 100; @@ -175,6 +199,21 @@ void set_dec_frame_params(LC3PLUS_Dec* decoder) decoder->yLen /= 2; decoder->bands_number = bands_number_5ms[decoder->fs_idx]; } +#ifdef CR8_G_ADD_75MS + if (decoder->frame_ms == 7.5) + { + decoder->frame_length = (decoder->frame_length >> 2) * 3; + decoder->yLen = (decoder->yLen / 4) * 3; + if (decoder->hrmode) + { + decoder->bands_number = bands_number_7_5ms_HR[decoder->fs_idx]; + } + else + { + decoder->bands_number = bands_number_7_5ms[decoder->fs_idx]; + } + } +# endif if (decoder->hrmode) { @@ -221,6 +260,20 @@ void set_dec_frame_params(LC3PLUS_Dec* decoder) } decoder->cutoffBins = BW_cutoff_bin_all_5ms; } +#ifdef CR8_G_ADD_75MS + else if (decoder->frame_ms == 7.5) + { + if (decoder->hrmode) + { + decoder->bands_offset = ACC_COEFF_PER_BAND_7_5ms_HR[decoder->fs_idx]; + } + else + { + decoder->bands_offset = ACC_COEFF_PER_BAND_7_5ms[decoder->fs_idx]; + } + decoder->cutoffBins = BW_cutoff_bin_all_7_5ms; + } +# endif decoder->n_bandsPLC = MIN(decoder->frame_length, 80); @@ -246,6 +299,19 @@ void set_dec_frame_params(LC3PLUS_Dec* decoder) decoder->n_bandsPLC = 60; } } +# ifdef CR8_G_ADD_75MS + else if (decoder->frame_ms == 7.5) + { + decoder->bands_offsetPLC = ACC_COEFF_PER_BAND_PLC_7_5ms[decoder->fs_idx]; + + if (decoder->fs != 32000 && decoder->fs != 96000) + if (decoder->fs != 32000) + { + decoder->n_bandsPLC = 60; + } + } +# endif + assert(decoder->bands_offsetPLC); if (decoder->frame_ms == 10) { @@ -263,6 +329,13 @@ void set_dec_frame_params(LC3PLUS_Dec* decoder) decoder->imdct_laZeros = MDCT_la_zeroes_5ms[decoder->fs_idx]; decoder->imdct_winLen = MDCT_WINDOWS_LENGTHS_5ms[decoder->fs_idx]; } +#ifdef CR8_G_ADD_75MS + else if (decoder->frame_ms == 7.5) { + decoder->imdct_win = MDCT_WINS_7_5ms[decoder->hrmode][decoder->fs_idx]; + decoder->imdct_laZeros = MDCT_la_zeroes_7_5ms[decoder->fs_idx]; + decoder->imdct_winLen = MDCT_WINDOWS_LENGTHS_7_5ms[decoder->fs_idx]; + } +# endif decoder->la_zeroes = decoder->imdct_laZeros; @@ -307,6 +380,11 @@ void set_dec_frame_params(LC3PLUS_Dec* decoder) setup->PlcAdvSetup->cum_fading_fast = 1; setup->PlcAdvSetup->cum_fading_slow = 1; setup->PlcAdvSetup->cum_fflcAtten = 1; + +#ifdef CR8_A_PLC_FADEOUT_TUNING + setup->PlcAdvSetup->longterm_analysis_counter_max = plc_fadeout_param_maxlen[(decoder->frame_dms / 25) - 1]; + setup->PlcAdvSetup->longterm_analysis_counter_max_bytebuffer = plc_fadeout_param_maxbytes[(decoder->frame_dms / 25) - 1]; +#endif if (decoder->fs_idx <= 4 && decoder->frame_dms == 100) { @@ -340,6 +418,9 @@ void set_dec_frame_params(LC3PLUS_Dec* decoder) } setup->PlcAdvSetup->PlcPhEcuSetup.PhECU_short_flag_prev = 0; /* fullband transient */ setup->PlcAdvSetup->PlcPhEcuSetup.PhECU_num_plocs = 0; +#ifdef CR8_A_PLC_FADEOUT_TUNING + setup->PlcAdvSetup->PlcPhEcuSetup.PhECU_nonpure_tone_flag = -1; /* nonpure tone flag, -1==new calc., 0==pure, 1==nonpure */ +#endif } } } @@ -362,6 +443,12 @@ LC3PLUS_Error update_dec_bitrate(LC3PLUS_Dec* decoder, int ch, int nBytes) maxBytes = 375; minBytes = MIN_NBYTES; break; +#ifdef CR8_G_ADD_75MS + case 75: + maxBytes = 625; + minBytes = MIN_NBYTES; + break; +#endif case 100: maxBytes = 625; minBytes = MIN_NBYTES; @@ -406,6 +493,12 @@ LC3PLUS_Error update_dec_bitrate(LC3PLUS_Dec* decoder, int ch, int nBytes) setup->enable_lpc_weighting = (setup->total_bits < 240); totalBits = setup->total_bits * 2 - 160; } +# ifdef CR8_G_ADD_75MS + if (decoder->frame_ms == 7.5) { + setup->enable_lpc_weighting = (setup->total_bits < 360); + totalBits = round(setup->total_bits * 10 / 7.5); + } +# endif if (decoder->frame_length > 40 * ((LC3_FLOAT) (decoder->frame_dms) / 10.0)) { setup->N_red_tns = 40 * ((LC3_FLOAT) (decoder->frame_dms) / 10.0); diff --git a/lib_lc3plus/setup_dec_lc3.h b/lib_lc3plus/setup_dec_lc3.h index 6ed0f438ea..3ae6b13977 100644 --- a/lib_lc3plus/setup_dec_lc3.h +++ b/lib_lc3plus/setup_dec_lc3.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef SETUP_DEC_LC3_FL_H #define SETUP_DEC_LC3_FL_H +#include "options.h" #include "constants.h" /* Channel state and bitrate-derived values go in this struct */ @@ -49,6 +50,9 @@ typedef struct { LC3_FLOAT x_fl[MAX_LEN]; LC3_FLOAT imdct_mem[MAX_LEN]; LC3_FLOAT alpha; +#ifdef CR9_N_SHORT_FADE_FOR_UNSTABLE_PITCH + LC3_FLOAT rel_pitch_change; +#endif Dct4 dct4structImdct; diff --git a/lib_lc3plus/setup_enc_lc3.c b/lib_lc3plus/setup_enc_lc3.c index 986b43d608..a7c94a44e2 100644 --- a/lib_lc3plus/setup_enc_lc3.c +++ b/lib_lc3plus/setup_enc_lc3.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -42,9 +42,12 @@ LC3PLUS_Error FillEncSetup(LC3PLUS_Enc* encoder, int samplerate, int channels encoder->fs_in = samplerate; encoder->fs_idx = FS2FS_IDX(encoder->fs); encoder->frame_dms = 100; + +#ifndef CR8_A_PLC_FADEOUT_TUNING if (encoder->fs_idx > 4) { encoder->fs_idx = 5; } +#endif encoder->hrmode = hrmode != 0; @@ -103,6 +106,7 @@ void set_enc_frame_params(LC3PLUS_Enc* encoder) encoder->yLen = MIN(MAX_BW, encoder->frame_length); encoder->sns_damping = 0.85; } + encoder->stEnc_mdct_mem_len = encoder->frame_length - encoder->la_zeroes; encoder->bands_number = 64; encoder->nSubdivisions = 3; @@ -140,19 +144,46 @@ void set_enc_frame_params(LC3PLUS_Enc* encoder) encoder->attdec_damping = 0.5; encoder->attdec_hangover_thresh = 2; } - else if (encoder->frame_ms == 2.5) { - encoder->la_zeroes = MDCT_la_zeroes_2_5ms[encoder->fs_idx]; +#ifdef CR8_G_ADD_75MS + else if (encoder->frame_ms == 7.5) { if (encoder->hrmode) { - encoder->bands_offset = ACC_COEFF_PER_BAND_2_5ms_HR[encoder->fs_idx]; + encoder->bands_offset = ACC_COEFF_PER_BAND_7_5ms_HR[encoder->fs_idx]; } else { - encoder->bands_offset = ACC_COEFF_PER_BAND_2_5ms[encoder->fs_idx]; + encoder->bands_offset = ACC_COEFF_PER_BAND_7_5ms[encoder->fs_idx]; } - encoder->cutoffBins = BW_cutoff_bin_all_2_5ms; + encoder->la_zeroes = MDCT_la_zeroes_7_5ms[encoder->fs_idx]; + encoder->cutoffBins = BW_cutoff_bin_all_7_5ms; + encoder->attdec_nblocks = 3; + encoder->attdec_damping = 0.3; + encoder->attdec_hangover_thresh = 1; + + encoder->frame_length = (encoder->frame_length >> 2) * 3; + encoder->yLen = (encoder->yLen >> 2) * 3; + + encoder->stEnc_mdct_mem_len = encoder->frame_length - encoder->la_zeroes; + if (encoder->hrmode) + { + encoder->bands_number = bands_number_7_5ms_HR[encoder->fs_idx]; + } + else + { + encoder->bands_number = bands_number_7_5ms[encoder->fs_idx]; + } + encoder->nSubdivisions = 3; + encoder->near_nyquist_index = encoder->bands_number - 4; + encoder->r12k8_mem_out_len = ceil(2.0 * ((LC3_FLOAT) encoder->frame_length / 2.0 - (LC3_FLOAT) encoder->la_zeroes) * 12800.0 / (LC3_FLOAT) encoder->fs - 8.0); } +#endif else if (encoder->frame_ms == 5) { + encoder->frame_length = encoder->frame_length >> 1; + encoder->yLen /= 2; + encoder->stEnc_mdct_mem_len = encoder->frame_length - encoder->la_zeroes; + encoder->bands_number = bands_number_5ms[encoder->fs_idx]; + encoder->nSubdivisions = 2; + encoder->near_nyquist_index = encoder->bands_number - 3; encoder->la_zeroes = MDCT_la_zeroes_5ms[encoder->fs_idx]; if (encoder->hrmode) { @@ -164,8 +195,17 @@ void set_enc_frame_params(LC3PLUS_Enc* encoder) } encoder->cutoffBins = BW_cutoff_bin_all_5ms; } - - if (encoder->frame_ms == 2.5) { + else if (encoder->frame_ms == 2.5) { + encoder->la_zeroes = MDCT_la_zeroes_2_5ms[encoder->fs_idx]; + if (encoder->hrmode) + { + encoder->bands_offset = ACC_COEFF_PER_BAND_2_5ms_HR[encoder->fs_idx]; + } + else + { + encoder->bands_offset = ACC_COEFF_PER_BAND_2_5ms[encoder->fs_idx]; + } + encoder->cutoffBins = BW_cutoff_bin_all_2_5ms; encoder->frame_length = encoder->frame_length >> 2; encoder->yLen /= 4; encoder->stEnc_mdct_mem_len = encoder->frame_length - encoder->la_zeroes; @@ -182,22 +222,14 @@ void set_enc_frame_params(LC3PLUS_Enc* encoder) encoder->near_nyquist_index = encoder->bands_number - 2; encoder->ltpf_mem_in_len = LTPF_MEMIN_LEN + (LEN_12K8 >> 2); } - - - if (encoder->frame_ms == 5) { - encoder->frame_length = encoder->frame_length >> 1; - encoder->yLen /= 2; - encoder->stEnc_mdct_mem_len = encoder->frame_length - encoder->la_zeroes; - encoder->bands_number = bands_number_5ms[encoder->fs_idx]; - encoder->nSubdivisions = 2; - encoder->near_nyquist_index = encoder->bands_number - 3; - } for (ch = 0; ch < encoder->channels; ch++) { setup = encoder->channel_setup[ch]; setup->olpa_mem_pitch = 17; - +#ifdef CR9_F_PITCH_WIN_LEN_FIX + setup->pitch_flag = 0; +#endif if (setup->mdctStruct.mem != NULL) { mdct_free(&setup->mdctStruct); mdct_init(&setup->mdctStruct, encoder->frame_length, encoder->frame_dms, encoder->fs_idx, encoder->hrmode); @@ -219,9 +251,9 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) int ch = 0, bitsTmp = 0, minBR = 0, maxBR = 0, totalBytes = 0; LC3_INT channel_bytes = 0, max_bytes = 0; +#ifdef ENABLE_HR_MODE_FL if (encoder->hrmode) { -#ifdef ENABLE_HR_MODE_FL switch (encoder->frame_dms) { case 25: @@ -236,6 +268,14 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) else if (encoder->fs == 96000) {minBR = MIN_BR_50MS_96KHZ_HR;} else { return LC3PLUS_HRMODE_ERROR;} break; +#ifdef CR8_G_ADD_75MS + case 75: + maxBR = 500000; + if (encoder->fs == 48000) {minBR = MIN_BR_075DMS_48KHZ_HR;} + else if (encoder->fs == 96000) {minBR = MIN_BR_075DMS_96KHZ_HR;} + else {return LC3PLUS_HRMODE_ERROR;} + break; +#endif case 100: maxBR = 500000; if (encoder->fs == 48000) {minBR = MIN_BR_100MS_48KHZ_HR;} @@ -245,9 +285,9 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) default: return LC3PLUS_HRMODE_ERROR; } -#endif } else +#endif /* ENABLE_HR_MODE_FL */ { minBR = (MIN_NBYTES << 3); maxBR = MAX_BR; @@ -268,6 +308,20 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) default: break; } break; +#ifdef CR8_G_ADD_75MS + case 75: + minBR = MIN_BR_075DMS; + maxBR = MAX_BR_075DMS; + /* have additional limitations for 7.5ms */ + switch (encoder->fs_in) + { + case 8000: maxBR = MAX_BR_075DMS_NB ; break; + case 16000: maxBR = MAX_BR_075DMS_WB ; break; + case 24000: maxBR = MAX_BR_075DMS_SSWB; break; + default: break; + } + break; +#endif case 100: /* have additional limitations for 10ms */ minBR = MIN_BR_100DMS; @@ -388,6 +442,11 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) setup->targetBitsAri = setup->total_bits; setup->enable_lpc_weighting = setup->total_bits < 480; +#ifdef CR8_G_ADD_75MS + if (encoder->frame_ms == 7.5) { + setup->enable_lpc_weighting = setup->total_bits < 360; + } +#endif if (encoder->frame_ms == 5) { setup->enable_lpc_weighting = setup->total_bits < 240; } @@ -433,6 +492,11 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) if (encoder->frame_ms == 5) { bitsTmp = bitsTmp * 2 - 160; } +#ifdef CR8_G_ADD_75MS + if (encoder->frame_ms == 7.5) { + bitsTmp = round(bitsTmp * 10 / 7.5); + } +#endif if (bitsTmp < 400 + (encoder->fs_idx - 1) * 80) { setup->ltpf_enable = 1; @@ -461,6 +525,14 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) encoder->sns_damping = 6881.0/32768.0; } } +#ifdef CR8_G_ADD_75MS + if (encoder->frame_ms == 7.5) + { + if (setup->total_bits > 3*4400/4) { + encoder->sns_damping = 5898.0/32768.0; + } + } +#endif if (encoder->frame_ms == 5) { if (setup->total_bits > 4600/2) { @@ -487,6 +559,12 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) { setup->regBits +=2; } +#ifdef CR8_G_ADD_75MS + if (encoder->frame_ms == 7.5) + { + setup->regBits +=1; + } +#endif if (encoder->frame_ms == 2.5) { setup->regBits -= 6; @@ -502,6 +580,12 @@ LC3PLUS_Error update_enc_bitrate(LC3PLUS_Enc* encoder, int bitrate) { setup->regBits += 0; } +#ifdef CR8_G_ADD_75MS + if (encoder->frame_ms == 7.5) + { + setup->regBits +=2; + } +#endif if (encoder->frame_ms == 10) { setup->regBits += 5; @@ -538,9 +622,11 @@ void update_enc_bandwidth(LC3PLUS_Enc* encoder, int bandwidth) { encoder->bandwidth = bandwidth; index = FS2FS_IDX(bandwidth); +#ifndef CR8_A_PLC_FADEOUT_TUNING if (index > 4) { index = 5; } +#endif encoder->bw_ctrl_cutoff_bin = encoder->cutoffBins[index]; } } diff --git a/lib_lc3plus/setup_enc_lc3.h b/lib_lc3plus/setup_enc_lc3.h index 31f0cbeb50..43c29e12bc 100644 --- a/lib_lc3plus/setup_enc_lc3.h +++ b/lib_lc3plus/setup_enc_lc3.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef SETUP_ENC_LC3_FL_H #define SETUP_ENC_LC3_FL_H +#include "options.h" #include "constants.h" /* Channel state and bitrate-derived values go in this struct */ @@ -22,7 +23,11 @@ typedef struct { LC3_FLOAT attdec_acc_energy; LC3_FLOAT r12k8_mem_50[2]; LC3_FLOAT r12k8_mem_in[120]; +#ifdef CR8_G_ADD_75MS + LC3_FLOAT r12k8_mem_out[44]; +#else LC3_FLOAT r12k8_mem_out[24]; +#endif LC3_FLOAT olpa_mem_s12k8[3]; LC3_FLOAT olpa_mem_s6k4[LEN_6K4 + MAX_PITCH_6K4 + 16]; LC3_FLOAT ltpf_mem_in[LTPF_MEMIN_LEN + LEN_12K8 + 1]; @@ -44,6 +49,9 @@ typedef struct { LC3_INT tns_bits; LC3_INT targetBitsQuant; LC3_INT olpa_mem_pitch; +#ifdef CR9_F_PITCH_WIN_LEN_FIX + LC3_INT pitch_flag; +#endif LC3_INT ltpf_mem_ltpf_on; LC3_INT mem_targetBits; LC3_INT mem_specBits; diff --git a/lib_lc3plus/sns_compute_scf.c b/lib_lc3plus/sns_compute_scf.c index 5cb041925b..586fd9ef66 100644 --- a/lib_lc3plus/sns_compute_scf.c +++ b/lib_lc3plus/sns_compute_scf.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,12 +11,16 @@ #include "options.h" #include "functions.h" -void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT tilt, LC3_INT xLen, LC3_FLOAT* gains, LC3_INT smooth, LC3_FLOAT sns_damping, LC3_FLOAT attdec_damping_factor) +void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT xLen, LC3_FLOAT* gains, LC3_INT smooth, LC3_FLOAT sns_damping, LC3_FLOAT attdec_damping_factor, LC3_INT fs_idx) { - LC3_INT bands_number = 0, d = 0, i = 0, j = 0, n = 0, n2 = 0, n4 = 0, mapping[64] = {0}; - LC3_FLOAT tmp[64] = {0}, x_tmp1[MAX_LEN] = {0}, x_tmp2[MAX_LEN] = {0}, sum = 0, mean = 0, xl4[16] = {0}, nf = 0, xl[64] = {0}, gains_smooth[M] = {0}, ratio = 0; - LC3_FLOAT W[6] = {1.0 / 12.0, 2.0 / 12.0, 3.0 / 12.0, 3.0 / 12.0, 2.0 / 12.0, 1.0 / 12.0}; - + LC3_INT bands_number, d, i, j, n, n2, n4, mapping[64]; + LC3_FLOAT x_tmp1[MAX_LEN], sum, mean, nf, gains_smooth[M], ratio; + LC3_FLOAT sum_gains_smooth; + const LC3_FLOAT* sns_preemph; + + sum_gains_smooth = 0; sum = 0; + sns_preemph = sns_preemph_all[fs_idx]; + bands_number = xLen; assert(bands_number <= 64); @@ -28,13 +32,14 @@ void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT tilt, LC3_INT xLen, LC3_FLOAT { j = 0; for (i = 0; i < 2 * d; i = i + 2) { - tmp[i] = x[j]; - tmp[i + 1] = x[j]; + x_tmp1[i] = x[j]; + x_tmp1[i + 1] = x[j]; j++; } - move_float(&tmp[2 * d], &x[d], 64 - 2 * d); - } else if (ceil(64.0 / (LC3_FLOAT) xLen) == 4) + move_float(&x_tmp1[2 * d], &x[d], 64 - 2 * d); + } + else if (bands_number < 32) { ratio = LC3_FABS((LC3_FLOAT) (1.0 - 32.0 / (LC3_FLOAT) xLen)); n4 = round(ratio * xLen); @@ -60,13 +65,13 @@ void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT tilt, LC3_INT xLen, LC3_FLOAT for (i = 0; i < 64; i++) { - tmp[i] = x[mapping[i] - 1]; + x_tmp1[i] = x[mapping[i] - 1]; } } else { assert(0 && "Unsupported number of bands!"); } - move_float(x, tmp, 64); + move_float(x, x_tmp1, 64); bands_number = 64; xLen = bands_number; @@ -76,20 +81,17 @@ void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT tilt, LC3_INT xLen, LC3_FLOAT /* Smoothing */ x_tmp1[0] = x[0]; + move_float(&x_tmp1[1], &x[0], 63); - move_float(&x_tmp1[1], &x[0], xLen - 1); - - move_float(&x_tmp2[0], &x[1], xLen - 1); - - x_tmp2[xLen - 1] = x[xLen - 1]; - - for (i = 0; i < xLen; i++) { - x[i] = 0.5 * x[i] + 0.25 * (x_tmp1[i] + x_tmp2[i]); + for (i = 0; i < 63; i++) { + x[i] = 0.5 * x[i] + 0.25 * (x_tmp1[i] + x[i + 1]); } + + x[63] = 0.5 * x[63] + 0.25 * (x_tmp1[63] + x[63]); /* Pre-emphasis */ - for (i = 0; i < xLen; i++) { - x[i] = x[i] * LC3_POW(10.0, (LC3_FLOAT)i * (LC3_FLOAT)tilt / ((LC3_FLOAT)bands_number - 1.0) / 10.0); + for (i = 0; i < 64; i++) { + x[i] = x[i] * sns_preemph[i]; } /* Noise floor at -40dB */ @@ -97,10 +99,10 @@ void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT tilt, LC3_INT xLen, LC3_FLOAT sum += x[i]; } - mean = sum / (LC3_FLOAT)xLen; + mean = sum * 0.015625; /* 1/64 */ - nf = mean * LC3_POW(10.0, -40.0 / 10.0); - nf = MAX(nf, LC3_POW(2.0, -32.0)); + nf = mean * 1.00e-04; + nf = MAX(nf, 2.328306436538696e-10); for (i = 0; i < 64; i++) { if (x[i] < nf) { @@ -110,45 +112,40 @@ void processSnsComputeScf_fl(LC3_FLOAT* x, LC3_INT tilt, LC3_INT xLen, LC3_FLOAT /* Log-domain */ for (i = 0; i < 64; i++) { - xl[i] = LC3_LOGTWO(x[i]) / 2.0; + x[i] = LC3_LOGTWO(x[i]) * 0.5; } /* Downsampling */ - for (n = 0; n < bands_number / 4; n++) { + for (n = 0; n < 16; n++) { if (n == 0) { - tmp[0] = xl[0]; + x_tmp1[0] = x[0]; - move_float(&tmp[1], &xl[0], 5); + move_float(&x_tmp1[1], &x[0], 5); - } else if (n == (bands_number / 4 - 1)) { - move_float(tmp, &xl[59], 5); + } else if (n == 15) { + move_float(x_tmp1, &x[59], 5); - tmp[5] = xl[63]; + x_tmp1[5] = x[63]; } else { - move_float(tmp, &xl[n * 4 - 1], ((n * 4 + 5 - 1) - (n * 4 - 1) + 1)); + move_float(x_tmp1, &x[n * 4 - 1], ((n * 4 + 5 - 1) - (n * 4 - 1) + 1)); } sum = 0; for (i = 0; i < 6; i++) { - sum += tmp[i] * W[i]; + sum += x_tmp1[i] * sns_W[i]; } - xl4[n] = sum; + gains_smooth[n] = sum; + sum_gains_smooth += sum; } /* Remove mean and scaling */ + mean = sum_gains_smooth / 16.0; - sum = 0; - for (i = 0; i < bands_number / 4; i++) { - sum += xl4[i]; - } - - mean = sum / ((LC3_FLOAT)bands_number / 4.0); - - for (i = 0; i < bands_number / 4; i++) { - gains[i] = sns_damping * (xl4[i] - mean); + for (i = 0; i < 16; i++) { + gains[i] = sns_damping * (gains_smooth[i] - mean); } /* Smoothing */ diff --git a/lib_lc3plus/sns_interpolate_scf.c b/lib_lc3plus/sns_interpolate_scf.c index 4419397890..fea81e6be5 100644 --- a/lib_lc3plus/sns_interpolate_scf.c +++ b/lib_lc3plus/sns_interpolate_scf.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,23 +13,23 @@ void processSnsInterpolateScf_fl(LC3_FLOAT* gains, LC3_INT encoder_side, LC3_INT bands_number, LC3_FLOAT* gains_int) { - LC3_INT i = 0, n = 0, d = 0, n4 = 0; - LC3_FLOAT tmp[MAX_BANDS_NUMBER_PLC] = {0}, ratio = 0; + LC3_INT i, n, d, n4; + LC3_FLOAT tmp[MAX_BANDS_NUMBER_PLC], ratio; /* Interpolation */ gains_int[0] = gains[0]; gains_int[1] = gains[0]; - for (n = 0; n <= 14; n++) { - gains_int[n * 4 + 2] = gains[n] + (gains[n + 1] - gains[n]) / 8.0; - gains_int[n * 4 + 3] = gains[n] + 3.0 * (gains[n + 1] - gains[n]) / 8.0; - gains_int[n * 4 + 4] = gains[n] + 5.0 * (gains[n + 1] - gains[n]) / 8.0; - gains_int[n * 4 + 5] = gains[n] + 7.0 * (gains[n + 1] - gains[n]) / 8.0; + for (n = 0; n <= 14; n++) { + gains_int[n * 4 + 2] = gains[n] + (gains[n + 1] - gains[n]) * 0.125; + gains_int[n * 4 + 3] = gains[n] + (gains[n + 1] - gains[n]) * 0.375; + gains_int[n * 4 + 4] = gains[n] + (gains[n + 1] - gains[n]) * 0.625; + gains_int[n * 4 + 5] = gains[n] + (gains[n + 1] - gains[n]) * 0.875; } - gains_int[62] = gains[15] + (gains[15] - gains[14]) / 8.0; - gains_int[63] = gains[15] + 3.0 * (gains[15] - gains[14]) / 8.0; + gains_int[62] = gains[15] + (gains[15] - gains[14]) * 0.125; + gains_int[63] = gains[15] + (gains[15] - gains[14]) * 0.375; /* For 5ms */ @@ -53,7 +53,8 @@ void processSnsInterpolateScf_fl(LC3_FLOAT* gains, LC3_INT encoder_side, LC3_INT } move_float(gains_int, tmp, d); - } else if (ceil(64.0 / (LC3_FLOAT) bands_number) == 4) + } + else if (bands_number < 32) { ratio = LC3_FABS((LC3_FLOAT) ((LC3_FLOAT)1.0 - (LC3_FLOAT)32.0 / (LC3_FLOAT) bands_number)); n4 = LC3_ROUND(ratio * (LC3_FLOAT)bands_number); diff --git a/lib_lc3plus/sns_quantize_scf.c b/lib_lc3plus/sns_quantize_scf.c index 704127cce7..3cb81aee9c 100644 --- a/lib_lc3plus/sns_quantize_scf.c +++ b/lib_lc3plus/sns_quantize_scf.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -421,7 +421,7 @@ LC3_INT find_last_indice_le(LC3_INT compare, const LC3_INT* array, LC3_INT len) void pvq_dec(LC3_INT k, LC3_INT m, LC3_INT LS_ind, LC3_INT MPVQ_ind, LC3_INT* pulses) { - LC3_INT leading_sign = 0, idx = 0, k_delta = 0, pos = 0; + LC3_INT leading_sign, idx, k_delta = 0, pos; leading_sign = 1 - 2 * LS_ind; @@ -454,9 +454,9 @@ void pvq_dec(LC3_INT k, LC3_INT m, LC3_INT LS_ind, LC3_INT MPVQ_ind, LC3_INT* pu void process_snsQuantizesScf_Dec(LC3_INT* scf_idx, LC3_FLOAT* scf_q) { - LC3_INT i = 0, submode = 0; + LC3_INT i, submode; LC3_INT pulses2[6] = {0}, pulses[M] = {0}; - LC3_FLOAT st2_vector[M] = {0}, st2_vector_idct[M] = {0}, sum = 0; + LC3_FLOAT st2_vector[M], st2_vector_idct[M], sum = 0; /* Decode first stage */ @@ -505,13 +505,18 @@ void process_snsQuantizesScf_Dec(LC3_INT* scf_idx, LC3_FLOAT* scf_q) idct_II(st2_vector, st2_vector_idct, M); /* Gain */ + /* Add stage 1 and stage 2 */ +#ifdef CR9_SIMPLIFY_LOOP + for (i = 0; i < M; i++) { + scf_q[i] += st2_vector_idct[i] * sns_dec_gains[submode][scf_idx[3]]; + } +#else for (i = 0; i < M; i++) { st2_vector_idct[i] = st2_vector_idct[i] * sns_dec_gains[submode][scf_idx[3]]; } - /* Add stage 1 and stage 2 */ - for (i = 0; i < M; i++) { scf_q[i] = scf_q[i] + st2_vector_idct[i]; } +#endif } diff --git a/lib_lc3plus/structs.h b/lib_lc3plus/structs.h index fea377da41..e311824b7f 100644 --- a/lib_lc3plus/structs.h +++ b/lib_lc3plus/structs.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef STRUCTS_H #define STRUCTS_H +#include "options.h" #include "defines.h" #include "fft/iisfft.h" @@ -66,6 +67,7 @@ typedef struct { LC3_INT32 pc_be_bp_left; LC3_INT32 pc_be_bp_right; LC3_INT32 pc_return; + LC3_INT16 pc_inv_bin; } Decoder_State_fl; typedef struct { @@ -154,6 +156,9 @@ typedef struct { LC3_INT32 PhECU_num_plocs; HANDLE_IIS_FFT handle_fft_phaseecu; HANDLE_IIS_FFT handle_ifft_phaseecu; +#ifdef CR8_A_PLC_FADEOUT_TUNING + LC3_INT16 PhECU_nonpure_tone_flag; /* BASOP Word16 PhECU_nonpure_tone_flag*/ +#endif } PlcPhEcuSetup; @@ -179,8 +184,24 @@ typedef struct { LC3_FLOAT cum_fflcAtten; LC3_FLOAT scf_q_old[M]; LC3_FLOAT scf_q_old_old[M]; - PlcPhEcuSetup PlcPhEcuSetup; + PlcPhEcuSetup PlcPhEcuSetup; + +#ifdef CR8_A_PLC_FADEOUT_TUNING + LC3_INT16 longterm_counter_plcTdc; +# ifndef CR9_L_RETRAIN_FADEOUT_TYPE_CLASSIFIER + LC3_INT16 longterm_counter_plcPhaseEcu; +# endif + LC3_INT16 longterm_counter_plcNsAdv; + LC3_INT16 longterm_analysis_counter_max; /* Maximum longterm frames number */ + LC3_INT16 longterm_analysis_counter_max_bytebuffer; /* Same as above but reduced for circular bit-buffer */ + LC3_INT32 *plc_longterm_advc_tdc; + LC3_INT32 *plc_longterm_advc_ns; + LC3_UINT8 plc_fadeout_type; + LC3_UINT8 plc_fadeout_type_first; + LC3_INT16 overall_counter; + LC3_INT8 longterm_counter_byte_position; + LC3_INT8 longterm_counter_bit_position; +#endif } PlcAdvSetup; - #endif diff --git a/lib_lc3plus/tns_coder.c b/lib_lc3plus/tns_coder.c index ff3883d2b5..e9301af9df 100644 --- a/lib_lc3plus/tns_coder.c +++ b/lib_lc3plus/tns_coder.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -14,35 +14,22 @@ static void xcorr(LC3_FLOAT* in, LC3_FLOAT* out, LC3_INT lag, LC3_INT inLen); static void levdown(LC3_FLOAT* anxt, LC3_FLOAT* out_a, LC3_INT* len); static void poly2rc(LC3_FLOAT* a, LC3_FLOAT* out, LC3_INT len); -static LC3_INT findRC_idx(const LC3_FLOAT* in1, const LC3_FLOAT* in2, LC3_FLOAT checkValue); void xcorr(LC3_FLOAT* in, LC3_FLOAT* out, LC3_INT lag, LC3_INT inLen) { - LC3_INT i = 0, m = 0; - LC3_FLOAT sum = 0, tmp_buf[MAX_LEN] = {0}; + LC3_INT32 m; - for (m = -lag; m <= lag; m++) { - /* Append zeros and input vector */ - zero_float(tmp_buf, abs(m)); - - move_float(&tmp_buf[abs(m)], in, inLen - abs(m)); - - /* Calculate sum */ - sum = 0; - - for (i = 0; i < inLen; i++) { - sum += in[i] * tmp_buf[i]; - } - - out[m + lag] = sum; + for (m = 0; m <= lag; m++) { + /* Calculate correlation */ + out[m] = mac_loop(in, &in[m], (inLen - m)); } } void levinsonDurbin(LC3_FLOAT* r, LC3_FLOAT* out_lev, LC3_FLOAT* rc_unq, LC3_FLOAT* error, LC3_INT len) { - LC3_INT t = 0, i = 0, j = 0; - LC3_FLOAT g = 0, v = 0, sum = 0, buf_tmp[MAX_LEN] = {0}; + LC3_INT t, i, j; + LC3_FLOAT g, v, sum, buf_tmp[10]; g = r[1] / r[0]; out_lev[0] = g; @@ -51,7 +38,6 @@ void levinsonDurbin(LC3_FLOAT* r, LC3_FLOAT* out_lev, LC3_FLOAT* rc_unq, LC3_FLO rc_unq[0] = -g; for (t = 1; t < len; t++) { - zero_float(buf_tmp, len + 1); sum = 0; for (i = 1; i <= t; i++) { @@ -91,33 +77,33 @@ void levinsonDurbin(LC3_FLOAT* r, LC3_FLOAT* out_lev, LC3_FLOAT* rc_unq, LC3_FLO void levdown(LC3_FLOAT* anxt, LC3_FLOAT* out_a, LC3_INT* len) { - LC3_INT i = 0, j = 0; - LC3_FLOAT tmp_buf[8] = {0}, tmp_buf1[8] = {0}, tmp_buf2[8] = {0}, knxt = 0; + LC3_INT32 i, j; + LC3_FLOAT tmp_buf[8], knxt; + LC3_FLOAT norm; + memset(tmp_buf, 0, 8 * sizeof(LC3_FLOAT)); /* Initial length = 9 */ /* Drop the leading 1 */ - move_float(&tmp_buf[0], &anxt[1], (*len - 1)); - *len = *len - 1; /* Lenght = 8 */ /* Last coefficient */ - knxt = tmp_buf[*len - 1]; /* At [7] */ + knxt = anxt[*len]; /* At [7] */ *len = *len - 1; /* Lenght = 7 */ - move_float(tmp_buf1, tmp_buf, *len); - j = 0; for (i = *len - 1; i >= 0; i--) { - tmp_buf2[j] = knxt * tmp_buf[i]; + tmp_buf[j] = knxt * anxt[i + 1]; j++; } + + norm = 1.0 / (1.0 - (LC3_FABS(knxt)) * (LC3_FABS(knxt))); out_a[0] = 1; for (i = 0; i < *len; i++) { - out_a[i + 1] = (tmp_buf1[i] - tmp_buf2[i]) / (1.0 - (LC3_FABS(knxt)) * (LC3_FABS(knxt))); + out_a[i + 1] = (anxt[i + 1] - tmp_buf[i]) * norm; } *len = *len + 1; /* Length = 8 */ @@ -125,8 +111,8 @@ void levdown(LC3_FLOAT* anxt, LC3_FLOAT* out_a, LC3_INT* len) void poly2rc(LC3_FLOAT* a, LC3_FLOAT* out, LC3_INT len) { - LC3_INT k = 0, i = 0, len_old = 0; - LC3_FLOAT buf[9] = {0}; + LC3_INT k, i, len_old; + LC3_FLOAT buf[9]; len_old = len; @@ -155,30 +141,21 @@ void poly2rc(LC3_FLOAT* a, LC3_FLOAT* out, LC3_INT len) } } -LC3_INT findRC_idx(const LC3_FLOAT* in1, const LC3_FLOAT* in2, LC3_FLOAT checkValue) -{ - LC3_INT i = 0, ret = 0; - - for (i = 0; i < 17; i++) { - if (checkValue <= in1[i] && checkValue > in2[i]) { - ret = i; - } - } - - return ret; -} void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, LC3_INT fs, LC3_INT N, LC3_INT frame_dms, LC3_INT nBits, LC3_INT* order_out, LC3_INT* rc_idx, LC3_INT* tns_numfilters, LC3_INT* bits_out , LC3_INT16 near_nyquist_flag ) { - LC3_INT i = 0, stopfreq[2] = {0}, startfreq[2] = {0}, f = 0, numfilters = 0, maxOrder = 0, bits = 0, sub = 0, - subdiv_startfreq = 0, subdiv_stopfreq = 0, j = 0, rc_idx_tmp[8] = {0}, order_tmp[8] = {0}, tmp = 0, tns = 0; - LC3_FLOAT minPGfac = 0, minPredictionGain = 0, maxPG = 0, xcorr_out[MAX_LEN] = {0}, buf_tmp[MAX_LEN] = {0}, sum = 0, - subdiv_len = 0, nSubdivisions = 0, r[9] = {0}, out_lev[9] = {0}, rc_unq[9] = {0}, error_lev = 0, predGain = 0, - alpha = 0, rc[8] = {0}, st[9] = {0}, s = 0, tmpSave = 0, tmp_fl = 0; + LC3_INT i, stopfreq[2], startfreq[2], f, numfilters, maxOrder, bits, sub, + subdiv_startfreq, subdiv_stopfreq, j, rc_idx_tmp[MAXLAG], order_tmp, tmp, tns; + LC3_FLOAT minPGfac, minPredictionGain, maxPG, xcorr_out[MAXLAG + 1], sum, + subdiv_len, nSubdivisions, r[MAXLAG + 1], rc_unq[MAXLAG + 1], error_lev, predGain, + alpha, rc[MAXLAG], st[MAXLAG + 1] = {0}, s, tmpSave, tmp_fl; const LC3_INT* order; + LC3_FLOAT inv_sum, x_val; + LC3_FLOAT alpha_loc; + LC3_INT32 iIndex; /* Init */ @@ -188,8 +165,10 @@ void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, L numfilters = 1; } - if (N > 40 * ((LC3_FLOAT) (frame_dms) / 10.0)) { - N = 40 * ((LC3_FLOAT) (frame_dms) / 10.0); + /* 40 * frame_dms / 10 = 4 * frame_dms */ + if (N > 4 * frame_dms) + { + N = 4 * frame_dms; fs = 40000; } @@ -213,21 +192,21 @@ void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, L maxOrder = 4; nSubdivisions = 2.0; break; +#ifdef CR8_G_ADD_75MS + case 75: + maxOrder = 8; + nSubdivisions = 3; + break; +#endif case 100: maxOrder = 8; nSubdivisions = 3.0; break; } - minPGfac = 0.85; - maxPG = 2; minPredictionGain = 1.5; - if ((frame_dms >= 50 && nBits >= 48 * ((LC3_FLOAT) frame_dms / 10.0)) || frame_dms == 25) { - maxPG = minPredictionGain; - } - - if ((frame_dms >= 50 && nBits >= 48 * ((LC3_FLOAT) frame_dms / 10.0)) || frame_dms == 25) { + if (nBits >= 4.8 * frame_dms) { order = order1_tns; } else { order = order2_tns; @@ -249,32 +228,53 @@ void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, L for (f = 0; f < numfilters; f++) { subdiv_len = ((LC3_FLOAT)stopfreq[f] + 1.0 - (LC3_FLOAT)startfreq[f]) / nSubdivisions; - zero_float(r, 9); + zero_float(r, MAXLAG+1); for (sub = 1; sub <= nSubdivisions; sub++) { subdiv_startfreq = floor(subdiv_len * (sub - 1)) + startfreq[f] - 1; subdiv_stopfreq = floor(subdiv_len * sub) + startfreq[f] - 1; + +#ifdef CR8_G_ADD_75MS + if (fs == 32000 && frame_dms == 75) + { + if (subdiv_startfreq == 83) + { + subdiv_startfreq = 82; + } + + if (subdiv_stopfreq == 83) + { + subdiv_stopfreq = 82; + } + + if (subdiv_startfreq == 160) + { + subdiv_startfreq = 159; + } + + if (subdiv_stopfreq == 160) + { + subdiv_stopfreq = 159; + } + } +#endif sum = 0; for (i = subdiv_startfreq; i < subdiv_stopfreq; i++) { sum += x[i] * x[i]; } - if (sum < LC3_EPS) - { - zero_float(r, 9); + if (sum < LC3_EPS) { + zero_float(r, MAXLAG+1); r[0] = 1; break; } - move_float(buf_tmp, &x[subdiv_startfreq], subdiv_stopfreq - subdiv_startfreq); - - xcorr(buf_tmp, xcorr_out, maxOrder, subdiv_stopfreq - subdiv_startfreq); + xcorr(&x[subdiv_startfreq], xcorr_out, maxOrder, subdiv_stopfreq - subdiv_startfreq); - j = 0; - for (i = maxOrder; i >= 0; i--) { - r[j] = r[j] + xcorr_out[i] / sum; - j++; + inv_sum = 1.0 / sum; + for (i = 0; i <= maxOrder; i++) { + r[i] = r[i] + xcorr_out[i] * inv_sum; } } @@ -282,7 +282,7 @@ void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, L r[i] = r[i] * lagw_tns[i]; } - levinsonDurbin(r, out_lev, rc_unq, &error_lev, maxOrder); + levinsonDurbin(r, xcorr_out, rc_unq, &error_lev, maxOrder); predGain = r[0] / error_lev; @@ -295,34 +295,50 @@ void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, L bits++; if (tns == 1) { + minPGfac = 0.85; + maxPG = 2; + if (nBits >= 4.8 * frame_dms) { + maxPG = minPredictionGain; + } + /* LPC weighting */ if (predGain < maxPG) { alpha = (maxPG - predGain) * (minPGfac - 1.0) / (maxPG - minPredictionGain) + 1.0; + alpha_loc = 1; for (i = 0; i <= maxOrder; i++) { - out_lev[i] = out_lev[i] * LC3_POW(alpha, i); + xcorr_out[i] = xcorr_out[i] * alpha_loc; + alpha_loc *= alpha; } - poly2rc(out_lev, rc_unq, maxOrder + 1); + poly2rc(xcorr_out, rc_unq, maxOrder + 1); } /* PARCOR Quantization */ - for (i = 0; i < maxOrder; i++) { - rc_idx_tmp[i] = findRC_idx(&quants_thr_tns[1], &quants_thr_tns[0], rc_unq[i]); + for (i = 0; i < maxOrder; i++) + { + iIndex = 1; + x_val = rc_unq[i]; + + while ((iIndex < 17) && (x_val > quants_thr_tns[iIndex - 1])) + { + iIndex = (iIndex + 1); + } + rc_idx_tmp[i] = (iIndex - 2); } /* Filter Order */ - j = 0; + order_tmp = 0; for (i = 0; i < maxOrder; i++) { rc[i] = quants_pts_tns[rc_idx_tmp[i]]; if (rc[i] != 0) { - order_tmp[j] = i + 1; - j++; + order_tmp = i + 1; } } - order_out[f] = order_tmp[j - 1]; + order_out[f] = order_tmp; + // Disable TNS if order is 0: if (order_out[f] == 0) { tns = 0; @@ -344,6 +360,9 @@ void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, L rc_idx[i] = rc_idx_tmp[j]; j++; } + } else { +tns_disabled: + order_out[f] = 0; } /* Filtering */ @@ -367,7 +386,6 @@ void processTnsCoder_fl(LC3_FLOAT* x, LC3_INT bw_cutoff_idx, LC3_INT bw_fcbin, L } } } -tns_disabled: *tns_numfilters = numfilters; *bits_out = bits; diff --git a/lib_lc3plus/tns_decoder.c b/lib_lc3plus/tns_decoder.c index d3aeefc3a3..f4dff52f39 100644 --- a/lib_lc3plus/tns_decoder.c +++ b/lib_lc3plus/tns_decoder.c @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -13,8 +13,9 @@ void processTnsDecoder_fl(LC3_FLOAT* x, LC3_INT* rc_idx, LC3_INT* order, LC3_INT numfilters, LC3_INT bw_fcbin, LC3_INT N, LC3_INT fs) { - LC3_INT startfreq[2] = {0}, stopfreq[2] = {0}, f = 0, i = 0, j = 0, m = 0, l = 0, rc_idx_f[9] = {0}; - LC3_FLOAT rc[9] = {0}, s = 0, st[9] = {0}; + LC3_INT startfreq[2], stopfreq[2], f, i, j, m, l; + LC3_FLOAT rc[9], s, st[9] = {0}; + LC3_INT order_tmp; if (numfilters == 2) { startfreq[0] = floor(600 * N * 2 / fs) + 1; @@ -27,19 +28,20 @@ void processTnsDecoder_fl(LC3_FLOAT* x, LC3_INT* rc_idx, LC3_INT* order, LC3_INT } for (f = 0; f < numfilters; f++) { - if (order[f] > 0) { + order_tmp = order[f]; + + if (order_tmp > 0) { j = 0; - for (i = f * 8; i < f * 8 + 8; i++) { - rc_idx_f[j] = rc_idx[i]; - rc[j] = quants_pts_tns[rc_idx_f[j]]; + for (i = f * 8; i < f * 8 + order_tmp; i++) { + rc[j] = quants_pts_tns[rc_idx[i]]; j++; } for (m = startfreq[f]; m <= stopfreq[f]; m++) { - s = x[m - 1] - rc[order[f] - 1] * st[order[f] - 1]; + s = x[m - 1] - rc[order_tmp - 1] * st[order_tmp - 1]; - for (l = order[f] - 2; l >= 0; l--) { + for (l = order_tmp - 2; l >= 0; l--) { s = s - rc[l] * st[l]; st[l + 1] = rc[l] * s + st[l]; } diff --git a/lib_lc3plus/util.h b/lib_lc3plus/util.h index 7ef6dedef7..adf422cff6 100644 --- a/lib_lc3plus/util.h +++ b/lib_lc3plus/util.h @@ -1,5 +1,5 @@ /****************************************************************************** -* ETSI TS 103 634 V1.4.1 * +* ETSI TS 103 634 V1.4.3 * * Low Complexity Communication Codec Plus (LC3plus) * * * * Copyright licence is solely granted through ETSI Intellectual Property * @@ -11,6 +11,7 @@ #ifndef UTIL_H #define UTIL_H +#include "options.h" #include "clib.h" #include "math.h" @@ -51,18 +52,50 @@ static inline LC3_FLOAT sqrf(LC3_FLOAT x) { return x * x; } /* convenience wrappers around memmove */ static inline void move_float(LC3_FLOAT *dst, const LC3_FLOAT *src, LC3_INT len) { +#ifdef WMOPS + LC3_INT i; + for (i = 0; i < len; i++) + { + dst[i] = src[i]; + } +#else memmove(dst, src, len * sizeof(LC3_FLOAT)); +#endif } static inline void move_int(LC3_INT *dst, const LC3_INT *src, LC3_INT len) { +#ifdef WMOPS + LC3_INT i; + for (i = 0; i < len; i++) + { + dst[i] = src[i]; + } +#else memmove(dst, src, len * sizeof(LC3_INT)); +#endif } /* convenience wrappers around memset */ static inline void zero_float(LC3_FLOAT *x, LC3_INT len) { +#ifdef WMOPS + LC3_INT i; + for (i = 0; i < len; i++) + { + x[i] = 0; + } +#else memset(x, 0, len * sizeof(LC3_FLOAT)); +#endif } static inline void zero_int(LC3_INT *x, LC3_INT len) { +#ifdef WMOPS + LC3_INT i; + for (i = 0; i < len; i++) + { + x[i] = 0; + } +#else memset(x, 0, len * sizeof(LC3_INT)); +#endif } /* multiply float vectors element by element, in-place */ -- GitLab From ea740e9fdc3fd9391a49ce879fc103c4b0b85db1 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 15 Feb 2024 16:33:31 +0100 Subject: [PATCH 303/601] [CI] disable lc3plus-ensure-no-code-changes job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3c0c52bbe9..94173beb32 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1028,7 +1028,7 @@ check-first-frame-is-sid: expose_as: "logs-sidstart" expire_in: "5 days" -lc3plus-ensure-no-code-changes: +.lc3plus-ensure-no-code-changes: extends: - .test-job-linux - .rules-merge-request -- GitLab From 8a905890163d5d390db83b0c269661fa02bc2c1e Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 15 Feb 2024 16:48:58 +0100 Subject: [PATCH 304/601] wrap changes into ifdef NONBE_FIX_998_DIRAC_ROTATION --- lib_com/options.h | 2 ++ lib_dec/ivas_output_config.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..a8336495ef 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -182,6 +182,8 @@ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ +#define NONBE_FIX_998_DIRAC_ROTATION /* FhG: fix issue 998: DirAC scene rotation accidentially deactivated */ + /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 221492abfb..346a6095da 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -188,7 +188,11 @@ void ivas_renderer_select( } else if ( nchan_internal == 4 || nchan_internal == 3 ) { +#ifdef NONBE_FIX_998_DIRAC_ROTATION st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; +#else + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; +#endif } else if ( nchan_internal == 6 || nchan_internal == 5 ) { -- GitLab From a22c17a48dac1248003ff8f7c48fca9231763fb2 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 15 Feb 2024 16:51:06 +0100 Subject: [PATCH 305/601] skip passing XFAIL cases until bug in paramBin is fixed --- tests/hrtf_binary_loading/test_codec_ROM_vs_file.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 7ce51ae175..9e12df6cf4 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -196,6 +196,9 @@ def test_sba_binaural_headrotation(test_info, in_fmt, fs, out_fmt, trj_file, hrt ], ) def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_file): + # TODO: remove once fixed + if hrtf_file == HRTF_BINARY_FILE_DIFF_FROM_ROM: + pytest.skip("Skipped due to bug in paramBin HRTF loading") bitrate = 256000 metadata_file = str( TESTV_DIR.joinpath(FORMAT_TO_METADATA_FILES["MASA"].format(in_dir, in_tc, fs)) @@ -234,6 +237,9 @@ def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_file): def test_masa_binaural_headrotation( test_info, in_tc, in_dir, fs, out_fmt, trj_file, hrtf_file ): + # TODO: remove once fixed + if hrtf_file == HRTF_BINARY_FILE_DIFF_FROM_ROM: + pytest.skip("Skipped due to bug in paramBin HRTF loading") bitrate = 256000 metadata_file = str( TESTV_DIR.joinpath(FORMAT_TO_METADATA_FILES["MASA"].format(in_dir, in_tc, fs)) -- GitLab From 5fda509541969c0335fac80c0aac2d4ff9ed4a2a Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Feb 2024 17:02:07 +0100 Subject: [PATCH 306/601] issue 699: complement FileReader_getFilePath() logic for TSM and JBM; under FIX_699_FILE_READER_JBM_TSM --- apps/decoder.c | 65 +++++++++++++++++--------------- apps/encoder.c | 4 ++ lib_com/options.h | 2 +- lib_util/tsm_scale_file_reader.c | 6 +++ lib_util/tsm_scale_file_reader.h | 6 +++ 5 files changed, 51 insertions(+), 32 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 01e6b4f3d1..e8acfb67a2 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2334,7 +2334,11 @@ static ivas_error decodeG192( { if ( ( error = TsmScaleFileReader_readScale( tsmScaleFileReader, &scale ) ) != IVAS_ERR_OK ) { +#ifdef FIX_699_FILE_READER_JBM_TSM + fprintf( stderr, "\nError (%s) when reading TSM data from %s \n\n", arg.inputBitstreamFilename, TsmScaleFileReader_getFilePath( tsmScaleFileReader ) ); +#else fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename ); +#endif goto cleanup; } int16_t maxScaling; @@ -2426,7 +2430,6 @@ static ivas_error decodeG192( #endif } } - } while ( nSamplesRendered < nOutSamples && error == IVAS_ERR_OK ); if ( error == IVAS_ERR_END_OF_FILE ) @@ -2577,8 +2580,8 @@ static ivas_error decodeG192( } /*------------------------------------------------------------------------------------------* - * Flush what is still left in the VoIP Buffers.... - *------------------------------------------------------------------------------------------*/ + * Flush what is still left in the VoIP Buffers.... + *------------------------------------------------------------------------------------------*/ while ( nSamplesAvailableNext > 0 ) { @@ -2733,8 +2736,8 @@ static ivas_error decodeG192( } /*------------------------------------------------------------------------------------------* - * Printouts after decoding has finished - *------------------------------------------------------------------------------------------*/ + * Printouts after decoding has finished + *------------------------------------------------------------------------------------------*/ if ( !arg.quietModeEnabled ) { @@ -2766,8 +2769,8 @@ static ivas_error decodeG192( } /*------------------------------------------------------------------------------------------* - * Add zeros at the end to have equal length of synthesized signals - *------------------------------------------------------------------------------------------*/ + * Add zeros at the end to have equal length of synthesized signals + *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2784,8 +2787,8 @@ static ivas_error decodeG192( #endif /*------------------------------------------------------------------------------------------* - * Close files and deallocate resources - *------------------------------------------------------------------------------------------*/ + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ @@ -2816,10 +2819,10 @@ cleanup: #ifdef DEBUGGING /*---------------------------------------------------------------------* - * printBitstreamInfoVoip() - * - * Print bitstream info of a VoIP G.192 or RTPDUMP bitstream. - *---------------------------------------------------------------------*/ + * printBitstreamInfoVoip() + * + * Print bitstream info of a VoIP G.192 or RTPDUMP bitstream. + *---------------------------------------------------------------------*/ static ivas_error printBitstreamInfoVoip( DecArguments arg, @@ -2897,8 +2900,8 @@ static ivas_error printBitstreamInfoVoip( IVAS_DEC_PrintConfigWithVoipBitstream( hIvasDec, arg.quietModeEnabled, au, auSizeBits ); /*------------------------------------------------------------------------------------------* - * Close fhandles and deallocate resources - *------------------------------------------------------------------------------------------*/ + * Close fhandles and deallocate resources + *------------------------------------------------------------------------------------------*/ previewFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ @@ -2924,10 +2927,10 @@ static ivas_error writeJbmTraceFileFrameWrapper( const void *data, void *writer /*---------------------------------------------------------------------* - * decodeVoIP() - * - * Read G.192 or RTPDUMP bitstream and decode in VOIP - *---------------------------------------------------------------------*/ + * decodeVoIP() + * + * Read G.192 or RTPDUMP bitstream and decode in VOIP + *---------------------------------------------------------------------*/ static ivas_error decodeVoIP( DecArguments arg, @@ -3093,8 +3096,8 @@ static ivas_error decodeVoIP( #endif /*------------------------------------------------------------------------------------------* - * Main receiving/decoding loop - *------------------------------------------------------------------------------------------*/ + * Main receiving/decoding loop + *------------------------------------------------------------------------------------------*/ while ( 1 ) { @@ -3431,8 +3434,8 @@ static ivas_error decodeVoIP( } /*------------------------------------------------------------------------------------------* - * Add zeros at the end to have equal length of synthesized signals - *------------------------------------------------------------------------------------------*/ + * Add zeros at the end to have equal length of synthesized signals + *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) @@ -3442,8 +3445,8 @@ static ivas_error decodeVoIP( } /*------------------------------------------------------------------------------------------* - * Printouts after decoding has finished - *------------------------------------------------------------------------------------------*/ + * Printouts after decoding has finished + *------------------------------------------------------------------------------------------*/ if ( !arg.quietModeEnabled ) { @@ -3475,8 +3478,8 @@ static ivas_error decodeVoIP( } /*------------------------------------------------------------------------------------------* - * Close files and deallocate resources - *------------------------------------------------------------------------------------------*/ + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ @@ -3506,10 +3509,10 @@ cleanup: #ifdef DEBUGGING /*---------------------------------------------------------------------* - * parseForcedRendModeDec() - * - * - *---------------------------------------------------------------------*/ + * parseForcedRendModeDec() + * + * + *---------------------------------------------------------------------*/ static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( char *forcedRendModeChar ) diff --git a/apps/encoder.c b/apps/encoder.c index 882187601b..835c4d18f9 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -686,7 +686,11 @@ int main( { if ( ( error = JbmFileReader_readCAconfig( jbmReader, &caConfig ) ) != IVAS_ERR_OK ) { +#ifdef FIX_699_FILE_READER_JBM_TSM + fprintf( stderr, "\nError (%s) while reading Channel-Aware Config. from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), JbmFileReader_getFilePath( jbmReader ) ); +#else fprintf( stderr, "JbmFileReader_readCAconfig() failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); +#endif goto cleanup; } diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..008f909ad1 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,7 @@ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #define FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI /* FhG: fix and undef behaviour bug in the harmonic TCX model arithmetic coder */ - +#define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ diff --git a/lib_util/tsm_scale_file_reader.c b/lib_util/tsm_scale_file_reader.c index 775462253b..147f077f66 100644 --- a/lib_util/tsm_scale_file_reader.c +++ b/lib_util/tsm_scale_file_reader.c @@ -36,6 +36,9 @@ #include #include +#ifdef DEBUGGING +#ifdef VARIABLE_SPEED_DECODING + struct TsmScaleFileReader { FILE *file; @@ -146,3 +149,6 @@ const char *TsmScaleFileReader_getFilePath( return self->file_path; } + +#endif +#endif diff --git a/lib_util/tsm_scale_file_reader.h b/lib_util/tsm_scale_file_reader.h index 4fe560e39b..7666a3b594 100644 --- a/lib_util/tsm_scale_file_reader.h +++ b/lib_util/tsm_scale_file_reader.h @@ -37,6 +37,9 @@ /* clang-format off */ +#ifdef DEBUGGING +#ifdef VARIABLE_SPEED_DECODING + typedef struct TsmScaleFileReader TsmScaleFileReader; @@ -59,6 +62,9 @@ const char *TsmScaleFileReader_getFilePath( TsmScaleFileReader* self /* i/o: TsmScaleFileReader handle */ ); +#endif +#endif + /* clang-format on */ #endif /* IVAS_TSM_SCALE_FILE_READER_H */ -- GitLab From 55dc3a30bc1f14ce8b09e534e7dc8871dc4cd122 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Feb 2024 17:10:11 +0100 Subject: [PATCH 307/601] fix non-diegetic switch condition --- scripts/config/self_test_ltv.prm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index b9d765b97f..ff3b45d783 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -536,7 +536,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec EXT 48 bit testv/stv+4ISM48s.wav_brate_sw_48-48_DTX_EXT.tst // 4 ISM with extended metadata and non diegetic pan object switching bitrate 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out -../IVAS_cod -dtx -ism +4 testv/ltvISM1.csv NULL testv/ltvISM_with_no_diegetic_switch.csv testv/ltvISM4.csv 256000 48 testv/ltv48_4ISM.wav bit +../IVAS_cod -dtx -ism +4 testv/ltvISM1.csv NULL testv/ltvISM3.csv testv/ltvISM4.csv 256000 48 testv/ltv48_4ISM.wav bit ../IVAS_dec BINAURAL 48 bit testv/ltv48_4ISM_non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst -- GitLab From e00604ed8f918861d77fd8059265a4653748e520 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Feb 2024 17:57:28 +0100 Subject: [PATCH 308/601] clang-format --- apps/decoder.c | 60 +++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index e8acfb67a2..5b0193cb7c 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2580,8 +2580,8 @@ static ivas_error decodeG192( } /*------------------------------------------------------------------------------------------* - * Flush what is still left in the VoIP Buffers.... - *------------------------------------------------------------------------------------------*/ + * Flush what is still left in the VoIP Buffers.... + *------------------------------------------------------------------------------------------*/ while ( nSamplesAvailableNext > 0 ) { @@ -2736,8 +2736,8 @@ static ivas_error decodeG192( } /*------------------------------------------------------------------------------------------* - * Printouts after decoding has finished - *------------------------------------------------------------------------------------------*/ + * Printouts after decoding has finished + *------------------------------------------------------------------------------------------*/ if ( !arg.quietModeEnabled ) { @@ -2769,8 +2769,8 @@ static ivas_error decodeG192( } /*------------------------------------------------------------------------------------------* - * Add zeros at the end to have equal length of synthesized signals - *------------------------------------------------------------------------------------------*/ + * Add zeros at the end to have equal length of synthesized signals + *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2787,8 +2787,8 @@ static ivas_error decodeG192( #endif /*------------------------------------------------------------------------------------------* - * Close files and deallocate resources - *------------------------------------------------------------------------------------------*/ + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ @@ -2819,10 +2819,10 @@ cleanup: #ifdef DEBUGGING /*---------------------------------------------------------------------* - * printBitstreamInfoVoip() - * - * Print bitstream info of a VoIP G.192 or RTPDUMP bitstream. - *---------------------------------------------------------------------*/ + * printBitstreamInfoVoip() + * + * Print bitstream info of a VoIP G.192 or RTPDUMP bitstream. + *---------------------------------------------------------------------*/ static ivas_error printBitstreamInfoVoip( DecArguments arg, @@ -2900,8 +2900,8 @@ static ivas_error printBitstreamInfoVoip( IVAS_DEC_PrintConfigWithVoipBitstream( hIvasDec, arg.quietModeEnabled, au, auSizeBits ); /*------------------------------------------------------------------------------------------* - * Close fhandles and deallocate resources - *------------------------------------------------------------------------------------------*/ + * Close fhandles and deallocate resources + *------------------------------------------------------------------------------------------*/ previewFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ @@ -2927,10 +2927,10 @@ static ivas_error writeJbmTraceFileFrameWrapper( const void *data, void *writer /*---------------------------------------------------------------------* - * decodeVoIP() - * - * Read G.192 or RTPDUMP bitstream and decode in VOIP - *---------------------------------------------------------------------*/ + * decodeVoIP() + * + * Read G.192 or RTPDUMP bitstream and decode in VOIP + *---------------------------------------------------------------------*/ static ivas_error decodeVoIP( DecArguments arg, @@ -3096,8 +3096,8 @@ static ivas_error decodeVoIP( #endif /*------------------------------------------------------------------------------------------* - * Main receiving/decoding loop - *------------------------------------------------------------------------------------------*/ + * Main receiving/decoding loop + *------------------------------------------------------------------------------------------*/ while ( 1 ) { @@ -3434,8 +3434,8 @@ static ivas_error decodeVoIP( } /*------------------------------------------------------------------------------------------* - * Add zeros at the end to have equal length of synthesized signals - *------------------------------------------------------------------------------------------*/ + * Add zeros at the end to have equal length of synthesized signals + *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) @@ -3445,8 +3445,8 @@ static ivas_error decodeVoIP( } /*------------------------------------------------------------------------------------------* - * Printouts after decoding has finished - *------------------------------------------------------------------------------------------*/ + * Printouts after decoding has finished + *------------------------------------------------------------------------------------------*/ if ( !arg.quietModeEnabled ) { @@ -3478,8 +3478,8 @@ static ivas_error decodeVoIP( } /*------------------------------------------------------------------------------------------* - * Close files and deallocate resources - *------------------------------------------------------------------------------------------*/ + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ @@ -3509,10 +3509,10 @@ cleanup: #ifdef DEBUGGING /*---------------------------------------------------------------------* - * parseForcedRendModeDec() - * - * - *---------------------------------------------------------------------*/ + * parseForcedRendModeDec() + * + * + *---------------------------------------------------------------------*/ static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( char *forcedRendModeChar ) -- GitLab From d47f7b046fbfc8f61b2cf7cdd6058bfe4cc5aaf3 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 16 Feb 2024 08:15:09 +0100 Subject: [PATCH 309/601] correct function description --- lib_dec/ivas_spar_decoder.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 58dcdb6dc7..776f606c4d 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1250,12 +1250,19 @@ void ivas_spar_dec_set_render_map( return; } - +#ifdef FIX_997_REMOVE_SPAR_DEC_UPMIXER /*-------------------------------------------------------------------* * ivas_spar_dec_set_render_params() * + * IVAS SPAR set rendering parameters + *-------------------------------------------------------------------*/ +#else +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer() + * * IVAS SPAR upmixer *-------------------------------------------------------------------*/ +#endif void ivas_spar_dec_set_render_params( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ -- GitLab From 6b82ff1d40a7564615d61968079999856da0c2b2 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 16 Feb 2024 09:53:28 +0100 Subject: [PATCH 310/601] remove obsolete code and tables for ParamMC --- lib_com/ivas_cnst.h | 4 ++++ lib_com/ivas_mc_param_com.c | 18 ++++++++++++------ lib_com/ivas_prot.h | 4 ++++ lib_com/ivas_rom_com.c | 11 ++++++++++- lib_com/ivas_stat_com.h | 4 ++++ lib_com/options.h | 3 ++- lib_dec/ivas_mc_param_dec.c | 14 +++++++++++--- lib_enc/ivas_mc_param_enc.c | 25 +++++++++++++++++++++---- 8 files changed, 68 insertions(+), 15 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e9173e6e93..48b1715412 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1390,7 +1390,11 @@ typedef enum #define PARAM_MC_MAX_DECORR_CLDFB_BANDS 20 /* Maximum number of CLDFB bands with decorrelation */ #define PARAM_MC_MAX_TRANSPORT_CHANS 4 /* Number of down mix channels */ #define PARAM_MC_MAX_ILD_REF_CHANNELS 2 /* Maximum number of reference channels for a coded ILD */ +#ifdef FIX_901_PARAMMC_DEAD_CODE +#define PARAM_MC_NUM_CONFIGS 14 /* Number of available Parametric MC configurations */ +#else #define PARAM_MC_NUM_CONFIGS 15 /* Number of available Parametric MC configurations */ +#endif #define PARAM_MC_MAX_BAND_LFE 1 /* Number of parameter bands for LFE coding */ #define PARAM_MC_SZ_ICC_MAP 11 /* Maximum number of transmitted ICCs per parameter band */ #define PARAM_MC_SZ_ILD_MAP 12 /* Maximum number of transmitted channel energies per band*/ diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index 44efdebe2e..429d28e131 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -128,22 +128,26 @@ void ivas_param_mc_metadata_open( { assert( 0 && "nbands must be 20 or 14!" ); } - +#ifndef FIX_901_PARAMMC_DEAD_CODE /* create map of all possible ICCs */ ivas_param_mc_create_full_icc_mapping( nchan_setup, lfe_index, hMetadataPMC->icc_map_full, &hMetadataPMC->icc_map_size_full ); +#endif hMetadataPMC->icc_mapping_conf = ivas_param_mc_conf[config_index].icc_mapping_conf; hMetadataPMC->ild_mapping_conf = ivas_param_mc_conf[config_index].ild_mapping_conf; hMetadataPMC->ild_factors = ivas_param_mc_conf[config_index].ild_factors; +#ifndef FIX_901_PARAMMC_DEAD_CODE /* set default ICC maps */ for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) { ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[i] ); } - +#endif /* init remaining flags and indices */ hMetadataPMC->param_frame_idx = 0; +#ifndef FIX_901_PARAMMC_DEAD_CODE hMetadataPMC->flag_use_adaptive_icc_map = 0; +#endif hMetadataPMC->bAttackPresent = 0; hMetadataPMC->attackIndex = 0; hMetadataPMC->lfe_on = 1; @@ -198,7 +202,7 @@ void ivas_param_mc_set_coded_bands( return; } - +#ifndef FIX_901_PARAMMC_DEAD_CODE /*------------------------------------------------------------------------- * ivas_param_mc_metadata_close() * @@ -223,7 +227,7 @@ void ivas_param_mc_metadata_close( return; } - +#endif /*------------------------------------------------------------------------- * ivas_param_mc_getNumTransportChannels() @@ -247,7 +251,7 @@ int16_t ivas_param_mc_getNumTransportChannels( return nchan_transport; } - +#ifndef FIX_901_PARAMMC_DEAD_CODE /*------------------------------------------------------------------------- * ivas_param_mc_create_full_icc_mapping() * @@ -303,7 +307,6 @@ void ivas_param_mc_create_full_icc_mapping( return; } - /*------------------------------------------------------------------------- * ivas_param_mc_default_icc_map() * @@ -326,6 +329,7 @@ void ivas_param_mc_default_icc_map( return; } +#endif /*------------------------------------------------------------------------- @@ -408,9 +412,11 @@ static int16_t ivas_param_mc_get_num_param_bands( case IVAS_128k: num_parameter_bands = 14; break; +#ifndef FIX_901_PARAMMC_DEAD_CODE case IVAS_160k: num_parameter_bands = 20; break; +#endif } break; default: diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 594d00ee30..e736949e86 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3835,9 +3835,11 @@ void ivas_param_mc_set_coded_bands( HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ ); +#ifndef FIX_901_PARAMMC_DEAD_CODE void ivas_param_mc_metadata_close( HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ ); +#endif void ivas_param_mc_create_full_icc_mapping( const int16_t n_channels, /* i : number of channels with LFE for the internal setup */ @@ -3910,10 +3912,12 @@ void ivas_param_mc_dec( float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ); +#ifndef FIX_901_PARAMMC_DEAD_CODE void ivas_param_mc_default_icc_map( const PARAM_MC_ICC_MAPPING * hIccMapping, /* i : handle to ICC mapping configuration */ int16_t icc_map[PARAM_MC_SZ_ICC_MAP][2] /* o : copy of map from the configuration */ ); +#endif /*! r: number of cldfb synthesis instances */ int16_t param_mc_get_num_cldfb_syntheses( diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 50892fcf53..704b4355b1 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1973,6 +1973,7 @@ const float ivas_param_mc_ild_fac_CICP19_3tc[12] = 0.5f }; +#ifndef FIX_901_PARAMMC_DEAD_CODE const float ivas_param_mc_ild_fac_CICP19_4tc[12] = { 0.35f, @@ -1988,6 +1989,7 @@ const float ivas_param_mc_ild_fac_CICP19_4tc[12] = 0.5f, 0.2f, }; +#endif const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP6_2tc = { @@ -2052,6 +2054,7 @@ const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_3tc = {{0},{1},{0},{1},{0},{1},{0},{1},{0},{1},{2},{2}} }; +#ifndef FIX_901_PARAMMC_DEAD_CODE const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_4tc = { 11, @@ -2060,6 +2063,7 @@ const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_4tc = {1,1,2,1,1,1,1,1,1,1,1,2}, {{0},{1},{0,1},{0},{1},{0},{1},{2},{3},{2},{3},{0,1}} }; +#endif const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP6_2tc = { @@ -2161,6 +2165,7 @@ const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_3tc = } }; +#ifndef FIX_901_PARAMMC_DEAD_CODE const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_4tc = { 8, @@ -2176,6 +2181,7 @@ const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_4tc = { 2, 3 } /* C/LFE */ } }; +#endif const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = { @@ -2332,7 +2338,9 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP19_3tc, &ivas_param_mc_dmx_fac_CICP19_3tc[0], &ivas_param_mc_ild_fac_CICP19_3tc[0] - }, + } +#ifndef FIX_901_PARAMMC_DEAD_CODE + , /* CICP19 160000 */ { MC_LS_SETUP_7_1_4, @@ -2344,6 +2352,7 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_dmx_fac_CICP19_4tc[0], &ivas_param_mc_ild_fac_CICP19_4tc[0] } + #endif }; const float ivas_param_mc_quant_ild_5d1_48[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 566abcb443..438cd4b102 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -595,11 +595,15 @@ typedef struct ivas_parametric_mc_metadata_struct { const PARAM_MC_ILD_MAPPING *ild_mapping_conf; const PARAM_MC_ICC_MAPPING *icc_mapping_conf; +#ifndef FIX_901_PARAMMC_DEAD_CODE int16_t icc_mapping[PARAM_MC_PARAMETER_FRAMES][PARAM_MC_SZ_ICC_MAP][2]; int16_t *icc_map_full[2]; +#endif int16_t icc_map_size_full; int16_t param_frame_idx; +#ifndef FIX_901_PARAMMC_DEAD_CODE int16_t flag_use_adaptive_icc_map; +#endif const float *ild_factors; int16_t coding_band_mapping[PARAM_MC_MAX_PARAMETER_BANDS]; int16_t nbands_in_param_frame[PARAM_MC_PARAMETER_FRAMES]; diff --git a/lib_com/options.h b/lib_com/options.h index a4eab8337d..b8e746503e 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,8 +151,9 @@ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #define FIX_643_PCA_OPTION /* VA: issue 643: rename PCA bypass command-line option */ +#define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ -/* #################### End BE switches ################################## */ + /* #################### End BE switches ################################## */ #define FIX_899_VARIABLE_SPEED_DECODING /* FhG: Fix variable speed decoding */ /* #################### Start NON-BE switches ############################ */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 3352a79781..f12eaba92c 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -629,6 +629,7 @@ ivas_error ivas_param_mc_dec_reconfig( hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; +#ifndef FIX_901_PARAMMC_DEAD_CODE /* deallocate the full icc map, gets newly allocated in the metadata open function */ for ( k = 0; k < 2; k++ ) @@ -642,6 +643,7 @@ ivas_error ivas_param_mc_dec_reconfig( hParamMC->hMetadataPMC->icc_map_full[k] = NULL; } } +#endif mvs2s( hParamMC->band_grouping, band_grouping_old, hParamMC->hMetadataPMC->num_parameter_bands + 1 ); @@ -1104,8 +1106,9 @@ void ivas_param_mc_dec_close( /* parameter decoding */ if ( hParamMC->hMetadataPMC != NULL ) { +#ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_close( hParamMC->hMetadataPMC ); - +#endif free( hParamMC->hMetadataPMC ); hParamMC->hMetadataPMC = NULL; } @@ -1310,6 +1313,7 @@ void ivas_param_mc_dec_read_BS( num_lfe_bands = 0; } +#ifndef FIX_901_PARAMMC_DEAD_CODE if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 ) { int16_t icc_mapping_index[PARAM_MC_SZ_ICC_MAP]; @@ -1368,6 +1372,7 @@ void ivas_param_mc_dec_read_BS( ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx] ); } } +#endif ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->icc_coding, icc_map_size_wo_lfe, icc_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icc_q ); @@ -1905,7 +1910,6 @@ void ivas_param_mc_dec_render( return; } - /*------------------------------------------------------------------------- * ivas_param_mc_dec() * @@ -1946,7 +1950,6 @@ void ivas_param_mc_dec( return; } - /*------------------------------------------------------------------------- * param_mc_dec_init() * @@ -2771,8 +2774,13 @@ static void ivas_param_mc_dequantize_cov( /* replace some estimated ICCs with transmitted values */ for ( k = 0; k < hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; k++ ) { +#ifndef FIX_901_PARAMMC_DEAD_CODE Cy_state_int[hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][0] + nY_int * hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][1]] = icc_q[k]; Cy_state_int[hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][1] + nY_int * hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][0]] = icc_q[k]; +#else + Cy_state_int[hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0] + nY_int * hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1]] = icc_q[k]; + Cy_state_int[hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1] + nY_int * hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0]] = icc_q[k]; +#endif } if ( param_band_index >= PARAM_MC_MAX_BAND_LFE || !hParamMC->hMetadataPMC->lfe_on ) diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index fba2975665..ec050bf9b0 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -62,7 +62,9 @@ static void ivas_param_mc_parameter_quantizer( const float *x, const int16_t L, static void ivas_param_mc_transient_detection( PARAM_MC_ENC_HANDLE hParamMC, TRAN_DET_HANDLE hTranDet, int16_t *bAttackPresent, int16_t *attackIdx ); +#ifndef FIX_901_PARAMMC_DEAD_CODE static void ivas_param_mc_enc_find_icc_map( PARAM_MC_ENC_HANDLE hParamMC, float Cx_sum[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], float Cy_sum[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], float ILD_q[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP], const int16_t nchan_input, const int16_t nchan_transport ); +#endif static void ivas_param_mc_quantize_iccs( PARAM_MC_ENC_HANDLE hParamMC, float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], const int16_t freq_idx, const int16_t nchan_input, int16_t *ICC_idx_out ); @@ -154,6 +156,7 @@ ivas_error ivas_param_mc_enc_open( /* open/init parameter coding */ ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); +#ifndef FIX_901_PARAMMC_DEAD_CODE /* init icc index states */ for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) { @@ -170,6 +173,7 @@ ivas_error ivas_param_mc_enc_open( } } } +#endif /* Band Grouping */ if ( hParamMC->hMetadataPMC.num_parameter_bands == 20 ) @@ -280,6 +284,7 @@ ivas_error ivas_param_mc_enc_reconfig( /* get dmx factors */ hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; +#ifndef FIX_901_PARAMMC_DEAD_CODE /* deallocate the full icc map, gets newly allocated in the metadata open function */ for ( i = 0; i < 2; i++ ) { @@ -292,10 +297,12 @@ ivas_error ivas_param_mc_enc_reconfig( hParamMC->hMetadataPMC.icc_map_full[i] = NULL; } } +#endif /* open/init parameter coding */ ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); +#ifndef FIX_901_PARAMMC_DEAD_CODE /* init icc index states */ for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) { @@ -312,6 +319,7 @@ ivas_error ivas_param_mc_enc_reconfig( } } } +#endif /* Band Grouping */ if ( hParamMC->hMetadataPMC.num_parameter_bands == 20 ) @@ -374,9 +382,9 @@ void ivas_param_mc_enc_close( { return; } - +#ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_close( &( *hParamMC )->hMetadataPMC ); - +#endif ivas_FB_mixer_close( &( *hParamMC )->hFbMixer, sampling_rate, 0 ); free( ( *hParamMC ) ); @@ -510,6 +518,7 @@ void ivas_param_mc_enc( ivas_param_mc_quantize_ilds( hParamMC, Cy_sum[k], Cx_sum[k], k, nchan_inp, st_ivas->nchan_transport, ILD_idx, ILD_q[k] ); } +#ifndef FIX_901_PARAMMC_DEAD_CODE /* get icc map */ if ( hParamMC->hMetadataPMC.flag_use_adaptive_icc_map == 1 ) { @@ -519,6 +528,7 @@ void ivas_param_mc_enc( { ivas_param_mc_default_icc_map( hParamMC->hMetadataPMC.icc_mapping_conf, hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx] ); } +#endif /* ICC parameter quantization */ for ( k = 0; k < hParamMC->hMetadataPMC.nbands_coded; k += band_step ) @@ -986,7 +996,7 @@ static void ivas_param_mc_param_est_enc( return; } - +#ifndef FIX_901_PARAMMC_DEAD_CODE /*------------------------------------------------------------------------- * ivas_param_mc_enc_find_icc_map() * @@ -1209,7 +1219,7 @@ static void ivas_param_mc_enc_find_icc_map( return; } - +#endif /*------------------------------------------------------------------------- * ivas_param_mc_quantize_ilds() @@ -1447,8 +1457,13 @@ static void ivas_param_mc_quantize_iccs( /* Reduce set of parameters and quantize them */ for ( k = 0; k < num_iccs_to_code; ++k ) { +#ifndef FIX_901_PARAMMC_DEAD_CODE tmp_map[0] = hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][k][0]; tmp_map[1] = hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][k][1]; +#else + tmp_map[0] = hParamMC->hMetadataPMC.icc_mapping_conf->icc_mapping[k][0]; + tmp_map[1] = hParamMC->hMetadataPMC.icc_mapping_conf->icc_mapping[k][1]; +#endif ICC_vect[k] = Cy[tmp_map[0]][tmp_map[1]]; } @@ -1626,6 +1641,7 @@ static void ivas_param_mc_write_bs( nbands = hParamMC->hMetadataPMC.nbands_coded / band_step + ( ( hParamMC->hMetadataPMC.nbands_coded % band_step ) ? 1 : 0 ); } +#ifndef FIX_901_PARAMMC_DEAD_CODE /* Encoding of the ICC mapping done as simple bitmap */ if ( hParamMC->hMetadataPMC.flag_use_adaptive_icc_map == 1 ) { @@ -1643,6 +1659,7 @@ static void ivas_param_mc_write_bs( *bit_pos += hParamMC->hMetadataPMC.icc_map_size_full - 1; } +#endif ivas_param_mc_encode_parameter( ICC_idx, &hParamMC->hMetadataPMC, &hParamMC->hMetadataPMC.icc_coding, nbands, band_step, icc_map_size_wo_lfe, icc_map_size, bit_buffer, bit_pos ); -- GitLab From 61e9983fe110a13f1c1325db82b19b9990c1d71b Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 16 Feb 2024 10:14:55 +0100 Subject: [PATCH 311/601] fix #901, remove dead ParamMC code and tables, change a few more defines, fix compiler warnings --- lib_com/ivas_cnst.h | 4 ++++ lib_com/ivas_mc_param_com.c | 8 ++++++-- lib_com/ivas_prot.h | 5 +++-- lib_dec/ivas_mc_param_dec.c | 14 ++++++++++++-- lib_enc/ivas_mc_param_enc.c | 19 ++++++++++++++++--- 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 447c7b6e55..e409c2a891 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1392,7 +1392,11 @@ typedef enum #define PARAM_MC_ICC_ERROR_BIAS_FAC (1.15f) /* factor for favouring past ICC maps in the adaptive ICC map decision */ #define PARAM_MC_TRANSIENT_BAND_STEP 2 /* Number of parameter bands combined in case of a transient frame*/ #define PARAM_MC_MAX_DECORR_CLDFB_BANDS 20 /* Maximum number of CLDFB bands with decorrelation */ +#ifdef FIX_901_PARAMMC_DEAD_CODE +#define PARAM_MC_MAX_TRANSPORT_CHANS 3 /* Number of down mix channels */ +#else #define PARAM_MC_MAX_TRANSPORT_CHANS 4 /* Number of down mix channels */ +#endif #define PARAM_MC_MAX_ILD_REF_CHANNELS 2 /* Maximum number of reference channels for a coded ILD */ #ifdef FIX_901_PARAMMC_DEAD_CODE #define PARAM_MC_NUM_CONFIGS 14 /* Number of available Parametric MC configurations */ diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index 4584b01194..f38f071920 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -86,13 +86,17 @@ uint16_t ivas_param_mc_get_configuration_index( *------------------------------------------------------------------------*/ void ivas_param_mc_metadata_open( - const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ - const int16_t lfe_index, /* i : channel index of LFE */ + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ +#ifndef FIX_901_PARAMMC_DEAD_CODE + const int16_t lfe_index, /* i : channel index of LFE */ +#endif const int32_t ivas_total_brate, /* i : IVAS total bitrate */ HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ ) { +#ifndef FIX_901_PARAMMC_DEAD_CODE int16_t i; +#endif uint16_t config_index; int16_t nchan_setup; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index bd8a91b5d0..dfa2b05456 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3805,7 +3805,9 @@ void ivas_mc_paramupmix_dec_render( void ivas_param_mc_metadata_open( const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + #ifndef FIX_901_PARAMMC_DEAD_CODE const int16_t lfe_index, /* i : channel index of LFE */ + #endif const int32_t ivas_total_brate, /* i : IVAS total bitrate */ HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ ); @@ -3818,7 +3820,6 @@ void ivas_param_mc_set_coded_bands( void ivas_param_mc_metadata_close( HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ ); -#endif void ivas_param_mc_create_full_icc_mapping( const int16_t n_channels, /* i : number of channels with LFE for the internal setup */ @@ -3826,7 +3827,7 @@ void ivas_param_mc_create_full_icc_mapping( int16_t *icc_map[2], /* o : map of all possible ICCs */ int16_t *icc_map_size_full /* o : number of all possible ICCs */ ); - +#endif /*! r: number of IVAS transport channels */ int16_t ivas_param_mc_getNumTransportChannels( const int32_t ivas_total_bitrate, /* i : IVAS total bitrate */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index a5035ade02..937cc87339 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -228,7 +228,11 @@ ivas_error ivas_param_mc_dec_open( hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; +#ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); +#else + ivas_param_mc_metadata_open( mc_ls_setup, ivas_total_brate, hParamMC->hMetadataPMC ); +#endif /* init arrays for quantized parameters */ if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) @@ -642,8 +646,11 @@ ivas_error ivas_param_mc_dec_reconfig( #endif mvs2s( hParamMC->band_grouping, band_grouping_old, hParamMC->hMetadataPMC->num_parameter_bands + 1 ); - +#ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); +#else + ivas_param_mc_metadata_open( mc_ls_setup, ivas_total_brate, hParamMC->hMetadataPMC ); +#endif /* Band Grouping */ if ( hParamMC->hMetadataPMC->num_parameter_bands == 20 ) @@ -1218,7 +1225,10 @@ void ivas_param_mc_dec_read_BS( int16_t num_lfe_bands; int16_t num_param_bands; int16_t metadata_bit_pos; - int16_t i, j, k, l; + int16_t i, j, k; +#ifndef FIX_901_PARAMMC_DEAD_CODE + int16_t l; +#endif int16_t icc_map_size; int16_t icc_map_size_wo_lfe; int16_t ild_map_size; diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 6d9e31be10..eac2d3d194 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -88,7 +88,10 @@ ivas_error ivas_param_mc_enc_open( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ) { - int16_t i, k, l; + int16_t i; +#ifndef FIX_901_PARAMMC_DEAD_CODE + int16_t k, l; +#endif IVAS_FB_CFG *fb_cfg; PARAM_MC_ENC_HANDLE hParamMC; uint16_t config_index; @@ -154,8 +157,11 @@ ivas_error ivas_param_mc_enc_open( } /* open/init parameter coding */ +#ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); - +#else + ivas_param_mc_metadata_open( mc_input_setup, ivas_total_brate, &hParamMC->hMetadataPMC ); +#endif #ifndef FIX_901_PARAMMC_DEAD_CODE /* init icc index states */ for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) @@ -239,7 +245,10 @@ ivas_error ivas_param_mc_enc_reconfig( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ) { - int16_t i, k, l; + int16_t i; +#ifndef FIX_901_PARAMMC_DEAD_CODE + int16_t k, l; +#endif PARAM_MC_ENC_HANDLE hParamMC; uint16_t config_index; MC_LS_SETUP mc_input_setup; @@ -300,7 +309,11 @@ ivas_error ivas_param_mc_enc_reconfig( #endif /* open/init parameter coding */ +#ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); +#else + ivas_param_mc_metadata_open( mc_input_setup, ivas_total_brate, &hParamMC->hMetadataPMC ); +#endif #ifndef FIX_901_PARAMMC_DEAD_CODE /* init icc index states */ -- GitLab From cd4e1cae44889d33b96fa4a5c36076d358de5709 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 16 Feb 2024 10:25:40 +0100 Subject: [PATCH 312/601] fix for #901, remove dead ParamMC code, fix a compiler warning --- lib_com/ivas_mc_param_com.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index f38f071920..b1c0bdedd4 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -98,9 +98,11 @@ void ivas_param_mc_metadata_open( int16_t i; #endif uint16_t config_index; +#ifndef FIX_901_PARAMMC_DEAD_CODE int16_t nchan_setup; nchan_setup = ivas_mc_ls_setup_get_num_channels( mc_ls_setup ); +#endif /* get coding band mappings */ set_s( hMetadataPMC->coding_band_mapping, 0, PARAM_MC_MAX_PARAMETER_BANDS ); -- GitLab From fa4094af079bfe7c23ba31dec4ab3206002821ab Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 16 Feb 2024 10:29:19 +0100 Subject: [PATCH 313/601] fix for #901, remove dead ParamMC code, fix Linux compiler warnings --- lib_dec/ivas_mc_param_dec.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 937cc87339..512e83a134 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -114,7 +114,9 @@ ivas_error ivas_param_mc_dec_open( { int16_t k, nchan_transport; PARAM_MC_DEC_HANDLE hParamMC; +#ifndef FIX_901_PARAMMC_DEAD_CODE IVAS_OUTPUT_SETUP hTransportSetup; +#endif int16_t nchan_out_transport; int16_t nchan_out_cov; float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -146,8 +148,9 @@ ivas_error ivas_param_mc_dec_open( output_Fs = st_ivas->hDecoderConfig->output_Fs; output_config = st_ivas->hDecoderConfig->output_config; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - +#ifndef FIX_901_PARAMMC_DEAD_CODE hTransportSetup = st_ivas->hTransSetup; +#endif mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; hParamMC->hoa_encoder = NULL; @@ -555,7 +558,9 @@ ivas_error ivas_param_mc_dec_reconfig( { int16_t k, nchan_transport; PARAM_MC_DEC_HANDLE hParamMC; +#ifndef FIX_901_PARAMMC_DEAD_CODE IVAS_OUTPUT_SETUP hTransportSetup; +#endif int16_t nchan_out_transport; int16_t nchan_out_cov; float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -584,8 +589,9 @@ ivas_error ivas_param_mc_dec_reconfig( output_Fs = st_ivas->hDecoderConfig->output_Fs; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - +#ifndef FIX_901_PARAMMC_DEAD_CODE hTransportSetup = st_ivas->hTransSetup; +#endif mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; @@ -2724,11 +2730,15 @@ static void ivas_param_mc_dequantize_cov( int16_t l; float *Cyp; float ap; +#ifndef FIX_901_PARAMMC_DEAD_CODE int16_t param_frame_idx; +#endif const PARAM_MC_ILD_MAPPING *h_ild_mapping; float Cy_state_int[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; +#ifndef FIX_901_PARAMMC_DEAD_CODE param_frame_idx = hParamMC->hMetadataPMC->param_frame_idx; +#endif set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); h_ild_mapping = hParamMC->hMetadataPMC->ild_mapping_conf; -- GitLab From df38406c3610acd080b1c243cb3bbc92edc59526 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 16 Feb 2024 10:45:23 +0100 Subject: [PATCH 314/601] fix for #901, remove dead ParamMC code, fix formatting --- lib_com/ivas_prot.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index dfa2b05456..c77bc25bf4 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3805,9 +3805,9 @@ void ivas_mc_paramupmix_dec_render( void ivas_param_mc_metadata_open( const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ - #ifndef FIX_901_PARAMMC_DEAD_CODE +#ifndef FIX_901_PARAMMC_DEAD_CODE const int16_t lfe_index, /* i : channel index of LFE */ - #endif +#endif const int32_t ivas_total_brate, /* i : IVAS total bitrate */ HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ ); -- GitLab From d435f5f452126fb222bf75e4c36a3cc74b6ceee8 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 Feb 2024 12:09:34 +0100 Subject: [PATCH 315/601] allow head rotation with HOA3 output signals for debugging --- apps/decoder.c | 2 ++ lib_com/options.h | 4 +++- lib_dec/ivas_init_dec.c | 5 ++++- lib_dec/ivas_output_config.c | 12 ++++++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 01e6b4f3d1..ca40ee51b1 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -306,6 +306,7 @@ int main( if ( arg.enableHeadRotation ) { /* sanity check */ +#if 0 if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM @@ -315,6 +316,7 @@ int main( fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); goto cleanup; } +#endif if ( ( error = RotationFileReader_open( arg.headrotTrajFileName, &headRotReader ) ) != IVAS_ERR_OK ) { diff --git a/lib_com/options.h b/lib_com/options.h index a8336495ef..6552e1ea1d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -182,7 +182,9 @@ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ -#define NONBE_FIX_998_DIRAC_ROTATION /* FhG: fix issue 998: DirAC scene rotation accidentially deactivated */ +#define NONBE_FIX_998_DIRAC_ROTATION /* FhG: fix issue 998: DirAC scene rotation accidentially deactivated */ + +#define ALLOW_HOA3_ROTATION /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index e1b6a6a415..03a345e4ea 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -3130,12 +3130,14 @@ static ivas_error doSanityChecks_IVAS( return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); } #endif - if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { if ( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM +#endif +#ifdef ALLOW_HOA3_ROTATION + || output_config == IVAS_AUDIO_CONFIG_HOA3 #endif ) ) { @@ -3143,6 +3145,7 @@ static ivas_error doSanityChecks_IVAS( } } + if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { if ( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 346a6095da..45d736a602 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -79,6 +79,18 @@ void ivas_renderer_select( st_ivas->hCombinedOrientationData->shd_rot_max_order = -1; } +#ifdef ALLOW_HOA3_ROTATION + if (output_config == IVAS_AUDIO_CONFIG_HOA3) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; + +#ifdef NONBE_FIX_998_DIRAC_ROTATION + st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; +#endif + + } +#endif + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM -- GitLab From 23ea487d619ede9461db73de69ab4372ea10d012 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Fri, 16 Feb 2024 12:16:49 +0100 Subject: [PATCH 316/601] fix for #999, fix MCT renderer flushing on JBM rate switch --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..8af747f9f4 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -181,6 +181,7 @@ #endif #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ +#define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index cb68cd2ddd..f19ab688d8 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1692,7 +1692,11 @@ ivas_error ivas_jbm_dec_flush_renderer( ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); } +#ifdef NONBE_FIX_999_JBM_MCT_FLUSH + else if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD ) +#else else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) +#endif { if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) { @@ -1701,6 +1705,12 @@ ivas_error ivas_jbm_dec_flush_renderer( ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); } +#ifdef NONBE_FIX_999_JBM_MCT_FLUSH + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong renderer in MCT VoIP renderer flushing!" ); + } +#endif } else { -- GitLab From d5255de12f598b1bcae6e9d7f00cf11536d738ef Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 Feb 2024 12:17:32 +0100 Subject: [PATCH 317/601] fix formatting --- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_output_config.c | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 03a345e4ea..4355f45079 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -3137,7 +3137,7 @@ static ivas_error doSanityChecks_IVAS( || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM #endif #ifdef ALLOW_HOA3_ROTATION - || output_config == IVAS_AUDIO_CONFIG_HOA3 + || output_config == IVAS_AUDIO_CONFIG_HOA3 #endif ) ) { diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 45d736a602..0305858161 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -80,15 +80,14 @@ void ivas_renderer_select( } #ifdef ALLOW_HOA3_ROTATION - if (output_config == IVAS_AUDIO_CONFIG_HOA3) - { - st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; + if ( output_config == IVAS_AUDIO_CONFIG_HOA3 ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; #ifdef NONBE_FIX_998_DIRAC_ROTATION st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; #endif - - } + } #endif if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB -- GitLab From c74fb65e054bd21aa118befa2500bc8553fbacbf Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 16 Feb 2024 13:44:56 +0200 Subject: [PATCH 318/601] Fix issue 991 by correctly using provided HRTF structure for ParamBin in rendering. --- lib_com/options.h | 1 + lib_dec/ivas_dirac_dec.c | 4 + lib_dec/ivas_init_dec.c | 4 + lib_dec/ivas_ism_dec.c | 8 ++ lib_rend/ivas_dirac_dec_binaural_functions.c | 103 ++++++++++++++++++- lib_rend/ivas_prot_rend.h | 4 + lib_rend/ivas_stat_rend.h | 19 ++++ lib_rend/lib_rend.c | 24 ++++- 8 files changed, 160 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..3f9d7f83aa 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -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 ########################### */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index f7f152b738..8e3f383fea 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -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; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index e1b6a6a415..18c9a98603 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -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; } diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 5583f58651..dc05cdbdb1 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -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; } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index e0a4dc9549..ecfece02e0 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -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] ); @@ -140,8 +148,12 @@ 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 */ + 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 */ { - mvr2r( hHrtfParambin->parametricEarlyPartEneCorrection, hDiracDecBin->earlyPartEneCorrection, nBins ); +#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 { - 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 ) +#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]; } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 975a2356aa..e2f7b5d091 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -245,7 +245,11 @@ void ivas_masa_ext_rend_parambin_render( ); 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 ); void ivas_dirac_dec_close_binaural_data( diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index bb91a6e7ab..d5701c81f6 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -500,6 +500,19 @@ typedef struct ivas_diffuse_distribution_data_structure } DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF +/* Parametric binaural renderer HRTF structure */ +typedef struct ivas_hrtfs_parambin_struct +{ + float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; + float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; + + float parametricReverberationTimes[CLDFB_NO_CHANNELS_MAX]; + float parametricReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX]; + float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; + +} HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; +#endif /* Parametric binaural data structure */ typedef struct ivas_dirac_dec_binaural_data_structure @@ -536,6 +549,10 @@ typedef struct ivas_dirac_dec_binaural_data_structure ivas_td_decorr_state_t *hTdDecorr; float reqularizationFactor; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + HRTFS_PARAMBIN_HANDLE *phHrtfParambin; +#endif + DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; @@ -1314,6 +1331,7 @@ typedef struct ivas_hrtfs_fastconv_struct } HRTFS_FASTCONV, *HRTFS_FASTCONV_HANDLE; +#ifndef NONBE_FIX_991_PARAMBIN_BINARY_HRTF typedef struct ivas_hrtfs_parambin_struct { float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; @@ -1324,6 +1342,7 @@ typedef struct ivas_hrtfs_parambin_struct float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; } HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; +#endif typedef struct ivas_hrtfs_statistics_struct { diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 8194de9fba..fec022e19f 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -9262,7 +9262,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + HRTFS_PARAMBIN_HANDLE *phHrtfParambin; +#else HRTFS_PARAMBIN_HANDLE hHrtfParambin; +#endif int16_t nBins; int32_t output_Fs; RENDERER_TYPE renderer_type; @@ -9276,7 +9280,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( error = IVAS_ERR_OK; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + phHrtfParambin = inputMasa->hMasaExtRend->hHrtfParambin; +#else hHrtfParambin = *( inputMasa->hMasaExtRend->hHrtfParambin ); +#endif /* Set common variables and defaults */ output_Fs = *( inputMasa->base.ctx.pOutSampleRate ); @@ -9346,7 +9354,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( } else if ( renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Indication of binaural rendering with room effect */ { - mvr2r( hHrtfParambin->parametricEarlyPartEneCorrection, hDiracDecBin->earlyPartEneCorrection, nBins ); +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + mvr2r( ( *phHrtfParambin )->parametricEarlyPartEneCorrection, hDiracDecBin->earlyPartEneCorrection, nBins ); +#else + mvr2r( hHrtfParambin->parametricEarlyPartEneCorrection, hDiracDecBin->earlyPartEneCorrection, nBins ); +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT if ( hDiracDecBin->hReverb == NULL && pos_idx == 0 ) /* open reverb only for the main direction */ @@ -9354,7 +9366,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( if ( hDiracDecBin->hReverb == NULL ) #endif { - if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK ) +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes, ( *phHrtfParambin )->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -9395,6 +9411,10 @@ static ivas_error ivas_masa_ext_rend_parambin_init( /* External renderer uses constant regularization factor */ hDiracDecBin->reqularizationFactor = 0.4f; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + hDiracDecBin->phHrtfParambin = phHrtfParambin; +#endif + #ifdef SPLIT_REND_WITH_HEAD_ROT inputMasa->hMasaExtRend->hDiracDecBin[pos_idx] = hDiracDecBin; } -- GitLab From 652da7527703f13dced59b7883c3f7f2802e1d7a Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 Feb 2024 12:30:50 +0100 Subject: [PATCH 319/601] fix condition for shf_rot_max_order setting under ALLOW_HOA3_ROTATION --- lib_dec/ivas_output_config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 0305858161..92a17bf7f2 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -80,7 +80,8 @@ void ivas_renderer_select( } #ifdef ALLOW_HOA3_ROTATION - if ( output_config == IVAS_AUDIO_CONFIG_HOA3 ) + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + if ( output_config == IVAS_AUDIO_CONFIG_HOA3 && st_ivas->hDecoderConfig->Opt_Headrotation && nchan_internal >= 2 ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; -- GitLab From dc1087e079865b176217f4a77f1de9acb2edf69c Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 16 Feb 2024 12:51:54 +0100 Subject: [PATCH 320/601] formatting of empty lines --- lib_com/ivas_mc_param_com.c | 1 + lib_com/ivas_prot.h | 2 +- lib_com/ivas_rom_com.c | 8 ++++---- lib_dec/ivas_mc_param_dec.c | 5 +++-- lib_enc/ivas_mc_param_enc.c | 11 ++++++----- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index b1c0bdedd4..5a11a90d86 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -134,6 +134,7 @@ void ivas_param_mc_metadata_open( { assert( 0 && "nbands must be 20 or 14!" ); } + #ifndef FIX_901_PARAMMC_DEAD_CODE /* create map of all possible ICCs */ ivas_param_mc_create_full_icc_mapping( nchan_setup, lfe_index, hMetadataPMC->icc_map_full, &hMetadataPMC->icc_map_size_full ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c77bc25bf4..2fea7f535b 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3897,8 +3897,8 @@ void ivas_param_mc_default_icc_map( const PARAM_MC_ICC_MAPPING * hIccMapping, /* i : handle to ICC mapping configuration */ int16_t icc_map[PARAM_MC_SZ_ICC_MAP][2] /* o : copy of map from the configuration */ ); -#endif +#endif /*! r: number of cldfb synthesis instances */ int16_t param_mc_get_num_cldfb_syntheses( Decoder_Struct *st_ivas /* i : IVAS decoder structure */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index cae38ec552..8ab2c86821 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1989,8 +1989,8 @@ const float ivas_param_mc_ild_fac_CICP19_4tc[12] = 0.5f, 0.2f, }; -#endif +#endif const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP6_2tc = { 5, @@ -2063,8 +2063,8 @@ const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_4tc = {1,1,2,1,1,1,1,1,1,1,1,2}, {{0},{1},{0,1},{0},{1},{0},{1},{2},{3},{2},{3},{0,1}} }; -#endif +#endif const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP6_2tc = { 4, @@ -2181,8 +2181,8 @@ const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_4tc = { 2, 3 } /* C/LFE */ } }; -#endif +#endif const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = { /* CICP6 48000 */ @@ -2352,7 +2352,7 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_dmx_fac_CICP19_4tc[0], &ivas_param_mc_ild_fac_CICP19_4tc[0] } - #endif +#endif }; const float ivas_param_mc_quant_ild_5d1_48[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 512e83a134..45ed71c978 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -649,9 +649,10 @@ ivas_error ivas_param_mc_dec_reconfig( hParamMC->hMetadataPMC->icc_map_full[k] = NULL; } } -#endif +#endif mvs2s( hParamMC->band_grouping, band_grouping_old, hParamMC->hMetadataPMC->num_parameter_bands + 1 ); + #ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); #else @@ -1382,8 +1383,8 @@ void ivas_param_mc_dec_read_BS( ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx] ); } } -#endif +#endif ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->icc_coding, icc_map_size_wo_lfe, icc_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icc_q ); if ( !st->BER_detect ) diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index eac2d3d194..b32bb1ce5d 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -64,8 +64,8 @@ static void ivas_param_mc_transient_detection( PARAM_MC_ENC_HANDLE hParamMC, TRA #ifndef FIX_901_PARAMMC_DEAD_CODE static void ivas_param_mc_enc_find_icc_map( PARAM_MC_ENC_HANDLE hParamMC, float Cx_sum[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], float Cy_sum[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], float ILD_q[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP], const int16_t nchan_input, const int16_t nchan_transport ); -#endif +#endif static void ivas_param_mc_quantize_iccs( PARAM_MC_ENC_HANDLE hParamMC, float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], const int16_t freq_idx, const int16_t nchan_input, int16_t *ICC_idx_out ); static void ivas_param_mc_quantize_ilds( PARAM_MC_ENC_HANDLE hParamMC, float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], float Cx[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], const int16_t freq_idx, const int16_t nchan_input, const int16_t nchan_transport, int16_t *ILD_idx_out, float ILD_q[PARAM_MC_SZ_ILD_MAP] ); @@ -306,8 +306,8 @@ ivas_error ivas_param_mc_enc_reconfig( hParamMC->hMetadataPMC.icc_map_full[i] = NULL; } } -#endif +#endif /* open/init parameter coding */ #ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); @@ -332,8 +332,8 @@ ivas_error ivas_param_mc_enc_reconfig( } } } -#endif +#endif /* Band Grouping */ if ( hParamMC->hMetadataPMC.num_parameter_bands == 20 ) { @@ -395,6 +395,7 @@ void ivas_param_mc_enc_close( { return; } + #ifndef FIX_901_PARAMMC_DEAD_CODE ivas_param_mc_metadata_close( &( *hParamMC )->hMetadataPMC ); #endif @@ -541,8 +542,8 @@ void ivas_param_mc_enc( { ivas_param_mc_default_icc_map( hParamMC->hMetadataPMC.icc_mapping_conf, hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx] ); } -#endif +#endif /* ICC parameter quantization */ for ( k = 0; k < hParamMC->hMetadataPMC.nbands_coded; k += band_step ) { @@ -1672,8 +1673,8 @@ static void ivas_param_mc_write_bs( *bit_pos += hParamMC->hMetadataPMC.icc_map_size_full - 1; } -#endif +#endif ivas_param_mc_encode_parameter( ICC_idx, &hParamMC->hMetadataPMC, &hParamMC->hMetadataPMC.icc_coding, nbands, band_step, icc_map_size_wo_lfe, icc_map_size, bit_buffer, bit_pos ); -- GitLab From 9157e765c44d8af5eb67b5c9f088e6ea18e6921c Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 Feb 2024 13:10:22 +0100 Subject: [PATCH 321/601] fix msan error with ALLOW_HOA3_ROTATION --- lib_dec/ivas_output_config.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 92a17bf7f2..b0895bf031 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -80,15 +80,18 @@ void ivas_renderer_select( } #ifdef ALLOW_HOA3_ROTATION - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - if ( output_config == IVAS_AUDIO_CONFIG_HOA3 && st_ivas->hDecoderConfig->Opt_Headrotation && nchan_internal >= 2 ) + if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) { - st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + if ( output_config == IVAS_AUDIO_CONFIG_HOA3 && st_ivas->hDecoderConfig->Opt_Headrotation && nchan_internal >= 2 ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; #ifdef NONBE_FIX_998_DIRAC_ROTATION - st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; + st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; #endif - } + } + } #endif if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB -- GitLab From 2eb58fd7bb640342297e72d84386efae225c924e Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 16 Feb 2024 14:35:31 +0200 Subject: [PATCH 322/601] Fix split renderer path --- lib_rend/ivas_dirac_dec_binaural_functions.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index ecfece02e0..f8de00c034 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -1317,7 +1317,7 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices( } #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked, *hDiracDecBin->hHrtfParambin ); + 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 @@ -1364,7 +1364,7 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices( /* 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 ); + 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 @@ -1378,7 +1378,7 @@ 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 ); + 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 -- GitLab From e516bcd290d3b87569b16d6c1393bbf59044a162 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 Feb 2024 13:42:11 +0100 Subject: [PATCH 323/601] fix formatting --- lib_dec/ivas_output_config.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index b0895bf031..8af2c4c531 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -82,16 +82,16 @@ void ivas_renderer_select( #ifdef ALLOW_HOA3_ROTATION if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) { - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - if ( output_config == IVAS_AUDIO_CONFIG_HOA3 && st_ivas->hDecoderConfig->Opt_Headrotation && nchan_internal >= 2 ) - { - st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + if ( output_config == IVAS_AUDIO_CONFIG_HOA3 && st_ivas->hDecoderConfig->Opt_Headrotation && nchan_internal >= 2 ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; #ifdef NONBE_FIX_998_DIRAC_ROTATION - st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; + st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; #endif - } - } + } + } #endif if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB -- GitLab From b1f5fd5fb122174fe71cc4661bb5bccf826c4978 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 Feb 2024 13:58:02 +0100 Subject: [PATCH 324/601] disable ALLOW_HOA3_ROTATION --- lib_com/options.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6552e1ea1d..67cda97653 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -123,9 +123,10 @@ /*#define DEBUG_AGC*/ /* debug SPAR AGC in-out */ #endif /*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ -/* #define DEBUG_OSBA */ +/*#define DEBUG_OSBA */ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ /*#define DEBUG_AGC_ENCODER_CMD_OPTION*/ /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ +/*#define ALLOW_HOA3_ROTATION*/ /* Allow outputting rotated HOA3 signals */ /*#define DEBUG_JBM_CMD_OPTION*/ /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ /*#define VARIABLE_SPEED_DECODING*/ /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ @@ -184,8 +185,6 @@ #define NONBE_FIX_998_DIRAC_ROTATION /* FhG: fix issue 998: DirAC scene rotation accidentially deactivated */ -#define ALLOW_HOA3_ROTATION - /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ -- GitLab From 0808e7afda50dcc03125b7a3a38ad06a59cfea36 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 16 Feb 2024 14:08:02 +0100 Subject: [PATCH 325/601] fix typo: 60 kbps -> 64 kbps --- scripts/config/self_test.prm | 2 +- scripts/config/self_test_ltv.prm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 9c0a6d262a..7c17cd4f53 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1465,7 +1465,7 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit -// EVS non-diegetic panning at 60 kbps, 48kHz in, 48kHz out, STEREO out +// EVS non-diegetic panning at 64 kbps, 48kHz in, 48kHz out, STEREO out ../IVAS_cod 64000 48 testv/stv48c.wav bit ../IVAS_dec -non_diegetic_pan -50 48 bit testv/stv48c.pcm_EVS_64000_48-48_STEREO_NON-DIEGETIC-PAN_-50.tst diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 856ed910d4..d1b233d26e 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1465,7 +1465,7 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit -// EVS non-diegetic panning at 60 kbps, 48kHz in, 48kHz out, STEREO out +// EVS non-diegetic panning at 64 kbps, 48kHz in, 48kHz out, STEREO out ../IVAS_cod 64000 48 testv/ltv48_MONO.wav bit ../IVAS_dec -non_diegetic_pan -50 48 bit testv/ltv48_MONO.pcm_EVS_64000_48-48_STEREO_NON-DIEGETIC-PAN_-50.tst -- GitLab From 50afee7f73060717ee159f79316a7c0bbde4471a Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 16 Feb 2024 15:09:08 +0100 Subject: [PATCH 326/601] fix command-line for IVAS decoder --- scripts/config/self_test.prm | 2 +- scripts/config/self_test_ltv.prm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 7c17cd4f53..83aa9ac504 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1471,7 +1471,7 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // 1 ISM non-diegetic panning at 32 kbps, 48kHz in, 48kHz out, STEREO out ../IVAS_cod -ism 1 testv/stvISM1.csv 32000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -non_diegetic_pan 80 48 bit testv/stv1ISM48s.pcm_ISM_32000_48-48_STEREO_NON-DIEGETIC-PAN_80.tst +../IVAS_dec -non_diegetic_pan 80 STEREO 48 bit testv/stv1ISM48s.pcm_ISM_32000_48-48_STEREO_NON-DIEGETIC-PAN_80.tst diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index d1b233d26e..9999e09d25 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1471,7 +1471,7 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // 1 ISM non-diegetic panning at 32 kbps, 48kHz in, 48kHz out, STEREO out ../IVAS_cod -ism 1 testv/ltv1ISM.csv 32000 48 testv/ltv48_1ISM.wav bit -../IVAS_dec -non_diegetic_pan 80 48 bit testv/ltv48_1ISM.pcm_ISM_32000_48-48_STEREO_NON-DIEGETIC-PAN_80.tst +../IVAS_dec -non_diegetic_pan 80 STEREO 48 bit testv/ltv48_1ISM.pcm_ISM_32000_48-48_STEREO_NON-DIEGETIC-PAN_80.tst -- GitLab From 8e1b1a5c52c578087021e9f604837c2a43f92a18 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 16 Feb 2024 15:17:37 +0100 Subject: [PATCH 327/601] formal improvements --- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_output_config.c | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 4355f45079..58329a6ce4 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -3130,6 +3130,7 @@ static ivas_error doSanityChecks_IVAS( return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); } #endif + if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { if ( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB @@ -3145,7 +3146,6 @@ static ivas_error doSanityChecks_IVAS( } } - if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { if ( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 8af2c4c531..7b77db1076 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -85,15 +85,15 @@ void ivas_renderer_select( nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); if ( output_config == IVAS_AUDIO_CONFIG_HOA3 && st_ivas->hDecoderConfig->Opt_Headrotation && nchan_internal >= 2 ) { - st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; - #ifdef NONBE_FIX_998_DIRAC_ROTATION st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; +#else + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; #endif } } -#endif +#endif if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM @@ -197,18 +197,21 @@ void ivas_renderer_select( { nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + +#ifdef NONBE_FIX_998_DIRAC_ROTATION + if ( nchan_internal == 4 || nchan_internal == 3 || nchan_internal == 2 ) +#else if ( nchan_internal == 2 ) +#endif { st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; } +#ifndef NONBE_FIX_998_DIRAC_ROTATION else if ( nchan_internal == 4 || nchan_internal == 3 ) { -#ifdef NONBE_FIX_998_DIRAC_ROTATION - st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; -#else st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; -#endif } +#endif else if ( nchan_internal == 6 || nchan_internal == 5 ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 2; -- GitLab From 2b3f042e6d7b6b90f659110fd536782b047c76d2 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 16 Feb 2024 17:18:49 +0100 Subject: [PATCH 328/601] patch for issue 1001 --- lib_com/ari_hm.c | 8 ++++++++ lib_com/options.h | 2 +- lib_com/prot.h | 8 ++++++++ lib_dec/ari_hm_dec.c | 8 ++++++++ lib_enc/ari_hm_enc.c | 16 ++++++++++++++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib_com/ari_hm.c b/lib_com/ari_hm.c index 3e83529bbb..2e603fbaa1 100644 --- a/lib_com/ari_hm.c +++ b/lib_com/ari_hm.c @@ -205,7 +205,11 @@ int16_t CountIndexBits( *-------------------------------------------------------------------*/ int16_t tcx_hm_render( +#ifdef FIX_1001_ARI_HM_OVERFLOW + const int32_t lag, /* i : pitch lag */ +#else const int16_t lag, /* i : pitch lag */ +#endif const int16_t fract_res, /* i : fractional resolution of the lag */ Word16 p[] /* o : harmonic model (Q13) */ ) @@ -265,7 +269,11 @@ int16_t tcx_hm_render( void tcx_hm_modify_envelope( const Word16 gain, /* i : HM gain (Q11) */ +#ifdef FIX_1001_ARI_HM_OVERFLOW + const int32_t lag, +#else const int16_t lag, +#endif const int16_t fract_res, const Word16 p[], /* i : harmonic model (Q13) */ Word32 env[], /* i/o: envelope (Q16) */ diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..71d4b3ba5b 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,7 @@ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #define FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI /* FhG: fix and undef behaviour bug in the harmonic TCX model arithmetic coder */ - +#define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ diff --git a/lib_com/prot.h b/lib_com/prot.h index e60023602e..fb721e9369 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -7832,14 +7832,22 @@ int16_t DecodeIndex( #define GET_ADJ2( T, L, F ) ( ( ( L ) << ( F ) ) - ( T ) ) int16_t tcx_hm_render( +#ifdef FIX_1001_ARI_HM_OVERFLOW + const int32_t lag, /* i : pitch lag */ +#else const int16_t lag, /* i : pitch lag */ +#endif const int16_t fract_res, /* i : fractional resolution of the lag */ Word16 p[] /* o : harmonic model (Q13) */ ); void tcx_hm_modify_envelope( const Word16 gain, /* i : HM gain (Q11) */ +#ifdef FIX_1001_ARI_HM_OVERFLOW + const int32_t lag, +#else const int16_t lag, +#endif const int16_t fract_res, const Word16 p[], /* i : harmonic model (Q13) */ Word32 env[], /* i/o: envelope (Q16) */ diff --git a/lib_dec/ari_hm_dec.c b/lib_dec/ari_hm_dec.c index 30889e741f..2a0e8bde04 100644 --- a/lib_dec/ari_hm_dec.c +++ b/lib_dec/ari_hm_dec.c @@ -120,7 +120,11 @@ void tcx_hm_decode( int16_t *hm_bits /* o : bit consumption */ ) { +#ifdef FIX_1001_ARI_HM_OVERFLOW + int32_t lag; +#else int16_t lag; +#endif int32_t tmpL; int16_t NumTargetBits, fract_res; Word16 p[2 * kTcxHmParabolaHalfWidth + 1], gain; @@ -144,7 +148,11 @@ void tcx_hm_decode( /* Convert the index to lag */ UnmapIndex( prm_hm[1], L_frame >= 256, LtpPitchLag, ( NumTargetBits <= kSmallerLagsTargetBitsThreshold ) || ( L_frame < 256 ), &fract_res, &tmpL ); +#ifdef FIX_1001_ARI_HM_OVERFLOW + lag = tmpL; +#else lag = (int16_t) tmpL; +#endif /* Render the harmonic model */ if ( tcx_hm_render( lag, fract_res, p ) ) diff --git a/lib_enc/ari_hm_enc.c b/lib_enc/ari_hm_enc.c index dd37682551..0a18a007ab 100644 --- a/lib_enc/ari_hm_enc.c +++ b/lib_enc/ari_hm_enc.c @@ -418,7 +418,11 @@ static void PeakFilter( static float tcx_hm_get_re( const float x[], /* i : absolute spectrum */ const Word16 gain, /* i : HM gain (Q11) */ +#ifdef FIX_1001_ARI_HM_OVERFLOW + const int32_t lag, +#else const int16_t lag, +#endif const int16_t fract_res, const Word16 p[], /* i : harmonic model (Q13) */ const Word32 env[], /* i : envelope (Q16) */ @@ -467,7 +471,11 @@ static float tcx_hm_get_re( static void tcx_hm_quantize_gain( const float x[], /* i : absolute spectrum */ const Word32 env[], /* i : envelope (Q16) */ +#ifdef FIX_1001_ARI_HM_OVERFLOW + const int32_t lag, +#else const int16_t lag, +#endif const int16_t fract_res, Word16 p[], /* i : harmonic model (Q13) */ const int16_t L_frame, /* i : number of spectral lines */ @@ -557,7 +565,11 @@ void tcx_hm_analyse( int16_t *hm_bits /* o : bit consumption */ ) { +#ifdef FIX_1001_ARI_HM_OVERFLOW + int32_t lag; +#else int16_t lag; +#endif int32_t tmpL; int16_t fract_res; float fspec[N_MAX_ARI], RelativeScore; @@ -583,7 +595,11 @@ void tcx_hm_analyse( /* Convert the index to lag */ UnmapIndex( prm_hm[1], L_frame >= 256, LtpPitchLag, ( targetBits - *hm_bits <= kSmallerLagsTargetBitsThreshold ) || ( L_frame < 256 ), &fract_res, &tmpL ); +#ifdef FIX_1001_ARI_HM_OVERFLOW + lag = tmpL; +#else lag = (int16_t) tmpL; +#endif /* Render harmonic model */ tcx_hm_render( lag, fract_res, p ); -- GitLab From 59b67412b92aad57e9cfc7df9cd27ed37fd45ce7 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 16 Feb 2024 17:21:39 +0100 Subject: [PATCH 329/601] formatting --- lib_com/ari_hm.c | 4 ++-- lib_com/prot.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/ari_hm.c b/lib_com/ari_hm.c index 2e603fbaa1..0e9a18085c 100644 --- a/lib_com/ari_hm.c +++ b/lib_com/ari_hm.c @@ -206,9 +206,9 @@ int16_t CountIndexBits( int16_t tcx_hm_render( #ifdef FIX_1001_ARI_HM_OVERFLOW - const int32_t lag, /* i : pitch lag */ + const int32_t lag, /* i : pitch lag */ #else - const int16_t lag, /* i : pitch lag */ + const int16_t lag, /* i : pitch lag */ #endif const int16_t fract_res, /* i : fractional resolution of the lag */ Word16 p[] /* o : harmonic model (Q13) */ diff --git a/lib_com/prot.h b/lib_com/prot.h index fb721e9369..d55ffdfbc6 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -7833,9 +7833,9 @@ int16_t DecodeIndex( int16_t tcx_hm_render( #ifdef FIX_1001_ARI_HM_OVERFLOW - const int32_t lag, /* i : pitch lag */ + const int32_t lag, /* i : pitch lag */ #else - const int16_t lag, /* i : pitch lag */ + const int16_t lag, /* i : pitch lag */ #endif const int16_t fract_res, /* i : fractional resolution of the lag */ Word16 p[] /* o : harmonic model (Q13) */ -- GitLab From c0f4bfc51eca1adab46f6de3996ac66ceabb8595 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 19 Feb 2024 08:34:13 +0100 Subject: [PATCH 330/601] fix typo in command line --- scripts/config/self_test_ltv.prm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 9999e09d25..9b9bccf657 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1470,7 +1470,7 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit ../IVAS_dec -non_diegetic_pan -50 48 bit testv/ltv48_MONO.pcm_EVS_64000_48-48_STEREO_NON-DIEGETIC-PAN_-50.tst // 1 ISM non-diegetic panning at 32 kbps, 48kHz in, 48kHz out, STEREO out -../IVAS_cod -ism 1 testv/ltv1ISM.csv 32000 48 testv/ltv48_1ISM.wav bit +../IVAS_cod -ism 1 testv/ltvISM1.csv 32000 48 testv/ltv48_1ISM.wav bit ../IVAS_dec -non_diegetic_pan 80 STEREO 48 bit testv/ltv48_1ISM.pcm_ISM_32000_48-48_STEREO_NON-DIEGETIC-PAN_80.tst -- GitLab From f16018777b80d4d278696dec3c7629e4cca58d1b Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 19 Feb 2024 09:19:28 +0100 Subject: [PATCH 331/601] #fix for #1003, fix ParamISM USAN problem for binaural output by fixing the TC Buffer reconfiguration on a rate switch for ParamISM and binaural output --- lib_com/options.h | 3 +-- lib_dec/ivas_ism_dec.c | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..36e4476128 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,8 +154,7 @@ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #define FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI /* FhG: fix and undef behaviour bug in the harmonic TCX model arithmetic coder */ - - +#define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 5583f58651..50c994dfd7 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -343,11 +343,13 @@ static ivas_error ivas_ism_bitrate_switching_dec( tc_nchan_allocate_new = tc_nchan_tc_new; tc_nchan_full_new = tc_nchan_tc_new; +#ifndef FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; tc_nchan_full_new = tc_nchan_allocate_new; } +#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { -- GitLab From f5a2cddb934c3681fdf5f1007a42cf97a4709bff Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Mon, 19 Feb 2024 10:59:17 +0200 Subject: [PATCH 332/601] Add -q into git clean flags to suppress log output. --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3c0c52bbe9..8665784309 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,6 +20,7 @@ variables: - 'default' - 'test-be-release' - 'test-long-self-test' + GIT_CLEAN_FLAGS: -ffdxq default: -- GitLab From 4fa087ab4a0a30fd035fdd85bdc09162ff8b6f65 Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 19 Feb 2024 10:13:26 +0100 Subject: [PATCH 333/601] avoid dib by zero in SWB TBE --- lib_com/options.h | 1 + lib_com/swb_tbe_com.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..43efa024c8 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -181,6 +181,7 @@ #endif #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ +#define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index 95b8a53080..8e21ef1748 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -938,6 +938,14 @@ void GenShapedSHBExcitation( } den = 4.0f * c0 * c2 - c4 * c4; + +#ifdef NONBE_FIX_1000_G1_G2_SWB_TBE + if ( den == 0.0f ) + { + den = 1e-7f; + } +#endif + g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; @@ -964,7 +972,17 @@ void GenShapedSHBExcitation( else { /* normalize gain */ +#ifdef NONBE_FIX_1000_G1_G2_SWB_TBE + temp = 0.0f; + if ( g1 + g2 == 0.0f ) + { + temp = 1e-7f; + } + + g = g2 / ( g1 + g2 + temp ); +#else g = g2 / ( g1 + g2 ); +#endif /* quantization of the mixing factor */ cbsize = 1 << NUM_BITS_SHB_VF; -- GitLab From 074b6183b5ce6c34b6195f472f72843e74b87df5 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 Feb 2024 10:19:20 +0100 Subject: [PATCH 334/601] [fix] update from latest DECT package to resolve crash --- lib_lc3plus/lc3.h | 2 +- lib_lc3plus/quantize_spec.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_lc3plus/lc3.h b/lib_lc3plus/lc3.h index 95dff9eb84..0981cea84b 100644 --- a/lib_lc3plus/lc3.h +++ b/lib_lc3plus/lc3.h @@ -37,7 +37,7 @@ typedef __int32 int32_t; #define LC3PLUS_VERSION_INT(major, minor, micro) (((major) << 16) | ((minor) << 8) | (micro)) /*! Version number to ensure header and binary are matching. */ -#define LC3PLUS_VERSION LC3PLUS_VERSION_INT(1, 7, 1) +#define LC3PLUS_VERSION LC3PLUS_VERSION_INT(1, 7, 2) /*! Maximum number of supported channels. The actual binary might support * less, use lc3plus_channels_supported() to check. */ diff --git a/lib_lc3plus/quantize_spec.c b/lib_lc3plus/quantize_spec.c index 01339f99bd..78d3486539 100644 --- a/lib_lc3plus/quantize_spec.c +++ b/lib_lc3plus/quantize_spec.c @@ -125,14 +125,14 @@ void processQuantizeSpec_fl(LC3_FLOAT x[], LC3_FLOAT gain, LC3_INT xq[], LC3_INT /* Last non-zero 2-tuple */ for (i = nt - 2; i >= 2; i = i - 2) { if (xq[i + 1] != 0 || xq[i] != 0) { - lastnz = i+2; + lastnz = i + 1; break; } } if (mode < 0) { - lastnz2 = lastnz; + lastnz2 = lastnz + 1; } else { @@ -263,9 +263,9 @@ void processQuantizeSpec_fl(LC3_FLOAT x[], LC3_FLOAT gain, LC3_INT xq[], LC3_INT } /* Truncation of high-frequency coefficients */ - if (lastnz > lastnz2) + for (i = lastnz2; i <= lastnz; i++) { - memset(&xq[lastnz2], 0, (lastnz - lastnz2) * sizeof(*xq)); + xq[i] = 0; } /* Truncation of LSBs */ -- GitLab From f54030b81bd22b3cd3efc8a855eec535ffc61fa7 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 19 Feb 2024 12:01:45 +0100 Subject: [PATCH 335/601] allow all render frame sizes for the decoder under test in the self test and the pytests --- .gitlab-ci.yml | 2 +- scripts/self_test.py | 13 +++++++------ tests/conftest.py | 22 +++++++++------------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 987b13772b..655cb1ab1d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -532,7 +532,7 @@ pytest-compare-20ms-and-5ms-rendering: - exit_code=0 # dummy, is needed for using the comparison anchor later - non_be_flag=0 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --dut_fr5 || exit_code=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --dut_fr 5 || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check artifacts: diff --git a/scripts/self_test.py b/scripts/self_test.py index 7e7a7ae760..5ed103089e 100755 --- a/scripts/self_test.py +++ b/scripts/self_test.py @@ -194,10 +194,11 @@ class SelfTest(IvasScriptsCommon.IvasScript): default=False, ) self.parser.add_argument( - "--dut_fr5", - help="Run the decoder under test with 5ms rendering", - action="store_true", - default=False, + "--dut_fr", + help="Run the decoder under test with specified render framn size", + default=20, + choices=[5, 10, 20], + type=int ) if shutil.which("valgrind"): self.valgrind = [ @@ -1508,8 +1509,8 @@ class SelfTest(IvasScriptsCommon.IvasScript): enable_logging=True, logger_name="{}.testrunner".format(self.logger.name), ) - if self.args["dut_fr5"] is True: - test_runner.decoder_cmdline_options.extend(["-fr","5"]) + + test_runner.decoder_cmdline_options.extend(["-fr", f"{self.args['dut_fr']}"]) test_runner.set_flat_mode_list(run_dict) test_runner.run() self.logger.console(" ") diff --git a/tests/conftest.py b/tests/conftest.py index 8410f1f47b..aee9387e17 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -159,9 +159,11 @@ def pytest_addoption(parser): ) parser.addoption( - "--dut_fr5", - action="store_true", - help="5ms rendering for the DUT output.", + "--dut_fr", + help="Render frame size for the DUT output.", + choices=[5, 10, 20], + type=int, + default=20, ) @pytest.fixture(scope="session", autouse=True) @@ -398,14 +400,14 @@ def dut_decoder_path(request) -> str: class DecoderFrontend: - def __init__(self, path, dec_type, timeout=None, fr5=None) -> None: + def __init__(self, path, dec_type, timeout=None, fr=20) -> None: self._path = path self._type = dec_type self.returncode = None self.stdout = None self.stderr = None self.timeout = timeout - self.fr5 = fr5 + self.fr = fr def run( self, @@ -423,8 +425,7 @@ class DecoderFrontend: if quiet_mode: command.extend(["-q"]) - if self.fr5 is not None: - command.extend(["-fr", "5"]) + command.extend(["-fr", str(self.fr)]) if plc_file is not None: @@ -512,13 +513,8 @@ def dut_decoder_frontend(dut_decoder_path, request) -> DecoderFrontend: """ Return a :class:`conftest.DecoderFrontend` instance as DUT for the test session. """ - - fr5 = None - if request.config.option.dut_fr5 is True: - fr5 = True - decoder = DecoderFrontend( - dut_decoder_path, "DUT", timeout=request.config.getoption("--testcase_timeout"), fr5=fr5 + dut_decoder_path, "DUT", timeout=request.config.getoption("--testcase_timeout"), fr=request.config.option.dut_fr ) yield decoder -- GitLab From 85dd6253728356125fa52b43c8926ebabd2b046a Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 19 Feb 2024 13:06:25 +0100 Subject: [PATCH 336/601] update CI config to both test 5ms and 10ms versus 20ms --- .gitlab-ci.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 655cb1ab1d..2bcf401a85 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -532,20 +532,26 @@ pytest-compare-20ms-and-5ms-rendering: - exit_code=0 # dummy, is needed for using the comparison anchor later - non_be_flag=0 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --dut_fr 5 || exit_code=$? - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 || exit_code1=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 || exit_code2=$? + - zero_errors=$(cat report-junit-5ms.xml report-junit-10ms.xml | grep -c 'errors="0"') || true + - exit_code = 0 + - if [ $exit_code -eq 1] || [ $exit_code2 -eq 1]; then exit_code=1; fi - *merge-request-comparison-check artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" expire_in: 1 week when: always - expose_as: "pytest 5ms vs 20ms results" + expose_as: "pytest 5ms/10ms vs 20ms results" paths: - - report-junit.xml - - report.html + - report-junit-5ms.xml + - report-5ms.html + - report-junit-10ms.xml + - report-10ms.html reports: junit: - - report-junit.xml + - report-junit-5ms.xml + - report-junit-10ms.xml # test renderer executable renderer-smoke-test: -- GitLab From 319f9b0af5d50fe6601c0a58298b19aa71f1c67b Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 19 Feb 2024 13:11:20 +0100 Subject: [PATCH 337/601] fix CI config file problem --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d61570e78c..8ffdd5aac7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -558,7 +558,7 @@ pytest-compare-20ms-and-5ms-rendering: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" expire_in: 1 week when: always - expose_as: "pytest 5ms/10ms vs 20ms results" + expose_as: "pytest 5ms and 10ms vs 20ms results" paths: - report-junit-5ms.xml - report-5ms.html -- GitLab From be41fb0e885fab5951bda1cfa0dd7122266b6f83 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 19 Feb 2024 13:25:03 +0100 Subject: [PATCH 338/601] fix ifdef in head-rotation sanity check --- apps/decoder.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index ca40ee51b1..83e360e687 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -306,8 +306,11 @@ int main( if ( arg.enableHeadRotation ) { /* sanity check */ -#if 0 - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR +#ifdef ALLOW_HOA3_ROTATION + && arg.outputConfig != IVAS_AUDIO_CONFIG_HOA3 +#endif + && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM #endif @@ -316,7 +319,6 @@ int main( fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); goto cleanup; } -#endif if ( ( error = RotationFileReader_open( arg.headrotTrajFileName, &headRotReader ) ) != IVAS_ERR_OK ) { -- GitLab From 83f4f3d9bbd08e80a2d5e6443626030fad2b9a4b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 19 Feb 2024 13:26:42 +0100 Subject: [PATCH 339/601] fix formatting --- apps/decoder.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 83e360e687..2be9c78d87 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -306,11 +306,11 @@ int main( if ( arg.enableHeadRotation ) { /* sanity check */ - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR #ifdef ALLOW_HOA3_ROTATION - && arg.outputConfig != IVAS_AUDIO_CONFIG_HOA3 -#endif - && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + && arg.outputConfig != IVAS_AUDIO_CONFIG_HOA3 +#endif + && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM #endif -- GitLab From 346b7489d2f0ba8dfcbacac7d168870c2c1eedaf Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 19 Feb 2024 16:10:51 +0100 Subject: [PATCH 340/601] fix for #1005, fix TC Buffer update on a MC rate switch --- lib_com/options.h | 1 + lib_dec/ivas_mct_dec.c | 35 +++++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..6e0255312f 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -181,6 +181,7 @@ #endif #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ +#define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 02f8483111..bfa2a6ad07 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -774,22 +774,29 @@ static ivas_error ivas_mc_dec_reconfig( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); /* transfer subframe info from DirAC or ParamMC to central tc buffer */ - if ( last_mc_mode == MC_MODE_PARAMMC ) +#ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE + if ( st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER ) { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; - st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; - st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; - mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); - } - else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hSpatParamRendCom != NULL ) - { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; - st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; - st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; - mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); +#endif + if ( last_mc_mode == MC_MODE_PARAMMC ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; + mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } +#ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE } +#endif /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv render what still fits in the new granularity */ -- GitLab From 6f8b6f980f5f6d5e6c287b72b9a785da921cda24 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 20 Feb 2024 09:47:05 +0100 Subject: [PATCH 341/601] use tags in testcase name --- tests/hrtf_binary_loading/constants.py | 5 + .../test_codec_ROM_vs_file.py | 92 +++++++++---------- .../test_renderer_ROM_vs_file.py | 62 ++++++------- tests/hrtf_binary_loading/utils.py | 10 +- 4 files changed, 89 insertions(+), 80 deletions(-) diff --git a/tests/hrtf_binary_loading/constants.py b/tests/hrtf_binary_loading/constants.py index 2fa8104cdf..6c19acbecf 100644 --- a/tests/hrtf_binary_loading/constants.py +++ b/tests/hrtf_binary_loading/constants.py @@ -54,6 +54,11 @@ HRTF_BINARY_FILE_SAME_AS_ROM = "ivas_binaural_{}kHz.bin" HRTF_BINARY_FILE_DIFF_FROM_ROM = "ivas_binaural_51_brir-lc_{}kHz.bin" HRTF_FILES = [HRTF_BINARY_FILE_SAME_AS_ROM, HRTF_BINARY_FILE_DIFF_FROM_ROM] +HRTF_TAG_SAME_AS_ROM = "hrtf_same_as_rom" +HRTF_TAG_DIFF_FROM_ROM = "hrtf_diff_from_rom" +HRTF_TAGS = [HRTF_TAG_SAME_AS_ROM, HRTF_TAG_DIFF_FROM_ROM] +HRTF_FILE_FOR_TAG = dict(zip(HRTF_TAGS, HRTF_FILES)) + SAMPLE_RATE = ["16", "32", "48"] INPUT_FORMATS_MC = ["5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] # "MONO", "STEREO", diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 9e12df6cf4..2f5cbe6d1f 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -34,32 +34,32 @@ import itertools from tests.hrtf_binary_loading.utils import * -from .constants import HRTF_FILES, HRTF_BINARY_FILE_DIFF_FROM_ROM +from .constants import HRTF_TAGS """ Binary file """ @pytest.mark.parametrize("out_fs", SAMPLE_RATE) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) -def test_binary_file(test_info, hrtf_file, out_fs): - check_binary_file(hrtf_file, out_fs) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) +def test_binary_file(test_info, hrtf_tag, out_fs): + check_binary_file(hrtf_tag, out_fs) """ Multichannel """ @pytest.mark.parametrize( - ("out_fmt", "out_fs", "in_fmt", "hrtf_file"), + ("out_fmt", "out_fs", "in_fmt", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM else x for x in itertools.product( - OUTPUT_FORMATS_BINAURAL[:-1], SAMPLE_RATE, INPUT_FORMATS_MC, HRTF_FILES + OUTPUT_FORMATS_BINAURAL[:-1], SAMPLE_RATE, INPUT_FORMATS_MC, HRTF_TAGS ) ], ) -def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_file): +def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_tag): bitrate = 512000 in_fs = 48 option_list = ["-mc", in_fmt] @@ -73,12 +73,12 @@ def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_f in_fs, out_fmt, out_fs, - hrtf_file, + hrtf_tag, ) @pytest.mark.parametrize( - ("trj_file", "out_fmt", "out_fs", "in_fmt", "hrtf_file"), + ("trj_file", "out_fmt", "out_fs", "in_fmt", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM @@ -88,12 +88,12 @@ def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_f OUTPUT_FORMATS_BINAURAL[:-1], SAMPLE_RATE, INPUT_FORMATS_MC, - HRTF_FILES, + HRTF_TAGS, ) ], ) def test_multichannel_binaural_headrotation( - test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_file + test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag ): bitrate = 512000 in_fs = 48 @@ -108,7 +108,7 @@ def test_multichannel_binaural_headrotation( in_fs, out_fmt, out_fs, - hrtf_file, + hrtf_tag, trj_file=str(TESTV_DIR.joinpath(f"{trj_file}.csv")), ) @@ -117,17 +117,17 @@ def test_multichannel_binaural_headrotation( @pytest.mark.parametrize( - ("in_fmt", "fs", "out_fmt", "hrtf_file"), + ("in_fmt", "fs", "out_fmt", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM else x for x in itertools.product( - INPUT_FORMATS_SBA, SAMPLE_RATE[1:], OUTPUT_FORMATS_BINAURAL[:-1], HRTF_FILES + INPUT_FORMATS_SBA, SAMPLE_RATE[1:], OUTPUT_FORMATS_BINAURAL[:-1], HRTF_TAGS ) ], ) -def test_sba_binaural_static(test_info, in_fmt, fs, out_fmt, hrtf_file): +def test_sba_binaural_static(test_info, in_fmt, fs, out_fmt, hrtf_tag): bitrate = 256000 option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -140,12 +140,12 @@ def test_sba_binaural_static(test_info, in_fmt, fs, out_fmt, hrtf_file): fs, out_fmt, fs, - hrtf_file, + hrtf_tag, ) @pytest.mark.parametrize( - ("in_fmt", "fs", "out_fmt", "trj_file", "hrtf_file"), + ("in_fmt", "fs", "out_fmt", "trj_file", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM @@ -155,11 +155,11 @@ def test_sba_binaural_static(test_info, in_fmt, fs, out_fmt, hrtf_file): SAMPLE_RATE[1:], OUTPUT_FORMATS_BINAURAL[:-1], [HR_TRAJECTORIES_TO_TEST[0]], - HRTF_FILES, + HRTF_TAGS, ) ], ) -def test_sba_binaural_headrotation(test_info, in_fmt, fs, out_fmt, trj_file, hrtf_file): +def test_sba_binaural_headrotation(test_info, in_fmt, fs, out_fmt, trj_file, hrtf_tag): bitrate = 256000 option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -172,7 +172,7 @@ def test_sba_binaural_headrotation(test_info, in_fmt, fs, out_fmt, trj_file, hrt fs, out_fmt, fs, - hrtf_file, + hrtf_tag, trj_file=str(TESTV_DIR.joinpath(f"{trj_file}.csv")), ) @@ -181,7 +181,7 @@ def test_sba_binaural_headrotation(test_info, in_fmt, fs, out_fmt, trj_file, hrt @pytest.mark.parametrize( - ("out_fmt", "fs", "in_dir", "in_tc", "hrtf_file"), + ("out_fmt", "fs", "in_dir", "in_tc", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM @@ -191,13 +191,13 @@ def test_sba_binaural_headrotation(test_info, in_fmt, fs, out_fmt, trj_file, hrt SAMPLE_RATE[-1:], INPUT_FORMATS_MASA["dir"], INPUT_FORMATS_MASA["tc"], - HRTF_FILES, + HRTF_TAGS, ) ], ) -def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_file): +def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_tag): # TODO: remove once fixed - if hrtf_file == HRTF_BINARY_FILE_DIFF_FROM_ROM: + if hrtf_tag == HRTF_BINARY_FILE_DIFF_FROM_ROM: pytest.skip("Skipped due to bug in paramBin HRTF loading") bitrate = 256000 metadata_file = str( @@ -214,12 +214,12 @@ def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_file): fs, out_fmt, fs, - hrtf_file, + hrtf_tag, ) @pytest.mark.parametrize( - ("in_tc", "in_dir", "out_fmt", "fs", "trj_file", "hrtf_file"), + ("in_tc", "in_dir", "out_fmt", "fs", "trj_file", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM @@ -230,15 +230,15 @@ def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_file): OUTPUT_FORMATS_BINAURAL[:-1], SAMPLE_RATE[-1:], [HR_TRAJECTORIES_TO_TEST[1]], - HRTF_FILES, + HRTF_TAGS, ) ], ) def test_masa_binaural_headrotation( - test_info, in_tc, in_dir, fs, out_fmt, trj_file, hrtf_file + test_info, in_tc, in_dir, fs, out_fmt, trj_file, hrtf_tag ): # TODO: remove once fixed - if hrtf_file == HRTF_BINARY_FILE_DIFF_FROM_ROM: + if hrtf_tag == HRTF_BINARY_FILE_DIFF_FROM_ROM: pytest.skip("Skipped due to bug in paramBin HRTF loading") bitrate = 256000 metadata_file = str( @@ -255,7 +255,7 @@ def test_masa_binaural_headrotation( fs, out_fmt, fs, - hrtf_file, + hrtf_tag, trj_file=str(TESTV_DIR.joinpath(f"{trj_file}.csv")), ) @@ -264,17 +264,17 @@ def test_masa_binaural_headrotation( @pytest.mark.parametrize( - ("in_fmt", "out_fs", "out_fmt", "hrtf_file"), + ("in_fmt", "out_fs", "out_fmt", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM else x for x in itertools.product( - INPUT_FORMATS_ISM, SAMPLE_RATE, [OUTPUT_FORMATS_BINAURAL[0]], HRTF_FILES + INPUT_FORMATS_ISM, SAMPLE_RATE, [OUTPUT_FORMATS_BINAURAL[0]], HRTF_TAGS ) ], ) -def test_ism_binaural_static(test_info, in_fmt, out_fs, out_fmt, hrtf_file): +def test_ism_binaural_static(test_info, in_fmt, out_fs, out_fmt, hrtf_tag): in_fs = 48 bitrate = BITRATE_ISM[in_fmt] option_list = ["-ism", in_fmt] @@ -295,12 +295,12 @@ def test_ism_binaural_static(test_info, in_fmt, out_fs, out_fmt, hrtf_file): in_fs, out_fmt, out_fs, - hrtf_file, + hrtf_tag, ) @pytest.mark.parametrize( - ("in_fmt", "out_fs", "out_fmt", "trj_file", "hrtf_file"), + ("in_fmt", "out_fs", "out_fmt", "trj_file", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM @@ -310,12 +310,12 @@ def test_ism_binaural_static(test_info, in_fmt, out_fs, out_fmt, hrtf_file): SAMPLE_RATE, [OUTPUT_FORMATS_BINAURAL[0]], [HR_TRAJECTORIES_TO_TEST[0]], - HRTF_FILES, + HRTF_TAGS, ) ], ) def test_ism_binaural_headrotation( - test_info, in_fmt, out_fs, out_fmt, trj_file, hrtf_file + test_info, in_fmt, out_fs, out_fmt, trj_file, hrtf_tag ): in_fs = 48 bitrate = BITRATE_ISM[in_fmt] @@ -337,7 +337,7 @@ def test_ism_binaural_headrotation( in_fs, out_fmt, out_fs, - hrtf_file, + hrtf_tag, trj_file=str(TESTV_DIR.joinpath(f"{trj_file}.csv")), ) @@ -346,17 +346,17 @@ def test_ism_binaural_headrotation( @pytest.mark.parametrize( - ("in_fmt", "out_fs", "out_fmt", "hrtf_file"), + ("in_fmt", "out_fs", "out_fmt", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM else x for x in itertools.product( - INPUT_FORMATS_ISM, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[-1:], HRTF_FILES + INPUT_FORMATS_ISM, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[-1:], HRTF_TAGS ) ], ) -def test_ism_binaural_roomreverb_static(test_info, in_fmt, out_fs, out_fmt, hrtf_file): +def test_ism_binaural_roomreverb_static(test_info, in_fmt, out_fs, out_fmt, hrtf_tag): in_fs = 48 bitrate = BITRATE_ISM[in_fmt] option_list = ["-ism", in_fmt] @@ -377,12 +377,12 @@ def test_ism_binaural_roomreverb_static(test_info, in_fmt, out_fs, out_fmt, hrtf in_fs, out_fmt, out_fs, - hrtf_file, + hrtf_tag, ) @pytest.mark.parametrize( - ("in_fmt", "out_fs", "out_fmt", "trj_file", "hrtf_file"), + ("in_fmt", "out_fs", "out_fmt", "trj_file", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM @@ -392,12 +392,12 @@ def test_ism_binaural_roomreverb_static(test_info, in_fmt, out_fs, out_fmt, hrtf SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[-1:], [HR_TRAJECTORIES_TO_TEST[0]], - HRTF_FILES, + HRTF_TAGS, ) ], ) def test_ism_binaural_roomreverb_headrotation( - test_info, in_fmt, out_fs, out_fmt, trj_file, hrtf_file + test_info, in_fmt, out_fs, out_fmt, trj_file, hrtf_tag ): in_fs = 48 bitrate = BITRATE_ISM[in_fmt] @@ -419,6 +419,6 @@ def test_ism_binaural_roomreverb_headrotation( in_fs, out_fmt, out_fs, - hrtf_file, + hrtf_tag, trj_file=str(TESTV_DIR.joinpath(f"{trj_file}.csv")), ) diff --git a/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py b/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py index 7781885fae..921562b5bc 100644 --- a/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py @@ -43,7 +43,7 @@ from tests.renderer.constants import ( INPUT_FORMATS_MC, ) -from .constants import HRTF_FILES +from .constants import HRTF_TAGS """ Ambisonics """ @@ -51,12 +51,12 @@ from .constants import HRTF_FILES @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ambisonics_binaural_static_with_binary_hrir( - test_info, in_fmt, out_fmt, frame_size, hrtf_file + test_info, in_fmt, out_fmt, frame_size, hrtf_tag ): compare_renderer_vs_renderer_with_binary_hrir( - test_info, in_fmt, out_fmt, hrtf_file, frame_size=frame_size + test_info, in_fmt, out_fmt, hrtf_tag, frame_size=frame_size ) @@ -64,15 +64,15 @@ def test_ambisonics_binaural_static_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ambisonics_binaural_headrotation_with_binary_hrir( - test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_file + test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_tag ): compare_renderer_vs_renderer_with_binary_hrir( test_info, in_fmt, out_fmt, - hrtf_file, + hrtf_tag, trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), frame_size=frame_size, ) @@ -84,15 +84,15 @@ def test_ambisonics_binaural_headrotation_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_multichannel_binaural_static_with_binary_hrir( - test_info, in_fmt, out_fmt, frame_size, hrtf_file + test_info, in_fmt, out_fmt, frame_size, hrtf_tag ): if in_fmt in ["MONO", "STEREO"]: pytest.skip("MONO or STEREO to Binaural rendering unsupported") compare_renderer_vs_renderer_with_binary_hrir( - test_info, in_fmt, out_fmt, hrtf_file, frame_size=frame_size + test_info, in_fmt, out_fmt, hrtf_tag, frame_size=frame_size ) @@ -100,9 +100,9 @@ def test_multichannel_binaural_static_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_multichannel_binaural_headrotation_with_binary_hrir( - test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_file + test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_tag ): if in_fmt in ["MONO", "STEREO"]: pytest.skip("MONO or STEREO to Binaural rendering unsupported") @@ -111,7 +111,7 @@ def test_multichannel_binaural_headrotation_with_binary_hrir( test_info, in_fmt, out_fmt, - hrtf_file, + hrtf_tag, trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), frame_size=frame_size, ) @@ -123,9 +123,9 @@ def test_multichannel_binaural_headrotation_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ism_binaural_static_with_binary_hrir( - test_info, in_fmt, out_fmt, frame_size, hrtf_file + test_info, in_fmt, out_fmt, frame_size, hrtf_tag ): try: in_meta_files = FORMAT_TO_METADATA_FILES_RENDERER[in_fmt] @@ -136,7 +136,7 @@ def test_ism_binaural_static_with_binary_hrir( test_info, in_fmt, out_fmt, - hrtf_file, + hrtf_tag, in_meta_files=in_meta_files, frame_size=frame_size, ) @@ -146,9 +146,9 @@ def test_ism_binaural_static_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ism_binaural_headrotation_with_binary_hrir( - test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_file + test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_tag ): try: in_meta_files = FORMAT_TO_METADATA_FILES_RENDERER[in_fmt] @@ -159,7 +159,7 @@ def test_ism_binaural_headrotation_with_binary_hrir( test_info, in_fmt, out_fmt, - hrtf_file, + hrtf_tag, trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), in_meta_files=in_meta_files, frame_size=frame_size, @@ -172,9 +172,9 @@ def test_ism_binaural_headrotation_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA_RENDERER) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_masa_binaural_static_with_binary_hrir( - test_info, in_fmt, out_fmt, frame_size, hrtf_file + test_info, in_fmt, out_fmt, frame_size, hrtf_tag ): if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") @@ -183,7 +183,7 @@ def test_masa_binaural_static_with_binary_hrir( test_info, in_fmt, out_fmt, - hrtf_file, + hrtf_tag, in_meta_files=FORMAT_TO_METADATA_FILES_RENDERER[in_fmt], ) @@ -192,9 +192,9 @@ def test_masa_binaural_static_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA_RENDERER) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_masa_binaural_headrotation_with_binary_hrir( - test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_file + test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_tag ): if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") @@ -203,7 +203,7 @@ def test_masa_binaural_headrotation_with_binary_hrir( test_info, in_fmt, out_fmt, - hrtf_file, + hrtf_tag, trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), in_meta_files=FORMAT_TO_METADATA_FILES_RENDERER[in_fmt], ) @@ -215,15 +215,15 @@ def test_masa_binaural_headrotation_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_layout", CUSTOM_LS_TO_TEST) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_custom_ls_input_binaural_with_binary_hrir( - test_info, in_layout, out_fmt, frame_size, hrtf_file + test_info, in_layout, out_fmt, frame_size, hrtf_tag ): compare_renderer_vs_renderer_with_binary_hrir( test_info, CUSTOM_LAYOUT_DIR.joinpath(f"{in_layout}.txt"), out_fmt, - hrtf_file, + hrtf_tag, frame_size=frame_size, ) @@ -232,15 +232,15 @@ def test_custom_ls_input_binaural_with_binary_hrir( @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_layout", CUSTOM_LS_TO_TEST) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -@pytest.mark.parametrize("hrtf_file", HRTF_FILES) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_custom_ls_input_binaural_headrotation_with_binary_hrir( - test_info, in_layout, out_fmt, trj_file, frame_size, hrtf_file + test_info, in_layout, out_fmt, trj_file, frame_size, hrtf_tag ): compare_renderer_vs_renderer_with_binary_hrir( test_info, CUSTOM_LAYOUT_DIR.joinpath(f"{in_layout}.txt"), out_fmt, - hrtf_file, + hrtf_tag, trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), frame_size=frame_size, ) diff --git a/tests/hrtf_binary_loading/utils.py b/tests/hrtf_binary_loading/utils.py index da7d3ba91c..2271f03432 100644 --- a/tests/hrtf_binary_loading/utils.py +++ b/tests/hrtf_binary_loading/utils.py @@ -140,7 +140,8 @@ def get_option_list_str(option_list): return option_list_str -def check_binary_file(hrtf_file, out_fs): +def check_binary_file(hrtf_tag, out_fs): + hrtf_file = HRTF_FILE_FOR_TAG[hrtf_tag] with open(str(HRTF_BINARY_DIR.joinpath(hrtf_file.format(out_fs))), "rb") as file: binary_data = file.read() @@ -284,13 +285,15 @@ def compare_rom_vs_binary( in_fs, out_fmt, out_fs, - hrtf_file: str, + hrtf_tag: str, keep_file: Optional[bool] = False, trj_file: Optional[str] = None, ): option_str = "_".join(get_option_list_str(option_list_enc)) file_ext = f"_{option_str or ''}_{bitrate or ''}_{in_fs or ''}-{out_fs or ''}_{out_fmt or ''}-{uuid.uuid1()} " + hrtf_file = HRTF_FILE_FOR_TAG[hrtf_tag] + xfail = hrtf_file == HRTF_BINARY_FILE_DIFF_FROM_ROM input_path = TESTV_DIR.joinpath(in_file).with_suffix(".wav") @@ -333,7 +336,7 @@ def compare_renderer_vs_renderer_with_binary_hrir( test_info, in_fmt, out_fmt, - hrtf_file, + hrtf_tag, metadata_input: Optional[str] = None, in_meta_files: Optional[list] = None, trj_file: Optional[str] = None, @@ -346,6 +349,7 @@ def compare_renderer_vs_renderer_with_binary_hrir( frame_size: Optional[str] = "20ms", keep_file=False, ): + hrtf_file = HRTF_FILE_FOR_TAG[hrtf_tag] xfail = hrtf_file == HRTF_BINARY_FILE_DIFF_FROM_ROM hrtf_file_dir = SCRIPTS_DIR.joinpath( -- GitLab From ba3ee3b9d49b83c34b77b8f3ab181627c5939975 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 20 Feb 2024 10:32:18 +0100 Subject: [PATCH 342/601] add more testcases to cover all paths --- tests/hrtf_binary_loading/constants.py | 10 +++++++++- .../test_codec_ROM_vs_file.py | 19 +++++++++---------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/tests/hrtf_binary_loading/constants.py b/tests/hrtf_binary_loading/constants.py index 6c19acbecf..1524e9bf57 100644 --- a/tests/hrtf_binary_loading/constants.py +++ b/tests/hrtf_binary_loading/constants.py @@ -67,6 +67,14 @@ INPUT_FORMATS_ISM = ["1", "2", "3", "4"] INPUT_FORMATS_MASA = {"tc": ["1", "2"], "dir": ["1", "2"]} INPUT_FORMATS_MASA_RENDERER = ["MASA1", "MASA2"] +MC_BITRATE_FOR_FORMAT = { + "5_1": 96000, + "5_1_2": 32000, + "5_1_4": 512000, + "7_1": 512000, + "7_1_4": 160000, +} + FORMAT_TO_FILE_MC_WOEXT = { "5_1": "stv51MC{}c_cut", @@ -87,7 +95,7 @@ BITRATE_ISM = { "1": 96000, "2": 160000, "3": 384000, - "4": 512000, + "4": 32000, } FORMAT_TO_METADATA_FILES = {"MASA": "stv{}MASA{}TC{}c.met", "ISM": "stvISM{}.csv"} diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 2f5cbe6d1f..4428aeb81d 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -34,7 +34,7 @@ import itertools from tests.hrtf_binary_loading.utils import * -from .constants import HRTF_TAGS +from .constants import HRTF_TAGS, MC_BITRATE_FOR_FORMAT """ Binary file """ @@ -60,7 +60,7 @@ def test_binary_file(test_info, hrtf_tag, out_fs): ], ) def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_tag): - bitrate = 512000 + bitrate = MC_BITRATE_FOR_FORMAT[in_fmt] in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) @@ -95,7 +95,7 @@ def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_t def test_multichannel_binaural_headrotation( test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag ): - bitrate = 512000 + bitrate = MC_BITRATE_FOR_FORMAT[in_fmt] in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) @@ -117,18 +117,17 @@ def test_multichannel_binaural_headrotation( @pytest.mark.parametrize( - ("in_fmt", "fs", "out_fmt", "hrtf_tag"), + ("bitrate", "in_fmt", "fs", "out_fmt", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM else x for x in itertools.product( - INPUT_FORMATS_SBA, SAMPLE_RATE[1:], OUTPUT_FORMATS_BINAURAL[:-1], HRTF_TAGS + [256000, 64000], INPUT_FORMATS_SBA, SAMPLE_RATE[1:], OUTPUT_FORMATS_BINAURAL[:-1], HRTF_TAGS ) ], ) -def test_sba_binaural_static(test_info, in_fmt, fs, out_fmt, hrtf_tag): - bitrate = 256000 +def test_sba_binaural_static(bitrate, test_info, in_fmt, fs, out_fmt, hrtf_tag): option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -145,12 +144,13 @@ def test_sba_binaural_static(test_info, in_fmt, fs, out_fmt, hrtf_tag): @pytest.mark.parametrize( - ("in_fmt", "fs", "out_fmt", "trj_file", "hrtf_tag"), + ("bitrate", "in_fmt", "fs", "out_fmt", "trj_file", "hrtf_tag"), [ pytest.param(*x, marks=pytest.mark.xfail(strict=True)) if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM else x for x in itertools.product( + [256000, 64000], INPUT_FORMATS_SBA, SAMPLE_RATE[1:], OUTPUT_FORMATS_BINAURAL[:-1], @@ -159,8 +159,7 @@ def test_sba_binaural_static(test_info, in_fmt, fs, out_fmt, hrtf_tag): ) ], ) -def test_sba_binaural_headrotation(test_info, in_fmt, fs, out_fmt, trj_file, hrtf_tag): - bitrate = 256000 +def test_sba_binaural_headrotation(bitrate, test_info, in_fmt, fs, out_fmt, trj_file, hrtf_tag): option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) -- GitLab From 353214a9a58852fcdf3747da11e6c0e322321741 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Tue, 20 Feb 2024 09:32:59 +0100 Subject: [PATCH 343/601] add generateCustomBinaryFile --- ...erate_ivas_binauralizer_tables_from_sofa.m | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m b/scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m index ec454511d7..e6547762f4 100644 --- a/scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m +++ b/scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m @@ -47,15 +47,21 @@ addpath(genpath('../td_object_renderer/modeling_tool/')); %% Set arguments writeRomFileOutput = true; %% generation of rom files if true writeBinaryOutput = true; %% generation of binary files if true. Always true for TD renderer -writeEachRendererBinaryOutput = true; %% generation of binary split files each containing binary data for individual renderer +writeEachRendererBinaryOutput = false; %% generation of binary split files each containing binary data for individual renderer %% Set ivas root path ivas_path = ['..' filesep '..' filesep]; +generateCustomBinaryFile = false; + %% Set input files -%hrir_file_name = 'D1_48K_24bit_256tap_FIR_SOFA.sofa'; -%hrir_file_name = 'HRIR_128_Meth5_IRC_51_Q10_symL_Itrp1_48000.sofa'; -hrir_file_name = 'HRIR_128_Meth5_IRC_53_Q10_symL_Itrp1_48000.sofa'; +if generateCustomBinaryFile + hrir_file_name = 'HRIR_128_Meth5_IRC_51_Q10_symL_Itrp1_48000.sofa'; + output_bin_name = 'ivas_binaural_51_brir-lc'; +else + hrir_file_name = 'HRIR_128_Meth5_IRC_53_Q10_symL_Itrp1_48000.sofa'; + output_bin_name = 'ivas_binaural'; +end brir_file_name = 'IIS_BRIR_officialMPEG_Combined.sofa'; hrir_path = fullfile ('.','HRIRs_sofa'); brir_path = fullfile ('.','BRIRs_sofa'); @@ -63,7 +69,6 @@ brir_path = fullfile ('.','BRIRs_sofa'); rom_path = [ivas_path 'lib_rend']; binary_path = fullfile ('.','binaural_renderers_hrtf_data'); binary_name = [erase(hrir_file_name,'.sofa') '+' erase(brir_file_name, '.sofa') ]; -output_bin_name = 'ivas_binaural'; if ~(exist(binary_path, 'dir')) mkdir(binary_path); end @@ -100,6 +105,12 @@ if writeBinaryOutput == true ]; end +if generateCustomBinaryFile + command = [command ... + ' -brir_optim_config_path' ... + ' brir_low_complexity_optim.cfg ' ... + ] +end command = [command ... ' -compute_reverb_rom ' ... erase(hrir_file,'.sofa') '.mat ' ... -- GitLab From 2c1f5e5ae880441cc4065f29513dbb280c9f2799 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Tue, 20 Feb 2024 11:19:12 +0100 Subject: [PATCH 344/601] add generateCustomBinaryFile and normalized input hrir --- ...erate_ivas_binauralizer_tables_from_sofa.m | 20 +++++++++++++---- .../SOFA_save.m | 22 +++++++++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m b/scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m index e6547762f4..491062b1aa 100644 --- a/scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m +++ b/scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m @@ -47,8 +47,8 @@ addpath(genpath('../td_object_renderer/modeling_tool/')); %% Set arguments writeRomFileOutput = true; %% generation of rom files if true writeBinaryOutput = true; %% generation of binary files if true. Always true for TD renderer -writeEachRendererBinaryOutput = false; %% generation of binary split files each containing binary data for individual renderer - +writeEachRendererBinaryOutput = true; %% generation of binary split files each containing binary data for individual renderer +normalizeSofaInputData = false; %% if true SOFA IR are nomalized %% Set ivas root path ivas_path = ['..' filesep '..' filesep]; @@ -56,10 +56,12 @@ generateCustomBinaryFile = false; %% Set input files if generateCustomBinaryFile - hrir_file_name = 'HRIR_128_Meth5_IRC_51_Q10_symL_Itrp1_48000.sofa'; + hrir_file_name_init = 'HRIR_128_Meth5_IRC_51_Q10_symL_Itrp1_48000.sofa'; + hrir_file_name = 'HRIR_128_Meth5_IRC_51_Q10_symL_Itrp1_48000_norm.sofa'; output_bin_name = 'ivas_binaural_51_brir-lc'; else - hrir_file_name = 'HRIR_128_Meth5_IRC_53_Q10_symL_Itrp1_48000.sofa'; + hrir_file_name_init = 'HRIR_128_Meth5_IRC_53_Q10_symL_Itrp1_48000.sofa'; + hrir_file_name = 'HRIR_128_Meth5_IRC_53_Q10_symL_Itrp1_48000_norm.sofa'; output_bin_name = 'ivas_binaural'; end brir_file_name = 'IIS_BRIR_officialMPEG_Combined.sofa'; @@ -73,9 +75,19 @@ if ~(exist(binary_path, 'dir')) mkdir(binary_path); end +hrir_file_init = fullfile( hrir_path, hrir_file_name_init); hrir_file = fullfile( hrir_path, hrir_file_name); brir_file = fullfile( brir_path, brir_file_name); +%% normalize input HRTF + +if (normalizeSofaInputData) + SOFA_normalize(hrir_file_init,hrir_file); +else + hrir_file_name = hrir_file_name_init; + hrir_file = hrir_file_init; +end + %% generate td binauralizer rom or binary values dataSpec.dataBase = 'IVAS'; diff --git a/scripts/binauralRenderer_interface/matlab_hrir_generation_scripts/SOFA_save.m b/scripts/binauralRenderer_interface/matlab_hrir_generation_scripts/SOFA_save.m index f1f8743250..85e5e81f0e 100644 --- a/scripts/binauralRenderer_interface/matlab_hrir_generation_scripts/SOFA_save.m +++ b/scripts/binauralRenderer_interface/matlab_hrir_generation_scripts/SOFA_save.m @@ -35,6 +35,16 @@ function [outputArg1] = SOFA_save(IR,fs,latency_s, inputSofaTemplatePath,outputS % Detailed explanation goes here outputArg1 = false; inputAsLatencys = false; +outputFormatIsHOA = 0; +if (size(IR,3) == 4) + outputFormatIsHOA = 1; +end +if (size(IR,3) == 9) + outputFormatIsHOA = 1; +end +if (size(IR,3) == 16) + outputFormatIsHOA = 1; +end if isfile(inputSofaTemplatePath) if isfile(outputSofaPath) @@ -92,7 +102,11 @@ if isfile(inputSofaTemplatePath) varId = netcdf.inqVarID(ncid_in,sofa_data.Variables(indVar).Name); [name,xtype,dimids,natts] = netcdf.inqVar(ncid_in,varId); netcdf.defVar(ncid, name , xtype, dimids); - data = zeros(sofa_data.Variables(indVar).Size); + if (outputFormatIsHOA == 0) + data = netcdf.getVar(ncid_in,varId); + else + data = zeros(sofa_data.Variables(indVar).Size); + end netcdf.putVar(ncid, varId, data); if (strcmp(name, 'Data.IR')) netcdf.putVar(ncid, varId, IR); @@ -120,6 +134,10 @@ if isfile(inputSofaTemplatePath) ncwriteatt(outputSofaPath,'/', 'ListenerShortName',ncreadatt(inputSofaTemplatePath,'/','ListenerShortName')); ncwriteatt(outputSofaPath,'/', 'DatabaseName',ncreadatt(inputSofaTemplatePath,'/','DatabaseName')); ncwriteatt(outputSofaPath,'/','Title' ,ncreadatt(inputSofaTemplatePath,'/','Title')); - ncwriteatt(outputSofaPath,'/', 'SOFAConventions', 'AmbisonicsBRIR'); + if (outputFormatIsHOA == 0) + ncwriteatt(outputSofaPath,'/', 'SOFAConventions', 'AmbisonicsBRIR'); + else + ncwriteatt(outputSofaPath,'/', 'SOFAConventions', ncreadatt(inputSofaTemplatePath,'/','SOFAConventions')); + end end \ No newline at end of file -- GitLab From 654fa7dfbcd091251b85599a711894ac9cce961f Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 20 Feb 2024 12:14:54 +0100 Subject: [PATCH 345/601] exclude temporary test paths from recent HRTF update --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 2024f865f1..bceaf41a73 100644 --- a/.gitignore +++ b/.gitignore @@ -46,7 +46,10 @@ binary/ tests/**/[c|d]ut tests/**/ref tests/*/testv +tests/hrtf_binary_loading/bitstream/* +tests/hrtf_binary_loading/dec_out_*/* scripts/testv/*_cut*.pcm +scripts/testv/*_cut*.wav scripts/testv/stvOMASA_*.met scripts/testv/stvOMASA_*.csv scripts/testv/stvOMASA_2ISM_1MASA1TC48c.wav -- GitLab From 20c523122a882a5cf2416339635b7aaa740c7fa8 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 20 Feb 2024 16:47:44 +0100 Subject: [PATCH 346/601] Fix for #777 - render config reader with combined configurations --- lib_com/options.h | 1 + lib_util/render_config_reader.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 0803c5bcfd..0e53de46f7 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,6 +170,7 @@ #define BE_FIX_567_DOUBLE_STEREO_DMX /* NTT: Fix formal issues */ #define NONBE_FIX_567_DOUBLE_STEREO_DMX /* Orange: Double-precision replaced by single-precision */ +#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 43e0246898..c27bec2b6d 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2301,7 +2301,11 @@ ivas_error RenderConfigReader_read( /* RT60 */ else if ( strcmp( item, "RT60" ) == 0 ) { +#ifdef FIX_777_COMBI_RENDER_CONFIG_FILE + if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) +#else if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) +#endif { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; @@ -2311,7 +2315,11 @@ ivas_error RenderConfigReader_read( /* DSR */ else if ( strcmp( item, "DSR" ) == 0 ) { +#ifdef FIX_777_COMBI_RENDER_CONFIG_FILE + if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) +#else if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) +#endif { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; -- GitLab From 5f9e1d613cd3dc70eb96e227e9900dc51dfd00f4 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 20 Feb 2024 17:33:36 +0100 Subject: [PATCH 347/601] wrap print statement under #ifdef DEBUGGING --- lib_util/render_config_reader.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 43e0246898..2c20e8a0cd 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2452,7 +2452,9 @@ ivas_error RenderConfigReader_read( while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) { params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); +#ifdef DEBUGGING fprintf( stderr, " PARAM: %s -> %s\n", item, pValue ); +#endif if ( strcmp( item, "CODECDELAY" ) == 0 ) { if ( !sscanf( pValue, "%hd", &hRenderConfig->split_rend_config.codec_delay_ms ) ) -- GitLab From 7976c073b0ae75717d19780df0de913f04ade2aa Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 21 Feb 2024 07:31:58 +0100 Subject: [PATCH 348/601] fix for #864, fix JBM for 5ms, address comments, simplify flushing for JBM --- apps/decoder.c | 157 ++++--------------------------------------------- 1 file changed, 12 insertions(+), 145 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 3af33307ff..f712cdb80b 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -3360,10 +3360,10 @@ static ivas_error decodeVoIP( #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE if ( vec_pos_update == 0 ) { -#endif systemTime_ms += vec_pos_len * systemTimeInc_ms; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE } +#else + systemTime_ms += systemTimeInc_ms; #endif #ifdef WMOPS @@ -3376,20 +3376,19 @@ static ivas_error decodeVoIP( #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE int16_t nSamplesFlushed = 0; - do - { - - /* decode and get samples */ + /* decode and get samples */ #ifdef SPLIT_REND_WITH_HEAD_ROT - if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) #else - if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) #endif - { - fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + if ( nSamplesFlushed ) + { /* Write current frame */ if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) { @@ -3442,139 +3441,7 @@ static ivas_error decodeVoIP( } } } - - vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len; - frame++; - if ( !arg.quietModeEnabled ) - { - fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); -#ifdef DEBUGGING - if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) ) - { - fprintf( stdout, "\n Decoding error: BER detected in frame %d !!!!!\n", frame - 1 ); - } -#endif - } - - /* reference vector */ - if ( arg.enableReferenceVectorTracking && vec_pos_update == 0 ) - { - IVAS_VECTOR3 listenerPosition, referencePosition; - if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); - goto cleanup; - } - - if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - } - - /* Reference rotation */ - if ( arg.enableReferenceRotation && vec_pos_update == 0 ) - { - IVAS_QUATERNION quaternion; - if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( refRotReader ) ); - goto cleanup; - } - - if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - } - int16_t num_subframes; - if ( ( error = IVAS_DEC_GetNumOrientationSubframes( hIvasDec, &num_subframes ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_GetNumOrientationSubframes failed: \n" ); - goto cleanup; - } - - /* Head-tracking input simulation */ - /* Head-tracking input simulation */ - if ( arg.enableHeadRotation ) - { - IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; - -#ifdef SPLIT_REND_WITH_HEAD_ROT - if ( headRotReader == NULL ) - { - for ( i = 0; i < num_subframes; i++ ) - { - Quaternions[i].w = -3.0f; - Quaternions[i].x = 0.0f; - Quaternions[i].y = 0.0f; - Quaternions[i].z = 0.0f; - Pos[i].x = 0.0f; - Pos[i].y = 0.0f; - Pos[i].z = 0.0f; - } - } - else - { -#endif - for ( i = 0; i < num_subframes; i++ ) - { - if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), - RotationFileReader_getFilePath( headRotReader ) ); - goto cleanup; - } - } -#ifdef SPLIT_REND_WITH_HEAD_ROT - } -#endif - - for ( i = 0; i < num_subframes; i++ ) - { - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i -#ifdef SPLIT_REND_WITH_HEAD_ROT - , - DEFAULT_AXIS -#endif - ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - } - } - - if ( arg.enableExternalOrientation ) - { - IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; - int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; - int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; - int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; - int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; - - for ( i = 0; i < num_subframes; i++ ) - { - - if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &Quaternions[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError %s while reading external orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), - RotationFileReader_getFilePath( externalOrientationFileReader ) ); - goto cleanup; - } - } - for ( i = 0; i < num_subframes; i++ ) - { - if ( ( error = IVAS_DEC_FeedExternalOrientationData( hIvasDec, Quaternions[i], enableHeadRotation[i], enableExternalOrientation[i], enableRotationInterpolation[i], numFramesToTargetOrientation[i], i ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_DEC_FeedExternalOrientationData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } - } - } - } while ( nSamplesFlushed > 0 ); + } #endif /*------------------------------------------------------------------------------------------* -- GitLab From 527d79bf04e136a5bbfedb3c4b29218b5163dbb7 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 21 Feb 2024 08:07:19 +0100 Subject: [PATCH 349/601] #fix for 864, incorporate fix for #984 --- apps/decoder.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/decoder.c b/apps/decoder.c index 0bc42dd920..10a8ce2370 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -3496,13 +3496,28 @@ static ivas_error decodeVoIP( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples is zeroed, and delayNumSamples_orig is updated only on first good frame, so need to re-fetch delay info */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } +#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; -- GitLab From 8b650cdd5a43bbbe3b59ebbc1b7eab8394590553 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 21 Feb 2024 09:20:39 +0100 Subject: [PATCH 350/601] Added lock functionality for creation of fer bitstreams. Synchronized test names in self_test.prm and self_test_ltv.prm --- scripts/config/self_test.prm | 104 ++++++++++++------------- scripts/config/self_test_ltv.prm | 125 ++++++++++++++++--------------- tests/conftest.py | 15 ++-- 3 files changed, 125 insertions(+), 119 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index a24dac7a4d..0d930c6692 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -569,19 +569,19 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 32 bit_error testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Subframe_FER5.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, HR ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, exo +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, HR, exo ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot_EXOF.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, OT +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, HR, OT ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_OtrAvg.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, exo, OT +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, HR, exo, OT ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_EXOF_OtrAvg.tst @@ -590,11 +590,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 32 bit_error testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_FER5.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation +// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, HR ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_Headrot.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation, exo +// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, HR, exo ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_Headrot_EXOF.tst @@ -611,7 +611,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst -// SBA at 32 kbps, 48kHz in, 48kHz out, MONO out, DTX,bandwidth switching +// SBA at 32 kbps, 48kHz in, 48kHz out, MONO out, DTX, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_FB.txt -dtx -sba 1 32000 48 testv/stvFOA48c.wav bit ../IVAS_dec MONO 48 bit testv/stvFOA48c.wav_SBA_32000_48-48_DTX_MONO.tst @@ -632,35 +632,35 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot_EXOF.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, OT +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, OT ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, OT, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, OT, exo ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, reference vector tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, reference vector tracking, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, reference vector tracking, exo ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, reference vector tracking in level mode +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, reference vector tracking in level mode, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, reference vector tracking in level mode, exo ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPosLev.tst @@ -669,11 +669,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 32 bit_error testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_FER5.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, HR ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, HR, exo ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_Headrot_EXOF.tst @@ -715,11 +715,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 32 bit_error testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_FER5.tst -// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation +// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, HR ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_Headrot.tst -// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, exo +// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, HR, exo ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_Headrot_EXOF.tst @@ -731,19 +731,19 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 1 96000 48 testv/stvFOA48c.wav bit ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_SBA_96000_48-48_FOA.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, exo +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot_EXOF.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, OT +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, OT ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, OT, exo +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, OT, exo ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_EXOF_OtrAvg.tst @@ -781,7 +781,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst -// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, Headrotation, exo +// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BinauralRoom_Headrot_EXOF.tst @@ -798,7 +798,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -max_band testv/ivas_bws_20fr_start_SWB.txt -sba 3 512000 48 testv/stv3OA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural.tst -// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, exo +// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, HR, exo ../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_Binaural_Headrot_EXOF.tst @@ -850,35 +850,35 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 1 -max_band fb ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvFOA48c.wav bit ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_sw_48-48_FOA.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, HR ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_REVERB 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoomReverb_Headrot.tst -// Planar SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, Config renderer, Headrotation +// Planar SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, Config renderer, HR ../IVAS_cod -sba -2 48000 32 testv/stv2OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stv2OA32c.pcm_planarSBA_48000_32-32_BinauralRoomReverb_Config_renderer_Headrot.tst -// SBA at 48 kbps, 32kHz in, 48kHz out, BINAURAL_ROOM_REVERB out (Model from file), Headrotation +// SBA at 48 kbps, 32kHz in, 48kHz out, BINAURAL_ROOM_REVERB out (Model from file), HR ../IVAS_cod -sba 1 48000 32 testv/stvFOA32c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin -t testv/headrot.csv BINAURAL_ROOM_REVERB 48 bit testv/stvFOA32c.pcm_SBA_48000_32-48_BinauralRoomReverb_Headrot_BinauralFile.tst -// Planar SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out (Model from file), Config renderer, Headrotation +// Planar SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out (Model from file), Config renderer, HR ../IVAS_cod -sba -3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stv3OA32c.pcm_planarSBA_48000_32-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst -// SBA at 128 kbps, 32kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out Headrotation +// SBA at 128 kbps, 32kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out HR ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_REVERB 32 bit testv/stv3OA32c.pcm_SBA_12800032-32_BinauralRoomReverb_Headrot.tst -// SBA at 128 kbps, 32kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out, Config renderer, Headrotation +// SBA at 128 kbps, 32kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out, Config renderer, HR ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stv3OA32c.pcm_SBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot.tst -// SBA at 128 kbps, 32kHZ in, 16kHz out, BINAURAL_ROOM_REVERB out (Model from file), Headrotation +// SBA at 128 kbps, 32kHZ in, 16kHz out, BINAURAL_ROOM_REVERB out (Model from file), HR ../IVAS_cod -sba 2 128000 32 testv/stv2OA32c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_REVERB 16 bit testv/stv2OA32c.pcm_SBA_12800032-16_BinauralRoomReverb_Headrot_BinauralFile.tst -// Planar SBA at 128 kbps, 48kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out (Model from file), Config renderer, Headrotation +// Planar SBA at 128 kbps, 48kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out (Model from file), Config renderer, HR ../IVAS_cod -sba -1 128000 48 testv/stvFOA48c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stvFOA48c.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst @@ -901,11 +901,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, Headrotation +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, Headrotation, exo +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot_EXOF.tst @@ -931,11 +931,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Subframe.tst -// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, HR ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot.tst -// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, exo +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, HR, exo ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot_EXOF.tst @@ -956,19 +956,19 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, Headrotation +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, Headrotation, exo +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot_EXOF.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, Headrotation, OT +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, OT ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, Headrotation, OT, exo +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, OT, exo ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_EXOF_OtrAvg.tst @@ -1003,11 +1003,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec EXT 48 bit_error testv/stv2MASA2TC48c.wav_64000_48-48_external_FER5.tst -// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, HR ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 64000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_BINAURAL_Headrot.tst -// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, exo +// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, HR, exo ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 64000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_BINAURAL_Headrot_EXOF.tst @@ -1024,7 +1024,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, bandwidth switching +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM IR out, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_WB.txt -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst @@ -1103,11 +1103,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -max_band testv/ivas_bws_20fr_start_WB.txt -mc 5_1 24400 48 testv/stv51MC48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Subframe.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, HR ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, exo +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, HR, exo ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Headrot_EXOF.tst @@ -1120,19 +1120,19 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, HR ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, exo +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, HR, exo ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot_EXOF.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, Headrotation, exo +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot_EXOF.tst @@ -1145,11 +1145,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural.tst -// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, HR ../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, exo +// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, HR, exo ../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural_Headrot_EXOF.tst diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 09564f01a6..aacd0afc63 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -303,7 +303,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -ism 1 testv/ltvISM1.csv 32000 32 testv/ltv32_1ISM.wav bit ../IVAS_dec MONO 32 bit testv/ltv32_1ISM.wav_1ISM_32000_32-32_DTX_MONO.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, HR, random FER at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM IR out, HR, random FER at 5% ../IVAS_cod -ism 1 testv/ltvISM1.csv 48000 48 testv/ltv48_1ISM.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit_error testv/ltv48_1ISM.wav_64000_48-48_binaural_room_HR.tst @@ -313,7 +313,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL 48 bit_error testv/ltv48_1ISM.wav_64000_48-48_binaural_HR.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, HR, exo, random FER at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM IR out, HR, exo, random FER at 5% ../IVAS_cod -ism 1 testv/ltvISM1.csv 48000 48 testv/ltv48_1ISM.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit_error testv/ltv48_1ISM.wav_64000_48-48_binaural_room_HR_EXOF.tst @@ -358,7 +358,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec EXT 48 bit_error testv/ltv48_2ISM.wav_48000_48-48_EXT_FER5.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM IR out ../IVAS_cod -ism 2 testv/ltvISM3.csv testv/ltvISM4.csv 64000 48 testv/ltv48_2ISM.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_2ISM.wav_64000_48-48_binaural_room.tst @@ -451,17 +451,17 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 32000 48 testv/ltv48_4ISM.wav bit ../IVAS_dec -t testv/headrot_case03_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/ltv48_4ISM.wav_32000_48-48_binaural_file_TDHR_EXOF.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FER at 5% +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM IR out, random FER at 5% ../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 32000 48 testv/ltv48_4ISM.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL_ROOM_IR 48 bit_error testv/ltv48_4ISM.wav_32000_48-48_binaural_room_FER5.tst -// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL ROOM out, random FER at 5% +// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL ROOM IR out, random FER at 5% ../IVAS_cod -dtx -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 48000 48 testv/ltv48_4ISM.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL_ROOM_IR 48 bit_error testv/ltv48_4ISM.wav_48000_48-48_DTX_TD_binaural_room_FER5.tst -// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM IR out ../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 64000 48 testv/ltv48_4ISM.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_4ISM.wav_64000_48-48_binaural_room.tst @@ -624,43 +624,43 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec STEREO 32 bit testv/ltv32_HOA3.wav_SBA_48000_32-32_stereo.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/ltv32_HOA3.wav_SBA_48000_32-32_BinauralRoom.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/ltv32_HOA3.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 32 bit testv/ltv32_HOA3.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/ltv32_HOA3.wav_SBA_48000_32-32_BinauralRoom_Headrot_EXOF.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, OT +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, OT ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, OT, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, OT, exo ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, reference vector tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, reference vector tracking, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, reference vector tracking, exo ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, reference vector tracking in level mode +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, reference vector tracking in level mode, exo +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, reference vector tracking in level mode, exo ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPosLev.tst @@ -731,19 +731,19 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 1 96000 48 testv/ltv48_FOA.wav bit ../IVAS_dec FOA 48 bit testv/ltv48_FOA.wav_SBA_96000_48-48_FOA.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -sba 3 128000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 32 bit testv/ltv32_HOA3.wav_SBA_128000_32-32_Binaural_room_Headrot.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, exo +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -sba 3 128000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/ltv32_HOA3.wav_SBA_128000_32-32_Binaural_room_Headrot_EXOF.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, OT +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, OT ../IVAS_cod -sba 3 128000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, OT, exo +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, OT, exo ../IVAS_cod -sba 3 128000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_EXOF_OtrAvg.tst @@ -781,7 +781,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 1 256000 32 testv/ltv32_FOA.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/ltv32_FOA.wav_SBA_256000_32-32_BINAURAL_ROOM.tst -// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, HR, exo +// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -sba 1 256000 32 testv/ltv32_FOA.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/ltv32_FOA.wav_SBA_256000_32-32_BinauralRoom_Headrot_EXOF.tst @@ -850,35 +850,35 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 1 -max_band fb ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_FOA.wav bit ../IVAS_dec FOA 48 bit testv/ltv48_FOA.wav_sw_48-48_FOA.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, HR ../IVAS_cod -sba 3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_REVERB 32 bit testv/ltv32_HOA3.pcm_SBA_48000_32-32_BinauralRoomReverb_Headrot.tst -// Planar SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, Config renderer, Headrotation +// Planar SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, Config renderer, HR ../IVAS_cod -sba -2 48000 32 testv/ltv32_HOA2.wav bit ../IVAS_dec -t testv/headrot.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/ltv32_HOA2.pcm_planarSBA_48000_32-32_BinauralRoomReverb_Config_renderer_Headrot.tst -// SBA at 48 kbps, 32kHz in, 48kHz out, BINAURAL_ROOM_REVERB out (Model from file), Headrotation +// SBA at 48 kbps, 32kHz in, 48kHz out, BINAURAL_ROOM_REVERB out (Model from file), HR ../IVAS_cod -sba 1 48000 32 testv/ltv32_FOA.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin -t testv/headrot.csv BINAURAL_ROOM_REVERB 48 bit testv/ltv32_FOA.pcm_SBA_48000_32-48_BinauralRoomReverb_Headrot_BinauralFile.tst -// Planar SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out (Model from file), Config renderer, Headrotation +// Planar SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_REVERB out (Model from file), Config renderer, HR ../IVAS_cod -sba -3 48000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/ltv32_HOA3.pcm_planarSBA_48000_32-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst -// SBA at 128 kbps, 32kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out Headrotation +// SBA at 128 kbps, 32kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out HR ../IVAS_cod -sba 3 128000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_REVERB 32 bit testv/ltv32_HOA3.pcm_SBA_12800032-32_BinauralRoomReverb_Headrot.tst -// SBA at 128 kbps, 32kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out, Config renderer, Headrotation +// SBA at 128 kbps, 32kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out, Config renderer, HR ../IVAS_cod -sba 3 128000 32 testv/ltv32_HOA3.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/ltv32_HOA3.pcm_SBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot.tst -// SBA at 128 kbps, 32kHZ in, 16kHz out, BINAURAL_ROOM_REVERB out (Model from file), Headrotation +// SBA at 128 kbps, 32kHZ in, 16kHz out, BINAURAL_ROOM_REVERB out (Model from file), HR ../IVAS_cod -sba 2 128000 32 testv/ltv32_HOA2.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_REVERB 16 bit testv/ltv32_HOA2.pcm_SBA_12800032-16_BinauralRoomReverb_Headrot_BinauralFile.tst -// Planar SBA at 128 kbps, 48kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out (Model from file), Config renderer, Headrotation +// Planar SBA at 128 kbps, 48kHZ in, 32kHz out, BINAURAL_ROOM_REVERB out (Model from file), Config renderer, HR ../IVAS_cod -sba -1 128000 48 testv/ltv48_FOA.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/ltv48_FOA.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst @@ -893,19 +893,19 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec HOA3 48 bit_error testv/ltv48_MASA1TC.wav_16400_48-48_HOA3_FER5.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met 24400 48 testv/ltv48_MASA1TC.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA1TC.wav_24400_48-48_BinauralRoom.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met 24400 48 testv/ltv48_MASA1TC.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA1TC.wav_24400_48-48_BinauralRoom_Subframe.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met 24400 48 testv/ltv48_MASA1TC.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA1TC.wav_24400_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR, exo +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met 24400 48 testv/ltv48_MASA1TC.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA1TC.wav_24400_48-48_BinauralRoom_Headrot_EXOF.tst @@ -952,23 +952,23 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 24400 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec STEREO 48 bit testv/ltv48_MASA2TC.wav_24400_48-48_STEREO.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 32000 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA2TC.wav_32000_48-48_BinauralRoom.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 32000 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA2TC.wav_32000_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR, exo +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 32000 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA2TC.wav_32000_48-48_BinauralRoom_Headrot_EXOF.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR, OT +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, OT ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 32000 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR, OT, exo +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, OT, exo ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 32000 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_EXOF_OtrAvg.tst @@ -1020,13 +1020,14 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec 5_1_4 48 bit_error testv/ltv48_MASA2TC.wav_192000_48-48_5_1_4_FER5.tst +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 384000 48 testv/ltv48_MASA2TC.wav bit +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA2TC.wav_384000_48-48_BinauralRoom_Subframe.tst + // MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM IR out, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_WB.txt -masa 2 testv/ltv48_MASA2TC.met 384000 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA2TC.wav_384000_48-48_BinauralRoom.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out -../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 384000 48 testv/ltv48_MASA2TC.wav bit -../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA2TC.wav_384000_48-48_BinauralRoom_Subframe.tst // MASA 2dir 2TC at 512 kbps, 48kHz in, 48kHz out, 5_1 out ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 512000 48 testv/ltv48_MASA2TC.wav bit @@ -1128,11 +1129,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 5_1 64000 48 testv/ltv48_MC51.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/ltv48_MC51.wav_MC51_64000_48-48_Binaural_Headrot_EXOF.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -mc 5_1 64000 48 testv/ltv48_MC51.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/ltv48_MC51.wav_MC51_64000_48-48_Binaural_room_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR, exo +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -mc 5_1 64000 48 testv/ltv48_MC51.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/ltv48_MC51.wav_MC51_64000_48-48_Binaural_room_Headrot_EXOF.tst @@ -1158,7 +1159,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec STEREO 48 bit_error testv/ltv48_MC51.wav_MC51_256000_48-48_stereo_FER5.tst -// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out +// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out ../IVAS_cod -mc 5_1 192000 48 testv/ltv48_MC51.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_MC51.wav_MC51_192000_48-48_BinauralRoom.tst @@ -1166,19 +1167,19 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 5_1 256000 48 testv/ltv48_MC51.wav bit ../IVAS_dec MONO 48 bit testv/ltv48_MC51.wav_MC51_256000_48-48_mono.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR ../IVAS_cod -mc 5_1 256000 48 testv/ltv48_MC51.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/ltv48_MC51.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR, exo +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, exo ../IVAS_cod -mc 5_1 256000 48 testv/ltv48_MC51.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/ltv48_MC51.wav_MC51_256000_48-48_BinauralRoom_Headrot_EXOF.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR, OT +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, OT ../IVAS_cod -mc 5_1 256000 48 testv/ltv48_MC51.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, HR, OT, exo +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM IR out, HR, OT, exo ../IVAS_cod -mc 5_1 256000 48 testv/ltv48_MC51.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_EXOF_OtrAvg.tst @@ -1423,37 +1424,37 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/ltv48_MASA2TC.wav_sw_48-48_EXT_JBM5.tst -// OMASA 2Dir2TC 1ISM at bitrate switching techs 13.2 to 512 kbps start 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, JBM Prof 5 +// OMASA 2Dir2TC 1ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, JBM Prof 5 ../IVAS_cod -ism_masa 1 2 testv/ltv48_OMASA_1ISM_2TC_ISM1.csv testv/ltv48_OMASA_1ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_24k4_omasatechs_1ism.bin 48 testv/ltv48_OMASA_1ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 48 netsimoutput testv/ltv48_OMASA_1ISM_2TC.wav_BINAURAL_ROOM_IR_sw_48-48_JBM5.tst -// OMASA 2Dir2TC 2ISM at bitrate switching techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 48kHz out, 7.1 out, JBM Prof 5 +// OMASA 2Dir2TC 2ISM at br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 48kHz out, 7.1 out, JBM Prof 5 ../IVAS_cod -ism_masa 2 2 testv/ltv48_OMASA_2ISM_2TC_ISM1.csv NULL testv/ltv48_OMASA_2ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_2ism.bin 48 testv/ltv48_OMASA_2ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1 48 netsimoutput testv/ltv48_OMASA_2ISM_2TC.wav_7_1_sw_48-48_JBM5.tst -// OMASA 2Dir2TC 3ISM at bitrate switching techs 13.2 to 512 kbps start 160 kbps, 48kHz in, 48kHz out, MONO out, JBM Prof 5 +// OMASA 2Dir2TC 3ISM at br sw techs 13.2 to 512 kbps start 160 kbps, 48kHz in, 48kHz out, MONO out, JBM Prof 5 ../IVAS_cod -ism_masa 3 2 testv/ltv48_OMASA_3ISM_2TC_ISM1.csv testv/ltv48_OMASA_3ISM_2TC_ISM2.csv testv/ltv48_OMASA_3ISM_2TC_ISM3.csv testv/ltv48_OMASA_3ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_160k_omasatechs_3ism.bin 48 testv/ltv48_OMASA_3ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP MONO 48 netsimoutput testv/ltv48_OMASA_3ISM_2TC.wav_MONO_sw_48-48_JBM5.tst -// OMASA 2Dir1TC 3ISM at bitrate switching techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 32kHz out, STEREO out, JBM Prof 5 +// OMASA 2Dir1TC 3ISM at br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 32kHz out, STEREO out, JBM Prof 5 ../IVAS_cod -ism_masa 3 1 testv/ltv48_OMASA_3ISM_1TC_ISM1.csv testv/ltv48_OMASA_3ISM_1TC_ISM2.csv testv/ltv48_OMASA_3ISM_1TC_ISM3.csv testv/ltv48_OMASA_3ISM_1TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_3ism.bin 48 testv/ltv48_OMASA_3ISM_1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/ltv48_OMASA_3ISM_1TC.wav_STEREO_sw_48-32_JBM5.tst -// OMASA 1Dir2TC 3ISM at bitrate switching techs 13.2 to 512 kbps start 24.4 kbps, 32kHz in, 48kHz out, 5.1.2 out, JBM Prof 5 +// OMASA 1Dir2TC 3ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 32kHz in, 48kHz out, 5.1.2 out, JBM Prof 5 ../IVAS_cod -ism_masa 3 2 testv/ltv48_OMASA_3ISM_2TC_ISM1.csv testv/ltv48_OMASA_3ISM_2TC_ISM2.csv testv/ltv48_OMASA_3ISM_2TC_ISM3.csv testv/ltv48_OMASA_3ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_24k4_omasatechs_3ism.bin 32 testv/ltv32_OMASA_3ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP 5_1_2 48 netsimoutput testv/ltv32_OMASA_3ISM_2TC.wav_5_1_2_sw_32-48_JBM5.tst -// OMASA 1Dir1TC 4ISM at bitrate switching techs 13.2 to 512 kbps start 32 kbps, 48kHz in, 48kHz out, BINAURAL out, JBM Prof 5 +// OMASA 1Dir1TC 4ISM at br sw techs 13.2 to 512 kbps start 32 kbps, 48kHz in, 48kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -ism_masa 4 1 testv/ltv48_OMASA_4ISM_1TC_ISM1.csv testv/ltv48_OMASA_4ISM_1TC_ISM2.csv testv/ltv48_OMASA_4ISM_1TC_ISM3.csv testv/ltv48_OMASA_4ISM_1TC_ISM4.csv testv/ltv48_OMASA_4ISM_1TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_32k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_OMASA_4ISM_1TC.wav_BINAURAL_sw_48-48_JBM5.tst -// OMASA 1Dir2TC 4ISM at bitrate switching techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, FOA out, JBM Prof 5 +// OMASA 1Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, FOA out, JBM Prof 5 ../IVAS_cod -ism_masa 4 2 NULL testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_OMASA_4ISM_2TC.wav_FOA_sw_48-48_JBM5.tst @@ -1571,29 +1572,29 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec EXT 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_EXT_384000_48-48.tst -// OMASA 2Dir2TC 3ISM at bitrate switching techs 13.2 to 512 kbps start 160 kbps, 48kHz in, 48kHz out, MONO out +// OMASA 2Dir2TC 3ISM at br sw techs 13.2 to 512 kbps start 160 kbps, 48kHz in, 48kHz out, MONO out ../IVAS_cod -ism_masa 3 2 testv/ltv48_OMASA_3ISM_2TC_ISM1.csv testv/ltv48_OMASA_3ISM_2TC_ISM2.csv testv/ltv48_OMASA_3ISM_2TC_ISM3.csv testv/ltv48_OMASA_3ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_160k_omasatechs_3ism.bin 48 testv/ltv48_OMASA_3ISM_2TC.wav bit ../IVAS_dec MONO 48 bit testv/ltv48_OMASA_3ISM_2TC.wav_MONO_sw_48-48.tst -// OMASA 2Dir1TC 3ISM at bitrate switching techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 32kHz out, STEREO out, FER at 10% +// OMASA 2Dir1TC 3ISM at br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 32kHz out, STEREO out, FER at 10% ../IVAS_cod -ism_masa 3 1 testv/ltv48_OMASA_3ISM_1TC_ISM1.csv testv/ltv48_OMASA_3ISM_1TC_ISM2.csv testv/ltv48_OMASA_3ISM_1TC_ISM3.csv testv/ltv48_OMASA_3ISM_1TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_3ism.bin 48 testv/ltv48_OMASA_3ISM_1TC.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g192 bit_error ../IVAS_dec STEREO 32 bit_error testv/ltv48_OMASA_3ISM_1TC.wav_STEREO_sw_48-32.tst -// OMASA 1Dir2TC 3ISM at bitrate switching techs 13.2 to 512 kbps start 24.4 kbps, 32kHz in, 48kHz out, 5.1.4 out +// OMASA 1Dir2TC 3ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 32kHz in, 48kHz out, 5.1.4 out ../IVAS_cod -ism_masa 3 2 testv/ltv48_OMASA_3ISM_2TC_ISM1.csv testv/ltv48_OMASA_3ISM_2TC_ISM2.csv testv/ltv48_OMASA_3ISM_2TC_ISM3.csv testv/ltv48_OMASA_3ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_24k4_omasatechs_3ism.bin 32 testv/ltv32_OMASA_3ISM_2TC.wav bit ../IVAS_dec 5_1_4 48 bit testv/ltv32_OMASA_3ISM_2TC.wav_5_1_4_sw_32-48.tst -// OMASA 1Dir1TC 4ISM at bitrate switching techs 13.2 to 512 kbps start 32 kbps, 48kHz in, 48kHz out, BINAURAL out, FER at 5% +// OMASA 1Dir1TC 4ISM at br sw techs 13.2 to 512 kbps start 32 kbps, 48kHz in, 48kHz out, BINAURAL out, FER at 5% ../IVAS_cod -ism_masa 4 1 testv/ltv48_OMASA_4ISM_1TC_ISM1.csv testv/ltv48_OMASA_4ISM_1TC_ISM2.csv testv/ltv48_OMASA_4ISM_1TC_ISM3.csv testv/ltv48_OMASA_4ISM_1TC_ISM4.csv testv/ltv48_OMASA_4ISM_1TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_32k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_1TC.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec BINAURAL 48 bit_error testv/ltv48_OMASA_4ISM_1TC.wav_BINAURAL_sw_48-48_FER5.tst -// OMASA 1Dir2TC 4ISM at bitrate switching techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, HOA3 out +// OMASA 1Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, HOA3 out ../IVAS_cod -ism_masa 4 2 NULL testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit ../IVAS_dec HOA3 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_HOA3_sw_48-48.tst -// OMASA 2Dir2TC 4ISM at bitrate switching techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out ../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit ../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst @@ -1683,7 +1684,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 4 1 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 512000 32 testv/ltv32_OSBA_4ISM_FOA.wav bit ../IVAS_dec STEREO 48 bit testv/ltv32_OSBA_4ISM_FOA.wav_STEREO_512000_32-48.tst -// OSBA 3OA 4ISM bitrate switching 13.2 to 512, 32kHz in, 48 out, EXT out +// OSBA 3OA 4ISM bitrate switching 13.2 to 512, 32kHz in, 48kHz out, EXT out ../IVAS_cod -ism_sba 4 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 32 testv/ltv32_OSBA_4ISM_HOA3.wav bit ../IVAS_dec EXT 48 bit testv/ltv32_OSBA_4ISM_HOA3.wav_EXT_sw_13k2_512k_32-32.tst diff --git a/tests/conftest.py b/tests/conftest.py index c3ac758fa4..503915a0c7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -42,6 +42,9 @@ import textwrap from pathlib import Path from subprocess import STDOUT, CalledProcessError, TimeoutExpired, run from typing import Optional, Union +import threading + +lock = threading.Lock() # Lock for fer bitstreams logger = logging.getLogger(__name__) USE_LOGGER_FOR_DBG = False # current tests do not make use of the logger feature @@ -171,8 +174,6 @@ def pytest_addoption(parser): help="MLD limit for comparison (default: 0)", default="0", ) - -<<<<<<< HEAD parser.addoption( "--create_ref", action="store_true", @@ -183,8 +184,6 @@ def pytest_addoption(parser): action="store_true", default=False, ) -======= ->>>>>>> main @pytest.fixture(scope="session", autouse=True) def update_ref(request): @@ -488,12 +487,18 @@ class DecoderFrontend: str(input_bitstream_path) + eid_output_suffix, ] + # If the same bitstream is combined with the same error patterns multiple times, + # the following section may create a race condition. Hence, it is guarded by a + # lock and the file is only created if it does not exist already. + lock.aquire() try: - result = run(eid_command, check=True) + if not os.path.exists(str(input_bitstream_path) + eid_output_suffix): + result = run(eid_command, check=True) except Exception as e: print(result.stderr) print(result.stdout) pytest.fail(f"eid-xor operation failed!") + lock.release() input_bitstream_path += eid_output_suffix -- GitLab From ace603875fd9075dd62f30bcfadcaace8ddd8b38 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 21 Feb 2024 09:38:05 +0100 Subject: [PATCH 351/601] Fix syntax error in tests/conftest.py --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 503915a0c7..3fa55b15d2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -490,7 +490,7 @@ class DecoderFrontend: # If the same bitstream is combined with the same error patterns multiple times, # the following section may create a race condition. Hence, it is guarded by a # lock and the file is only created if it does not exist already. - lock.aquire() + lock.acquire() try: if not os.path.exists(str(input_bitstream_path) + eid_output_suffix): result = run(eid_command, check=True) -- GitLab From 77fa776dadee446f4c17350e728881df8f5d1405 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 21 Feb 2024 09:39:25 +0100 Subject: [PATCH 352/601] fix for #1008, fix external target interpolation initialization --- lib_com/options.h | 6 +++--- lib_rend/ivas_rotation.c | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 11f4153922..94db09d156 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -/* #define DEBUGGING */ /* Activate debugging part of the code */ +/*#define DEBUGGING*/ /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ @@ -57,7 +57,6 @@ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ #ifdef DEBUGGING - /*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ @@ -72,6 +71,7 @@ /*#define DEBUG_MODE_INFO_PLC */ /* define to output PLC related parameters */ /*#define DEBUG_MODE_INFO_ALLRAD*/ /* define to output generated HOA decoding mtx */ /*#define DEBUG_MODE_LFE */ /* define to output LFE relevant parameters */ +/*#define DEBUG_MODE_ORIENTATION */ /* define to output combined orientation relevant parameters */ #endif #ifdef DEBUG_MODE_MDCT @@ -160,7 +160,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ - +#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 86cfec1d22..b9f05c9f2d 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -898,14 +898,18 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->num_subframes = num_subframes; ( *hCombinedOrientationData )->interpolationCoefficient = 1.0f; ( *hCombinedOrientationData )->interpolationIncrement = 1.0f; +#ifndef FIX_1008_EXTORIENT_TARGET_INTERPOLATION if ( num_subframes == 1 ) { ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 2000; } else { +#endif ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; +#ifndef FIX_1008_EXTORIENT_TARGET_INTERPOLATION } +#endif ( *hCombinedOrientationData )->lrSwitchedNext = 0; ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; ( *hCombinedOrientationData )->lrSwitchInterpVal = 0.0f; @@ -1331,6 +1335,16 @@ ivas_error combine_external_and_head_orientations( } } +#ifdef DEBUG_MODE_ORIENTATION + for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ ) + { + dbgwrite( &hCombinedOrientationData->enableCombinedOrientation[i], sizeof( int16_t ), 1, 1, "res/dec_orientation_enabled.dat" ); + dbgwrite( &( hCombinedOrientationData->Quaternions[i].w ), sizeof( float ), 1, 1, "res/dec_orientation_quaternion_w.dat" ); + dbgwrite( &( hCombinedOrientationData->Quaternions[i].x ), sizeof( float ), 1, 1, "res/dec_orientation_quaternion_x.dat" ); + dbgwrite( &( hCombinedOrientationData->Quaternions[i].y ), sizeof( float ), 1, 1, "res/dec_orientation_quaternion_y.dat" ); + dbgwrite( &( hCombinedOrientationData->Quaternions[i].z ), sizeof( float ), 1, 1, "res/dec_orientation_quaternion_z.dat" ); + } +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT hCombinedOrientationData->sr_pose_pred_axis = sr_pose_pred_axis; #endif -- GitLab From 00f8c8c6acebde050e23f7f8b036c5ecf8862e61 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 21 Feb 2024 10:58:43 +0100 Subject: [PATCH 353/601] Remove lock -- file names are unique and lock should not be needed --- tests/conftest.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 3fa55b15d2..0525bbf628 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -42,9 +42,6 @@ import textwrap from pathlib import Path from subprocess import STDOUT, CalledProcessError, TimeoutExpired, run from typing import Optional, Union -import threading - -lock = threading.Lock() # Lock for fer bitstreams logger = logging.getLogger(__name__) USE_LOGGER_FOR_DBG = False # current tests do not make use of the logger feature @@ -487,10 +484,6 @@ class DecoderFrontend: str(input_bitstream_path) + eid_output_suffix, ] - # If the same bitstream is combined with the same error patterns multiple times, - # the following section may create a race condition. Hence, it is guarded by a - # lock and the file is only created if it does not exist already. - lock.acquire() try: if not os.path.exists(str(input_bitstream_path) + eid_output_suffix): result = run(eid_command, check=True) @@ -498,7 +491,6 @@ class DecoderFrontend: print(result.stderr) print(result.stdout) pytest.fail(f"eid-xor operation failed!") - lock.release() input_bitstream_path += eid_output_suffix -- GitLab From 6a6070c33f5d2e5c6ddab1217f7ed52dbbf083d2 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 21 Feb 2024 12:44:05 +0200 Subject: [PATCH 354/601] Code review fixes --- lib_rend/ivas_dirac_dec_binaural_functions.c | 10 ++++++---- lib_rend/ivas_prot_rend.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index f8de00c034..3c6c75bd96 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -3002,10 +3002,11 @@ static void getDirectPartGains( const uint8_t renderStereoOutputInsteadOfBinaural, float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, - const int16_t isHeadtracked #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - , + const int16_t isHeadtracked, HRTFS_PARAMBIN_HANDLE hHrtfParambin +#else + const int16_t isHeadtracked #endif ) { @@ -3087,10 +3088,11 @@ static void hrtfShGetHrtf( float *rRealp, float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, - const int16_t useCachedValue #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - , + const int16_t useCachedValue, HRTFS_PARAMBIN_HANDLE hHrtfParambin +#else + const int16_t useCachedValue #endif ) { diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index e2f7b5d091..80b53d508d 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -246,7 +246,7 @@ void ivas_masa_ext_rend_parambin_render( 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 */ + HRTFS_PARAMBIN_HANDLE *phHrtfParambin /* i : HRTF structure for rendering */ #else HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ #endif -- GitLab From 25f8c5b4192c0b8a9398687151de2d0348a207e6 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 21 Feb 2024 13:29:18 +0100 Subject: [PATCH 355/601] Test cases added for combined room acoustics configuration --- scripts/config/self_test.prm | 4 ++++ scripts/config/self_test_ltv.prm | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 83aa9ac504..040434581c 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -539,6 +539,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM_with_no_diegetic_switch.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48n.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48n+non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst +// 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bit +../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav + // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_WB.txt -sba 3 13200 32 testv/stv3OA32c.wav bit diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 9b9bccf657..6c656abdf7 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -539,6 +539,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -ism +4 testv/ltvISM1.csv NULL testv/ltvISM3.csv testv/ltvISM4.csv 256000 48 testv/ltv48_4ISM.wav bit ../IVAS_dec BINAURAL 48 bit testv/ltv48_4ISM_non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst +// 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bi +../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav + // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_WB.txt -sba 3 13200 32 testv/ltv32_HOA3.wav bit -- GitLab From 9008f4401739c9842206ce6b7e4589851d96eadd Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 21 Feb 2024 13:50:27 +0100 Subject: [PATCH 356/601] [cleanup] accept BE_FIX_567_DOUBLE_STEREO_DMX, NONBE_FIX_567_DOUBLE_STEREO_DMX --- lib_com/options.h | 2 -- lib_com/prot.h | 2 -- lib_com/tools.c | 2 -- lib_enc/ivas_stereo_dmx_evs.c | 52 ----------------------------------- 4 files changed, 58 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 024147cdf4..39e9adb235 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,8 +171,6 @@ /* all switches in this category should start with "NONBE_" */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ -#define BE_FIX_567_DOUBLE_STEREO_DMX /* NTT: Fix formal issues */ -#define NONBE_FIX_567_DOUBLE_STEREO_DMX /* Orange: Double-precision replaced by single-precision */ #define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ diff --git a/lib_com/prot.h b/lib_com/prot.h index d55ffdfbc6..10477f3587 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -132,12 +132,10 @@ float inv_sqrt( const float x /* i : input value */ ); -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX /*! r: inverse square root of input value (float) */ float inv_sqrtf( const float x /* i : input value */ ); -#endif /*! r: output random value */ int16_t own_random( diff --git a/lib_com/tools.c b/lib_com/tools.c index 4d70663ebf..10633883fd 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -768,7 +768,6 @@ float inv_sqrt( return (float) ( 1.0 / sqrt( x ) ); } -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX /*---------------------------------------------------------------------* * inv_sqrtf() * @@ -782,7 +781,6 @@ float inv_sqrtf( { return ( 1.0f / sqrtf( x ) ); } -#endif /*-------------------------------------------------------------------* * conv() diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 11cc506c9c..e67029d071 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -58,11 +58,7 @@ #define STEREO_DMX_EVS_POC_FORGETTING 0.78f #define STEREO_DMX_EVS_TARGET_POC_FORGETTING 0.79f #define STEREO_DMX_EVS_POC_W_FORGETTING 0.875f -#ifdef BE_FIX_567_DOUBLE_STEREO_DMX #define STEREO_DMX_EVS_SHIFT_LIMIT STEREO_DFT_ZP_NS_ENC -#else -#define STEREO_DMX_EVS_SHIFT_LIMIT 5.625f /* ms */ -#endif #define STEREO_DMX_EVS_DMX_EGY_FORGETTING 0.25f #define STEREO_DMX_EVS_CORR_FORGETTING 0.78f @@ -529,11 +525,7 @@ static void calc_poc( tPi += IPDi; /* ICCr */ -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX Pn = inv_sqrtf( ( IPDr * IPDr + IPDi * IPDi ) + EPSILON ); -#else - Pn = (float) inv_sqrt( ( IPDr * IPDr + IPDi * IPDi ) + EPSILON ); -#endif IPDr *= Pn; IPDi *= Pn; @@ -546,11 +538,7 @@ static void calc_poc( eneL += ( specLr[i] * specLr[i] + specLi[i] * specLi[i] ); eneR += ( specRr[i] * specRr[i] + specRi[i] * specRi[i] ); } -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX Pn = inv_sqrtf( ( tPr * tPr + tPi * tPi ) + EPSILON ); -#else - Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON ); -#endif tPr *= Pn; tPi *= Pn; @@ -559,11 +547,7 @@ static void calc_poc( Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX Pn = inv_sqrtf( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); -#else - Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); -#endif Pr[n] *= Pn; Pi[n] *= Pn; @@ -572,11 +556,7 @@ static void calc_poc( { Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX Pn = inv_sqrtf( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); -#else - Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); -#endif Pr[n] *= Pn; Pi[n] *= Pn; } @@ -603,11 +583,7 @@ static void calc_poc( } #endif -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX ICCr = sqrtf( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); -#else - ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); -#endif hPHA->iccr_s = STEREO_DMX_EVS_ICCR_FORGETTING * hPHA->iccr_s + ( 1.0f - STEREO_DMX_EVS_ICCR_FORGETTING ) * ICCr; #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA @@ -792,7 +768,6 @@ static void calc_poc( isd_rate = (float) isd_cnt_l / freq_8k; for ( i = 1; i < nsbd; i++ ) { -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX rfft_pha_buf[i * 2] = sqrtf( ( 1.0f + Pr[i] ) / 2.0f ); rfft_pha_buf[i * 2 + 1] = sqrtf( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD ) @@ -800,15 +775,6 @@ static void calc_poc( rfft_pha_buf[i * 2 + 1] = sqrtf( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); rfft_pha_buf[i * 2] = sqrtf( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); } -#else - rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); - rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); - if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD ) - { - rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); - rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); - } -#endif if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) { ild_cnt++; @@ -902,7 +868,6 @@ static void calc_poc( isd_rate = (float) isd_cnt_l / freq_8k; for ( i = 1; i < nsbd; i++ ) { -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX rfft_pha_buf[i * 2] = sqrtf( ( 1.0f + Pr[i] ) / 2.0f ); rfft_pha_buf[i * 2 + 1] = sqrtf( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD ) @@ -910,15 +875,6 @@ static void calc_poc( rfft_pha_buf[i * 2 + 1] = sqrtf( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); rfft_pha_buf[i * 2] = sqrtf( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); } -#else - rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); - rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); - if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD ) - { - rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); - rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); - } -#endif if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) { ild_cnt++; @@ -976,11 +932,7 @@ static void calc_poc( { energy += hPHA->p_curr_taps[n][i] * hPHA->p_curr_taps[n][i]; } -#ifdef NONBE_FIX_567_DOUBLE_STEREO_DMX energy = inv_sqrtf( energy + EPSILON ); -#else - energy = (float) inv_sqrt( energy + EPSILON ); -#endif for ( i = 0; i < hPHA->pha_len; i++ ) { hPHA->p_curr_taps[n][i] *= energy; @@ -2291,11 +2243,7 @@ ivas_error stereo_dmx_evs_init_encoder( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_POC_DATA\n" ) ); } -#ifdef BE_FIX_567_DOUBLE_STEREO_DMX hStereoDmxEVS->hPOC->shift_limit = NS2SA( input_Fs, STEREO_DMX_EVS_SHIFT_LIMIT ); -#else - hStereoDmxEVS->hPOC->shift_limit = (int16_t) ( STEREO_DMX_EVS_SHIFT_LIMIT * input_Fs / 1000 ); -#endif for ( n = 0; n < CPE_CHANNELS; n++ ) { -- GitLab From 5aae34aebc478c890939130bbaf074c514a148d0 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 21 Feb 2024 13:51:31 +0100 Subject: [PATCH 357/601] [cleanup] accept NONBE_FIX_947_STEREO_DMX_EVS_POC --- lib_com/options.h | 3 --- lib_enc/ivas_rom_enc.c | 23 -------------------- lib_enc/ivas_rom_enc.h | 6 ------ lib_enc/ivas_stereo_dmx_evs.c | 40 ----------------------------------- 4 files changed, 72 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 39e9adb235..2b7b6dd222 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,10 +171,7 @@ /* all switches in this category should start with "NONBE_" */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ -#define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ -#endif #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ diff --git a/lib_enc/ivas_rom_enc.c b/lib_enc/ivas_rom_enc.c index 8273e0e444..57eede1ee5 100644 --- a/lib_enc/ivas_rom_enc.c +++ b/lib_enc/ivas_rom_enc.c @@ -534,7 +534,6 @@ const float ari_bit_estimate_s17_LC[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 2] = { 0.00009518625f, 0.00038070876f, 0.00085645882f, 0.00152225529f, 0.00237784467f, 0.00342290120f, 0.00465702698f, 0.00607975212f, 0.00769053493f, 0.00948876211f, @@ -593,28 +592,6 @@ const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 2] = { 0.46899585921f, 0.47225590178f, 0.47551712789f, 0.47877939840f, 0.48204257416f, 0.48530651596f, 0.48857108456f, 0.49183614071f, 0.49510154512f, 0.49836715849f, }; -#else -const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 4] = { - 0.00154133327f, 0.0138150426f, 0.0380602330f, 0.0736799166f, 0.119797014f, 0.175276011f, 0.238750681f, 0.308658302f, 0.383277327f, 0.460770488f, - 0.539229512f, 0.616722703f, 0.691341758f, 0.761249363f, 0.824724138f, 0.880203009f, 0.926320136f, 0.961939812f, 0.986184955f, 0.998458624f, -}; - -const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 4] = { - 0.000385481922f, 0.00346577191f, 0.00960735977f, 0.0187723786f, 0.0309043285f, 0.0459284224f, 0.0637519881f, 0.0842651874f, 0.107341543f, 0.132838756f, - 0.160599619f, 0.190453023f, 0.222214893f, 0.255689442f, 0.290670186f, 0.326941460f, 0.364279807f, 0.402454913f, 0.441231340f, 0.480370134f, - 0.519629955f, 0.558768749f, 0.597545147f, 0.635720134f, 0.673058629f, 0.709329903f, 0.744310737f, 0.777785182f, 0.809546947f, 0.839400351f, - 0.867161214f, 0.892658472f, 0.915734828f, 0.936248004f, 0.954071581f, 0.969095647f, 0.981227636f, 0.990392625f, 0.996534228f, 0.999614537f -}; - -const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 4] = { - 0.000171337553f, 0.00154133327f, 0.00427756971f, 0.00837254710f, 0.0138150426f, 0.0205901340f, 0.0286792554f, 0.0380602330f, 0.0487073623f, 0.0605914444f, - 0.0736799166f, 0.0879369006f, 0.103323318f, 0.119797014f, 0.137312800f, 0.155822709f, 0.175276011f, 0.195619285f, 0.216796920f, 0.238750681f, - 0.261420637f, 0.284744442f, 0.308658302f, 0.333096594f, 0.357992321f, 0.383277327f, 0.408882231f, 0.434736967f, 0.460770488f, 0.486911595f, - 0.513088524f, 0.539229512f, 0.565263212f, 0.591117799f, 0.616722703f, 0.642007649f, 0.666903436f, 0.691341758f, 0.715255499f, 0.738579512f, - 0.761249363f, 0.783203125f, 0.804380774f, 0.824724138f, 0.844177306f, 0.862687230f, 0.880203009f, 0.896676719f, 0.912063122f, 0.926320136f, - 0.939408541f, 0.951292694f, 0.961939812f, 0.971320748f, 0.979409873f, 0.986184955f, 0.991627395f, 0.995722473f, 0.998458624f, 0.999828696f -}; -#endif const float Stereo_dmx_wnd_coef_32k[L_FRAME32k] = { 0.00245436677f, 0.00736304140f, 0.0122715384f, 0.0171797406f, 0.0220875274f, 0.0269947834f, 0.0319013894f, 0.0368072242f, 0.0417121723f, 0.0466161147f, diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 3dae881bc8..f5ab81f8c0 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -120,15 +120,9 @@ extern const uint16_t ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC extern const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 2]; extern const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 2]; extern const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 2]; -#else -extern const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 4]; -extern const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 4]; -extern const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 4]; -#endif extern const float Stereo_dmx_wnd_coef_32k[L_FRAME32k]; extern const float Stereo_dmx_wnd_coef_48k[L_FRAME48k]; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index e67029d071..985040e236 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -1225,7 +1225,6 @@ static void weighted_ave( const float wnd[] /* i : window coef */ ) { -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT @@ -1271,25 +1270,6 @@ static void weighted_ave( #endif -#else - - int16_t i, len; - float gain_tmp = 0.f, gain_sub; - - len = input_frame >> 4; - gain_sub = gain - old_gain; - - for ( i = 0; i < len; i++ ) - { - gain_tmp = old_gain + gain_sub * wnd[i]; - dst[i] = src1[i] * gain_tmp + src2[i] * ( 1.0f - gain_tmp ); - } - for ( ; i < input_frame; i++ ) - { - dst[i] = src1[i] * gain + src2[i] * ( 1.0f - gain_tmp ); - } - -#endif return; } @@ -1407,7 +1387,6 @@ static void adapt_gain( const float wnd[] /* i : window coef */ ) { -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT @@ -1450,25 +1429,6 @@ static void adapt_gain( dst[i] = src[i] * gain; } -#else - - int16_t i, len; - float gain_tmp, gain_sub; - - len = input_frame >> 4; - gain_sub = gain - old_gain; - - for ( i = 0; i < len; i++ ) - { - gain_tmp = old_gain + gain_sub * wnd[i]; - dst[i] = src[i] * gain_tmp; - } - for ( ; i < input_frame; i++ ) - { - dst[i] = src[i] * gain; - } - -#endif return; } -- GitLab From 6fbdff39d3533f93be53cc15617d36cb5d7b3b57 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 21 Feb 2024 13:52:16 +0100 Subject: [PATCH 358/601] [cleanup] accept NONBE_FIX_947_STEREO_DMX_ROMOPT --- lib_com/options.h | 1 - lib_enc/ivas_stereo_dmx_evs.c | 36 ----------------------------------- 2 files changed, 37 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2b7b6dd222..d3b29c2f01 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,7 +171,6 @@ /* all switches in this category should start with "NONBE_" */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ -#define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 985040e236..d93076d6ce 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -1226,7 +1226,6 @@ static void weighted_ave( ) { -#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT int16_t i, len, len2; float gain_tmp = 0.f, gain_sub; @@ -1250,25 +1249,6 @@ static void weighted_ave( dst[i] = src1[i] * gain + src2[i] * ( 1.0f - gain_tmp ); } -#else - - int16_t i, len; - float gain_tmp = 0.f, gain_sub; - - len = input_frame >> 1; - gain_sub = gain - old_gain; - - for ( i = 0; i < len; i++ ) - { - gain_tmp = old_gain + gain_sub * wnd[i]; - dst[i] = src1[i] * gain_tmp + src2[i] * ( 1.0f - gain_tmp ); - } - for ( ; i < input_frame; i++ ) - { - dst[i] = src1[i] * gain + src2[i] * ( 1.0f - gain_tmp ); - } - -#endif return; @@ -1388,7 +1368,6 @@ static void adapt_gain( ) { -#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT int16_t i, len, len2; float gain_tmp, gain_sub; @@ -1408,21 +1387,6 @@ static void adapt_gain( dst[i] = src[i] * gain_tmp; } -#else - - int16_t i, len; - float gain_tmp, gain_sub; - - len = input_frame >> 1; - gain_sub = gain - old_gain; - - for ( i = 0; i < len; i++ ) - { - gain_tmp = old_gain + gain_sub * wnd[i]; - dst[i] = src[i] * gain_tmp; - } - -#endif for ( ; i < input_frame; i++ ) { -- GitLab From 83b938a39d451150b07e4497a19ccedbe8d48642 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 21 Feb 2024 13:54:03 +0100 Subject: [PATCH 359/601] [cleanup] accept NONBE_FIX_947_STEREO_DMX_EVS_PHA --- lib_com/options.h | 3 - lib_enc/ivas_stat_enc.h | 10 - lib_enc/ivas_stereo_dmx_evs.c | 447 ---------------------------------- 3 files changed, 460 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index d3b29c2f01..c619a7e3a2 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,10 +171,7 @@ /* all switches in this category should start with "NONBE_" */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ -#define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ -#endif #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ #ifdef SPLIT_REND_WITH_HEAD_ROT diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 434692f722..3962ac055f 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1074,9 +1074,6 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure typedef struct stereo_dmx_evs_correlation_filter_structure { -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - int16_t init_frmCntr; -#endif float isd_rate_s; float iccr_s; float ipd_ff[STEREO_DMX_EVS_NB_SUBBAND_MAX]; @@ -1097,7 +1094,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure STEREO_DMX_EVS_PHA curr_pha; STEREO_DMX_EVS_PHA prev_pha; int16_t pha_hys_cnt; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA STEREO_DMX_EVS_PHA proc_pha; bool force_poc; @@ -1109,21 +1105,16 @@ typedef struct stereo_dmx_evs_correlation_filter_structure int16_t pha_ipd_chanswitch; int16_t pha_ipd_chanswitch_allowed; float pha_ipd_sf_Threshold; -#endif int16_t prc_thres; STEREO_DMX_EVS_PRC curr_prc; STEREO_DMX_EVS_PRC prev_prc; int16_t prc_hys_cnt; float fad_g_prc[L_FRAME48k]; -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - int16_t fad_len_prc; -#endif float trns_aux_energy[CPE_CHANNELS]; float crst_fctr; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA int16_t n_fad_g; int16_t n_fad_cnt; float dmx_pha_ener; @@ -1133,7 +1124,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float dmx_pha_gain_sgc; float dmx_poc_gain_sgc; float low_egy_thres_sgc; -#endif } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index d93076d6ce..e653022c83 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -88,14 +88,10 @@ #define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define STEREO_DMX_EVS_IFF_AMIN 0.857696f #define STEREO_DMX_EVS_IFF_AMAX 0.944061f #define STEREO_DMX_EVS_IFF_FREQ 3000.0f #define STEREO_DMX_EVS_PHA_WND_C 1.8f -#else -#define STEREO_DMX_EVS_FADE_LEN_PRC 20.0f -#endif #define STEREO_DMX_EVS_NB_SBFRM 5 #define STEREO_DMX_EVS_TRNS_DTC_INST 75.0f @@ -105,7 +101,6 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define STEREO_DMX_EVS_FAD_R 3 #define STEREO_DMX_EVS_SGC_EGY_FORGETTING 0.9f #define STEREO_DMX_EVS_SGC_GR_S 1.00461543f @@ -119,7 +114,6 @@ #define STEREO_DMX_EVS_IPD_ILD_THRES 3.16f // 5dB #define STEREO_DMX_EVS_IPD_SF_THRES 0.05f -#endif /*-----------------------------------------------------------------------* * Local function prototypes @@ -133,9 +127,7 @@ static void adapt_gain( const float src[], float dst[], const float gain, const static void create_M_signal( const float srcL[], const float srcR[], float dmx[], const float w_curr, const int16_t input_frame, const float wnd[], float *w_prev, float *dmx_energy, float *src_energy ); static float find_poc_peak( STEREO_DMX_EVS_POC_HANDLE hPOC, float itd[], const int16_t input_frame, const float ratio ); static void calc_energy( const float src1[], const float src2[], float energy[], const int16_t input_frame, const float ratio ); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA static float spectral_flatness( const float sig[], const int16_t sig_length ); -#endif /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() @@ -227,11 +219,7 @@ static void calc_poc( int16_t cos_step, cos_max; float eps_cos, eps_sin, EPS; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA int16_t isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha, pha_ipd_ild_chan2rephase; -#else - int16_t isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha; -#endif float Nr, Ni, Dr, Di, tPr, tPi, Pn, energy, isd_rate; float eneL, eneR, IPDr, IPDi, tIPDr, tIPDi, ICCr; float *Pr, *Pi, *ipd_ff, *p_curr_taps; @@ -410,13 +398,6 @@ static void calc_poc( } specPOr[n0] = sign( specLr[n0] * specRr[n0] ) * wnd[i * step + bias] * gamma; -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - hPHA->init_frmCntr--; - if ( hPHA->init_frmCntr < 0 ) - { - hPHA->init_frmCntr = 0; - } -#endif freq_8k = L_FRAME16k / 2; freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) ); @@ -543,7 +524,6 @@ static void calc_poc( tPr *= Pn; tPi *= Pn; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; @@ -551,26 +531,10 @@ static void calc_poc( Pr[n] *= Pn; Pi[n] *= Pn; -#else - if ( hPHA->init_frmCntr == 0 ) - { - Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; - Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; - Pn = inv_sqrtf( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); - Pr[n] *= Pn; - Pi[n] *= Pn; - } - else - { - Pr[n] = tPr; - Pi[n] = tPi; - } -#endif Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Computes Spectral flatness on one channel */ tmp1 = spectral_flatness( &tEl[1], nsbd - 1 ); if ( tmp1 < hPHA->pha_ipd_sf_Threshold ) @@ -581,12 +545,10 @@ static void calc_poc( { hPHA->pha_ipd_chanswitch_allowed = 1; } -#endif ICCr = sqrtf( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); hPHA->iccr_s = STEREO_DMX_EVS_ICCR_FORGETTING * hPHA->iccr_s + ( 1.0f - STEREO_DMX_EVS_ICCR_FORGETTING ) * ICCr; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD ) { hPHA->force_poc = FALSE; @@ -808,115 +770,6 @@ static void calc_poc( p_curr_taps[i] = rfft_pha_buf[input_frame_pha - i]; } } -#else - if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD ) - { - hPHA->p_curr_taps[0] = NULL; - hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; - - rfft_pha_buf[0] = 1.; - rfft_pha_buf[1] = 1.; - - ild_cnt = 0; - for ( i = 1; i < nsbd; i++ ) - { - rfft_pha_buf[i * 2] = Pr[i]; - rfft_pha_buf[i * 2 + 1] = Pi[i]; - if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) - { - ild_cnt++; - tEr[i] = 1; - } - else - { - tEr[i] = -1; - } - } - if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) - { - for ( i = 1; i < nsbd; i++ ) - { - if ( tEr[i] > 0 ) - { - rfft_pha_buf[i * 2] = 1.; - rfft_pha_buf[i * 2 + 1] = 0.; - } - } - } - - rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); - mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); - } - else - { - if ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_L ) || ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_H ) && ( hPHA->p_curr_taps[0] != NULL ) ) ) - { - /* IPDn */ - - set_f( &( Pr[freq_ipd_max] ), 1.0f, ( nsbd - freq_ipd_max ) ); - set_f( &( Pi[freq_ipd_max] ), 0.0f, ( nsbd - freq_ipd_max ) ); - - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; - } - - rfft_pha_buf[0] = 1.; - rfft_pha_buf[1] = 1.; - - ild_cnt = 0; - isd_rate = (float) isd_cnt_l / freq_8k; - for ( i = 1; i < nsbd; i++ ) - { - rfft_pha_buf[i * 2] = sqrtf( ( 1.0f + Pr[i] ) / 2.0f ); - rfft_pha_buf[i * 2 + 1] = sqrtf( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); - if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD ) - { - rfft_pha_buf[i * 2 + 1] = sqrtf( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); - rfft_pha_buf[i * 2] = sqrtf( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); - } - if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) - { - ild_cnt++; - tEr[i] = 1; - } - else - { - tEr[i] = -1; - } - } - if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) - { - for ( i = 1; i < nsbd; i++ ) - { - if ( tEr[i] > 0 ) - { - rfft_pha_buf[i * 2] = 1.; - rfft_pha_buf[i * 2 + 1] = 0.; - } - } - } - - rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); - mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); - - /* PHA L2R */ - p_curr_taps = hPHA->p_curr_taps[0]; - p_curr_taps[0] = rfft_pha_buf[0]; - for ( i = 1; i < hPHA->pha_len; i++ ) - { - p_curr_taps[i] = rfft_pha_buf[input_frame_pha - i]; - } - } - else - { - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - hPHA->p_curr_taps[n] = NULL; - } - } - } -#endif for ( n = 0; n < CPE_CHANNELS; n++ ) { @@ -1254,7 +1107,6 @@ static void weighted_ave( return; } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /*-------------------------------------------------------------------* * spectral_flatness() * @@ -1285,7 +1137,6 @@ static float spectral_flatness( return geoMean / ariMean; } -#endif /*-------------------------------------------------------------------* * calc_energy() @@ -1333,7 +1184,6 @@ static void calc_energy( } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /*-------------------------------------------------------------------* * calc_energy_sgc() * @@ -1349,7 +1199,6 @@ static void calc_energy_sgc( *energy = ratio * *energy + ( 1.0f - ratio ) * sum2_f( src, input_frame ); return; } -#endif /*-------------------------------------------------------------------* @@ -1454,7 +1303,6 @@ static void create_M_signal( } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /*-------------------------------------------------------------------* * apply_gain_sgc() @@ -1493,7 +1341,6 @@ static void apply_gain_sgc( *gain *= lr; } -#endif /*-------------------------------------------------------------------* @@ -1510,7 +1357,6 @@ void stereo_dmx_evs_enc( const bool is_binaural /* i : indication that input is binaural audio */ ) { -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA float dmx_weight, corr; #ifdef NONBE_FIX_947_STEREO_DMX_FADOPT @@ -1857,247 +1703,6 @@ void stereo_dmx_evs_enc( mvr2s( p_dmx_data, data, n_samples ); -#else - - int16_t n; - float dmx_weight, corr; - float data_f[CPE_CHANNELS][L_FRAME48k]; - - int16_t k, m, pha_len, fad_len; - float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; - float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; - float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, ftmp; - STEREO_DMX_EVS_PRC curr_prc; - int16_t input_subframe, is_transient; - float *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; - - int16_t input_frame; - - if ( is_binaural ) - { - /* use of is_binaural flag is to be considered */ - } - - input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); - - for ( n = 0; n < input_frame; n++ ) - { - data_f[0][n] = (float) data[2 * n]; - data_f[1][n] = (float) data[2 * n + 1]; - } - if ( n_samples < input_frame ) - { - set_f( data_f[0] + n_samples, 0.0f, input_frame - n_samples ); - set_f( data_f[1] + n_samples, 0.0f, input_frame - n_samples ); - } - - - input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; - is_transient = 0; - for ( k = 0; k < CPE_CHANNELS; k++ ) - { - ftmp = 0; - for ( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) - { - p_sub_frame = &( data_f[k][m * input_subframe] ); - subframe_energy[m] = 0; - for ( n = 0; n < input_subframe; n++ ) - { - subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; - } - - if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) - { - is_transient = 1; - } - - if ( hStereoDmxEVS->hPHA->init_frmCntr == 0 ) - { - hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; - } - else - { - hStereoDmxEVS->hPHA->trns_aux_energy[k] = 0.5f * hStereoDmxEVS->hPHA->trns_aux_energy[k] + 0.5f * subframe_energy[m]; - } - - ftmp += subframe_energy[m]; - } - - for ( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) - { - if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) - { - is_transient = 1; - } - } - } - - estimate_itd( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); - - /* poc */ - - if ( hStereoDmxEVS->itd ) - { - dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; - } - else - { - dmx_weight = 0.5f; - } - - create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, - hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); - - /* pha */ - - pha_len = hStereoDmxEVS->hPHA->pha_len; - fad_len = hStereoDmxEVS->hPHA->fad_len; - fad_g = hStereoDmxEVS->hPHA->fad_g; - - set_zero( dmx_pha_data, n_samples ); - set_zero( mem_prev, fad_len ); - - for ( k = 0; k < CPE_CHANNELS; k++ ) - { - p_data = data_f[k]; - mvr2r( hStereoDmxEVS->hPHA->data_mem[k], data_mem, pha_len ); - mvr2r( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem[k], pha_len ); - p_data_mem = &( data_mem[pha_len] ); - mvr2r( p_data, p_data_mem, n_samples ); - - p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps[k]; - if ( p_prev_taps ) - { - for ( n = 0; n < fad_len; n++ ) - { - for ( ftmp = 0, m = 0; m < pha_len; m++ ) - { - ftmp += p_data_mem[n - m] * p_prev_taps[m]; - } - mem_prev[n] += ftmp * INV_SQRT_2; - } - } - else - { - for ( n = 0; n < fad_len; n++ ) - { - mem_prev[n] += p_data[n] * INV_SQRT_2; - } - } - - p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps[k]; - if ( p_curr_taps ) - { - for ( n = 0; n < n_samples; n++ ) - { - for ( ftmp = 0, m = 0; m < pha_len; m++ ) - { - ftmp += p_data_mem[n - m] * p_curr_taps[m]; - } - dmx_pha_data[n] += ftmp * INV_SQRT_2; - } - } - else - { - for ( n = 0; n < n_samples; n++ ) - { - dmx_pha_data[n] += p_data[n] * INV_SQRT_2; - } - } - } - - for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) - { - dmx_pha_data[n] *= fad_g[n]; - dmx_pha_data[n] += ( mem_prev[n] ) * fad_g[m]; - } - - /* prc switch */ - - curr_prc = hStereoDmxEVS->hPHA->curr_prc; - if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres ) - { - if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_POC ) - { - if ( hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_POC ) - { - hStereoDmxEVS->hPHA->prc_hys_cnt += 1; - } - else - { - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - } - - if ( hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) - { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; - } - } - hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; - } - else - { - if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_PHA ) - { - if ( hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_PHA ) - { - hStereoDmxEVS->hPHA->prc_hys_cnt += 1; - } - else - { - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - } - - if ( hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) - { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; - } - } - hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; - } - - if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) ) - { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - } - - if ( hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC ) - { - p_dmx_data = dmx_poc_data; - - if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc ) - { - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; - fad_g = hStereoDmxEVS->hPHA->fad_g_prc; - - for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) - { - p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += fad_g[m] * dmx_pha_data[n]; - } - } - } - else - { - p_dmx_data = dmx_pha_data; - - if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc ) - { - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; - fad_g = hStereoDmxEVS->hPHA->fad_g_prc; - - for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) - { - p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += fad_g[m] * dmx_poc_data[n]; - } - } - } - - mvr2s( p_dmx_data, data, n_samples ); - -#endif return; } @@ -2118,11 +1723,7 @@ ivas_error stereo_dmx_evs_init_encoder( int16_t n, input_frame; int16_t m, len, pha_len, fad_len, fad_len2, trans_len, itrh, rfft_ipd_coef_step, n0, input_frame_pha; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA float *win, *fad_g, fad_r, tmp_r, a_step, *ipd_ff; -#else - float *win, *fad_g, fad_r, tmp_r, a_min, a_max, a_step, *ipd_ff; -#endif const float *p_ipd_w; input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); @@ -2236,9 +1837,7 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_16; hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_16; hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_16; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_16; -#endif } else if ( input_Fs == 32000 ) { @@ -2246,9 +1845,7 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_32; hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_32; hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_32; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_32; -#endif } else if ( input_Fs == 48000 ) { @@ -2256,9 +1853,7 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48; hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_48; hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_48; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_48; -#endif } else { @@ -2266,9 +1861,6 @@ ivas_error stereo_dmx_evs_init_encoder( } hStereoDmxEVS->hPHA->pha_len = len / 2; -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - hStereoDmxEVS->hPHA->init_frmCntr = (int16_t) ( FRAMES_PER_SEC * 0.2f ); -#endif hStereoDmxEVS->hPHA->isd_rate_s = 0.0f; hStereoDmxEVS->hPHA->iccr_s = 0.0f; @@ -2276,21 +1868,13 @@ ivas_error stereo_dmx_evs_init_encoder( fad_len = hStereoDmxEVS->hPHA->fad_len; trans_len = (int16_t) ( (float) pha_len / 20.0f ); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA set_f( hStereoDmxEVS->hPHA->win, STEREO_DMX_EVS_PHA_WND_C, pha_len - trans_len ); -#else - set_f( hStereoDmxEVS->hPHA->win, 1.8f, pha_len - trans_len ); -#endif hStereoDmxEVS->hPHA->win[0] = 1.0f; tmp_r = 1.0f / ( ( trans_len * 2 ) + 1 ); win = &( hStereoDmxEVS->hPHA->win[pha_len - trans_len] ); for ( n = 0; n < trans_len; n++ ) { -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA win[n] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ) * STEREO_DMX_EVS_PHA_WND_C; -#else - win[n] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ) * 1.8f; -#endif } fad_g = hStereoDmxEVS->hPHA->fad_g; @@ -2306,7 +1890,6 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD; hStereoDmxEVS->hPHA->pha_hys_cnt = 0; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->pha_ipd_chan_cnt = 0; hStereoDmxEVS->hPHA->pha_ipd_chan_thresh = 10; @@ -2337,29 +1920,6 @@ ivas_error stereo_dmx_evs_init_encoder( { ipd_ff[n] = STEREO_DMX_EVS_IFF_AMIN; } -#else - - /* Compute the forgetting factor */ - a_min = 0.8576958985908941f; - a_max = 0.9440608762859234f; - itrh = (int16_t) ( ( 3000 * input_frame ) / ( input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE ) ); /* 3kHz */ - n0 = L_FRAME16k / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE ); - a_step = ( a_min - a_max ) / ( n0 + 1 - itrh ); - ipd_ff = hStereoDmxEVS->hPHA->ipd_ff; - for ( n = 0; n < itrh; n++ ) - { - ipd_ff[n] = a_max; - } - for ( ; n < ( n0 + 1 ); n++ ) /* 8kHz */ - { - ipd_ff[n] = a_max + ( n - itrh ) * a_step; - } - for ( ; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++ ) - { - ipd_ff[n] = a_min; - } - -#endif set_f( hStereoDmxEVS->hPHA->Pr, 1.0, STEREO_DMX_EVS_NB_SUBBAND_MAX ); set_zero( hStereoDmxEVS->hPHA->Pi, STEREO_DMX_EVS_NB_SUBBAND_MAX ); @@ -2399,12 +1959,7 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prc_hys_cnt = 0; -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f ); - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; -#else fad_len = input_frame; -#endif fad_g = hStereoDmxEVS->hPHA->fad_g_prc; fad_r = 1.0f / (float) ( fad_len + 1 ); @@ -2420,7 +1975,6 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->trns_aux_energy[n] = 0.0f; } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->n_fad_g = input_frame; hStereoDmxEVS->hPHA->n_fad_cnt = 0; @@ -2433,7 +1987,6 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->dmx_pha_ener = 0.0f; hStereoDmxEVS->hPHA->dmx_poc_ener = 0.0f; -#endif *hStereoDmxEVS_out = hStereoDmxEVS; -- GitLab From 130ba3bc58ba2f8b21313f097224ee3a78a952cb Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 21 Feb 2024 13:54:54 +0100 Subject: [PATCH 360/601] [cleanup] accept NONBE_FIX_947_STEREO_DMX_FADOPT --- lib_com/options.h | 1 - lib_enc/ivas_stereo_dmx_evs.c | 23 ----------------------- 2 files changed, 24 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index c619a7e3a2..b5c9fdc074 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,7 +171,6 @@ /* all switches in this category should start with "NONBE_" */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ -#define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ #ifdef SPLIT_REND_WITH_HEAD_ROT diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index e653022c83..849c90d442 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -1359,11 +1359,7 @@ void stereo_dmx_evs_enc( { float dmx_weight, corr; -#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT int16_t k, m, n, pha_len, fad_len, input_subframe, input_frame, n_fad_r, n_fad_g, m_fad_g, n_fad_cnt, sbfad_len; -#else - int16_t k, m, n, pha_len, fad_len, input_subframe, input_frame, n_fad_r, n_fad_g, m_fad_g, n_fad_cnt; -#endif float data_f[CPE_CHANNELS][L_FRAME48k]; float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; @@ -1609,11 +1605,7 @@ void stereo_dmx_evs_enc( else { hPHA->n_fad_g = input_frame - hPHA->n_fad_g - 1; -#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT hPHA->n_fad_cnt = 0; -#else - hPHA->n_fad_cnt = is_transient ? 0 : n_fad_r - hPHA->n_fad_cnt; -#endif } } else if ( is_transient ) @@ -1630,7 +1622,6 @@ void stereo_dmx_evs_enc( n_fad_cnt = hPHA->n_fad_cnt; m_fad_g = input_frame - n_fad_g - 1; -#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT if ( n_fad_r == 1 ) { n_fad_cnt = 0; @@ -1682,20 +1673,6 @@ void stereo_dmx_evs_enc( } } } -#else - for ( n = 0; n < fad_len; n++ ) - { - p_dmx_data[n] *= fad_g[n_fad_g]; - p_dmx_data[n] += fad_g[m_fad_g] * p_dmx_data_fo[n]; - - if ( ++n_fad_cnt == n_fad_r ) - { - n_fad_cnt = 0; - n_fad_g++; - m_fad_g--; - } - } -#endif hPHA->n_fad_g = n_fad_g; hPHA->n_fad_cnt = n_fad_cnt; -- GitLab From 938f6cd1e8d6caf0810be7a582fe63595304307c Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 21 Feb 2024 13:56:24 +0100 Subject: [PATCH 361/601] [cleanup] accept NONBE_FIX_982_OMASA_DELAY_COMP_5MS --- lib_com/ivas_cnst.h | 2 - lib_com/options.h | 1 - lib_dec/ivas_ism_renderer.c | 10 ----- lib_dec/ivas_jbm_dec.c | 2 - lib_dec/ivas_omasa_dec.c | 45 -------------------- lib_rend/ivas_dirac_dec_binaural_functions.c | 4 -- 6 files changed, 64 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e409c2a891..db4e1a7c5b 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1225,9 +1225,7 @@ enum #define MASA_BIT_REDUCT_PARAM 10 #define MASA_MAXIMUM_TWO_DIR_BANDS 24 #define NBITS_HR_COH 4 -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS #define OMASA_TDREND_MATCHING_GAIN 0.7943f -#endif #define MASA_JBM_RINGBUFFER_FRAMES 3 diff --git a/lib_com/options.h b/lib_com/options.h index b5c9fdc074..a61c381a5e 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,7 +171,6 @@ /* all switches in this category should start with "NONBE_" */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ -#define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ #ifdef SPLIT_REND_WITH_HEAD_ROT #define SPLIT_REND_LCLD_5MS /* Dlb: LCLD 5ms framing operation */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index b2a7231771..3dbc6a6190 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -523,16 +523,6 @@ void ivas_omasa_separate_object_render_jbm( for ( obj = 0; obj < num_objects; obj++ ) { -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - /* Delay the signal to match CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ - if ( slots_rendered == 0 ) - { - int16_t tcBufferSize; - - tcBufferSize = hSpatParamRendCom->num_slots * hSpatParamRendCom->slot_size; - delay_signal( input_f[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer[obj], st_ivas->hMasaIsmData->delayBuffer_size ); - } -#endif offsetSamples = 0; for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 36ce6117b3..89aa3f8d4c 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -934,7 +934,6 @@ void ivas_jbm_dec_feed_tc_to_renderer( ivas_ism_dec_digest_tc( st_ivas ); } -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC ) { int16_t num_objects; @@ -957,7 +956,6 @@ void ivas_jbm_dec_feed_tc_to_renderer( delay_signal( st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size ); } } -#endif #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT } #endif diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 75c5d97e22..ab032e2440 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -45,16 +45,6 @@ #endif #include "wmc_auto.h" -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS -/*------------------------------------------------------------------------- - * Local constants - *------------------------------------------------------------------------*/ - -#define OMASA_TDREND_MATCHING_GAIN 0.7943f -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT -#define EXT_RENDER_IIR_FAC 0.95f -#endif -#else #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /*------------------------------------------------------------------------- * Local constants @@ -62,7 +52,6 @@ #define EXT_RENDER_IIR_FAC 0.95f #endif -#endif /*-------------------------------------------------------------------* * ivas_omasa_data_open() @@ -747,34 +736,22 @@ void ivas_omasa_dirac_rend_jbm( int16_t n; float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS if ( !st_ivas->hDecoderConfig->Opt_tsm ) { *nSamplesRendered = min( nSamplesAsked, st_ivas->hTcBuffer->n_samples_available ); -#endif if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS mvr2r( &output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered ); -#else - mvr2r( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); -#endif } else { for ( n = 0; n < st_ivas->nchan_ism; n++ ) { -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS mvr2r( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered ); -#else - mvr2r( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); -#endif } } -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS } -#endif subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; @@ -804,36 +781,14 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( { int16_t n; float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - float gain = OMASA_TDREND_MATCHING_GAIN; -#endif ivas_error error; float *p_sepobj[MAX_NUM_OBJECTS]; -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - float *tc_local[MAX_TRANSPORT_CHANNELS]; -#endif for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) { p_sepobj[n] = &data_separated_objects[n][0]; } -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - /* Delay the object signals to match the CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ - if ( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) - { - int16_t tcBufferSize; - - tcBufferSize = st_ivas->hSpatParamRendCom->num_slots * st_ivas->hSpatParamRendCom->slot_size; - - for ( n = 0; n < st_ivas->nchan_ism; n++ ) - { - tc_local[n] = st_ivas->hTcBuffer->tc[n + 2]; - v_multc( tc_local[n], gain, tc_local[n], tcBufferSize ); - delay_signal( tc_local[n], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size ); - } - } -#endif ivas_dirac_dec_binaural_render( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, nchan_transport, output_f ); /* reset combined orientation access index before calling the td renderer */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index e0a4dc9549..7df3979328 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -2138,11 +2138,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( if ( ivas_format == MASA_ISM_FORMAT ) { -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS gainFactor = OMASA_TDREND_MATCHING_GAIN * sqrtf( hDiracDecBin->earlyPartEneCorrection[bin] ); -#else - gainFactor = 0.7943f * sqrtf( hDiracDecBin->earlyPartEneCorrection[bin] ); -#endif } else { -- GitLab From aa0fbf05e7265c6aca0311e01991915e97e8bf91 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 21 Feb 2024 13:59:20 +0100 Subject: [PATCH 362/601] Combined room acoustics configuration added --- scripts/testv/rend_config_combined.cfg | 101 +++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 scripts/testv/rend_config_combined.cfg diff --git a/scripts/testv/rend_config_combined.cfg b/scripts/testv/rend_config_combined.cfg new file mode 100644 index 0000000000..37c76d0dd1 --- /dev/null +++ b/scripts/testv/rend_config_combined.cfg @@ -0,0 +1,101 @@ +[directivitySetting] +directivityCount = 4; + +[directivityPattern:0] +directivity = [0.0, 360.0, 0.2512] +[directivityPattern:1] +directivity = [0.0, 360.0, 0.5] +[directivityPattern:2] +directivity = [15.0, 345.0, 0.701] +[directivityPattern:3] +directivity = [90.0, 270.0, 0.1] + +[roomAcoustics] +frequencyGridCount = 2; +acousticEnvironmentCount = 3; + +[frequencyGrid:0] +method = individualFrequencies; +nrBands = 31; +frequencies = [20.0, 25.0, 31.5, 40.0, + 50.0, 63.0, 80.0, 100.0, + 125.0, 160.0, 200.0, 250.0, + 315.0, 400.0, 500.0, 630.0, + 800.0, 1000.0, 1250.0, 1600.0, + 2000.0, 2500.0, 3150.0, 4000.0, + 5000.0, 6300.0, 8000.0, 10000.0, + 12500.0, 16000.0, 20000.0]; + +[frequencyGrid:1] +method = individualFrequencies; +nrBands = 24; +frequencies = [50.0, 63.0, 80.0, 100.0, + 125.0, 160.0, 200.0, 250.0, + 315.0, 400.0, 500.0, 630.0, + 800.0, 1000.0, 1250.0, 1600.0, + 2000.0, 2500.0, 3150.0, 4000.0, + 5000.0, 6300.0, 8000.0, 10000.0]; + +[acousticEnvironment:0] +frequencyGridIndex = 0; +predelay = 0.1; +rt60 = [1.3622, 1.4486, 1.3168, 1.5787, + 1.4766, 1.3954, 1.2889, 1.3462, + 1.0759, 1.0401, 1.0970, 1.0850, + 1.0910, 1.0404, 1.0499, 1.0699, + 1.1028, 1.1714, 1.1027, 1.0666, + 1.0550, 1.0553, 1.0521, 1.0569, + 1.0421, 0.97822, 0.80487, 0.75944, + 0.71945, 0.61682, 0.60031]; + +dsr = [1.8811e-08, 2.1428e-08, 1.3972e-08, 1.51e-08, + 1.287e-08, 1.8747e-08, 2.413e-08, 3.9927e-08, + 8.9719e-08, 1.902e-07, 3.702e-07, 6.1341e-07, + 7.1432e-07, 6.5331e-07, 4.6094e-07, 5.4683e-07, + 7.0134e-07, 6.856e-07, 7.114e-07, 6.9604e-07, + 5.2939e-07, 5.699e-07, 6.1773e-07, 5.7488e-07, + 4.7748e-07, 2.7213e-07, 1.3681e-07, 1.0941e-07, + 6.2001e-08, 2.8483e-08, 2.6267e-08]; + +[acousticEnvironment:1] +frequencyGridIndex = 1; +predelay = 0.108; +rt60 = [0.87, 0.66, 0.47, 0.41, + 0.32, 0.37, 0.28, 0.30, + 0.29, 0.29, 0.28, 0.30, + 0.31, 0.34, 0.34, 0.34, + 0.34, 0.33, 0.32, 0.29, + 0.28, 0.24, 0.24, 0.2]; + +dsr = [2.511887e-07, 1e-07, 1.2589251e-07, 1e-07, + 5.01187e-08, 5.01187e-08, 7.9432844e-08, 1e-07, + 6.309576e-08, 5.01187e-08, 7.9432844e-08, 1e-07, + 5.01187e-08, 1e-07, 7.9432844e-08, 6.309576e-08, + 7.9432844e-08, 5.01187e-08, 6.309576e-08, 3.9810708e-08, + 3.9810708e-08, 2.511887e-08, 1.9952632e-08, 1.2589251e-08]; + +earlyReflectionsSize = [4.0, 4.0, 5.0]; +absorptionCoeffs = [ 0.1, 0.2, 0.2, 0.2, 0.1, 0.1 ]; +lowComplexity = TRUE; +listenerOrigin = [-1, 0.5, 1.5]; + +[acousticEnvironment:2] +frequencyGridIndex = 1; +predelay = 0.108; +rt60 = [0.87, 0.66, 0.47, 0.41, + 0.32, 0.37, 0.28, 0.30, + 0.29, 0.29, 0.28, 0.30, + 0.31, 0.34, 0.34, 0.34, + 0.34, 0.33, 0.32, 0.29, + 0.28, 0.24, 0.24, 0.2]; + +dsr = [2.511887e-07, 1e-07, 1.2589251e-07, 1e-07, + 5.01187e-08, 5.01187e-08, 7.9432844e-08, 1e-07, + 6.309576e-08, 5.01187e-08, 7.9432844e-08, 1e-07, + 5.01187e-08, 1e-07, 7.9432844e-08, 6.309576e-08, + 7.9432844e-08, 5.01187e-08, 6.309576e-08, 3.9810708e-08, + 3.9810708e-08, 2.511887e-08, 1.9952632e-08, 1.2589251e-08]; + +earlyReflectionsSize = [3.0, 3.0, 4.0]; +absorptionCoeffs = [ 0.3, 0.2, 0.2, 0.2, 0.3, 0.1 ]; +lowComplexity = FALSE; -- GitLab From 5a911a6c9d2a0f7d77a47ccfcb7aa8db4d25e04e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 21 Feb 2024 14:03:21 +0100 Subject: [PATCH 363/601] formatting --- lib_com/options.h | 1 - lib_enc/ivas_stereo_dmx_evs.c | 13 +++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a61c381a5e..49d3c4b0fb 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,7 +163,6 @@ - /* #################### End BE switches ################################## */ /* #################### Start NON-BE switches ############################ */ diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 849c90d442..d4f280fb84 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -58,7 +58,7 @@ #define STEREO_DMX_EVS_POC_FORGETTING 0.78f #define STEREO_DMX_EVS_TARGET_POC_FORGETTING 0.79f #define STEREO_DMX_EVS_POC_W_FORGETTING 0.875f -#define STEREO_DMX_EVS_SHIFT_LIMIT STEREO_DFT_ZP_NS_ENC +#define STEREO_DMX_EVS_SHIFT_LIMIT STEREO_DFT_ZP_NS_ENC #define STEREO_DMX_EVS_DMX_EGY_FORGETTING 0.25f #define STEREO_DMX_EVS_CORR_FORGETTING 0.78f @@ -88,10 +88,10 @@ #define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 -#define STEREO_DMX_EVS_IFF_AMIN 0.857696f -#define STEREO_DMX_EVS_IFF_AMAX 0.944061f -#define STEREO_DMX_EVS_IFF_FREQ 3000.0f -#define STEREO_DMX_EVS_PHA_WND_C 1.8f +#define STEREO_DMX_EVS_IFF_AMIN 0.857696f +#define STEREO_DMX_EVS_IFF_AMAX 0.944061f +#define STEREO_DMX_EVS_IFF_FREQ 3000.0f +#define STEREO_DMX_EVS_PHA_WND_C 1.8f #define STEREO_DMX_EVS_NB_SBFRM 5 #define STEREO_DMX_EVS_TRNS_DTC_INST 75.0f @@ -1103,7 +1103,6 @@ static void weighted_ave( } - return; } @@ -1303,7 +1302,6 @@ static void create_M_signal( } - /*-------------------------------------------------------------------* * apply_gain_sgc() * @@ -1342,7 +1340,6 @@ static void apply_gain_sgc( } - /*-------------------------------------------------------------------* * stereo_dmx_evs_enc() * -- GitLab From 822b65bf0e8b234d6adbc0b0d9f69e51a98722f4 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 21 Feb 2024 14:31:53 +0100 Subject: [PATCH 364/601] Additional tests commented out --- scripts/config/self_test.prm | 4 ++-- scripts/config/self_test_ltv.prm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 040434581c..5602c5a619 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -540,8 +540,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48n+non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst // 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bit -../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav +//../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bit +//../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 6c656abdf7..6301755a28 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -540,8 +540,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/ltv48_4ISM_non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst // 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers -../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bi -../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav +//../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bi +//../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching -- GitLab From 3105cd1d67e78fa1faeabdd806331baa7cc73a3e Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 21 Feb 2024 14:54:25 +0100 Subject: [PATCH 365/601] fix ltv command line --- scripts/config/self_test_ltv.prm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 6301755a28..4964cb31c6 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -540,7 +540,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/ltv48_4ISM_non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst // 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers -//../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bi +//../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 128000 48 testv/ltv_4ISM.wav bit //../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav -- GitLab From 037b546bb6b51d364cac82fde6e08b157ee6dcbd Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 21 Feb 2024 15:06:22 +0100 Subject: [PATCH 366/601] improve command lines --- scripts/config/self_test.prm | 2 +- scripts/config/self_test_ltv.prm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 5602c5a619..4d7d53e22e 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -541,7 +541,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers //../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bit -//../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav +//../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 3 0 2 1 BINAURAL_ROOM_REVERB 48 bit testv/stv4ISM48n+combined_render_config_brate_128000-48-binaural_room_reverb.wav // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 4964cb31c6..9a40a073ca 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -540,8 +540,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/ltv48_4ISM_non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst // 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers -//../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 128000 48 testv/ltv_4ISM.wav bit -//../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit out.wav +//../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 128000 48 testv/ltv48_4ISM.wav bit +//../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_4ISM+combined_render_config_brate_128000-48-binaural_room_reverb.wav // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching -- GitLab From b301e223133713bdee5abbb5281f4c3139e374cd Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 21 Feb 2024 15:43:20 +0100 Subject: [PATCH 367/601] scale binaural audio channels down to avoid clipping with BINAURAL_ROOM_REVERB --- lib_com/ivas_prot.h | 4 ++++ lib_com/options.h | 2 ++ lib_dec/ivas_binRenderer_internal.c | 18 ++++++++++++++++++ lib_dec/ivas_dirac_dec.c | 7 ++++++- lib_dec/ivas_mc_param_dec.c | 7 ++++++- lib_dec/ivas_mc_paramupmix_dec.c | 7 ++++++- lib_dec/ivas_output_config.c | 2 +- 7 files changed, 43 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index d0c797e27d..aa94e4e053 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5225,6 +5225,10 @@ void ivas_binRenderer( #endif float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + , + AUDIO_CONFIG output_config /* i : output configuration */ +#endif ); void ivas_binaural_add_LFE( diff --git a/lib_com/options.h b/lib_com/options.h index 60b17001e0..0c51093178 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -191,6 +191,8 @@ #define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ +#define DISABLE_LIMITER + /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index feb59980cf..48e0f13cff 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1916,6 +1916,10 @@ void ivas_binRenderer( #endif float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + , + AUDIO_CONFIG output_config /* i : output configuration */ +#endif ) { int16_t chIdx, k; @@ -2051,6 +2055,20 @@ void ivas_binRenderer( } #endif +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + for ( k = 0; k < numTimeSlots; k++ ) + { + v_multc( Cldfb_RealBuffer_Binaural[chIdx][k], 0.5f, Cldfb_RealBuffer_Binaural[chIdx][k], CLDFB_NO_CHANNELS_MAX ); + v_multc( Cldfb_ImagBuffer_Binaural[chIdx][k], 0.5f, Cldfb_ImagBuffer_Binaural[chIdx][k], CLDFB_NO_CHANNELS_MAX ); + } + } + } +#endif + /* Obtain the binaural dmx and compute the reverb */ if ( hBinRenderer->hReverb != NULL ) { diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index f7f152b738..d41f8376f4 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2407,7 +2407,12 @@ void ivas_dirac_dec_render_sf( #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG NULL, #endif - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + , + st_ivas->hDecoderConfig->output_config +#endif + ); #ifdef SPLIT_REND_WITH_HEAD_ROT if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 45ed71c978..eaab7b4952 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1825,7 +1825,12 @@ void ivas_param_mc_dec_render( #endif st_ivas->hCombinedOrientationData, hParamMC->subframe_nbslots[subframe_idx], - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + , + st_ivas->hDecoderConfig->output_config +#endif + ); #ifdef SPLIT_REND_WITH_HEAD_ROT if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 2ff77228f8..9e9fea7e09 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -830,7 +830,12 @@ static void ivas_mc_paramupmix_dec_sf( st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_subfr, - Cldfb_ImagBuffer_subfr ); + Cldfb_ImagBuffer_subfr +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + , + st_ivas->hDecoderConfig->output_config +#endif + ); #ifdef SPLIT_REND_WITH_HEAD_ROT if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index db8ee3dded..e044aa76e6 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -243,7 +243,7 @@ void ivas_renderer_select( { *renderer_type = RENDERER_BINAURAL_MIXER_CONV; } -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING +#if 0 else if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { *renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM; -- GitLab From d271ebe49edb4660e1bd346c3a4ddf5606fdedf6 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 22 Feb 2024 07:37:55 +0100 Subject: [PATCH 368/601] fix for #1009, fix ISM1 non-diegetic rendering, use the correct offset and buffer for rendering the non-diegetic object, under define FIX_1009_ISM_NONDIEGETIC_PANNING, active --- lib_com/ivas_prot.h | 5 ++++- lib_com/options.h | 2 +- lib_dec/ivas_jbm_dec.c | 4 ++++ lib_dec/ivas_mono_dmx_renderer.c | 11 +++++++++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index d0c797e27d..e091ce7305 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -769,7 +769,10 @@ void dtx_read_padding_bits( ); void ivas_apply_non_diegetic_panning( - float *output_f[], /* i/o: core-coder transport mono channel/stereo output */ +#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING + float *input_f, /* i : non-diegetic object */ +#endif + float *output_f[], /* o : core-coder transport mono channel/stereo output */ const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ const int16_t output_frame /* i : output frame length per channel */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 49d3c4b0fb..28fa2ff746 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -160,7 +160,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ - +#define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 89aa3f8d4c..6f4fb2f1cc 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1120,7 +1120,11 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { +#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING + ivas_apply_non_diegetic_panning( p_tc[0], p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); +#else ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); +#endif } #ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) diff --git a/lib_dec/ivas_mono_dmx_renderer.c b/lib_dec/ivas_mono_dmx_renderer.c index ffe5cb54be..7b6552707a 100644 --- a/lib_dec/ivas_mono_dmx_renderer.c +++ b/lib_dec/ivas_mono_dmx_renderer.c @@ -221,7 +221,10 @@ void ivas_mono_stereo_downmix_mcmasa( *------------------------------------------------------------------------*/ void ivas_apply_non_diegetic_panning( - float *output_f[], /* i/o: core-coder transport mono channel/stereo output */ +#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING + float *input_f, /* i : non-diegetic object */ +#endif + float *output_f[], /* o : core-coder transport mono channel/stereo output */ const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ const int16_t output_frame /* i : output frame length per channel */ ) @@ -230,9 +233,13 @@ void ivas_apply_non_diegetic_panning( pan_left = ( non_diegetic_pan_gain + 1.f ) * 0.5f; pan_right = 1.f - pan_left; - +#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING + v_multc( input_f, pan_right, output_f[1], output_frame ); + v_multc( input_f, pan_left, output_f[0], output_frame ); +#else v_multc( output_f[0], pan_right, output_f[1], output_frame ); v_multc( output_f[0], pan_left, output_f[0], output_frame ); +#endif return; } -- GitLab From 8a9b8ecfa3646476dd931aece3d465b2455a4cf8 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 10:36:41 +0100 Subject: [PATCH 369/601] split collected logs by PLC/noPLC --- ci/collect_artifacts.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ci/collect_artifacts.py b/ci/collect_artifacts.py index e665d75f16..29705dfc3d 100755 --- a/ci/collect_artifacts.py +++ b/ci/collect_artifacts.py @@ -37,16 +37,20 @@ def collect_for_sanitizer_test(file): with open(file) as f: console_log = f.readlines() - files_to_archive_noPLC = find_failed_files_for_sanitizer_test( - console_log, "logs_noPLC" - ) - files_to_archive = find_failed_files_for_sanitizer_test(console_log, "logs") + start_indicators = ["Adding config" in l for l in console_log] + idx_first_run = start_indicators.index(True) + idx_second_run = start_indicators[idx_first_run + 1:].index(True) + no_plc_part = console_log[idx_first_run:idx_second_run] + plc_part = console_log[idx_second_run:] + + files_to_archive_noPLC = find_failed_files_for_sanitizer_test(no_plc_part) + files_to_archive_PLC = find_failed_files_for_sanitizer_test(plc_part) log_folder = pathlib.Path("./LOGS_PLC") log_folder.mkdir() - for test in files_to_archive.keys(): + for test in files_to_archive_PLC.keys(): log_folder.joinpath(test).mkdir() - for test, files in files_to_archive.items(): + for test, files in files_to_archive_PLC.items(): folder = log_folder.joinpath(test) for p in files: source = pathlib.Path(p) -- GitLab From 0196b5dfe1a8a627c9b2e4bd5edb7410715392df Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 10:41:11 +0100 Subject: [PATCH 370/601] replace subfolder name for noPLC log file copying --- ci/collect_artifacts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/collect_artifacts.py b/ci/collect_artifacts.py index 29705dfc3d..ee5700b24a 100755 --- a/ci/collect_artifacts.py +++ b/ci/collect_artifacts.py @@ -64,7 +64,7 @@ def collect_for_sanitizer_test(file): for test, files in files_to_archive_noPLC.items(): folder = log_folder_noPLC.joinpath(test) for p in files: - source = pathlib.Path(p) + source = pathlib.Path(p.replace("/logs/", "/logs_noPLC/")) target = folder.joinpath(source.name) source.rename(target) -- GitLab From 3434463896c498597734a137b959090dd3b81e16 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 11:04:23 +0100 Subject: [PATCH 371/601] fix indexing --- ci/collect_artifacts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/collect_artifacts.py b/ci/collect_artifacts.py index ee5700b24a..c67445e51c 100755 --- a/ci/collect_artifacts.py +++ b/ci/collect_artifacts.py @@ -39,7 +39,7 @@ def collect_for_sanitizer_test(file): start_indicators = ["Adding config" in l for l in console_log] idx_first_run = start_indicators.index(True) - idx_second_run = start_indicators[idx_first_run + 1:].index(True) + idx_second_run = start_indicators[idx_first_run + 1:].index(True) + idx_first_run + 1 no_plc_part = console_log[idx_first_run:idx_second_run] plc_part = console_log[idx_second_run:] -- GitLab From 30a249b13af15d640dcc632d01c018cdf81e8fd7 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 22 Feb 2024 13:00:37 +0100 Subject: [PATCH 372/601] Fix for botched merge of options.h --- lib_com/options.h | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 22b35e05db..a4741e2861 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,6 +153,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ +#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI /* FhG: fix and undef behaviour bug in the harmonic TCX model arithmetic coder */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ @@ -170,18 +171,6 @@ /* all switches in this category should start with "NONBE_" */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ -#define BE_FIX_567_DOUBLE_STEREO_DMX /* NTT: Fix formal issues */ -#define NONBE_FIX_567_DOUBLE_STEREO_DMX /* Orange: Double-precision replaced by single-precision */ -#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ -#define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC -#define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ -#endif -#define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA -#define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ -#endif -#define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ #ifdef SPLIT_REND_WITH_HEAD_ROT #define SPLIT_REND_LCLD_5MS /* Dlb: LCLD 5ms framing operation */ -- GitLab From 965ba198c416b89e103ce33eec2a128e3f261817 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 22 Feb 2024 14:35:08 +0100 Subject: [PATCH 373/601] Added test cases for a combined renderer configuration file --- scripts/config/self_test.prm | 4 ++-- scripts/config/self_test_ltv.prm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 4d7d53e22e..f9782c2226 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -540,8 +540,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48n+non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst // 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers -//../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bit -//../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 3 0 2 1 BINAURAL_ROOM_REVERB 48 bit testv/stv4ISM48n+combined_render_config_brate_128000-48-binaural_room_reverb.wav +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bit +../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 3 0 2 1 BINAURAL_ROOM_REVERB 48 bit testv/stv4ISM48n+combined_render_config_brate_128000-48-binaural_room_reverb.wav // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 9a40a073ca..6b46f668f7 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -540,8 +540,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL 48 bit testv/ltv48_4ISM_non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst // 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers -//../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 128000 48 testv/ltv48_4ISM.wav bit -//../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_4ISM+combined_render_config_brate_128000-48-binaural_room_reverb.wav +../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 128000 48 testv/ltv48_4ISM.wav bit +../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 0 0 0 0 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_4ISM+combined_render_config_brate_128000-48-binaural_room_reverb.wav // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out, bandwidth switching -- GitLab From a8dede3c41a2ee71b0ea5a5f931b9823fc7b5fba Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 22 Feb 2024 15:23:20 +0100 Subject: [PATCH 374/601] Revert "scale binaural audio channels down to avoid clipping with BINAURAL_ROOM_REVERB" This reverts commit b301e223133713bdee5abbb5281f4c3139e374cd. --- lib_com/ivas_prot.h | 4 ---- lib_com/options.h | 2 -- lib_dec/ivas_binRenderer_internal.c | 37 ----------------------------- lib_dec/ivas_dirac_dec.c | 7 +----- lib_dec/ivas_mc_param_dec.c | 7 +----- lib_dec/ivas_mc_paramupmix_dec.c | 7 +----- lib_dec/ivas_output_config.c | 2 +- 7 files changed, 4 insertions(+), 62 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index aa94e4e053..d0c797e27d 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5225,10 +5225,6 @@ void ivas_binRenderer( #endif float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - AUDIO_CONFIG output_config /* i : output configuration */ -#endif ); void ivas_binaural_add_LFE( diff --git a/lib_com/options.h b/lib_com/options.h index 12f4434116..073500f5b0 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -180,8 +180,6 @@ #define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ -#define DISABLE_LIMITER - /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 97a90171fd..7cbcf2dba4 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1916,10 +1916,6 @@ void ivas_binRenderer( #endif float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - AUDIO_CONFIG output_config /* i : output configuration */ -#endif ) { int16_t chIdx, k; @@ -2053,39 +2049,6 @@ void ivas_binRenderer( } } } -#endif - -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - -#ifdef SPLIT_REND_WITH_HEAD_ROT - if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { - for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) - { - for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) - { - for ( k = 0; k < numTimeSlots; k++ ) - { - v_multc( Cldfb_RealBuffer_Binaural[pos_idx][chIdx][k], 0.5f, Cldfb_RealBuffer_Binaural[pos_idx][chIdx][k], hBinRenderer->conv_band ); - v_multc( Cldfb_ImagBuffer_Binaural[pos_idx][chIdx][k], 0.5f, Cldfb_ImagBuffer_Binaural[pos_idx][chIdx][k], hBinRenderer->conv_band ); - } - } - } - } -#else - if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { - for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) - { - for ( k = 0; k < numTimeSlots; k++ ) - { - v_multc( Cldfb_RealBuffer_Binaural[chIdx][k], 0.5f, Cldfb_RealBuffer_Binaural[chIdx][k], hBinRenderer->conv_band ); - v_multc( Cldfb_ImagBuffer_Binaural[chIdx][k], 0.5f, Cldfb_ImagBuffer_Binaural[chIdx][k], hBinRenderer->conv_band ); - } - } - } -#endif - #endif /* Obtain the binaural dmx and compute the reverb */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index d41f8376f4..f7f152b738 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2407,12 +2407,7 @@ void ivas_dirac_dec_render_sf( #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG NULL, #endif - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - st_ivas->hDecoderConfig->output_config -#endif - ); + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #ifdef SPLIT_REND_WITH_HEAD_ROT if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index eaab7b4952..45ed71c978 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1825,12 +1825,7 @@ void ivas_param_mc_dec_render( #endif st_ivas->hCombinedOrientationData, hParamMC->subframe_nbslots[subframe_idx], - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - st_ivas->hDecoderConfig->output_config -#endif - ); + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #ifdef SPLIT_REND_WITH_HEAD_ROT if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 9e9fea7e09..2ff77228f8 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -830,12 +830,7 @@ static void ivas_mc_paramupmix_dec_sf( st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_subfr, - Cldfb_ImagBuffer_subfr -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - st_ivas->hDecoderConfig->output_config -#endif - ); + Cldfb_ImagBuffer_subfr ); #ifdef SPLIT_REND_WITH_HEAD_ROT if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index e044aa76e6..db8ee3dded 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -243,7 +243,7 @@ void ivas_renderer_select( { *renderer_type = RENDERER_BINAURAL_MIXER_CONV; } -#if 0 +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING else if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { *renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM; -- GitLab From 2ad0fa862aa7bd143b3e07c7023e49ebcbf65342 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 22 Feb 2024 15:36:21 +0100 Subject: [PATCH 375/601] remove left-overs from experimantal binaural-signal scaling --- lib_dec/ivas_binRenderer_internal.c | 21 +++------------------ lib_rend/ivas_prot_rend.h | 4 ---- lib_rend/lib_rend.c | 28 ++++------------------------ 3 files changed, 7 insertions(+), 46 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 7cbcf2dba4..feb59980cf 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -2114,12 +2114,7 @@ void ivas_rend_CldfbMultiBinRendProcess( float Cldfb_Out_Real[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_Out_Imag[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t low_res_pre_rend_rot, - const int16_t num_subframes -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - AUDIO_CONFIG output_config /* i : output configuration */ -#endif -) + const int16_t num_subframes ) { int16_t slot_idx, ch_idx, idx, pose_idx, i, j; int16_t sf_idx; @@ -2169,19 +2164,9 @@ void ivas_rend_CldfbMultiBinRendProcess( #endif #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG - ivas_binRenderer( hCldfbRend, pMultiBinPoseData, *pCombinedOrientationData, MAX_PARAM_SPATIAL_SUBFRAMES, &head_track_post, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_sfIn, Cldfb_ImagBuffer_sfIn -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - output_config -#endif - ); + ivas_binRenderer( hCldfbRend, pMultiBinPoseData, *pCombinedOrientationData, MAX_PARAM_SPATIAL_SUBFRAMES, &head_track_post, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_sfIn, Cldfb_ImagBuffer_sfIn ); #else - ivas_binRenderer( hCldfbRend, pMultiBinPoseData, *pCombinedOrientationData, MAX_PARAM_SPATIAL_SUBFRAMES, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_sfIn, Cldfb_ImagBuffer_sfIn -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - output_config -#endif - ); + ivas_binRenderer( hCldfbRend, pMultiBinPoseData, *pCombinedOrientationData, MAX_PARAM_SPATIAL_SUBFRAMES, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer_sfIn, Cldfb_ImagBuffer_sfIn ); #endif for ( pose_idx = 0; pose_idx < hCldfbRend->numPoses; pose_idx++ ) { diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index cb760871e8..975a2356aa 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1901,10 +1901,6 @@ void ivas_rend_CldfbMultiBinRendProcess( float Cldfb_Out_Imag[MAX_HEAD_ROT_POSES*BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t low_res_pre_rend_rot, const int16_t num_subframes -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - AUDIO_CONFIG output_config /* i : output configuration */ -#endif ); ivas_error ivas_rend_openCldfb( diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index d89abbb9a4..8194de9fba 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -7316,12 +7316,7 @@ static ivas_error renderSbaToMultiBinauralCldfb( float Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t low_res_pre_rend_rot, - const int16_t num_subframes -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - AUDIO_CONFIG output_config /* i : output configuration */ -#endif -) + const int16_t num_subframes ) { float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; @@ -7329,12 +7324,7 @@ static ivas_error renderSbaToMultiBinauralCldfb( copyBufferToCLDFBarray( sbaInput->base.inputBuffer, Cldfb_RealBuffer, Cldfb_ImagBuffer ); ivas_rend_CldfbMultiBinRendProcess( sbaInput->cldfbRendWrapper.hCldfbRend, sbaInput->base.ctx.pCombinedOrientationData, &sbaInput->base.ctx.pSplitRendWrapper->multiBinPoseData, - Cldfb_RealBuffer, Cldfb_ImagBuffer, Cldfb_Out_Real, Cldfb_Out_Imag, low_res_pre_rend_rot, num_subframes -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - output_config -#endif - ); + Cldfb_RealBuffer, Cldfb_ImagBuffer, Cldfb_Out_Real, Cldfb_Out_Imag, low_res_pre_rend_rot, num_subframes ); return IVAS_ERR_OK; } @@ -7359,12 +7349,7 @@ static ivas_error renderSbaToSplitBinaural( if ( sbaInput->base.ctx.hhRendererConfig[0]->split_rend_config.rendererSelection == IVAS_SPLIT_REND_RENDERER_SELECTION_FASTCONV ) { if ( ( renderSbaToMultiBinauralCldfb( sbaInput, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, low_res_pre_rend_rot, - getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - outConfig -#endif - ) ) != IVAS_ERR_OK ) + getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) { return error; } @@ -7409,12 +7394,7 @@ static ivas_error renderSbaToBinaural( float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; if ( ( error = renderSbaToMultiBinauralCldfb( sbaInput, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, 0, - getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - , - outConfig -#endif - ) ) != IVAS_ERR_OK ) + getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From f6a9546fa79d3115cddba176cc4661d3874d66f2 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 22 Feb 2024 15:44:16 +0100 Subject: [PATCH 376/601] do not swith do BRIRs for BINAURAL_ROOM_REVERB --- lib_dec/ivas_output_config.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index db8ee3dded..1e31f0aac4 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -243,12 +243,6 @@ void ivas_renderer_select( { *renderer_type = RENDERER_BINAURAL_MIXER_CONV; } -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING - else if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { - *renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM; - } -#endif else { *renderer_type = RENDERER_BINAURAL_FASTCONV; -- GitLab From 69821972c1cb847b7c6b2a6c4618260c7040cc15 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 22 Feb 2024 16:09:30 +0100 Subject: [PATCH 377/601] update switch to SPLIT_REND_WITH_HEAD_ROT_DEBUG --- lib_util/render_config_reader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index f9bceea7f6..678f760a0b 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2460,7 +2460,7 @@ ivas_error RenderConfigReader_read( while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) { params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); -#ifdef DEBUGGING +#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG fprintf( stderr, " PARAM: %s -> %s\n", item, pValue ); #endif if ( strcmp( item, "CODECDELAY" ) == 0 ) -- GitLab From 2842e8b1206b77e04f041e01b261fbf8065bea56 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 16:45:13 +0100 Subject: [PATCH 378/601] introduce yaml anchor for sanitizer tests and add ltv sanitizer jobs --- .gitlab-ci.yml | 160 +++++++++++++++++++++++++++---------------------- 1 file changed, 90 insertions(+), 70 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8665784309..c3a516a643 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -182,6 +182,20 @@ stages: - (Get-Content -Path "CMakeLists.txt") -replace '# \(add_compile_options\("\/WX"\)\)', '$1' | Set-Content -Path "CMakeLists.txt" - Get-ChildItem -Path "Workspace_msvc" -Filter "*.vcxproj" | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'false', 'true' | Set-Content -Path $_.FullName } +# to be reused in MR and LTV-scheduled sanitizer test jobs +# set CLANG_NUM and SELF_TEST_PRM_FILE in before_script section +.sanitizer-selftest-anchor: &sanitizer-selftest-anchor + stage: test + needs: ["build-codec-sanitizers-linux"] + script: + - *print-common-info + - *copy-ltv-files-to-testv-dir + - make clean + - make -j CLANG=$CLANG_NUM + - testcase_timeout=180 + - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 python3 -m pytest $SELF_TEST_PRM_FILE -v --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec + + # --------------------------------------------------------------- # Job templates # --------------------------------------------------------------- @@ -249,6 +263,38 @@ stages: - python3 scripts/prepare_combined_format_inputs.py - cp -r scripts/testv/* $TESTV_DIR/ +.sanitizer-selftest-on-mr: + extends: + - .test-job-linux-needs-testv-dir + - .rules-merge-request + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + - report.html + expose_as: "$CI_JOB_NAME selftest results" + reports: + junit: + - report-junit.xml + +.sanitizer-selftest-ltv: + extends: + - .test-job-linux-needs-testv-dir + - .rules-main-scheduled + artifacts: + name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" + expire_in: 2 week + when: always + paths: + - report-junit.xml + - report.html + expose_as: "$CI_JOB_NAME selftest results" + reports: + junit: + - report-junit.xml + # --------------------------------------------------------------- # .pre jobs for setting up things # --------------------------------------------------------------- @@ -443,83 +489,29 @@ codec-smoke-test: # code selftest testvectors with memory-sanitizer binaries codec-msan: extends: - - .test-job-linux-needs-testv-dir - - .rules-merge-request - stage: test - needs: ["build-codec-sanitizers-linux"] - script: - - *print-common-info - - make clean - - make -j CLANG=1 - - testcase_timeout=180 - - exit_code=0 - - python3 -m pytest tests/codec_be_on_mr_nonselection/test_param_file.py -v --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code=$? - - if [ $exit_code != 0 ] ; then echo "Run errors found by Clang memory-sanitizer"; exit 1; fi - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "msan selftest results" - reports: - junit: - - report-junit.xml + - .sanitizer-selftest-on-mr + before_script: + - CLANG_NUM=1 + - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" + <<: *sanitizer-selftest-anchor # code selftest testvectors with address-sanitizer binaries codec-asan: extends: - - .test-job-linux-needs-testv-dir - - .rules-merge-request - stage: test - needs: ["build-codec-sanitizers-linux"] - script: - - *print-common-info - - make clean - - make -j CLANG=2 - - testcase_timeout=180 - - exit_code=0 - - python3 -m pytest tests/codec_be_on_mr_nonselection/test_param_file.py -v --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code=$? - - if [ $exit_code != 0 ] ; then echo "Run errors found by Clang address-sanitizer"; exit 1; fi - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "asan selftest results" - reports: - junit: - - report-junit.xml + - .sanitizer-selftest-on-mr + before_script: + - CLANG_NUM=2 + - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" + <<: *sanitizer-selftest-anchor -# code selftest testvectors with address-sanitizer binaries +# code selftest testvectors with undefined-behaviour-sanitizer binaries codec-usan: extends: - - .test-job-linux-needs-testv-dir - - .rules-merge-request - stage: test - needs: ["build-codec-sanitizers-linux"] - script: - - *print-common-info - - make clean - - make -j CLANG=3 - - testcase_timeout=180 - - exit_code=0 - - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 python3 -m pytest tests/codec_be_on_mr_nonselection/test_param_file.py -v --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code=$? - - if [ $exit_code != 0 ] ; then echo "Run errors found by Clang undefined-behavior-sanitizer"; exit 1; fi - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "usan selftest results" - reports: - junit: - - report-junit.xml + - .sanitizer-selftest-on-mr + before_script: + - CLANG_NUM=3 + - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" + <<: *sanitizer-selftest-anchor # test renderer executable renderer-smoke-test: @@ -1289,6 +1281,34 @@ test-long-self-test: # --------------------------------------------------------------- # Scheduled jobs on main # --------------------------------------------------------------- + +# code selftest long testvectors with memory-sanitizer binaries +ltv-msan: + extends: + - .sanitizer-selftest-ltv + before_script: + - CLANG_NUM=1 + - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" + <<: *sanitizer-selftest-anchor + +# code selftest long testvectors with address-sanitizer binaries +ltv-asan: + extends: + - .sanitizer-selftest-ltv + before_script: + - CLANG_NUM=2 + - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" + <<: *sanitizer-selftest-anchor + +# code selftest long testvectors with undefined-behaviour-sanitizer binaries +ltv-usan: + extends: + - .sanitizer-selftest-ltv + before_script: + - CLANG_NUM=3 + - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" + <<: *sanitizer-selftest-anchor + .sanitizer-test-template: extends: - .test-job-linux -- GitLab From 10ace10cf106f75188ea757abd6add2d53148470 Mon Sep 17 00:00:00 2001 From: kiene Date: Thu, 22 Feb 2024 15:59:40 +0000 Subject: [PATCH 379/601] Update .gitlab-ci.yml file --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c3a516a643..bef6ddbd94 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -274,7 +274,7 @@ stages: paths: - report-junit.xml - report.html - expose_as: "$CI_JOB_NAME selftest results" + expose_as: "Sanitizer selftest results" reports: junit: - report-junit.xml @@ -290,7 +290,7 @@ stages: paths: - report-junit.xml - report.html - expose_as: "$CI_JOB_NAME selftest results" + expose_as: "Sanitizer selftest results" reports: junit: - report-junit.xml -- GitLab From bb28e7079670989904ecfdcfb88b32e546d5b59c Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 17:11:28 +0100 Subject: [PATCH 380/601] prepare job for schedule --- .gitlab-ci.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bef6ddbd94..8014930756 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -282,7 +282,6 @@ stages: .sanitizer-selftest-ltv: extends: - .test-job-linux-needs-testv-dir - - .rules-main-scheduled artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" expire_in: 2 week @@ -1286,6 +1285,8 @@ test-long-self-test: ltv-msan: extends: - .sanitizer-selftest-ltv + rules: + - if: $SANITIZER_SCHEDULE_E before_script: - CLANG_NUM=1 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" @@ -1295,6 +1296,10 @@ ltv-msan: ltv-asan: extends: - .sanitizer-selftest-ltv + rules: + - if: $SANITIZER_SCHEDULE_E + when: delayed + start_in: 1 hours before_script: - CLANG_NUM=2 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" @@ -1304,6 +1309,10 @@ ltv-asan: ltv-usan: extends: - .sanitizer-selftest-ltv + rules: + - if: $SANITIZER_SCHEDULE_E + when: delayed + start_in: 2 hours before_script: - CLANG_NUM=3 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" -- GitLab From 154be16eaa9b41e5281db6530162d89a629a6d38 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 17:26:13 +0100 Subject: [PATCH 381/601] add timeout --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8014930756..00a04b2166 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1287,6 +1287,7 @@ ltv-msan: - .sanitizer-selftest-ltv rules: - if: $SANITIZER_SCHEDULE_E + timeout: 1 hour before_script: - CLANG_NUM=1 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" @@ -1300,6 +1301,7 @@ ltv-asan: - if: $SANITIZER_SCHEDULE_E when: delayed start_in: 1 hours + timeout: 1 hour before_script: - CLANG_NUM=2 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" @@ -1313,6 +1315,7 @@ ltv-usan: - if: $SANITIZER_SCHEDULE_E when: delayed start_in: 2 hours + timeout: 1 hour before_script: - CLANG_NUM=3 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" -- GitLab From 823f83417c14323d64ecbce425ffde25deb6714b Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 17:26:34 +0100 Subject: [PATCH 382/601] temporarily allow scheduled piepline on all branches --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 00a04b2166..556cd9c442 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -39,7 +39,7 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main variables: IVAS_PIPELINE_NAME: 'Push pipeline: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'schedule' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Scheduled in main + - if: $CI_PIPELINE_SOURCE == 'schedule' variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing -- GitLab From 1aa191a7c5de7ae0d47e3770b304daab15b66406 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 17:40:47 +0100 Subject: [PATCH 383/601] add correct tag --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 556cd9c442..a83c70443a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1288,6 +1288,8 @@ ltv-msan: rules: - if: $SANITIZER_SCHEDULE_E timeout: 1 hour + tags: + - ivas-linux-fast before_script: - CLANG_NUM=1 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" @@ -1301,6 +1303,8 @@ ltv-asan: - if: $SANITIZER_SCHEDULE_E when: delayed start_in: 1 hours + tags: + - ivas-linux-fast timeout: 1 hour before_script: - CLANG_NUM=2 @@ -1315,6 +1319,8 @@ ltv-usan: - if: $SANITIZER_SCHEDULE_E when: delayed start_in: 2 hours + tags: + - ivas-linux-fast timeout: 1 hour before_script: - CLANG_NUM=3 -- GitLab From 57eb5cf011ba490ed645768c61cb1ffc04be608e Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Feb 2024 18:09:53 +0100 Subject: [PATCH 384/601] longer testcase timeout for ltv sanitizer test --- .gitlab-ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a83c70443a..4c7295102b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -183,7 +183,7 @@ stages: - Get-ChildItem -Path "Workspace_msvc" -Filter "*.vcxproj" | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'false', 'true' | Set-Content -Path $_.FullName } # to be reused in MR and LTV-scheduled sanitizer test jobs -# set CLANG_NUM and SELF_TEST_PRM_FILE in before_script section +# set CLANG_NUM, SELFTEST_SANITY_TIMEOUT and SELF_TEST_PRM_FILE in before_script section .sanitizer-selftest-anchor: &sanitizer-selftest-anchor stage: test needs: ["build-codec-sanitizers-linux"] @@ -192,7 +192,7 @@ stages: - *copy-ltv-files-to-testv-dir - make clean - make -j CLANG=$CLANG_NUM - - testcase_timeout=180 + - testcase_timeout=$SELFTEST_SANITY_TIMEOUT - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 python3 -m pytest $SELF_TEST_PRM_FILE -v --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec @@ -491,6 +491,7 @@ codec-msan: - .sanitizer-selftest-on-mr before_script: - CLANG_NUM=1 + - SELFTEST_SANITY_TIMEOUT=180 - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" <<: *sanitizer-selftest-anchor @@ -500,6 +501,7 @@ codec-asan: - .sanitizer-selftest-on-mr before_script: - CLANG_NUM=2 + - SELFTEST_SANITY_TIMEOUT=180 - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" <<: *sanitizer-selftest-anchor @@ -509,6 +511,7 @@ codec-usan: - .sanitizer-selftest-on-mr before_script: - CLANG_NUM=3 + - SELFTEST_SANITY_TIMEOUT=180 - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" <<: *sanitizer-selftest-anchor @@ -1292,6 +1295,7 @@ ltv-msan: - ivas-linux-fast before_script: - CLANG_NUM=1 + - SELFTEST_SANITY_TIMEOUT=420 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" <<: *sanitizer-selftest-anchor @@ -1308,6 +1312,7 @@ ltv-asan: timeout: 1 hour before_script: - CLANG_NUM=2 + - SELFTEST_SANITY_TIMEOUT=420 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" <<: *sanitizer-selftest-anchor @@ -1324,6 +1329,7 @@ ltv-usan: timeout: 1 hour before_script: - CLANG_NUM=3 + - SELFTEST_SANITY_TIMEOUT=420 - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" <<: *sanitizer-selftest-anchor -- GitLab From f1d360dd646f67e166c406cba67d78456d49561d Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 09:45:02 +0100 Subject: [PATCH 385/601] increase testcase timeout even further --- .gitlab-ci.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4c7295102b..3e63ed7a88 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,6 +21,8 @@ variables: - 'test-be-release' - 'test-long-self-test' GIT_CLEAN_FLAGS: -ffdxq + TESTCASE_TIMEOUT_STV_SANITIZERS: 180 + TESTCASE_TIMEOUT_LTV_SANITIZERS: 720 default: @@ -491,7 +493,7 @@ codec-msan: - .sanitizer-selftest-on-mr before_script: - CLANG_NUM=1 - - SELFTEST_SANITY_TIMEOUT=180 + - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_STV_SANITIZERS - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" <<: *sanitizer-selftest-anchor @@ -501,7 +503,7 @@ codec-asan: - .sanitizer-selftest-on-mr before_script: - CLANG_NUM=2 - - SELFTEST_SANITY_TIMEOUT=180 + - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_STV_SANITIZERS - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" <<: *sanitizer-selftest-anchor @@ -511,7 +513,7 @@ codec-usan: - .sanitizer-selftest-on-mr before_script: - CLANG_NUM=3 - - SELFTEST_SANITY_TIMEOUT=180 + - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_STV_SANITIZERS - SELF_TEST_PRM_FILE="tests/codec_be_on_mr_nonselection/test_param_file.py" <<: *sanitizer-selftest-anchor @@ -1295,7 +1297,7 @@ ltv-msan: - ivas-linux-fast before_script: - CLANG_NUM=1 - - SELFTEST_SANITY_TIMEOUT=420 + - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_LTV_SANITIZERS - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" <<: *sanitizer-selftest-anchor @@ -1312,7 +1314,7 @@ ltv-asan: timeout: 1 hour before_script: - CLANG_NUM=2 - - SELFTEST_SANITY_TIMEOUT=420 + - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_LTV_SANITIZERS - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" <<: *sanitizer-selftest-anchor @@ -1329,7 +1331,7 @@ ltv-usan: timeout: 1 hour before_script: - CLANG_NUM=3 - - SELFTEST_SANITY_TIMEOUT=420 + - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_LTV_SANITIZERS - SELF_TEST_PRM_FILE="tests/test_param_file_ltv.py" <<: *sanitizer-selftest-anchor -- GitLab From e101741f69627658810fb1d281f70275ed59e110 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 10:35:06 +0100 Subject: [PATCH 386/601] Remove xfails and issue normal fails if no diff --- .../test_codec_ROM_vs_file.py | 190 +++++------------- tests/renderer/utils.py | 13 +- 2 files changed, 57 insertions(+), 146 deletions(-) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 4428aeb81d..98857f4731 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -30,7 +30,6 @@ the United Nations Convention on Contracts on the International Sales of Goods. """ import pytest -import itertools from tests.hrtf_binary_loading.utils import * @@ -48,17 +47,10 @@ def test_binary_file(test_info, hrtf_tag, out_fs): """ Multichannel """ -@pytest.mark.parametrize( - ("out_fmt", "out_fs", "in_fmt", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - OUTPUT_FORMATS_BINAURAL[:-1], SAMPLE_RATE, INPUT_FORMATS_MC, HRTF_TAGS - ) - ], -) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[:-1]) +@pytest.mark.parametrize("out_fs", SAMPLE_RATE) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_tag): bitrate = MC_BITRATE_FOR_FORMAT[in_fmt] in_fs = 48 @@ -77,21 +69,11 @@ def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_t ) -@pytest.mark.parametrize( - ("trj_file", "out_fmt", "out_fs", "in_fmt", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - [HR_TRAJECTORIES_TO_TEST[0]], - OUTPUT_FORMATS_BINAURAL[:-1], - SAMPLE_RATE, - INPUT_FORMATS_MC, - HRTF_TAGS, - ) - ], -) +@pytest.mark.parametrize("trj_file", [HR_TRAJECTORIES_TO_TEST[0]]) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[:-1]) +@pytest.mark.parametrize("out_fs", SAMPLE_RATE) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_multichannel_binaural_headrotation( test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag ): @@ -116,18 +98,12 @@ def test_multichannel_binaural_headrotation( """ Ambisonics """ -@pytest.mark.parametrize( - ("bitrate", "in_fmt", "fs", "out_fmt", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - [256000, 64000], INPUT_FORMATS_SBA, SAMPLE_RATE[1:], OUTPUT_FORMATS_BINAURAL[:-1], HRTF_TAGS - ) - ], -) -def test_sba_binaural_static(bitrate, test_info, in_fmt, fs, out_fmt, hrtf_tag): +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[:-1]) +@pytest.mark.parametrize("bitrate", [256000, 64000]) +@pytest.mark.parametrize("fs", SAMPLE_RATE[1:]) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_SBA) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) +def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -143,23 +119,13 @@ def test_sba_binaural_static(bitrate, test_info, in_fmt, fs, out_fmt, hrtf_tag): ) -@pytest.mark.parametrize( - ("bitrate", "in_fmt", "fs", "out_fmt", "trj_file", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - [256000, 64000], - INPUT_FORMATS_SBA, - SAMPLE_RATE[1:], - OUTPUT_FORMATS_BINAURAL[:-1], - [HR_TRAJECTORIES_TO_TEST[0]], - HRTF_TAGS, - ) - ], -) -def test_sba_binaural_headrotation(bitrate, test_info, in_fmt, fs, out_fmt, trj_file, hrtf_tag): +@pytest.mark.parametrize("bitrate", [256000, 64000]) +@pytest.mark.parametrize("trj_file", [HR_TRAJECTORIES_TO_TEST[0]]) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[:-1]) +@pytest.mark.parametrize("fs", SAMPLE_RATE[1:]) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_SBA) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) +def test_sba_binaural_headrotation(test_info, bitrate, in_fmt, fs, out_fmt, trj_file, hrtf_tag): option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -179,21 +145,11 @@ def test_sba_binaural_headrotation(bitrate, test_info, in_fmt, fs, out_fmt, trj_ """ MASA """ -@pytest.mark.parametrize( - ("out_fmt", "fs", "in_dir", "in_tc", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - OUTPUT_FORMATS_BINAURAL[:-1], - SAMPLE_RATE[-1:], - INPUT_FORMATS_MASA["dir"], - INPUT_FORMATS_MASA["tc"], - HRTF_TAGS, - ) - ], -) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[:-1]) +@pytest.mark.parametrize("fs", SAMPLE_RATE[-1:]) +@pytest.mark.parametrize("in_dir", INPUT_FORMATS_MASA["dir"]) +@pytest.mark.parametrize("in_tc", INPUT_FORMATS_MASA["tc"]) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_tag): # TODO: remove once fixed if hrtf_tag == HRTF_BINARY_FILE_DIFF_FROM_ROM: @@ -217,22 +173,12 @@ def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_tag): ) -@pytest.mark.parametrize( - ("in_tc", "in_dir", "out_fmt", "fs", "trj_file", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - INPUT_FORMATS_MASA["tc"], - INPUT_FORMATS_MASA["dir"], - OUTPUT_FORMATS_BINAURAL[:-1], - SAMPLE_RATE[-1:], - [HR_TRAJECTORIES_TO_TEST[1]], - HRTF_TAGS, - ) - ], -) +@pytest.mark.parametrize("trj_file", [HR_TRAJECTORIES_TO_TEST[1]]) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[:-1]) +@pytest.mark.parametrize("fs", SAMPLE_RATE[-1:]) +@pytest.mark.parametrize("in_dir", INPUT_FORMATS_MASA["dir"]) +@pytest.mark.parametrize("in_tc", INPUT_FORMATS_MASA["tc"]) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_masa_binaural_headrotation( test_info, in_tc, in_dir, fs, out_fmt, trj_file, hrtf_tag ): @@ -262,17 +208,10 @@ def test_masa_binaural_headrotation( """ ISM """ -@pytest.mark.parametrize( - ("in_fmt", "out_fs", "out_fmt", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - INPUT_FORMATS_ISM, SAMPLE_RATE, [OUTPUT_FORMATS_BINAURAL[0]], HRTF_TAGS - ) - ], -) +@pytest.mark.parametrize("out_fmt", [OUTPUT_FORMATS_BINAURAL[0]]) +@pytest.mark.parametrize("out_fs", SAMPLE_RATE) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ism_binaural_static(test_info, in_fmt, out_fs, out_fmt, hrtf_tag): in_fs = 48 bitrate = BITRATE_ISM[in_fmt] @@ -298,21 +237,11 @@ def test_ism_binaural_static(test_info, in_fmt, out_fs, out_fmt, hrtf_tag): ) -@pytest.mark.parametrize( - ("in_fmt", "out_fs", "out_fmt", "trj_file", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - INPUT_FORMATS_ISM, - SAMPLE_RATE, - [OUTPUT_FORMATS_BINAURAL[0]], - [HR_TRAJECTORIES_TO_TEST[0]], - HRTF_TAGS, - ) - ], -) +@pytest.mark.parametrize("trj_file", [HR_TRAJECTORIES_TO_TEST[0]]) +@pytest.mark.parametrize("out_fmt", [OUTPUT_FORMATS_BINAURAL[0]]) +@pytest.mark.parametrize("out_fs", SAMPLE_RATE) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ism_binaural_headrotation( test_info, in_fmt, out_fs, out_fmt, trj_file, hrtf_tag ): @@ -344,17 +273,10 @@ def test_ism_binaural_headrotation( """ ISM - Room Reverb """ -@pytest.mark.parametrize( - ("in_fmt", "out_fs", "out_fmt", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - INPUT_FORMATS_ISM, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[-1:], HRTF_TAGS - ) - ], -) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[-1:]) +@pytest.mark.parametrize("out_fs", SAMPLE_RATE) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ism_binaural_roomreverb_static(test_info, in_fmt, out_fs, out_fmt, hrtf_tag): in_fs = 48 bitrate = BITRATE_ISM[in_fmt] @@ -380,21 +302,11 @@ def test_ism_binaural_roomreverb_static(test_info, in_fmt, out_fs, out_fmt, hrtf ) -@pytest.mark.parametrize( - ("in_fmt", "out_fs", "out_fmt", "trj_file", "hrtf_tag"), - [ - pytest.param(*x, marks=pytest.mark.xfail(strict=True)) - if x[-1] == HRTF_BINARY_FILE_DIFF_FROM_ROM - else x - for x in itertools.product( - INPUT_FORMATS_ISM, - SAMPLE_RATE, - OUTPUT_FORMATS_BINAURAL[-1:], - [HR_TRAJECTORIES_TO_TEST[0]], - HRTF_TAGS, - ) - ], -) +@pytest.mark.parametrize("trj_file", [HR_TRAJECTORIES_TO_TEST[0]]) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[-1:]) +@pytest.mark.parametrize("out_fs", SAMPLE_RATE) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ism_binaural_roomreverb_headrotation( test_info, in_fmt, out_fs, out_fmt, trj_file, hrtf_tag ): diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index ed8476a7f0..f8b75dbeb3 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -90,13 +90,12 @@ def check_BE( # check max_diff as well, since compare_audio_arrays will try to adjust for small delay differences diff_found = not np.allclose(ref, cut, rtol=0, atol=2) and max_diff > 2 - if diff_found: - if xfail: - pytest.xfail(f"Expected diff between CuT and REF!") - else: - pytest.fail( - f"CuT not BE to REF! SNR : {snr:3.2f} dB, Gain CuT: {gain_b:1.3f}, Max Diff = {int(max_diff)}" - ) + if diff_found and not xfail: + pytest.fail( + f"CuT not BE to REF! SNR : {snr:3.2f} dB, Gain CuT: {gain_b:1.3f}, Max Diff = {int(max_diff)}" + ) + elif not diff_found and xfail: + pytest.fail("Difference expected, but none found.") def run_renderer( -- GitLab From a6574b3431bfc868171aa02cf5a7f83674874b0a Mon Sep 17 00:00:00 2001 From: Adriana Vasilache Date: Fri, 23 Feb 2024 11:49:09 +0200 Subject: [PATCH 387/601] fix issue 1004 in ivas_masa_dec() --- lib_com/options.h | 2 +- lib_dec/ivas_masa_dec.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 48d7a6cb28..c72e407d3f 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -181,7 +181,7 @@ #endif #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ - +#define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index c211bea575..f7731831b7 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -136,6 +136,12 @@ ivas_error ivas_masa_decode( if ( masa_brate == IVAS_SID_5k2 ) { st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); +#ifdef NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS + if ( ivas_format == MASA_FORMAT ) + { + hMasa->config.numberOfDirections = 1; + } +#endif } else { -- GitLab From 1dc1ea2f5d1c2b5757bc72eb975d0d9e06e3237d Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 11:16:48 +0100 Subject: [PATCH 388/601] improve parametrization to have bitrate shown in test log --- .../test_codec_ROM_vs_file.py | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 98857f4731..5a86bb4d28 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -30,6 +30,7 @@ the United Nations Convention on Contracts on the International Sales of Goods. """ import pytest +import itertools from tests.hrtf_binary_loading.utils import * @@ -47,12 +48,11 @@ def test_binary_file(test_info, hrtf_tag, out_fs): """ Multichannel """ -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[:-1]) -@pytest.mark.parametrize("out_fs", SAMPLE_RATE) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) -@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) -def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_tag): - bitrate = MC_BITRATE_FOR_FORMAT[in_fmt] +@pytest.mark.parametrize( + ("hrtf_tag", "in_fmt", "bitrate", "out_fs", "out_fmt"), + [ ( x[0], x[1], MC_BITRATE_FOR_FORMAT[x[1]], x[2], x[3] ) for x in itertools.product(HRTF_TAGS, INPUT_FORMATS_MC, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[:-1]) ] + ) +def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_tag, bitrate): in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) @@ -68,16 +68,13 @@ def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_t hrtf_tag, ) - -@pytest.mark.parametrize("trj_file", [HR_TRAJECTORIES_TO_TEST[0]]) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[:-1]) -@pytest.mark.parametrize("out_fs", SAMPLE_RATE) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC) -@pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) +@pytest.mark.parametrize( + ("hrtf_tag", "in_fmt", "bitrate", "out_fs", "out_fmt", "trj_file"), + [ ( x[0], x[1], MC_BITRATE_FOR_FORMAT[x[1]], x[2], x[3], x[4] ) for x in itertools.product(HRTF_TAGS, INPUT_FORMATS_MC, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[:-1], [HR_TRAJECTORIES_TO_TEST[0]]) ] + ) def test_multichannel_binaural_headrotation( - test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag + test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag, bitrate ): - bitrate = MC_BITRATE_FOR_FORMAT[in_fmt] in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) -- GitLab From 65dedc3346064481d9870164e0809ece017dfced Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 23 Feb 2024 11:25:34 +0100 Subject: [PATCH 389/601] Unify py->python for Windows jobs. Cleanup debugging html reports --- .gitlab-ci.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6eb57675be..4795924c08 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -405,7 +405,7 @@ build-codec-windows-msbuild: script: - *print-common-info-windows - *activate-WX-windows - - py .\scripts\strip_split_rendering.py + - python .\scripts\strip_split_rendering.py - MSBuild.exe -maxcpucount .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug # --------------------------------------------------------------- @@ -1236,7 +1236,7 @@ ivas-conformance: # Prepare reference exec, use tests and scripts from reference - $source_branch_commit_sha = $(git rev-parse HEAD) - git checkout main # This should be set to a relevant reference - - py .\scripts\strip_split_rendering.py + - python .\scripts\strip_split_rendering.py - MSBuild.exe -maxcpucount .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug - cp -force IVAS_cod.exe IVAS_cod_ref.exe - cp -force IVAS_dec.exe IVAS_dec_ref.exe @@ -1247,7 +1247,7 @@ ivas-conformance: # Reference creation - python tests/create_short_testvectors.py - python scripts/prepare_combined_format_inputs.py - - python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref --html=report1.html --self-contained-html --keep_files + - python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref --keep_files - python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref_part2 --keep_files - python -m pytest tests/renderer/test_renderer.py --create_ref --keep_files @@ -1291,8 +1291,6 @@ ivas-conformance: when: always paths: - report-junit.xml - - report1.html - - report_cmd.html - report.html - Readme_IVAS_dec.txt - Readme_IVAS_enc.txt -- GitLab From b3345f4d2aa66b5dcea79549971287fded0297ff Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 11:31:04 +0100 Subject: [PATCH 390/601] skip some testcases and fix whitespace in filename --- .../hrtf_binary_loading/test_codec_ROM_vs_file.py | 14 +++++++++++--- .../test_renderer_ROM_vs_file.py | 4 ++++ tests/hrtf_binary_loading/utils.py | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 5a86bb4d28..4f0ebb88d2 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -34,7 +34,7 @@ import itertools from tests.hrtf_binary_loading.utils import * -from .constants import HRTF_TAGS, MC_BITRATE_FOR_FORMAT +from .constants import HRTF_TAGS, MC_BITRATE_FOR_FORMAT, HRTF_TAG_DIFF_FROM_ROM """ Binary file """ @@ -53,6 +53,8 @@ def test_binary_file(test_info, hrtf_tag, out_fs): [ ( x[0], x[1], MC_BITRATE_FOR_FORMAT[x[1]], x[2], x[3] ) for x in itertools.product(HRTF_TAGS, INPUT_FORMATS_MC, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[:-1]) ] ) def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_tag, bitrate): + if bitrate == 32000: + pytest.skip("Skip paramBin until differences are fixed") in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) @@ -75,6 +77,8 @@ def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_t def test_multichannel_binaural_headrotation( test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag, bitrate ): + if bitrate == 32000: + pytest.skip("Skip paramBin until differences are fixed") in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) @@ -101,6 +105,8 @@ def test_multichannel_binaural_headrotation( @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_SBA) @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): + if bitrate == 64000: + pytest.skip("Skip paramBin until differences are fixed") option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -123,6 +129,8 @@ def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_SBA) @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_sba_binaural_headrotation(test_info, bitrate, in_fmt, fs, out_fmt, trj_file, hrtf_tag): + if bitrate == 64000: + pytest.skip("Skip paramBin until differences are fixed") option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -149,7 +157,7 @@ def test_sba_binaural_headrotation(test_info, bitrate, in_fmt, fs, out_fmt, trj_ @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_tag): # TODO: remove once fixed - if hrtf_tag == HRTF_BINARY_FILE_DIFF_FROM_ROM: + if hrtf_tag == HRTF_TAG_DIFF_FROM_ROM: pytest.skip("Skipped due to bug in paramBin HRTF loading") bitrate = 256000 metadata_file = str( @@ -180,7 +188,7 @@ def test_masa_binaural_headrotation( test_info, in_tc, in_dir, fs, out_fmt, trj_file, hrtf_tag ): # TODO: remove once fixed - if hrtf_tag == HRTF_BINARY_FILE_DIFF_FROM_ROM: + if hrtf_tag == HRTF_TAG_DIFF_FROM_ROM: pytest.skip("Skipped due to bug in paramBin HRTF loading") bitrate = 256000 metadata_file = str( diff --git a/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py b/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py index 921562b5bc..c45aaae4ea 100644 --- a/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py @@ -178,6 +178,8 @@ def test_masa_binaural_static_with_binary_hrir( ): if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") + if hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipping paramBin until fixed") compare_renderer_vs_renderer_with_binary_hrir( test_info, @@ -198,6 +200,8 @@ def test_masa_binaural_headrotation_with_binary_hrir( ): if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") + if hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipping paramBin until fixed") compare_renderer_vs_renderer_with_binary_hrir( test_info, diff --git a/tests/hrtf_binary_loading/utils.py b/tests/hrtf_binary_loading/utils.py index 2271f03432..b45cde6ec2 100644 --- a/tests/hrtf_binary_loading/utils.py +++ b/tests/hrtf_binary_loading/utils.py @@ -290,7 +290,7 @@ def compare_rom_vs_binary( trj_file: Optional[str] = None, ): option_str = "_".join(get_option_list_str(option_list_enc)) - file_ext = f"_{option_str or ''}_{bitrate or ''}_{in_fs or ''}-{out_fs or ''}_{out_fmt or ''}-{uuid.uuid1()} " + file_ext = f"_{option_str or ''}_{bitrate or ''}_{in_fs or ''}-{out_fs or ''}_{out_fmt or ''}-{uuid.uuid1()}" hrtf_file = HRTF_FILE_FOR_TAG[hrtf_tag] -- GitLab From 970ad0b83a9d0126ffcf5ee4e383c4626420b748 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 12:57:36 +0100 Subject: [PATCH 391/601] unify skip message --- tests/hrtf_binary_loading/test_codec_ROM_vs_file.py | 12 ++++++------ .../hrtf_binary_loading/test_renderer_ROM_vs_file.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 4f0ebb88d2..7b868fb57a 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -54,7 +54,7 @@ def test_binary_file(test_info, hrtf_tag, out_fs): ) def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_tag, bitrate): if bitrate == 32000: - pytest.skip("Skip paramBin until differences are fixed") + pytest.skip("Skipping ParamBin until binary and ROM contain same data") in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) @@ -78,7 +78,7 @@ def test_multichannel_binaural_headrotation( test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag, bitrate ): if bitrate == 32000: - pytest.skip("Skip paramBin until differences are fixed") + pytest.skip("Skipping ParamBin until binary and ROM contain same data") in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) @@ -106,7 +106,7 @@ def test_multichannel_binaural_headrotation( @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): if bitrate == 64000: - pytest.skip("Skip paramBin until differences are fixed") + pytest.skip("Skipping ParamBin until binary and ROM contain same data") option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -130,7 +130,7 @@ def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_sba_binaural_headrotation(test_info, bitrate, in_fmt, fs, out_fmt, trj_file, hrtf_tag): if bitrate == 64000: - pytest.skip("Skip paramBin until differences are fixed") + pytest.skip("Skipping ParamBin until binary and ROM contain same data") option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -158,7 +158,7 @@ def test_sba_binaural_headrotation(test_info, bitrate, in_fmt, fs, out_fmt, trj_ def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_tag): # TODO: remove once fixed if hrtf_tag == HRTF_TAG_DIFF_FROM_ROM: - pytest.skip("Skipped due to bug in paramBin HRTF loading") + pytest.skip("Skipping ParamBin until binary and ROM contain same data") bitrate = 256000 metadata_file = str( TESTV_DIR.joinpath(FORMAT_TO_METADATA_FILES["MASA"].format(in_dir, in_tc, fs)) @@ -189,7 +189,7 @@ def test_masa_binaural_headrotation( ): # TODO: remove once fixed if hrtf_tag == HRTF_TAG_DIFF_FROM_ROM: - pytest.skip("Skipped due to bug in paramBin HRTF loading") + pytest.skip("Skipping ParamBin until binary and ROM contain same data") bitrate = 256000 metadata_file = str( TESTV_DIR.joinpath(FORMAT_TO_METADATA_FILES["MASA"].format(in_dir, in_tc, fs)) diff --git a/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py b/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py index c45aaae4ea..e6a4214594 100644 --- a/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py @@ -179,7 +179,7 @@ def test_masa_binaural_static_with_binary_hrir( if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") if hrtf_tag == HRTF_TAG_SAME_AS_ROM: - pytest.skip("Skipping paramBin until fixed") + pytest.skip("Skipping ParamBin until binary and ROM contain same data") compare_renderer_vs_renderer_with_binary_hrir( test_info, @@ -201,7 +201,7 @@ def test_masa_binaural_headrotation_with_binary_hrir( if out_fmt in ["BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"]: pytest.skip("Skipping binaural room outputs for MASA as unimplemented.") if hrtf_tag == HRTF_TAG_SAME_AS_ROM: - pytest.skip("Skipping paramBin until fixed") + pytest.skip("Skipping ParamBin until binary and ROM contain same data") compare_renderer_vs_renderer_with_binary_hrir( test_info, -- GitLab From 8ac3da3ccd93b224827ecc9e2c1ba9488741f9db Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 12:58:07 +0100 Subject: [PATCH 392/601] apply correct formatting --- .../test_codec_ROM_vs_file.py | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 7b868fb57a..d23c1f7c14 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -49,10 +49,17 @@ def test_binary_file(test_info, hrtf_tag, out_fs): @pytest.mark.parametrize( - ("hrtf_tag", "in_fmt", "bitrate", "out_fs", "out_fmt"), - [ ( x[0], x[1], MC_BITRATE_FOR_FORMAT[x[1]], x[2], x[3] ) for x in itertools.product(HRTF_TAGS, INPUT_FORMATS_MC, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[:-1]) ] + ("hrtf_tag", "in_fmt", "bitrate", "out_fs", "out_fmt"), + [ + (x[0], x[1], MC_BITRATE_FOR_FORMAT[x[1]], x[2], x[3]) + for x in itertools.product( + HRTF_TAGS, INPUT_FORMATS_MC, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[:-1] ) -def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_tag, bitrate): + ], +) +def test_multichannel_binaural_static( + test_info, in_fmt, out_fmt, out_fs, hrtf_tag, bitrate +): if bitrate == 32000: pytest.skip("Skipping ParamBin until binary and ROM contain same data") in_fs = 48 @@ -70,10 +77,20 @@ def test_multichannel_binaural_static(test_info, in_fmt, out_fmt, out_fs, hrtf_t hrtf_tag, ) + @pytest.mark.parametrize( - ("hrtf_tag", "in_fmt", "bitrate", "out_fs", "out_fmt", "trj_file"), - [ ( x[0], x[1], MC_BITRATE_FOR_FORMAT[x[1]], x[2], x[3], x[4] ) for x in itertools.product(HRTF_TAGS, INPUT_FORMATS_MC, SAMPLE_RATE, OUTPUT_FORMATS_BINAURAL[:-1], [HR_TRAJECTORIES_TO_TEST[0]]) ] + ("hrtf_tag", "in_fmt", "bitrate", "out_fs", "out_fmt", "trj_file"), + [ + (x[0], x[1], MC_BITRATE_FOR_FORMAT[x[1]], x[2], x[3], x[4]) + for x in itertools.product( + HRTF_TAGS, + INPUT_FORMATS_MC, + SAMPLE_RATE, + OUTPUT_FORMATS_BINAURAL[:-1], + [HR_TRAJECTORIES_TO_TEST[0]], ) + ], +) def test_multichannel_binaural_headrotation( test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag, bitrate ): @@ -128,7 +145,9 @@ def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): @pytest.mark.parametrize("fs", SAMPLE_RATE[1:]) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_SBA) @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) -def test_sba_binaural_headrotation(test_info, bitrate, in_fmt, fs, out_fmt, trj_file, hrtf_tag): +def test_sba_binaural_headrotation( + test_info, bitrate, in_fmt, fs, out_fmt, trj_file, hrtf_tag +): if bitrate == 64000: pytest.skip("Skipping ParamBin until binary and ROM contain same data") option_list = ["-sba", in_fmt] -- GitLab From b76f7894f503fa9edbc3c4455b46cd098e94b98b Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 14:08:48 +0100 Subject: [PATCH 393/601] remove obsolete conftest file --- tests/hrtf_binary_loading/conftest.py | 44 --------------------------- 1 file changed, 44 deletions(-) delete mode 100644 tests/hrtf_binary_loading/conftest.py diff --git a/tests/hrtf_binary_loading/conftest.py b/tests/hrtf_binary_loading/conftest.py deleted file mode 100644 index c4c8b05174..0000000000 --- a/tests/hrtf_binary_loading/conftest.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 - -""" - (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. -""" - - -def pytest_addoption(parser): - parser.addoption( - "--create_ref", - action="store_true", - default=False, - ) - parser.addoption( - "--create_cut", - action="store_true", - default=False, - ) -- GitLab From 30c08b58e223feb93b18991739f89e1e8944b852 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 14:54:12 +0100 Subject: [PATCH 394/601] skip ISM paramBin cases and remove tolerance from comparison --- .../test_codec_ROM_vs_file.py | 19 ++++++++++++++++++- .../test_renderer_ROM_vs_file.py | 6 ++++++ tests/hrtf_binary_loading/utils.py | 4 ++-- tests/renderer/utils.py | 3 ++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index d23c1f7c14..192adaa766 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -34,7 +34,12 @@ import itertools from tests.hrtf_binary_loading.utils import * -from .constants import HRTF_TAGS, MC_BITRATE_FOR_FORMAT, HRTF_TAG_DIFF_FROM_ROM +from .constants import ( + HRTF_TAGS, + MC_BITRATE_FOR_FORMAT, + HRTF_TAG_DIFF_FROM_ROM, + HRTF_TAG_SAME_AS_ROM, +) """ Binary file """ @@ -237,6 +242,9 @@ def test_masa_binaural_headrotation( @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ism_binaural_static(test_info, in_fmt, out_fs, out_fmt, hrtf_tag): + if in_fmt == "4" and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipping ParamBin until binary and ROM contain same data") + in_fs = 48 bitrate = BITRATE_ISM[in_fmt] option_list = ["-ism", in_fmt] @@ -269,6 +277,9 @@ def test_ism_binaural_static(test_info, in_fmt, out_fs, out_fmt, hrtf_tag): def test_ism_binaural_headrotation( test_info, in_fmt, out_fs, out_fmt, trj_file, hrtf_tag ): + if in_fmt == "4" and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipping ParamBin until binary and ROM contain same data") + in_fs = 48 bitrate = BITRATE_ISM[in_fmt] option_list = ["-ism", in_fmt] @@ -302,6 +313,9 @@ def test_ism_binaural_headrotation( @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_ism_binaural_roomreverb_static(test_info, in_fmt, out_fs, out_fmt, hrtf_tag): + if in_fmt == "4" and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipping ParamBin until binary and ROM contain same data") + in_fs = 48 bitrate = BITRATE_ISM[in_fmt] option_list = ["-ism", in_fmt] @@ -334,6 +348,9 @@ def test_ism_binaural_roomreverb_static(test_info, in_fmt, out_fs, out_fmt, hrtf def test_ism_binaural_roomreverb_headrotation( test_info, in_fmt, out_fs, out_fmt, trj_file, hrtf_tag ): + if in_fmt == "4" and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipping ParamBin until binary and ROM contain same data") + in_fs = 48 bitrate = BITRATE_ISM[in_fmt] option_list = ["-ism", in_fmt] diff --git a/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py b/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py index e6a4214594..10595b63a8 100644 --- a/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_renderer_ROM_vs_file.py @@ -127,6 +127,9 @@ def test_multichannel_binaural_headrotation_with_binary_hrir( def test_ism_binaural_static_with_binary_hrir( test_info, in_fmt, out_fmt, frame_size, hrtf_tag ): + if in_fmt == "4" and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipping ParamBin until binary and ROM contain same data") + try: in_meta_files = FORMAT_TO_METADATA_FILES_RENDERER[in_fmt] except: @@ -150,6 +153,9 @@ def test_ism_binaural_static_with_binary_hrir( def test_ism_binaural_headrotation_with_binary_hrir( test_info, in_fmt, out_fmt, trj_file, frame_size, hrtf_tag ): + if in_fmt == "4" and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipping ParamBin until binary and ROM contain same data") + try: in_meta_files = FORMAT_TO_METADATA_FILES_RENDERER[in_fmt] except: diff --git a/tests/hrtf_binary_loading/utils.py b/tests/hrtf_binary_loading/utils.py index b45cde6ec2..85d55a34d3 100644 --- a/tests/hrtf_binary_loading/utils.py +++ b/tests/hrtf_binary_loading/utils.py @@ -325,7 +325,7 @@ def compare_rom_vs_binary( ) out_bin, out_bin_fs = pyaudio3dtools.audiofile.readfile(out_bin_path) - check_BE(test_info, out_rom, out_rom_fs, out_bin, out_bin_fs, xfail) + check_BE(test_info, out_rom, out_rom_fs, out_bin, out_bin_fs, xfail, 0) if keep_file == False: os.remove(bitstream_path) os.remove(out_rom_path) @@ -393,7 +393,7 @@ def compare_renderer_vs_renderer_with_binary_hrir( ref, ref_fs = pyaudio3dtools.audiofile.readfile(ref_out) cut, cut_fs = pyaudio3dtools.audiofile.readfile(cut_out) - check_BE(test_info, ref, ref_fs, cut, cut_fs, xfail) + check_BE(test_info, ref, ref_fs, cut, cut_fs, xfail, 0) if keep_file == False: os.remove(ref_out) os.remove(cut_out) diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index f8b75dbeb3..2c498c21d7 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -71,6 +71,7 @@ def check_BE( cut: np.ndarray, cut_fs: int, xfail: bool = False, + atol: int = 2 ): if ref is None or np.array_equal(ref, np.zeros_like(ref)): pytest.fail("REF signal does not exist or is zero!") @@ -89,7 +90,7 @@ def check_BE( cut = np.pad(cut, [(0, ref.shape[0] - cut.shape[0]), (0, 0)]) # check max_diff as well, since compare_audio_arrays will try to adjust for small delay differences - diff_found = not np.allclose(ref, cut, rtol=0, atol=2) and max_diff > 2 + diff_found = not np.allclose(ref, cut, rtol=0, atol=atol) if diff_found and not xfail: pytest.fail( f"CuT not BE to REF! SNR : {snr:3.2f} dB, Gain CuT: {gain_b:1.3f}, Max Diff = {int(max_diff)}" -- GitLab From 7da50c40abd3cb4b8077646ca2053a3954e37281 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 15:09:12 +0100 Subject: [PATCH 395/601] update skipping of cases --- tests/hrtf_binary_loading/test_codec_ROM_vs_file.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 192adaa766..38f7c31bef 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -65,7 +65,7 @@ def test_binary_file(test_info, hrtf_tag, out_fs): def test_multichannel_binaural_static( test_info, in_fmt, out_fmt, out_fs, hrtf_tag, bitrate ): - if bitrate == 32000: + if bitrate == 32000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") in_fs = 48 option_list = ["-mc", in_fmt] @@ -99,7 +99,7 @@ def test_multichannel_binaural_static( def test_multichannel_binaural_headrotation( test_info, in_fmt, out_fmt, out_fs, trj_file, hrtf_tag, bitrate ): - if bitrate == 32000: + if bitrate == 32000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") in_fs = 48 option_list = ["-mc", in_fmt] @@ -127,7 +127,7 @@ def test_multichannel_binaural_headrotation( @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_SBA) @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): - if bitrate == 64000: + if bitrate == 64000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -153,7 +153,7 @@ def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): def test_sba_binaural_headrotation( test_info, bitrate, in_fmt, fs, out_fmt, trj_file, hrtf_tag ): - if bitrate == 64000: + if bitrate == 64000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -181,7 +181,7 @@ def test_sba_binaural_headrotation( @pytest.mark.parametrize("hrtf_tag", HRTF_TAGS) def test_masa_binaural_static(test_info, in_tc, in_dir, fs, out_fmt, hrtf_tag): # TODO: remove once fixed - if hrtf_tag == HRTF_TAG_DIFF_FROM_ROM: + if hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") bitrate = 256000 metadata_file = str( @@ -212,7 +212,7 @@ def test_masa_binaural_headrotation( test_info, in_tc, in_dir, fs, out_fmt, trj_file, hrtf_tag ): # TODO: remove once fixed - if hrtf_tag == HRTF_TAG_DIFF_FROM_ROM: + if hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") bitrate = 256000 metadata_file = str( -- GitLab From cec64c8e51daff56529ffbce904661816aa21c25 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 15:17:53 +0100 Subject: [PATCH 396/601] fix abs tol in checkBE --- tests/renderer/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index 2c498c21d7..52d1ccf19e 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -90,7 +90,7 @@ def check_BE( cut = np.pad(cut, [(0, ref.shape[0] - cut.shape[0]), (0, 0)]) # check max_diff as well, since compare_audio_arrays will try to adjust for small delay differences - diff_found = not np.allclose(ref, cut, rtol=0, atol=atol) + diff_found = not np.allclose(ref, cut, rtol=0, atol=atol) and max_diff > atol if diff_found and not xfail: pytest.fail( f"CuT not BE to REF! SNR : {snr:3.2f} dB, Gain CuT: {gain_b:1.3f}, Max Diff = {int(max_diff)}" -- GitLab From 03f3303843c98a168e1a06f02b572e6bcfa6392c Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 15:19:41 +0100 Subject: [PATCH 397/601] increase timeout --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3e63ed7a88..2c296290eb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,7 +22,7 @@ variables: - 'test-long-self-test' GIT_CLEAN_FLAGS: -ffdxq TESTCASE_TIMEOUT_STV_SANITIZERS: 180 - TESTCASE_TIMEOUT_LTV_SANITIZERS: 720 + TESTCASE_TIMEOUT_LTV_SANITIZERS: 1200 default: -- GitLab From 0594f1e79cb3c8695537116aa33bad6557e85c71 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 23 Feb 2024 15:35:19 +0100 Subject: [PATCH 398/601] Revert "temporarily allow scheduled piepline on all branches" This reverts commit 823f83417c14323d64ecbce425ffde25deb6714b. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3da876ba66..9344bda913 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,7 +42,7 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main variables: IVAS_PIPELINE_NAME: 'Push pipeline: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'schedule' + - if: $CI_PIPELINE_SOURCE == 'schedule' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Scheduled in main variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing -- GitLab From 350ba166491b5635fb9af9a47e4ffb83a1deb09e Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 23 Feb 2024 15:56:23 +0100 Subject: [PATCH 399/601] delete code under ifdef NONBE_FIX_998_DIRAC_ROTATION --- lib_com/options.h | 2 -- lib_dec/ivas_output_config.c | 10 ---------- 2 files changed, 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 67cda97653..1086720749 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -183,8 +183,6 @@ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ -#define NONBE_FIX_998_DIRAC_ROTATION /* FhG: fix issue 998: DirAC scene rotation accidentially deactivated */ - /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 7b77db1076..bb672ffb31 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -198,20 +198,10 @@ void ivas_renderer_select( nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); -#ifdef NONBE_FIX_998_DIRAC_ROTATION - if ( nchan_internal == 4 || nchan_internal == 3 || nchan_internal == 2 ) -#else if ( nchan_internal == 2 ) -#endif { st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; } -#ifndef NONBE_FIX_998_DIRAC_ROTATION - else if ( nchan_internal == 4 || nchan_internal == 3 ) - { - st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; - } -#endif else if ( nchan_internal == 6 || nchan_internal == 5 ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 2; -- GitLab From 51704a5da7ed17583ceaef76a96c206cdfc5938c Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 08:15:56 +0100 Subject: [PATCH 400/601] increase timeout of scheduled sanitizer tests --- ci/run_scheduled_sanitizer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 6692c94d7c..d8986233fb 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -55,7 +55,7 @@ GENPATT_CMD = f"gen-patt -tailstat -fer -g192 -gamma 0 -rate 0.15 -tol 0.001 -re MC_MODES = ["5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] AMBISONICS_MODES = ["HOA3", "HOA2", "FOA", "PlanarHOA3", "PlanarHOA2", "PlanarFOA"] TIMEOUT = ( - 60 * 15 + 60 * 20 ) # timeout of 15 minutes per en/decoding to safeguard against endless loops CONSOLE_OUT_FILE = "output_san.txt" -- GitLab From 3d06fbbe503aa936a9527581695be32cbb6edb93 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 08:20:24 +0100 Subject: [PATCH 401/601] move stage to template and remove needs --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9344bda913..6e4af2b332 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -191,8 +191,6 @@ stages: # to be reused in MR and LTV-scheduled sanitizer test jobs # set CLANG_NUM, SELFTEST_SANITY_TIMEOUT and SELF_TEST_PRM_FILE in before_script section .sanitizer-selftest-anchor: &sanitizer-selftest-anchor - stage: test - needs: ["build-codec-sanitizers-linux"] script: - *print-common-info - *copy-ltv-files-to-testv-dir @@ -272,6 +270,7 @@ stages: - cp -r scripts/testv/* $TESTV_DIR/ .sanitizer-selftest-on-mr: + stage: test extends: - .test-job-linux-needs-testv-dir - .rules-merge-request @@ -288,6 +287,7 @@ stages: - report-junit.xml .sanitizer-selftest-ltv: + stage: test extends: - .test-job-linux-needs-testv-dir artifacts: -- GitLab From aff6e83057097dd8f7a26f500d868ed0fec2160c Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 08:28:03 +0100 Subject: [PATCH 402/601] temporarily allow schedules to run on non-main --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6e4af2b332..92119def79 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,7 +42,7 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main variables: IVAS_PIPELINE_NAME: 'Push pipeline: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'schedule' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Scheduled in main + - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in main variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing -- GitLab From 73dd9802ac965fb7368a1156d79cb7a37d2a8118 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 08:35:14 +0100 Subject: [PATCH 403/601] Revert "temporarily allow schedules to run on non-main" This reverts commit aff6e83057097dd8f7a26f500d868ed0fec2160c. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 92119def79..6e4af2b332 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,7 +42,7 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main variables: IVAS_PIPELINE_NAME: 'Push pipeline: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in main + - if: $CI_PIPELINE_SOURCE == 'schedule' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Scheduled in main variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing -- GitLab From d92bf72493e8ef68dc6ccd42305d764910f33b27 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 08:49:14 +0100 Subject: [PATCH 404/601] update sanitizer issue tempalte --- .gitlab/issue_templates/sanitizer_error.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/sanitizer_error.md b/.gitlab/issue_templates/sanitizer_error.md index e5b42ba2f4..f442519aba 100644 --- a/.gitlab/issue_templates/sanitizer_error.md +++ b/.gitlab/issue_templates/sanitizer_error.md @@ -28,7 +28,7 @@ or directly: make clean make -j CLANG=X ./IVAS_cod ... -eid-xor -vbr -fer bit ep_015.g192 bit_fer +networkSimulator_g192 dly_profile.dat bit bit_err trace_dump 1 ./IVAS_dec ... ``` -- GitLab From c4c4f37905e80ed9051684c92eba757b283fd445 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 08:55:03 +0100 Subject: [PATCH 405/601] remove unused split-order function under ifdef FIX_998_UNUSED_FUNCTION --- lib_rend/ivas_dirac_output_synthesis_dec.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 0eb06064dd..25d119ae88 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -1570,7 +1570,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( return; } - +#ifndef FIX_998_UNUSED_FUNCTION /*------------------------------------------------------------------------- * ivas_dirac_dec_get_response_split_order() * @@ -1732,7 +1732,7 @@ static void ivas_dirac_dec_get_response_split_order( return; } - +#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_compute_directional_responses() @@ -1821,7 +1821,7 @@ void ivas_dirac_dec_compute_directional_responses( { set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); - +#ifndef FIX_998_UNUSED_FUNCTION if ( p_Rmat != 0 ) { ivas_dirac_dec_get_response_split_order( azimuth[k], elevation[k], direct_response_hoa, shd_rot_max_order, p_Rmat ); @@ -1832,6 +1832,7 @@ void ivas_dirac_dec_compute_directional_responses( } } else +#endif { ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirACRend->hOutSetup.ambisonics_order ); -- GitLab From bc282dbb51b678ade2c7682459fb431ddd1b4a04 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 08:56:20 +0100 Subject: [PATCH 406/601] delete code under ifdef ALLOW_HOA3_ROTATION --- apps/decoder.c | 6 +----- lib_com/options.h | 1 - lib_dec/ivas_init_dec.c | 3 --- lib_dec/ivas_output_config.c | 15 --------------- 4 files changed, 1 insertion(+), 24 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 2be9c78d87..01e6b4f3d1 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -306,11 +306,7 @@ int main( if ( arg.enableHeadRotation ) { /* sanity check */ - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR -#ifdef ALLOW_HOA3_ROTATION - && arg.outputConfig != IVAS_AUDIO_CONFIG_HOA3 -#endif - && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM #endif diff --git a/lib_com/options.h b/lib_com/options.h index 1086720749..f2757f11ea 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -126,7 +126,6 @@ /*#define DEBUG_OSBA */ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ /*#define DEBUG_AGC_ENCODER_CMD_OPTION*/ /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ -/*#define ALLOW_HOA3_ROTATION*/ /* Allow outputting rotated HOA3 signals */ /*#define DEBUG_JBM_CMD_OPTION*/ /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ /*#define VARIABLE_SPEED_DECODING*/ /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 58329a6ce4..e1b6a6a415 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -3136,9 +3136,6 @@ static ivas_error doSanityChecks_IVAS( if ( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM -#endif -#ifdef ALLOW_HOA3_ROTATION - || output_config == IVAS_AUDIO_CONFIG_HOA3 #endif ) ) { diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index bb672ffb31..e4e8f6c437 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -79,21 +79,6 @@ void ivas_renderer_select( st_ivas->hCombinedOrientationData->shd_rot_max_order = -1; } -#ifdef ALLOW_HOA3_ROTATION - if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) - { - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - if ( output_config == IVAS_AUDIO_CONFIG_HOA3 && st_ivas->hDecoderConfig->Opt_Headrotation && nchan_internal >= 2 ) - { -#ifdef NONBE_FIX_998_DIRAC_ROTATION - st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; -#else - st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; -#endif - } - } - -#endif if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM -- GitLab From 7bbf0ce9cd320be884f2c242625d468076bad30a Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 08:58:42 +0100 Subject: [PATCH 407/601] add separate issue templates for sanitizer errrors --- .../{sanitizer_error.md => asan_ltv_error.md} | 6 +-- .gitlab/issue_templates/msan_ltv_error.md | 46 +++++++++++++++++++ .gitlab/issue_templates/usan_ltv_error.md | 39 ++++++++++++++++ 3 files changed, 88 insertions(+), 3 deletions(-) rename .gitlab/issue_templates/{sanitizer_error.md => asan_ltv_error.md} (86%) create mode 100644 .gitlab/issue_templates/msan_ltv_error.md create mode 100644 .gitlab/issue_templates/usan_ltv_error.md diff --git a/.gitlab/issue_templates/sanitizer_error.md b/.gitlab/issue_templates/asan_ltv_error.md similarity index 86% rename from .gitlab/issue_templates/sanitizer_error.md rename to .gitlab/issue_templates/asan_ltv_error.md index f442519aba..efb359f539 100644 --- a/.gitlab/issue_templates/sanitizer_error.md +++ b/.gitlab/issue_templates/asan_ltv_error.md @@ -4,7 +4,7 @@ ### Bug description -Clang (m,a,u)san sanitizer test in pipeline found an error: +Clang ASAN sanitizer test in pipeline found an error: ``` @@ -20,13 +20,13 @@ Using the [scripts](https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/-/wikis/ ``` -python3 scripts/IvasBuildAndRunChecks.py --checks CLANGX -m MODE -p /path/to/my/local/ci_linux_ltv_local.json --usan_supp_file scripts/ubsan.supp +python3 scripts/IvasBuildAndRunChecks.py --checks CLANG2 -m MODE -p /path/to/my/local/ci_linux_ltv_local.json --usan_supp_file scripts/ubsan.supp ``` or directly: ``` make clean -make -j CLANG=X +make -j CLANG=2 ./IVAS_cod ... networkSimulator_g192 dly_profile.dat bit bit_err trace_dump 1 ./IVAS_dec ... diff --git a/.gitlab/issue_templates/msan_ltv_error.md b/.gitlab/issue_templates/msan_ltv_error.md new file mode 100644 index 0000000000..cc57222658 --- /dev/null +++ b/.gitlab/issue_templates/msan_ltv_error.md @@ -0,0 +1,46 @@ +### Basic info + +- Commit SHA: + +### Bug description + +Clang MSAN sanitizer test in pipeline found an error: + + +``` + +``` + + +Link to test pipeline: XXX + +### Ways to reproduce + +Activate [origin-tracking](https://clang.llvm.org/docs/MemorySanitizer.html#msan-origins) (more detailed traceback about where the undefined value came from) by appending +``` + -fsanitize-memory-track-origins +``` +in the `Makefile` at lines 71 and 72. Note that this may increase runtime heavily. + +Using the [scripts](https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/-/wikis/Software-development/pyivastest-howto#how-to-reproduce-tests): + + + +``` +python3 scripts/IvasBuildAndRunChecks.py --checks CLANG1 -m MODE -p /path/to/my/local/ci_linux_ltv_local.json +``` +or directly: + +``` +make clean +make -j CLANG=1 +./IVAS_cod ... +networkSimulator_g192 dly_profile.dat bit bit_err trace_dump 1 +./IVAS_dec ... +``` + + + +/label ~"Priority::Critical" ~Company: ~Subpart: +/label ~Type:Bug ~Status::ToDo diff --git a/.gitlab/issue_templates/usan_ltv_error.md b/.gitlab/issue_templates/usan_ltv_error.md new file mode 100644 index 0000000000..ef6562e866 --- /dev/null +++ b/.gitlab/issue_templates/usan_ltv_error.md @@ -0,0 +1,39 @@ +### Basic info + +- Commit SHA: + +### Bug description + +Clang USAN sanitizer test in pipeline found an error: + + +``` + +``` + + +Link to test pipeline: XXX + +### Ways to reproduce + +Using the [scripts](https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/-/wikis/Software-development/pyivastest-howto#how-to-reproduce-tests): + + +``` +python3 scripts/IvasBuildAndRunChecks.py --checks CLANG3 -m MODE -p /path/to/my/local/ci_linux_ltv_local.json --usan_supp_file scripts/ubsan.supp +``` +or directly: + +``` +make clean +make -j CLANG=3 +./IVAS_cod ... +networkSimulator_g192 dly_profile.dat bit bit_err trace_dump 1 +./IVAS_dec ... +``` + + + +/label ~"Priority::Critical" ~Company: ~Subpart: +/label ~Type:Bug ~Status::ToDo -- GitLab From 5a208f272c7ccfc8ab66429a51babb46e8573e68 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 09:06:16 +0100 Subject: [PATCH 408/601] remove obsolete part of template --- .gitlab/issue_templates/asan_ltv_error.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/asan_ltv_error.md b/.gitlab/issue_templates/asan_ltv_error.md index efb359f539..97b3fa9ec2 100644 --- a/.gitlab/issue_templates/asan_ltv_error.md +++ b/.gitlab/issue_templates/asan_ltv_error.md @@ -20,7 +20,7 @@ Using the [scripts](https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/-/wikis/ ``` -python3 scripts/IvasBuildAndRunChecks.py --checks CLANG2 -m MODE -p /path/to/my/local/ci_linux_ltv_local.json --usan_supp_file scripts/ubsan.supp +python3 scripts/IvasBuildAndRunChecks.py --checks CLANG2 -m MODE -p /path/to/my/local/ci_linux_ltv_local.json ``` or directly: -- GitLab From 488636747664be0b77efcae3b2a0228e53ed7949 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 09:19:01 +0100 Subject: [PATCH 409/601] enable define FIX_998_UNUSED_FUNCTION --- lib_com/options.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index caeaa8c4b9..c0447a2142 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -124,7 +124,7 @@ /*#define DEBUG_AGC*/ /* debug SPAR AGC in-out */ #endif /*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ -/*#define DEBUG_OSBA */ +/* #define DEBUG_OSBA*/ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ /*#define DEBUG_AGC_ENCODER_CMD_OPTION*/ /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ /*#define DEBUG_JBM_CMD_OPTION*/ /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ @@ -163,7 +163,8 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ -#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ +#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ +#define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ /* #################### End BE switches ################################## */ -- GitLab From 79cb6aa061bb44b47b673ac14d915cc935b64982 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 09:19:30 +0100 Subject: [PATCH 410/601] undo changes to ivas_output_config.c --- lib_com/options.h | 4 ++-- lib_dec/ivas_output_config.c | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index c0447a2142..a53439dac2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -124,7 +124,7 @@ /*#define DEBUG_AGC*/ /* debug SPAR AGC in-out */ #endif /*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ -/* #define DEBUG_OSBA*/ +/* #define DEBUG_OSBA */ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ /*#define DEBUG_AGC_ENCODER_CMD_OPTION*/ /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ /*#define DEBUG_JBM_CMD_OPTION*/ /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ @@ -163,7 +163,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ -#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ +#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index e4e8f6c437..c93b16dcdb 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -182,11 +182,14 @@ void ivas_renderer_select( { nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - if ( nchan_internal == 2 ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; } + else if ( nchan_internal == 4 || nchan_internal == 3 ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; + } else if ( nchan_internal == 6 || nchan_internal == 5 ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 2; -- GitLab From 2065b05e8927c8f79452340305f22abc6da11e66 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 09:52:48 +0100 Subject: [PATCH 411/601] fix compiler warnings --- lib_dec/ivas_dirac_dec.c | 8 ++++++++ lib_rend/ivas_dirac_output_synthesis_dec.c | 8 ++++++++ lib_rend/ivas_dirac_rend.c | 16 ++++++++++------ lib_rend/ivas_prot_rend.h | 4 ++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 8e3f383fea..f4309dd409 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1856,8 +1856,10 @@ void ivas_dirac_dec_render_sf( elevation, md_idx, surCohRatio, +#ifndef FIX_998_UNUSED_FUNCTION st_ivas->hCombinedOrientationData->shd_rot_max_order, p_Rmat, +#endif hodirac_flag ); } else @@ -1871,8 +1873,10 @@ void ivas_dirac_dec_render_sf( elevation, md_idx, surCohRatio, +#ifndef FIX_998_UNUSED_FUNCTION 0, NULL, +#endif hodirac_flag ); } } @@ -2213,8 +2217,10 @@ void ivas_dirac_dec_render_sf( hSpatParamRendCom->diffuseness_vector[md_idx], hSpatParamRendCom, hDirACRend, +#ifndef FIX_998_UNUSED_FUNCTION st_ivas->hCombinedOrientationData->shd_rot_max_order, p_Rmat, +#endif st_ivas->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, @@ -2231,8 +2237,10 @@ void ivas_dirac_dec_render_sf( hSpatParamRendCom->diffuseness_vector[md_idx], hSpatParamRendCom, hDirACRend, +#ifndef FIX_998_UNUSED_FUNCTION 0, 0, +#endif st_ivas->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 25d119ae88..a1ef9a3052 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -542,8 +542,10 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ +#ifndef FIX_998_UNUSED_FUNCTION const int16_t sh_rot_max_order, const float *p_Rmat, /* i : rotation matrix */ +#endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport, /* i : number of transport channels*/ @@ -590,8 +592,10 @@ void ivas_dirac_dec_output_synthesis_process_slot( elevation, md_idx, NULL, +#ifndef FIX_998_UNUSED_FUNCTION 2, p_Rmat, +#endif hodirac_flag ); } @@ -638,8 +642,10 @@ void ivas_dirac_dec_output_synthesis_process_slot( elevation, md_idx, NULL, +#ifndef FIX_998_UNUSED_FUNCTION sh_rot_max_order, p_Rmat, +#endif hodirac_flag ); if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) @@ -1750,8 +1756,10 @@ void ivas_dirac_dec_compute_directional_responses( const int16_t *elevation, const int16_t md_idx, const float *surCohRatio, +#ifndef FIX_998_UNUSED_FUNCTION const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat, /* i : rotation matrix */ +#endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c index ca2760d127..8bffbf9c39 100644 --- a/lib_rend/ivas_dirac_rend.c +++ b/lib_rend/ivas_dirac_rend.c @@ -230,14 +230,14 @@ ivas_error ivas_spat_hSpatParamRendCom_config( if ( flag_config == DIRAC_OPEN ) { - hSpatParamRendCom->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + hSpatParamRendCom->slot_size = ( int16_t )( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); set_s( hSpatParamRendCom->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hSpatParamRendCom->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); hSpatParamRendCom->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; hSpatParamRendCom->subframes_rendered = 0; hSpatParamRendCom->slots_rendered = 0; hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; - hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hSpatParamRendCom->num_freq_bands = ( int16_t )( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hSpatParamRendCom->numSimultaneousDirections = 0; hSpatParamRendCom->numParametricDirections = 0; hSpatParamRendCom->numIsmDirections = 0; @@ -1791,8 +1791,8 @@ void computeDirectionAngles( z = *( intensity_real_z++ ) * intensityNorm; } radius = sqrtf( x * x + y * y ); - azimuth[k] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); - elevation[k] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + azimuth[k] = ( int16_t )( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); + elevation[k] = ( int16_t )( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); } return; @@ -2077,8 +2077,8 @@ void rotateAziEle_DirAC( dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; /*Conversion spherical to cartesian coordinates*/ - azi[b] = (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); - ele[b] = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); + azi[b] = ( int16_t )( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); + ele[b] = ( int16_t )( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); } pop_wmops(); @@ -2216,8 +2216,10 @@ static void ivas_masa_ext_dirac_render_sf( elevation, md_idx, surCohRatio, +#ifndef FIX_998_UNUSED_FUNCTION 0, NULL, +#endif 0 ); @@ -2372,8 +2374,10 @@ static void ivas_masa_ext_dirac_render_sf( hSpatParamRendCom->diffuseness_vector[md_idx], hSpatParamRendCom, hDirACRend, +#ifndef FIX_998_UNUSED_FUNCTION 0, 0, +#endif hMasaExtRend->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 80b53d508d..7173290bb5 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -470,8 +470,10 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ +#ifndef FIX_998_UNUSED_FUNCTION const int16_t sh_rot_max_order, const float *p_Rmat, /* i : rotation matrix */ +#endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport, /* i : number of transport channels */ @@ -538,8 +540,10 @@ void ivas_dirac_dec_compute_directional_responses( const int16_t *elevation, const int16_t md_idx, const float *surCohRatio, +#ifndef FIX_998_UNUSED_FUNCTION const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat, /* i : rotation matrix */ +#endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); -- GitLab From c7f4ff07acaea1d1f4a1320e06873373e51e89e6 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 10:21:03 +0100 Subject: [PATCH 412/601] fix formatting --- lib_rend/ivas_dirac_output_synthesis_dec.c | 4 ++-- lib_rend/ivas_dirac_rend.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index a1ef9a3052..f985b514f5 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -544,7 +544,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ #ifndef FIX_998_UNUSED_FUNCTION const int16_t sh_rot_max_order, - const float *p_Rmat, /* i : rotation matrix */ + const float *p_Rmat, /* i : rotation matrix */ #endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ @@ -1760,7 +1760,7 @@ void ivas_dirac_dec_compute_directional_responses( const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat, /* i : rotation matrix */ #endif - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { int16_t k, l; diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c index 8bffbf9c39..7cd26526c7 100644 --- a/lib_rend/ivas_dirac_rend.c +++ b/lib_rend/ivas_dirac_rend.c @@ -230,14 +230,14 @@ ivas_error ivas_spat_hSpatParamRendCom_config( if ( flag_config == DIRAC_OPEN ) { - hSpatParamRendCom->slot_size = ( int16_t )( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + hSpatParamRendCom->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); set_s( hSpatParamRendCom->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hSpatParamRendCom->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); hSpatParamRendCom->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; hSpatParamRendCom->subframes_rendered = 0; hSpatParamRendCom->slots_rendered = 0; hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; - hSpatParamRendCom->num_freq_bands = ( int16_t )( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hSpatParamRendCom->numSimultaneousDirections = 0; hSpatParamRendCom->numParametricDirections = 0; hSpatParamRendCom->numIsmDirections = 0; @@ -1791,8 +1791,8 @@ void computeDirectionAngles( z = *( intensity_real_z++ ) * intensityNorm; } radius = sqrtf( x * x + y * y ); - azimuth[k] = ( int16_t )( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); - elevation[k] = ( int16_t )( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + azimuth[k] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); + elevation[k] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); } return; @@ -2077,8 +2077,8 @@ void rotateAziEle_DirAC( dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; /*Conversion spherical to cartesian coordinates*/ - azi[b] = ( int16_t )( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); - ele[b] = ( int16_t )( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); + azi[b] = (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); + ele[b] = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); } pop_wmops(); -- GitLab From f3e1f87fd8386e7666a22c900b062b9d6249fcfa Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 10:39:16 +0100 Subject: [PATCH 413/601] skip operating points with dubious non-BEs --- tests/hrtf_binary_loading/test_codec_ROM_vs_file.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 38f7c31bef..eeb001e983 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -67,6 +67,8 @@ def test_multichannel_binaural_static( ): if bitrate == 32000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") + if bitrate == 160000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipped until reason for non-BE in FastConv is clarified") in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) @@ -129,6 +131,8 @@ def test_multichannel_binaural_headrotation( def test_sba_binaural_static(test_info, bitrate, in_fmt, fs, out_fmt, hrtf_tag): if bitrate == 64000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") + if bitrate == 256000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipped until reason for non-BE in FastConv is clarified") option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) @@ -155,6 +159,8 @@ def test_sba_binaural_headrotation( ): if bitrate == 64000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") + if bitrate == 256000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipped until reason for non-BE in FastConv is clarified") option_list = ["-sba", in_fmt] in_file = FORMAT_TO_FILE_SBA_WOEXT[in_fmt].format(fs) -- GitLab From 97cedcfe5cd404706320883964df74c2aaa2c283 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 26 Feb 2024 10:44:27 +0100 Subject: [PATCH 414/601] add missing skip --- tests/hrtf_binary_loading/test_codec_ROM_vs_file.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index eeb001e983..c66792c653 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -103,6 +103,8 @@ def test_multichannel_binaural_headrotation( ): if bitrate == 32000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: pytest.skip("Skipping ParamBin until binary and ROM contain same data") + if bitrate == 160000 and hrtf_tag == HRTF_TAG_SAME_AS_ROM: + pytest.skip("Skipped until reason for non-BE in FastConv is clarified") in_fs = 48 option_list = ["-mc", in_fmt] in_file = FORMAT_TO_FILE_MC_WOEXT[in_fmt].format(in_fs) -- GitLab From ff7c953a253482aa18408affb9505921c13d1c58 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 11:17:27 +0100 Subject: [PATCH 415/601] address formatting comments --- lib_rend/ivas_dirac_output_synthesis_dec.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index f985b514f5..4e9d7db6cb 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -1829,6 +1829,7 @@ void ivas_dirac_dec_compute_directional_responses( { set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); + #ifndef FIX_998_UNUSED_FUNCTION if ( p_Rmat != 0 ) { @@ -1840,15 +1841,17 @@ void ivas_dirac_dec_compute_directional_responses( } } else -#endif { +#endif ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirACRend->hOutSetup.ambisonics_order ); if ( hodirac_flag ) { ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirACRend->hOutSetup.ambisonics_order ); } +#ifndef FIX_998_UNUSED_FUNCTION } +#endif if ( masa_band_mapping == NULL && hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { -- GitLab From 959debdc955415c5f37b85ed9b24db2bb532da56 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 11:24:43 +0100 Subject: [PATCH 416/601] delete unnecessary if conditions from ivas_dirac_dec_render_sf --- lib_dec/ivas_dirac_dec.c | 57 +++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index f4309dd409..555b0f87c6 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1013,7 +1013,7 @@ void ivas_dirac_dec_read_BS( if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { next_bit_pos_orig = st->next_bit_pos; - st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); + st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 ); if ( last_bit_pos > 0 ) { st->next_bit_pos = last_bit_pos; @@ -1086,7 +1086,7 @@ void ivas_dirac_dec_read_BS( next_bit_pos_orig = st->next_bit_pos; /* subtract mode signaling bits, since bitstream was moved after mode reading */ - st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); + st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; @@ -1394,13 +1394,13 @@ void ivas_qmetadata_to_dirac( if ( hodirac_flag ) { - azi = (int16_t) ( azimuth + 0.5f ); - ele = (int16_t) ( elevation + 0.5f ); + azi = ( int16_t )( azimuth + 0.5f ); + ele = ( int16_t )( elevation + 0.5f ); } else { - azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); - ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + azi = ( int16_t )( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele = ( int16_t )( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); /* limit the elevation to [-90, 90] */ ele = min( 90, ele ); ele = max( -90, ele ); @@ -1736,10 +1736,10 @@ void ivas_dirac_dec_render_sf( { for ( i = 0; i < output_frame; i++ ) { - tmp[nchan_transport * i + n] = (int16_t) ( output_f[n][i] + 0.5f ); + tmp[nchan_transport * i + n] = ( int16_t )( output_f[n][i] + 0.5f ); } } - sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, (int16_t) ( output_frame * 0.05 ) ); + sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, ( int16_t )( output_frame * 0.05 ) ); dbgwrite( tmp, sizeof( int16_t ), nchan_transport * output_frame, 1, file_name ); } #endif @@ -1844,6 +1844,7 @@ void ivas_dirac_dec_render_sf( set_zero( surCohRatio, hSpatParamRendCom->num_freq_bands ); } } +#ifndef FIX_998_UNUSED_FUNCTION if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 1 ) { @@ -1856,10 +1857,8 @@ void ivas_dirac_dec_render_sf( elevation, md_idx, surCohRatio, -#ifndef FIX_998_UNUSED_FUNCTION st_ivas->hCombinedOrientationData->shd_rot_max_order, p_Rmat, -#endif hodirac_flag ); } else @@ -1873,13 +1872,23 @@ void ivas_dirac_dec_render_sf( elevation, md_idx, surCohRatio, -#ifndef FIX_998_UNUSED_FUNCTION 0, NULL, -#endif hodirac_flag ); } } +#else + ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + st_ivas->hMasa == NULL ? NULL : st_ivas->hMasa->data.band_mapping, + st_ivas->hMasaIsmData, + azimuth, + elevation, + md_idx, + surCohRatio, + hodirac_flag ); +#endif if ( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 ) { @@ -2208,6 +2217,7 @@ void ivas_dirac_dec_render_sf( } /*Compute PSDs*/ +#ifndef FIX_998_UNUSED_FUNCTION if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) { ivas_dirac_dec_output_synthesis_process_slot( reference_power, @@ -2217,10 +2227,8 @@ void ivas_dirac_dec_render_sf( hSpatParamRendCom->diffuseness_vector[md_idx], hSpatParamRendCom, hDirACRend, -#ifndef FIX_998_UNUSED_FUNCTION st_ivas->hCombinedOrientationData->shd_rot_max_order, p_Rmat, -#endif st_ivas->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, @@ -2237,10 +2245,8 @@ void ivas_dirac_dec_render_sf( hSpatParamRendCom->diffuseness_vector[md_idx], hSpatParamRendCom, hDirACRend, -#ifndef FIX_998_UNUSED_FUNCTION 0, 0, -#endif st_ivas->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, @@ -2248,6 +2254,21 @@ void ivas_dirac_dec_render_sf( hodirac_flag, hDirAC->hConfig->dec_param_estim ); } +#else + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector[md_idx], + hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); +#endif if ( hDirAC->hConfig->dec_param_estim ) { @@ -2451,8 +2472,8 @@ void ivas_dirac_dec_render_sf( RealBuffer[i] = Cldfb_RealBuffer_Binaural[0][ch][i]; ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[0][ch][i]; #else - RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; - ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; #endif } -- GitLab From f26c7ed3ca1d83687aaa64a42b0eec00e0be3861 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 11:34:04 +0100 Subject: [PATCH 417/601] fix formatting --- lib_dec/ivas_dirac_dec.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 555b0f87c6..538b2532ae 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1013,7 +1013,7 @@ void ivas_dirac_dec_read_BS( if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { next_bit_pos_orig = st->next_bit_pos; - st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 ); + st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); if ( last_bit_pos > 0 ) { st->next_bit_pos = last_bit_pos; @@ -1086,7 +1086,7 @@ void ivas_dirac_dec_read_BS( next_bit_pos_orig = st->next_bit_pos; /* subtract mode signaling bits, since bitstream was moved after mode reading */ - st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); + st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; @@ -1394,13 +1394,13 @@ void ivas_qmetadata_to_dirac( if ( hodirac_flag ) { - azi = ( int16_t )( azimuth + 0.5f ); - ele = ( int16_t )( elevation + 0.5f ); + azi = (int16_t) ( azimuth + 0.5f ); + ele = (int16_t) ( elevation + 0.5f ); } else { - azi = ( int16_t )( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); - ele = ( int16_t )( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); /* limit the elevation to [-90, 90] */ ele = min( 90, ele ); ele = max( -90, ele ); @@ -1736,10 +1736,10 @@ void ivas_dirac_dec_render_sf( { for ( i = 0; i < output_frame; i++ ) { - tmp[nchan_transport * i + n] = ( int16_t )( output_f[n][i] + 0.5f ); + tmp[nchan_transport * i + n] = (int16_t) ( output_f[n][i] + 0.5f ); } } - sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, ( int16_t )( output_frame * 0.05 ) ); + sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, (int16_t) ( output_frame * 0.05 ) ); dbgwrite( tmp, sizeof( int16_t ), nchan_transport * output_frame, 1, file_name ); } #endif -- GitLab From 27f615ab1b1e3309154b918abfd0e24b7acf30c7 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 11:45:46 +0100 Subject: [PATCH 418/601] fix compile error --- lib_dec/ivas_dirac_dec.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 538b2532ae..849caa6e8e 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1876,7 +1876,6 @@ void ivas_dirac_dec_render_sf( NULL, hodirac_flag ); } - } #else ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, hDirACRend, @@ -1889,6 +1888,7 @@ void ivas_dirac_dec_render_sf( surCohRatio, hodirac_flag ); #endif + } if ( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 ) { @@ -2255,19 +2255,19 @@ void ivas_dirac_dec_render_sf( hDirAC->hConfig->dec_param_estim ); } #else - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - azimuth, - elevation, - hSpatParamRendCom->diffuseness_vector[md_idx], - hSpatParamRendCom, - hDirACRend, - st_ivas->hVBAPdata, - hDirACRend->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag, - hDirAC->hConfig->dec_param_estim ); + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector[md_idx], + hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); #endif if ( hDirAC->hConfig->dec_param_estim ) @@ -2472,8 +2472,8 @@ void ivas_dirac_dec_render_sf( RealBuffer[i] = Cldfb_RealBuffer_Binaural[0][ch][i]; ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[0][ch][i]; #else - RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; - ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; #endif } -- GitLab From b123958c5f964abf77b25bfbae56e532f290edea Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 Feb 2024 12:05:01 +0100 Subject: [PATCH 419/601] rename NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING to NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_A --- lib_com/options.h | 2 +- lib_dec/ivas_output_config.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 64c96ac769..cdd45dbd68 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -177,7 +177,7 @@ #ifdef SPLIT_REND_WITH_HEAD_ROT #define SPLIT_REND_LCLD_5MS /* Dlb: LCLD 5ms framing operation */ #endif -#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: fix broken output with ParamMC to BINAURAL_REVERB rendering */ +#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_A /* FhG: issue 987: fix broken output with ParamMC to BINAURAL_REVERB rendering */ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ #define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 1e31f0aac4..57876353a6 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -248,7 +248,7 @@ void ivas_renderer_select( *renderer_type = RENDERER_BINAURAL_FASTCONV; } -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_A if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && !( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #else if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) -- GitLab From 00d1268de901ee67c13aaf307c71c97f89affe38 Mon Sep 17 00:00:00 2001 From: Adriana Vasilache Date: Mon, 26 Feb 2024 13:17:36 +0200 Subject: [PATCH 420/601] change in issue 1004 --- lib_dec/ivas_masa_dec.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index f7731831b7..3984b79c54 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -136,18 +136,19 @@ ivas_error ivas_masa_decode( if ( masa_brate == IVAS_SID_5k2 ) { st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); -#ifdef NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS - if ( ivas_format == MASA_FORMAT ) - { - hMasa->config.numberOfDirections = 1; - } -#endif } else { st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 ); } +#ifdef NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS + if ( ivas_format == MASA_FORMAT && ( masa_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) + { + hMasa->config.numberOfDirections = 1; + } +#endif + if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) -- GitLab From d81961eded356475a9ab9db7e5f270bc50bc6a4e Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 26 Feb 2024 14:12:49 +0100 Subject: [PATCH 421/601] issue 993: remove unused function ivas_sba_get_order(); under FIX_993_REMOVE_SBA_GET_ORDER --- lib_com/ivas_prot.h | 3 ++- lib_com/ivas_sba_config.c | 8 ++++++-- lib_com/options.h | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index d0c797e27d..eab3f6664b 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3496,12 +3496,13 @@ ivas_error ivas_cldfb_dec_reconfig( const int16_t numCldfbSyntheses_old /* i : number of CLDFB synthesis instances in previous frame */ ); +#ifndef FIX_993_REMOVE_SBA_GET_ORDER /*! r: Ambisonic (SBA) order */ int16_t ivas_sba_get_order( const int16_t nb_channels, /* i : Number of ambisonic channels */ const int16_t sba_planar /* i : SBA planar flag */ ); - +#endif /*! r: Ambisonic (SBA) order used for analysis and coding */ int16_t ivas_sba_get_analysis_order( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 52ed4672b6..ddb59b2ed5 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -70,7 +70,11 @@ void ivas_sba_config( } else if ( sba_order < 0 ) { +#ifdef FIX_993_REMOVE_SBA_GET_ORDER + assert( !"SBA order cannot be negative!" ); +#else sba_order = ivas_sba_get_order( nb_channels, sba_planar ); +#endif } else if ( nb_channels < 0 ) { @@ -117,7 +121,7 @@ void ivas_sba_config( return; } - +#ifndef FIX_993_REMOVE_SBA_GET_ORDER /*-------------------------------------------------------------------* * ivas_sba_get_order() * @@ -147,7 +151,7 @@ int16_t ivas_sba_get_order( return ( sba_order ); } - +#endif /*-------------------------------------------------------------------* * ivas_sba_get_analysis_order() diff --git a/lib_com/options.h b/lib_com/options.h index f79b346839..e48c28c5b6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,6 +164,7 @@ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ #define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ +#define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ /* #################### End BE switches ################################## */ -- GitLab From 785a82d847d2392f26490bfbcf1c0d207bb09c2a Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 26 Feb 2024 14:35:15 +0100 Subject: [PATCH 422/601] fix for #1012, #1013, fix JBM flush output buffer, use also the global output buffer instead of a local one. --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index f79b346839..87fdfed11d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -184,6 +184,7 @@ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ +#define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 89aa3f8d4c..a7ebc61a2c 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1586,8 +1586,12 @@ ivas_error ivas_jbm_dec_flush_renderer( int16_t n_slots_still_available; int16_t n_samples_to_render; DECODER_TC_BUFFER_HANDLE hTcBuffer; +#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER + float *p_output[MAX_CICP_CHANNELS + MAX_NUM_OBJECTS]; +#else float output[MAX_CICP_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; float *p_output[MAX_CICP_CHANNELS]; +#endif if ( !st_ivas->hDecoderConfig->Opt_tsm ) { @@ -1632,10 +1636,17 @@ ivas_error ivas_jbm_dec_flush_renderer( hTcBuffer->n_samples_flushed = n_samples_to_render; hTcBuffer->n_samples_rendered = 0; +#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER + for ( ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + p_output[ch_idx] = st_ivas->p_output_f[ch_idx]; + } +#else for ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) { p_output[ch_idx] = output[ch_idx]; } +#endif if ( st_ivas->ivas_format == ISM_FORMAT ) { -- GitLab From 74d86d19d1f052394d9b99b851308ea0906c5e41 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 26 Feb 2024 15:07:34 +0100 Subject: [PATCH 423/601] add OMASA EXT self-test condition --- scripts/config/self_test.prm | 5 +++++ scripts/config/self_test_ltv.prm | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 460f9ce781..8e3ea95036 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1601,6 +1601,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out +../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/ +sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit +../IVAS_dec EXT 48 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_EXT_sw_48-48.tst + // OSBA FOA 1ISM at 32 kbps, 48kHz in, 48kHz out, BINAURAL out diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 6839760c25..3dd51a441d 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1602,6 +1602,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit ../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out +../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv NULL testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/ +sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit +../IVAS_dec EXT 48 bit testv/ltvOMASA_4ISM_2MASA2TC48c.wav_EXT_sw_48-48.tst + // OSBA FOA 1ISM at 32 kbps, 48kHz in, 48kHz out, BINAURAL out -- GitLab From 15b801a1bb6c999acd937c559f9b7157b8c268a1 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 26 Feb 2024 15:51:18 +0100 Subject: [PATCH 424/601] remove a line break --- scripts/config/self_test.prm | 3 +-- scripts/config/self_test_ltv.prm | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 8e3ea95036..61a179a769 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1602,8 +1602,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst // OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out -../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/ -sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit +../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit ../IVAS_dec EXT 48 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_EXT_sw_48-48.tst diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 3dd51a441d..feadcc61fe 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1603,8 +1603,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst // OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out -../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv NULL testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/ -sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit +../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv NULL testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit ../IVAS_dec EXT 48 bit testv/ltvOMASA_4ISM_2MASA2TC48c.wav_EXT_sw_48-48.tst -- GitLab From 4586a1a30e09f4fd7aadf521def132d7556ad7db Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 26 Feb 2024 16:01:06 +0100 Subject: [PATCH 425/601] fix for #1014, fix OSBA discrete object stereo output, update TC buffer subframe information in the ISM rendering for the discrete objects --- lib_com/options.h | 1 + lib_dec/ivas_ism_renderer.c | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index f79b346839..12730e95f0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -184,6 +184,7 @@ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ +#define NONBE_FIX_1014_OSBA_JBM_STEREO /* FhG: issue #1014: fix stereo output for OSBA*/ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 3dbc6a6190..07d6217cc4 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -168,7 +168,10 @@ void ivas_ism_render_sf( slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; last_sf++; } - +#ifdef DEBUGGING + assert( slots_to_render == 0 ); + assert( last_sf <= st_ivas->hTcBuffer->nb_subframes ); +#endif num_objects = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) { @@ -276,7 +279,11 @@ void ivas_ism_render_sf( ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); n_samples_rendered_loop += n_samples_in_subframe; +#ifdef NONBE_FIX_1014_OSBA_JBM_STEREO + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_OSBA_STEREO ) +#else if ( st_ivas->renderer_type == RENDERER_TD_PANNING ) +#endif { st_ivas->hTcBuffer->subframes_rendered += 1; st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; -- GitLab From 1473fa6ccf8aeb5dce3ebae9cfbe0a41adfd2ff1 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 27 Feb 2024 16:38:34 +1100 Subject: [PATCH 426/601] clean up of switch SPLIT_REND_LCLD_5MS --- apps/decoder.c | 33 -- apps/renderer.c | 18 - lib_com/options.h | 5 - lib_dec/ivas_init_dec.c | 20 -- lib_dec/ivas_mc_paramupmix_dec.c | 44 --- lib_dec/ivas_stat_dec.h | 3 - lib_dec/lib_dec.c | 103 ------ lib_rend/ivas_PredDecoder.c | 194 ---------- lib_rend/ivas_PredEncoder.c | 378 -------------------- lib_rend/ivas_RMSEnvGrouping.c | 4 - lib_rend/ivas_crend.c | 2 - lib_rend/ivas_lcld_decoder.c | 77 ---- lib_rend/ivas_lcld_encoder.c | 529 ---------------------------- lib_rend/ivas_lcld_prot.h | 49 --- lib_rend/ivas_lcld_rom_tables.c | 8 - lib_rend/ivas_lcld_rom_tables.h | 16 - lib_rend/ivas_prot_rend.h | 66 ---- lib_rend/ivas_splitRend_lcld_dec.c | 44 --- lib_rend/ivas_splitRend_lcld_enc.c | 62 ---- lib_rend/ivas_splitRendererPLC.c | 73 ---- lib_rend/ivas_splitRendererPost.c | 10 - lib_rend/ivas_splitRendererPre.c | 172 --------- lib_rend/ivas_splitRenderer_utils.c | 19 - lib_rend/ivas_stat_rend.h | 4 - lib_rend/lib_rend.c | 95 ----- 25 files changed, 2028 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 10a8ce2370..aca1635eae 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -455,14 +455,9 @@ int main( *------------------------------------------------------------------------------------------*/ #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef SPLIT_REND_LCLD_5MS asked_frame_size = arg.renderFramesize; -#endif if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { -#ifndef SPLIT_REND_LCLD_5MS - asked_frame_size = arg.renderFramesize; -#endif if ( ( error = IVAS_DEC_EnableSplitRendering( hIvasDec ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -475,12 +470,6 @@ int main( goto cleanup; } -#ifndef SPLIT_REND_LCLD_5MS - if ( arg.renderFramesize != asked_frame_size ) - { - fprintf( stderr, "\nChanged render framesize, only 20ms are allowed for split rendering!\n" ); - } -#endif arg.enableHeadRotation = true; } #endif @@ -633,26 +622,6 @@ int main( goto cleanup; } -#ifdef SPLIT_REND_WITH_HEAD_ROT -#ifndef SPLIT_REND_LCLD_5MS - if ( arg.renderFramesize == IVAS_RENDER_FRAMESIZE_5MS && ( renderConfig.split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE || - renderConfig.split_rend_config.dof == 0 ) ) - { - /*TODO : needs to be refined as this wont work with LCLD codec*/ - arg.renderFramesize = IVAS_RENDER_FRAMESIZE_5MS; - } - else - { - arg.renderFramesize = IVAS_RENDER_FRAMESIZE_20MS; - } - - if ( ( error = IVAS_DEC_SetRenderFramesize( hIvasDec, arg.renderFramesize ) ) != IVAS_ERR_OK ) - { - return error; - } - -#endif -#endif if ( RenderConfigReader_read( renderConfigReader, arg.renderConfigFilename, &renderConfig ) != IVAS_ERR_OK ) { fprintf( stderr, "Failed to read renderer configuration from file %s\n\n", arg.renderConfigFilename ); @@ -665,7 +634,6 @@ int main( goto cleanup; } -#ifdef SPLIT_REND_LCLD_5MS #ifdef SPLIT_REND_WITH_HEAD_ROT if ( asked_frame_size != IVAS_RENDER_FRAMESIZE_20MS && ( renderConfig.split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE || renderConfig.split_rend_config.dof == 0 ) ) @@ -686,7 +654,6 @@ int main( { fprintf( stderr, "\nChanged render framesize, only 20ms are allowed for non-0dof split rendering!\n" ); } -#endif #endif if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) diff --git a/apps/renderer.c b/apps/renderer.c index 636c6d651b..007ef477e7 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1889,7 +1889,6 @@ int main( #ifdef SPLIT_REND_WITH_HEAD_ROT for ( i = 0; i < args.inConfig.numBinBuses; ++i ) { -#ifdef SPLIT_REND_LCLD_5MS if ( numSamplesRead > 0 ) { if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, splitBinIds[i], &numChannels ) ) != IVAS_ERR_OK ) @@ -1905,23 +1904,8 @@ int main( exit( -1 ); } } -#endif if ( splitBinNeedsNewFrame ) { -#ifndef SPLIT_REND_LCLD_5MS - if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, splitBinIds[i], &numChannels ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); - } - IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.binBuses[i].inputChannelIndex, numChannels ); - - if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, splitBinIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); - } -#endif if ( ( error = IVAS_REND_FeedSplitBinauralBitstream( hIvasRend, splitBinIds[i], &bitsBuffer ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); @@ -2225,9 +2209,7 @@ cleanup: } split_rend_reader_writer_close( &hSplitRendFileReadWrite ); -#ifdef SPLIT_REND_LCLD_5MS SplitRendBFIFileReader_close( &splitRendBFIReader ); -#endif #endif for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) diff --git a/lib_com/options.h b/lib_com/options.h index f79b346839..7065d18d91 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -173,11 +173,6 @@ /* all switches in this category should start with "NONBE_" */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ - -#ifdef SPLIT_REND_WITH_HEAD_ROT -#define SPLIT_REND_LCLD_5MS /* Dlb: LCLD 5ms framing operation */ -#endif - #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ #define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 802c239484..1e6ac794eb 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -247,17 +247,10 @@ static ivas_error ivas_dec_init_split_rend( } } -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = ivas_split_rend_choose_default_codec( &st_ivas->hRenderConfig->split_rend_config.codec, &st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, pcm_out_flag, (int16_t) st_ivas->hDecoderConfig->render_framesize ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = ivas_split_rend_choose_default_codec( &st_ivas->hRenderConfig->split_rend_config.codec, &st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, pcm_out_flag ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif #ifdef SPLIT_REND_WITH_HEAD_ROT if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV && st_ivas->ivas_format == SBA_ISM_FORMAT ) @@ -266,11 +259,7 @@ static ivas_error ivas_dec_init_split_rend( } #endif -#ifdef SPLIT_REND_LCLD_5MS error = ivas_split_renderer_open( &st_ivas->hSplitBinRend.splitrend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hDecoderConfig->output_Fs, cldfb_in_flag, pcm_out_flag, (int16_t) st_ivas->hDecoderConfig->render_framesize ); -#else - error = ivas_split_renderer_open( &st_ivas->hSplitBinRend.splitrend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hDecoderConfig->output_Fs, cldfb_in_flag, pcm_out_flag, st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ); -#endif return error; } #endif @@ -2559,9 +2548,6 @@ void ivas_initialize_handles_dec( st_ivas->hSplitBinRend.hMultiBinCldfbData = NULL; st_ivas->hSplitBinRend.hSplitRendBits = NULL; st_ivas->hSplitBinRend.hCldfbDataOut = NULL; -#ifndef SPLIT_REND_LCLD_5MS - st_ivas->hSplitBinRend.tdDataOut = NULL; -#endif st_ivas->hSplitBinRend.numTdSamplesPerChannelCached = 0; ivas_init_split_rend_handles( &st_ivas->hSplitBinRend.splitrend ); #endif @@ -2711,12 +2697,6 @@ void ivas_destroy_dec( free( st_ivas->hSplitBinRend.hCldfbDataOut ); st_ivas->hSplitBinRend.hCldfbDataOut = NULL; } -#ifndef SPLIT_REND_LCLD_5MS - if ( st_ivas->hSplitBinRend.tdDataOut != NULL ) - { - free( st_ivas->hSplitBinRend.tdDataOut ); - } -#endif #endif /* Parametric binaural renderer handle */ diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 2ff77228f8..d6b12947ef 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -66,15 +66,7 @@ const int16_t MC_PARAMUPMIX_CHIDX2[MC_PARAMUPMIX_COMBINATIONS] = { 2, 3, 6, 7 }; static void ps_pred_process_sf( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, DECODER_TC_BUFFER_HANDLE hTcBuffer, float qmf_mod_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float *param_interpol, const int16_t ch, const int16_t slots_rendered ); -#ifndef SPLIT_REND_LCLD_5MS -#ifdef SPLIT_REND_WITH_HEAD_ROT -static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS], const int16_t slot_index_start ); -#else -static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS] ); -#endif -#else static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, float *output_f[MAX_OUTPUT_CHANNELS] ); -#endif static void ivas_param_upmix_dec_decorr_subframes( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering ); @@ -234,11 +226,6 @@ void ivas_mc_paramupmix_dec_render( int16_t slots_to_render, first_sf, last_sf, subframe_idx; uint16_t slot_size, ch; float *output_f_local[MAX_OUTPUT_CHANNELS]; -#ifndef SPLIT_REND_LCLD_5MS -#ifdef SPLIT_REND_WITH_HEAD_ROT - int16_t slot_index_start; -#endif -#endif MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; hMCParamUpmix = st_ivas->hMCParamUpmix; @@ -273,25 +260,10 @@ void ivas_mc_paramupmix_dec_render( assert( slots_to_render == 0 ); #endif { -#ifndef SPLIT_REND_LCLD_5MS -#ifdef SPLIT_REND_WITH_HEAD_ROT - slot_index_start = 0; -#endif -#endif for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; -#ifndef SPLIT_REND_LCLD_5MS -#ifdef SPLIT_REND_WITH_HEAD_ROT - ivas_mc_paramupmix_dec_sf( st_ivas, output_f_local, slot_index_start ); - - slot_index_start += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; -#else - ivas_mc_paramupmix_dec_sf( st_ivas, output_f_local ); -#endif -#else ivas_mc_paramupmix_dec_sf( st_ivas, output_f_local ); -#endif for ( ch = 0; ch < min( MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ) ); ch++ ) { @@ -664,22 +636,10 @@ static void ps_pred_process_sf( return; } -#ifndef SPLIT_REND_LCLD_5MS -static void ivas_mc_paramupmix_dec_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ -#ifdef SPLIT_REND_WITH_HEAD_ROT - float *output_f[MAX_OUTPUT_CHANNELS], /* i/o: synthesized core-coder transport channels */ - const int16_t slot_index_start -#else - float *output_f[MAX_OUTPUT_CHANNELS] /* i/o: synthesized core-coder transport channels */ -#endif -) -#else static void ivas_mc_paramupmix_dec_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float *output_f[MAX_OUTPUT_CHANNELS] /* i/o: synthesized core-coder transport channels */ ) -#endif { int16_t i, ch, slot_idx, k; float *pPcm_temp[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/ @@ -694,9 +654,7 @@ static void ivas_mc_paramupmix_dec_sf( #ifdef SPLIT_REND_WITH_HEAD_ROT float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#ifdef SPLIT_REND_LCLD_5MS int16_t slot_index_start; -#endif #else float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -707,9 +665,7 @@ static void ivas_mc_paramupmix_dec_sf( push_wmops( "ivas_mc_paramupmix_dec_sf" ); #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef SPLIT_REND_LCLD_5MS slot_index_start = st_ivas->hTcBuffer->slots_rendered; -#endif #endif for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 46b2533270..dccd1391a5 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -998,9 +998,6 @@ typedef struct IVAS_SPLIT_REND_BITS_HANDLE hSplitRendBits; /*scratch buffer for frame by frame processing*/ SPLIT_REND_WRAPPER splitrend; IVAS_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE hCldfbDataOut; /*buffer to store cldfb data before binauralization*/ -#ifndef SPLIT_REND_LCLD_5MS - float *tdDataOut; /*buffer to store TD data before binauralization*/ -#endif int16_t numTdSamplesPerChannelCached; } IVAS_DEC_SPLIT_REND_WRAPPER; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 61d452d9da..fad1c0b53e 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1058,20 +1058,11 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( Decoder_Struct *st_ivas; AUDIO_CONFIG output_config; int32_t output_Fs; -#ifndef SPLIT_REND_LCLD_5MS - float *writePtr; - float *readPtr, *readEnd; -#endif float *pOutput[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; float output[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; float pcmBuf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES * L_FRAME48k]; -#ifdef SPLIT_REND_LCLD_5MS float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; -#else - int16_t numSamplesPerChannelCacheSize; - int16_t numSamplesPerChannelToSplitEncode; -#endif int16_t numSamplesPerChannelToDecode; int16_t i, j; ivas_error error; @@ -1080,9 +1071,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( int16_t pcm_out_flag; int16_t td_input; int16_t numPoses; -#ifdef SPLIT_REND_LCLD_5MS int16_t slots_rendered, slots_rendered_new; -#endif int16_t ro_md_flag; error = IVAS_ERR_OK; @@ -1101,7 +1090,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( numPoses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; -#ifdef SPLIT_REND_LCLD_5MS if ( st_ivas->hDecoderConfig->render_framesize != IVAS_RENDER_FRAMESIZE_20MS && ( hIvasDec->st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE || hIvasDec->st_ivas->hRenderConfig->split_rend_config.dof == 0 ) ) @@ -1109,35 +1097,11 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( numSamplesPerChannelToDecode = (int16_t) ( output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ); numSamplesPerChannelToDecode *= (int16_t) st_ivas->hDecoderConfig->render_framesize; } -#else - if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS && hIvasDec->st_ivas->hRenderConfig->split_rend_config.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS && - ( hIvasDec->st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE || - hIvasDec->st_ivas->hRenderConfig->split_rend_config.dof == 0 ) ) - { - numSamplesPerChannelToSplitEncode = (int16_t) ( output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ); - numSamplesPerChannelCacheSize = numSamplesPerChannelToDecode - numSamplesPerChannelToSplitEncode; - - if ( hSplitBinRend->tdDataOut == NULL ) - { - /* Allocate enough space to save all decoded samples that will not be split encoded directly after decoding */ - if ( ( hSplitBinRend->tdDataOut = malloc( numSamplesPerChannelCacheSize * BINAURAL_CHANNELS * numPoses * sizeof( float ) ) ) == NULL ) - { - return IVAS_ERR_FAILED_ALLOC; - } - } - } - else - { - numSamplesPerChannelToSplitEncode = (int16_t) ( output_Fs / FRAMES_PER_SEC ); - numSamplesPerChannelCacheSize = 0; - } -#endif if ( output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { return IVAS_ERR_WRONG_PARAMS; } -#ifdef SPLIT_REND_LCLD_5MS if ( st_ivas->hTcBuffer == NULL || hIvasDec->hasBeenFedFrame ) { slots_rendered = 0; @@ -1153,55 +1117,9 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( { return error; } -#else - if ( numSamplesPerChannelToDecode == numSamplesPerChannelToSplitEncode || hSplitBinRend->numTdSamplesPerChannelCached == 0 ) - { - /* Decode and render */ - if ( ( error = IVAS_DEC_GetSamples( hIvasDec, numSamplesPerChannelToDecode, IVAS_DEC_PCM_FLOAT, pcmBuf, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) - { - return error; - } -#ifdef DEBUGGING - assert( numSamplesPerChannelToDecode == *nOutSamples ); -#endif - - /* copy to cache if cache is in use */ - if ( hSplitBinRend->tdDataOut != NULL ) - { - writePtr = hSplitBinRend->tdDataOut; - readPtr = pcmBuf + numSamplesPerChannelToSplitEncode * BINAURAL_CHANNELS * numPoses; - readEnd = pcmBuf + *nOutSamples * BINAURAL_CHANNELS * numPoses; - - while ( readPtr != readEnd ) - { - *writePtr++ = *readPtr++; - } - hSplitBinRend->numTdSamplesPerChannelCached = *nOutSamples - numSamplesPerChannelToSplitEncode; - } - } - else - { - /* copy from cache */ - assert( hSplitBinRend->tdDataOut != NULL ); - - readPtr = hSplitBinRend->tdDataOut + ( numSamplesPerChannelCacheSize - hSplitBinRend->numTdSamplesPerChannelCached ) * BINAURAL_CHANNELS * numPoses; - readEnd = readPtr + numSamplesPerChannelToSplitEncode * BINAURAL_CHANNELS * numPoses; - writePtr = pcmBuf; - - while ( readPtr != readEnd ) - { - *writePtr++ = *readPtr++; - } - hSplitBinRend->numTdSamplesPerChannelCached -= numSamplesPerChannelToSplitEncode; - } -#endif /* change buffer layout */ -#ifdef SPLIT_REND_LCLD_5MS for ( i = 0; i < numSamplesPerChannelToDecode; ++i ) -#else - for ( i = 0; i < numSamplesPerChannelToSplitEncode; ++i ) -#endif { for ( j = 0; j < BINAURAL_CHANNELS * numPoses; ++j ) { @@ -1213,7 +1131,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( pOutput[i] = output[i]; } -#ifdef SPLIT_REND_LCLD_5MS if ( st_ivas->hTcBuffer == NULL ) { slots_rendered_new = 0; @@ -1231,7 +1148,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( mvr2r( hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[i][j], Cldfb_ImagBuffer_Binaural[i][j - slots_rendered], CLDFB_NO_CHANNELS_MAX ); } } -#endif max_band = (int16_t) ( ( BINAURAL_MAXBANDS * output_Fs ) / 48000 ); pcm_out_flag = ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; @@ -1252,13 +1168,8 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( st_ivas->hRenderConfig->split_rend_config.codec, st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, hSplitBinRend->hSplitRendBits, -#ifdef SPLIT_REND_LCLD_5MS Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, -#else - hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural, - hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural, -#endif max_band, pOutput, 1, !td_input, pcm_out_flag, ro_md_flag ) ) != IVAS_ERR_OK ) { @@ -1271,30 +1182,18 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) { #ifndef DISABLE_LIMITER -#ifdef SPLIT_REND_LCLD_5MS ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); -#else - ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToSplitEncode, st_ivas->BER_detect ); -#endif #endif } else { -#ifdef SPLIT_REND_LCLD_5MS ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); -#else - ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToSplitEncode, st_ivas->BER_detect ); -#endif } #ifdef DEBUGGING st_ivas->noClipping += #endif -#ifdef SPLIT_REND_LCLD_5MS ivas_syn_output( pOutput, numSamplesPerChannelToDecode, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf_out ); -#else - ivas_syn_output( pOutput, numSamplesPerChannelToSplitEncode, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf_out ); -#endif } free( st_ivas->hSplitBinRend.hMultiBinCldfbData ); @@ -3844,11 +3743,9 @@ ivas_error IVAS_DEC_GetSplitRendBits( splitRendBits->pose_correction = hIvasDec->st_ivas->hSplitBinRend.hSplitRendBits->pose_correction; splitRendBits->codec_frame_size_ms = hIvasDec->st_ivas->hSplitBinRend.hSplitRendBits->codec_frame_size_ms; -#ifdef SPLIT_REND_LCLD_5MS /* data consumed, free it */ free( hIvasDec->st_ivas->hSplitBinRend.hSplitRendBits ); hIvasDec->st_ivas->hSplitBinRend.hSplitRendBits = NULL; -#endif return IVAS_ERR_OK; diff --git a/lib_rend/ivas_PredDecoder.c b/lib_rend/ivas_PredDecoder.c index 1fe552f3fa..ce791e9329 100644 --- a/lib_rend/ivas_PredDecoder.c +++ b/lib_rend/ivas_PredDecoder.c @@ -52,9 +52,7 @@ ivas_error CreatePredictionDecoder( const int32_t iNumBlocks ) { int16_t n; -#ifdef SPLIT_REND_LCLD_5MS int16_t m; -#endif PredictionDecoder *psPredictionDecoder = NULL; if ( ( psPredictionDecoder = (PredictionDecoder *) malloc( sizeof( PredictionDecoder ) ) ) == NULL ) @@ -64,25 +62,12 @@ ivas_error CreatePredictionDecoder( psPredictionDecoder->iChannels = iChannels; psPredictionDecoder->iNumBlocks = iNumBlocks; -#ifdef SPLIT_REND_LCLD_5MS psPredictionDecoder->iNumSubSets = LCLD_BLOCKS_PER_FRAME / psPredictionDecoder->iNumBlocks; psPredictionDecoder->iSubSetId = 0; -#endif if ( ( psPredictionDecoder->piPredChanEnable = (int32_t *) malloc( sizeof( int32_t ) * iChannels ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } -#ifndef SPLIT_REND_LCLD_5MS - if ( ( psPredictionDecoder->piNumPredBands = (int32_t *) malloc( sizeof( int32_t ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); - } - - if ( ( psPredictionDecoder->ppfEstPredGain = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); - } -#endif if ( ( psPredictionDecoder->ppiPredBandEnable = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); @@ -103,7 +88,6 @@ ivas_error CreatePredictionDecoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } -#ifdef SPLIT_REND_LCLD_5MS if ( ( psPredictionDecoder->ppfPredStateReal = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); @@ -112,28 +96,18 @@ ivas_error CreatePredictionDecoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD decoder Module \n" ) ); } -#endif for ( n = 0; n < psPredictionDecoder->iChannels; n++ ) { -#ifdef SPLIT_REND_LCLD_5MS psPredictionDecoder->piPredChanEnable[n] = 0; -#else - if ( ( psPredictionDecoder->ppfEstPredGain[n] = (float *) malloc( sizeof( float ) * LCLD_BANDS ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); - } -#endif if ( ( psPredictionDecoder->ppiPredBandEnable[n] = (int32_t *) malloc( LCLD_BANDS * sizeof( int32_t ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } -#ifdef SPLIT_REND_LCLD_5MS for ( m = 0; m < LCLD_BANDS; m++ ) { psPredictionDecoder->ppiPredBandEnable[n][m] = 0; } -#endif if ( ( psPredictionDecoder->ppfA1Real[n] = (float *) malloc( sizeof( float ) * LCLD_BANDS ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); @@ -150,7 +124,6 @@ ivas_error CreatePredictionDecoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } -#ifdef SPLIT_REND_LCLD_5MS if ( ( psPredictionDecoder->ppfPredStateReal[n] = (float *) malloc( LCLD_BANDS * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionDecoder Module \n" ) ); @@ -159,14 +132,11 @@ ivas_error CreatePredictionDecoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionDecoder Module \n" ) ); } -#ifdef SPLIT_REND_LCLD_5MS for ( m = 0; m < LCLD_BANDS; m++ ) { psPredictionDecoder->ppfPredStateReal[n][m] = 0; psPredictionDecoder->ppfPredStateImag[n][m] = 0; } -#endif -#endif } /* pre-define these tables? */ @@ -205,33 +175,22 @@ void DeletePredictionDecoder( for ( n = 0; n < psPredictionDecoder->iChannels; n++ ) { -#ifndef SPLIT_REND_LCLD_5MS - free( psPredictionDecoder->ppfEstPredGain[n] ); -#endif free( psPredictionDecoder->ppiPredBandEnable[n] ); free( psPredictionDecoder->ppfA1Real[n] ); free( psPredictionDecoder->ppfA1Imag[n] ); free( psPredictionDecoder->ppiA1Mag[n] ); free( psPredictionDecoder->ppiA1Phase[n] ); -#ifdef SPLIT_REND_LCLD_5MS free( psPredictionDecoder->ppfPredStateReal[n] ); free( psPredictionDecoder->ppfPredStateImag[n] ); -#endif } free( psPredictionDecoder->piPredChanEnable ); -#ifndef SPLIT_REND_LCLD_5MS - free( psPredictionDecoder->piNumPredBands ); - free( psPredictionDecoder->ppfEstPredGain ); -#endif free( psPredictionDecoder->ppiPredBandEnable ); free( psPredictionDecoder->ppfA1Real ); free( psPredictionDecoder->ppfA1Imag ); free( psPredictionDecoder->ppiA1Mag ); free( psPredictionDecoder->ppiA1Phase ); -#ifdef SPLIT_REND_LCLD_5MS free( psPredictionDecoder->ppfPredStateReal ); free( psPredictionDecoder->ppfPredStateImag ); -#endif free( psPredictionDecoder ); psPredictionDecoder = NULL; @@ -239,110 +198,6 @@ void DeletePredictionDecoder( return; } -#ifndef SPLIT_REND_LCLD_5MS -#define USE_TABLE_LOOKUP -/*-------------------------------------------------------------------* - * Function ReadPredictors() - * - * - *-------------------------------------------------------------------*/ - -int32_t ReadPredictors( - PredictionDecoder *psPredictionDecoder, - IVAS_SPLIT_REND_BITS_HANDLE pBits ) -{ - int16_t iBitsRead = 0; - int32_t c; - - for ( c = 0; c < psPredictionDecoder->iChannels; c++ ) - { - psPredictionDecoder->piPredChanEnable[c] = ivas_split_rend_bitstream_read_int32( pBits, 1 ); - iBitsRead += 1; - - if ( psPredictionDecoder->piPredChanEnable[c] ) - { - int32_t b; - - for ( b = 0; b < LCLD_BANDS; b++ ) - { - psPredictionDecoder->ppiPredBandEnable[c][b] = 0; - } - psPredictionDecoder->piNumPredBands[c] = ivas_split_rend_bitstream_read_int32( pBits, 6 ); - iBitsRead += 6; - - for ( b = 0; b < psPredictionDecoder->piNumPredBands[c]; b++ ) - { - psPredictionDecoder->ppiPredBandEnable[c][b] = ivas_split_rend_bitstream_read_int32( pBits, 1 ); - iBitsRead += 1; - - if ( psPredictionDecoder->ppiPredBandEnable[c][b] == 1 ) - { -#ifdef USE_TABLE_LOOKUP - int32_t iA1Mag; - int32_t iA1Phase; - float fA1Real; - float fA1Imag; - iA1Mag = ivas_split_rend_bitstream_read_int32( pBits, PRED_QUNAT_FILTER_MAG_BITS ); - iBitsRead += PRED_QUNAT_FILTER_MAG_BITS; - iA1Phase = ivas_split_rend_bitstream_read_int32( pBits, PRED_QUANT_FILTER_PHASE_BITS ); - iBitsRead += PRED_QUANT_FILTER_PHASE_BITS; - - psPredictionDecoder->ppiA1Mag[c][b] = iA1Mag; - psPredictionDecoder->ppiA1Phase[c][b] = iA1Phase + PRED_QUANT_FILTER_PHASE_MIN; - - fA1Real = psPredictionDecoder->pfMagLUT[iA1Mag] * psPredictionDecoder->pfP2RRealLUT[iA1Phase]; - fA1Imag = psPredictionDecoder->pfMagLUT[iA1Mag] * psPredictionDecoder->pfP2RImagLUT[iA1Phase]; - - psPredictionDecoder->ppfA1Real[c][b] = fA1Real; - psPredictionDecoder->ppfA1Imag[c][b] = fA1Imag; -#else - const float fInvMagScale = M_PI / ( 2.0 * (float) ( 1 << ( PRED_QUNAT_FILTER_MAG_BITS ) ) + 1.0 ); - const float fInvPhaseScale = M_PI / (float) ( 1 << ( PRED_QUANT_FILTER_PHASE_BITS - 1 ) ); - int32_t iA1Mag; - int32_t iA1Phase; - float fA1Mag; - float fA1Phase; - float fA1Real; - float fA1Imag; - - iA1Mag = ivas_split_rend_bitstream_read_int32( pBits, PRED_QUNAT_FILTER_MAG_BITS ); - iBitsRead += PRED_QUNAT_FILTER_MAG_BITS; - - iA1Phase = ivas_split_rend_bitstream_read_int32( pBits, PRED_QUANT_FILTER_PHASE_BITS ); - iBitsRead += PRED_QUANT_FILTER_PHASE_BITS; - iA1Phase += PRED_QUANT_FILTER_PHASE_MIN; - - psPredictionDecoder->ppiA1Mag[c][b] = iA1Mag; - psPredictionDecoder->ppiA1Phase[c][b] = iA1Phase; - - fA1Mag = sinf( fInvMagScale * (float) iA1Mag ); - fA1Phase = fInvPhaseScale * (float) iA1Phase; - - fA1Real = fA1Mag * cosf( fA1Phase ); - fA1Imag = fA1Mag * sinf( fA1Phase ); - - psPredictionDecoder->ppfA1Real[c][b] = fA1Real; - psPredictionDecoder->ppfA1Imag[c][b] = fA1Imag; - - /* printf("Dec %f\t%f\t%f\n",fA1Real,fA1Imag,fA1Real * fA1Real + fA1Imag * fA1Imag); */ -#endif - } - } - } - else - { - int16_t b; - for ( b = 0; b < LCLD_BANDS; b++ ) - { - psPredictionDecoder->ppiPredBandEnable[c][b] = 0; - } - } - } - - return iBitsRead; -} - -#else /*-------------------------------------------------------------------* * Function ReadPredictors() * @@ -438,55 +293,7 @@ int32_t ReadPredictors( return iBitsRead; } -#endif -#ifndef SPLIT_REND_LCLD_5MS -/*-------------------------------------------------------------------* - * Function ApplyInversePredictros() - * - * - *-------------------------------------------------------------------*/ - -void ApplyInversePredictros( - PredictionDecoder *psPredictionDecoder, - float ***pppfReal, - float ***pppfImag ) -{ - int32_t c; - for ( c = 0; c < psPredictionDecoder->iChannels; c++ ) - { - if ( psPredictionDecoder->piPredChanEnable[c] == 1 ) - { - int32_t b; - for ( b = 0; b < psPredictionDecoder->piNumPredBands[c]; b++ ) - { - if ( psPredictionDecoder->ppiPredBandEnable[c][b] == 1 ) - { - int32_t n; - float fA1Real; - float fA1Imag; - - fA1Real = psPredictionDecoder->ppfA1Real[c][b]; - fA1Imag = psPredictionDecoder->ppfA1Imag[c][b]; - for ( n = 1; n < psPredictionDecoder->iNumBlocks; n++ ) - { - float fReal; - float fImag; - - fReal = pppfReal[c][n][b] - fA1Real * pppfReal[c][n - 1][b] + fA1Imag * pppfImag[c][n - 1][b]; - fImag = pppfImag[c][n][b] - fA1Real * pppfImag[c][n - 1][b] - fA1Imag * pppfReal[c][n - 1][b]; - - pppfReal[c][n][b] = fReal; - pppfImag[c][n][b] = fImag; - } - } - } - } - } - - return; -} -#else /*-------------------------------------------------------------------* * Function ApplyInversePredictors() * @@ -547,4 +354,3 @@ void ApplyInversePredictors( return; } #endif -#endif diff --git a/lib_rend/ivas_PredEncoder.c b/lib_rend/ivas_PredEncoder.c index 2f7cfd3900..50ac5524fb 100644 --- a/lib_rend/ivas_PredEncoder.c +++ b/lib_rend/ivas_PredEncoder.c @@ -40,7 +40,6 @@ #include "ivas_prot_rend.h" #include "wmc_auto.h" -#ifdef SPLIT_REND_LCLD_5MS /*-------------------------------------------------------------------* * Function activate_bit() @@ -66,7 +65,6 @@ static void deactivate_bit( { ( *state ) &= ( ~( 1 << bit_id ) ); } -#endif /*-------------------------------------------------------------------* * Function CreatePredictionEncoder() @@ -74,19 +72,12 @@ static void deactivate_bit( * *-------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS ivas_error CreatePredictionEncoder( PredictionEncoder **psPredictionEncoder_out, const int32_t iChannels, const int32_t iNumBlocks, const int32_t iNumSubSets, const int32_t iMaxNumPredBands ) -#else -ivas_error CreatePredictionEncoder( - PredictionEncoder **psPredictionEncoder_out, - const int32_t iChannels, - const int32_t iNumBlocks ) -#endif { int32_t k, n; PredictionEncoder *psPredictionEncoder = NULL; @@ -98,7 +89,6 @@ ivas_error CreatePredictionEncoder( psPredictionEncoder->iChannels = iChannels; psPredictionEncoder->iNumBlocks = iNumBlocks; -#ifdef SPLIT_REND_LCLD_5MS psPredictionEncoder->iSubSetId = 0; psPredictionEncoder->iMaxNumPredBands = iMaxNumPredBands; psPredictionEncoder->iNumSubSets = iNumSubSets; @@ -106,24 +96,11 @@ ivas_error CreatePredictionEncoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); } -#else - if ( ( psPredictionEncoder->pfWindow = (float *) malloc( sizeof( float ) * iNumBlocks ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } -#endif -#ifdef SPLIT_REND_LCLD_5MS for ( n = 0; n < LCLD_PRED_WIN_LEN; n++ ) { psPredictionEncoder->pfWindow[n] = 0.54f - 0.46f * cosf( 2.0f * M_PI * ( (float) n + 0.5f ) / (float) LCLD_PRED_WIN_LEN ); } -#else - for ( n = 0; n < iNumBlocks; n++ ) - { - psPredictionEncoder->pfWindow[n] = 0.54f - 0.46f * cosf( 2.0f * M_PI * ( (float) n + 0.5f ) / (float) iNumBlocks ); - } -#endif if ( ( psPredictionEncoder->piPredChanEnable = (int32_t *) malloc( sizeof( int32_t ) * iChannels ) ) == NULL ) @@ -141,7 +118,6 @@ ivas_error CreatePredictionEncoder( psPredictionEncoder->piNumPredBands[n] = 40; // Will need to be set correctly } -#ifdef SPLIT_REND_LCLD_5MS if ( ( psPredictionEncoder->ppiPredBandEnable = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); @@ -194,50 +170,9 @@ ivas_error CreatePredictionEncoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); } -#else - if ( ( psPredictionEncoder->ppfEstPredGain = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } - if ( ( psPredictionEncoder->ppfEstPredBitGain = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } - if ( ( psPredictionEncoder->ppiPredBandEnable = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } - if ( ( psPredictionEncoder->ppfA1Real = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } - if ( ( psPredictionEncoder->ppfA1Imag = (float **) malloc( sizeof( float * ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } - if ( ( psPredictionEncoder->ppiA1Mag = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } - if ( ( psPredictionEncoder->ppiA1Phase = (int32_t **) malloc( sizeof( int32_t * ) * iChannels ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } - -#endif for ( n = 0; n < psPredictionEncoder->iChannels; n++ ) { -#ifndef SPLIT_REND_LCLD_5MS - if ( ( psPredictionEncoder->ppfEstPredGain[n] = (float *) malloc( sizeof( float ) * LCLD_BANDS ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } - if ( ( psPredictionEncoder->ppfEstPredBitGain[n] = (float *) malloc( sizeof( float ) * LCLD_BANDS ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); - } -#endif if ( ( psPredictionEncoder->ppiPredBandEnable[n] = (int32_t *) malloc( sizeof( int32_t ) * LCLD_BANDS ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); @@ -258,7 +193,6 @@ ivas_error CreatePredictionEncoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); } -#ifdef SPLIT_REND_LCLD_5MS if ( ( psPredictionEncoder->pppfInpBufReal[n] = (float **) malloc( sizeof( float * ) * LCLD_PRED_WIN_LEN ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD PredictionEncoder Module \n" ) ); @@ -313,17 +247,11 @@ ivas_error CreatePredictionEncoder( } set_zero( psPredictionEncoder->ppfPredStateRealTmp[n], LCLD_BANDS ); set_zero( psPredictionEncoder->ppfPredStateImagTmp[n], LCLD_BANDS ); -#endif for ( k = 0; k < LCLD_BANDS; k++ ) { psPredictionEncoder->ppiPredBandEnable[n][k] = 0; -#ifndef SPLIT_REND_LCLD_5MS - psPredictionEncoder->ppfA1Real[n][k] = 0.0; - psPredictionEncoder->ppfA1Imag[n][k] = 0.0; -#else psPredictionEncoder->ppfA1Real[n][k] = 0.0f; psPredictionEncoder->ppfA1Imag[n][k] = 0.0f; -#endif } } @@ -348,18 +276,12 @@ void DeletePredictionEncoder( for ( n = 0; n < psPredictionEncoder->iChannels; n++ ) { -#ifdef SPLIT_REND_LCLD_5MS int32_t k; -#else - free( psPredictionEncoder->ppfEstPredGain[n] ); - free( psPredictionEncoder->ppfEstPredBitGain[n] ); -#endif free( psPredictionEncoder->ppiPredBandEnable[n] ); free( psPredictionEncoder->ppfA1Real[n] ); free( psPredictionEncoder->ppfA1Imag[n] ); free( psPredictionEncoder->ppiA1Mag[n] ); free( psPredictionEncoder->ppiA1Phase[n] ); -#ifdef SPLIT_REND_LCLD_5MS for ( k = 0; k < LCLD_PRED_WIN_LEN; k++ ) { free( psPredictionEncoder->pppfInpBufReal[n][k] ); @@ -373,20 +295,14 @@ void DeletePredictionEncoder( free( psPredictionEncoder->ppfPredStateImag[n] ); free( psPredictionEncoder->ppfPredStateRealTmp[n] ); free( psPredictionEncoder->ppfPredStateImagTmp[n] ); -#endif } free( psPredictionEncoder->piPredChanEnable ); free( psPredictionEncoder->piNumPredBands ); -#ifndef SPLIT_REND_LCLD_5MS - free( psPredictionEncoder->ppfEstPredGain ); - free( psPredictionEncoder->ppfEstPredBitGain ); -#endif free( psPredictionEncoder->ppiPredBandEnable ); free( psPredictionEncoder->ppfA1Real ); free( psPredictionEncoder->ppfA1Imag ); free( psPredictionEncoder->ppiA1Mag ); free( psPredictionEncoder->ppiA1Phase ); -#ifdef SPLIT_REND_LCLD_5MS free( psPredictionEncoder->pppfInpBufReal ); free( psPredictionEncoder->pppfInpBufImag ); free( psPredictionEncoder->ppfInpPrevReal ); @@ -395,7 +311,6 @@ void DeletePredictionEncoder( free( psPredictionEncoder->ppfPredStateImag ); free( psPredictionEncoder->ppfPredStateRealTmp ); free( psPredictionEncoder->ppfPredStateImagTmp ); -#endif free( psPredictionEncoder ); @@ -410,7 +325,6 @@ void DeletePredictionEncoder( * *-------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS void ComputePredictors( PredictionEncoder *psPredictionEncoder, float ***pppfReal, @@ -598,205 +512,6 @@ void ComputePredictors( } } } -#else -int32_t ComputePredictors( - PredictionEncoder *psPredictionEncoder, - float ***pppfReal, - float ***pppfImag ) -{ - int32_t c; - int32_t iPredictionBits = 0; - - for ( c = 0; c < psPredictionEncoder->iChannels; c++ ) - { - int32_t b; - psPredictionEncoder->piNumPredBands[c] = 50; - for ( b = 0; b < psPredictionEncoder->piNumPredBands[c]; b++ ) - { - int32_t n; - int32_t iNumBlocks; - float fGain = 0.0; - float fBitGain = 0.0; - float *pfRxxReal; - float *pfRxxImag; - float fA1Real; - float fA1Imag; - int32_t iA1Mag; - int32_t iA1Phase; - - iNumBlocks = psPredictionEncoder->iNumBlocks; - - pfRxxReal = psPredictionEncoder->pfRxxReal; - pfRxxImag = psPredictionEncoder->pfRxxImag; - - pfRxxReal[0] = 0.0; - pfRxxImag[0] = 0.0; - for ( n = 0; n < iNumBlocks; n++ ) - { - pfRxxReal[0] += ( pppfReal[c][n][b] * pppfReal[c][n][b] + pppfImag[c][n][b] * pppfImag[c][n][b] ); - } - - pfRxxReal[1] = 0.0; - pfRxxImag[1] = 0.0; - for ( n = 1; n < iNumBlocks; n++ ) - { - pfRxxReal[1] += ( pppfReal[c][n][b] * pppfReal[c][n - 1][b] + pppfImag[c][n][b] * pppfImag[c][n - 1][b] ); - pfRxxImag[1] += ( pppfImag[c][n][b] * pppfReal[c][n - 1][b] - pppfReal[c][n][b] * pppfImag[c][n - 1][b] ); - } - - if ( pfRxxReal[0] > 1e-12f ) - { - float fA1Mag; - float fA1Phase; - float fGain2; - float fBitGain2; - - const float fMagScale = ( 2.0f * (float) ( 1 << ( PRED_QUNAT_FILTER_MAG_BITS ) ) + 1.0f ) / M_PI; - const float fInvMagScale = M_PI / ( 2.0f * (float) ( 1 << ( PRED_QUNAT_FILTER_MAG_BITS ) ) + 1.0f ); - const float fPhaseScale = (float) ( 1 << ( PRED_QUANT_FILTER_PHASE_BITS - 1 ) ) / M_PI; - const float fInvPhaseScale = M_PI / (float) ( 1 << ( PRED_QUANT_FILTER_PHASE_BITS - 1 ) ); - - /* Compute filter coefficeints */ - fA1Real = -pfRxxReal[1] / pfRxxReal[0]; - fA1Imag = -pfRxxImag[1] / pfRxxReal[0]; - - /* compute these before quant */ - /* Compute est coding gain based on quantized filter coefficients */ - fGain = 1.0f / ( 1.0f - fA1Real * fA1Real - fA1Imag * fA1Imag ); - fBitGain = 0.6f * log2f( fGain ) * (float) ( iNumBlocks ) - (float) ( PRED_QUNAT_FILTER_MAG_BITS + PRED_QUANT_FILTER_PHASE_BITS ); // Wrong fix (iNumBlocks-1) - - fA1Mag = sqrtf( fA1Real * fA1Real + fA1Imag * fA1Imag ); - fA1Mag = fMagScale * asinf( fA1Mag ); - iA1Mag = (int32_t) ( fA1Mag + 0.5f ); - iA1Mag = ( iA1Mag > PRED_QUANT_FILTER_MAG_MIN ) ? iA1Mag : PRED_QUANT_FILTER_MAG_MIN; - iA1Mag = ( iA1Mag < PRED_QUANT_FILTER_MAG_MAX ) ? iA1Mag : PRED_QUANT_FILTER_MAG_MAX; - fA1Mag = sinf( fInvMagScale * (float) iA1Mag ); - - fA1Phase = atan2f( fA1Imag, fA1Real ); - fA1Phase = fPhaseScale * fA1Phase; - iA1Phase = ( fA1Phase > 0.0f ) ? (int32_t) ( fA1Phase + 0.5f ) : (int32_t) ( fA1Phase - 0.5f ); - iA1Phase = ( iA1Phase > PRED_QUANT_FILTER_PHASE_MIN ) ? iA1Phase : PRED_QUANT_FILTER_PHASE_MIN; - iA1Phase = ( iA1Phase < PRED_QUANT_FILTER_PHASE_MAX ) ? iA1Phase : PRED_QUANT_FILTER_PHASE_MAX; // Is this the correct way to deal with this? should wrap? - fA1Phase = fInvPhaseScale * (float) iA1Phase; - - fA1Real = fA1Mag * cosf( fA1Phase ); - fA1Imag = fA1Mag * sinf( fA1Phase ); - - fGain2 = 1.0f / ( 1.0f - fA1Real * fA1Real - fA1Imag * fA1Imag ); - fBitGain2 = 0.6f * log2f( fGain ) * (float) ( iNumBlocks ) - (float) ( PRED_QUNAT_FILTER_MAG_BITS + PRED_QUANT_FILTER_PHASE_BITS ); // Wrong fix (iNumBlocks-1) - - fGain = ( fGain < fGain2 ) ? fGain : fGain2; - fBitGain = ( fBitGain < fBitGain2 ) ? fBitGain : fBitGain2; - } - else - { - psPredictionEncoder->ppfEstPredGain[c][b] = 0.0f; - fA1Real = 0.0f; - fA1Imag = 0.0f; - // iA1Real = 0; - // iA1Imag = 0; - iA1Mag = 0; - iA1Phase = 0; - fGain = -10.0f; // Fix this - } - - psPredictionEncoder->ppfEstPredGain[c][b] = fGain; - psPredictionEncoder->ppfEstPredBitGain[c][b] = fBitGain; - psPredictionEncoder->ppiPredBandEnable[c][b] = ( fBitGain > 0 ) ? 1 : 0; // Initial prediction enable - psPredictionEncoder->ppfA1Real[c][b] = fA1Real; - psPredictionEncoder->ppfA1Imag[c][b] = fA1Imag; - psPredictionEncoder->ppiA1Mag[c][b] = iA1Mag; - psPredictionEncoder->ppiA1Phase[c][b] = iA1Phase; - } - - { - /*int32_t iDone; - int32_t iPredBands; - - iDone = 0; - iPredBands = 30; - while(iPredBands > 0 && iDone == 0){ - int32_t b; - float fBitGain; - - fBitGain = -7.0; - for(b = 0; b < iPredBands; b ++){ - fBitGain -= 1.0; - if(psPredictionEncoder->ppiPredBandEnable[c][b] == 1){ - fBitGain += psPredictionEncoder->ppfEstPredBitGain[c][b]; - } - } - if(fBitGain > 0.0){ //thresh - iDone ++; - } - else{ - iPredBands --; - } - }*/ - // int32_t b; - float fBestCost; - int32_t iPredBands; - float fBitGain; - - fBestCost = 0.0; - iPredBands = 0; - fBitGain = -7.0; - for ( b = 0; b < 30; b++ ) - { // still getting this decision wrong! - fBitGain -= 1.0; - if ( psPredictionEncoder->ppiPredBandEnable[c][b] == 1 ) - { - fBitGain += psPredictionEncoder->ppfEstPredBitGain[c][b]; - } - if ( fBitGain > fBestCost ) - { - fBestCost = fBitGain; - iPredBands = b; - } - } - - // printf("%d\t%f\n",iPredBands,fBestCost); - /*if(fBestCost < 300.0){ - iPredBands = 0; - }*/ - - if ( iPredBands > 0 ) - { - // int32_t b; - iPredictionBits += 1; - iPredictionBits += 6; - for ( b = 0; b < iPredBands; b++ ) - { - iPredictionBits += 1; - if ( psPredictionEncoder->ppiPredBandEnable[c][b] == 1 ) - { - iPredictionBits += ( PRED_QUNAT_FILTER_MAG_BITS + PRED_QUANT_FILTER_PHASE_BITS ); - } - } - for ( b = iPredBands; b < LCLD_BANDS; b++ ) - { - psPredictionEncoder->ppiPredBandEnable[c][b] = 0; - } - psPredictionEncoder->piPredChanEnable[c] = 1; - psPredictionEncoder->piNumPredBands[c] = iPredBands; - } - else - { - // int32_t b; - iPredictionBits += 1; - for ( b = 0; b < LCLD_BANDS; b++ ) - { - psPredictionEncoder->ppiPredBandEnable[c][b] = 0; - } - psPredictionEncoder->piPredChanEnable[c] = 0; - psPredictionEncoder->piNumPredBands[c] = 0; - } - } - } - - return iPredictionBits; -} -#endif /*-------------------------------------------------------------------* @@ -805,7 +520,6 @@ int32_t ComputePredictors( * *-------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS void ApplyForwardPredictors( PredictionEncoder *psPredictionEncoder, float ***pppfReal, @@ -859,54 +573,6 @@ void ApplyForwardPredictors( return; } -#else -void ApplyForwardPredictors( - PredictionEncoder *psPredictionEncoder, - float ***pppfReal, - float ***pppfImag ) -{ - int32_t c; - for ( c = 0; c < psPredictionEncoder->iChannels; c++ ) - { - int32_t b; - if ( psPredictionEncoder->piPredChanEnable[c] == 1 ) - { - for ( b = 0; b < psPredictionEncoder->piNumPredBands[c]; b++ ) - { - if ( psPredictionEncoder->ppiPredBandEnable[c][b] == 1 ) - { - int32_t n; - float fOldReal; - float fOldImag; - float fA1Real; - float fA1Imag; - - fOldReal = pppfReal[c][0][b]; - fOldImag = pppfImag[c][0][b]; - fA1Real = psPredictionEncoder->ppfA1Real[c][b]; - fA1Imag = psPredictionEncoder->ppfA1Imag[c][b]; - for ( n = 1; n < psPredictionEncoder->iNumBlocks; n++ ) - { - float fReal; - float fImag; - - fReal = pppfReal[c][n][b] + fA1Real * fOldReal - fA1Imag * fOldImag; - fImag = pppfImag[c][n][b] + fA1Real * fOldImag + fA1Imag * fOldReal; - - fOldReal = pppfReal[c][n][b]; - fOldImag = pppfImag[c][n][b]; - - pppfReal[c][n][b] = fReal; - pppfImag[c][n][b] = fImag; - } - } - } - } - } - - return; -} -#endif /*-------------------------------------------------------------------* @@ -915,7 +581,6 @@ void ApplyForwardPredictors( * *-------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS int32_t WritePredictors( PredictionEncoder *psPredictionEncoder, IVAS_SPLIT_REND_BITS_HANDLE pBits ) @@ -979,47 +644,4 @@ int32_t WritePredictors( return iBitsWritten; } -#else -int32_t WritePredictors( - PredictionEncoder *psPredictionEncoder, - IVAS_SPLIT_REND_BITS_HANDLE pBits ) -{ - int32_t iBitsWritten = 0; - int32_t c; - - for ( c = 0; c < psPredictionEncoder->iChannels; c++ ) - { - int32_t b; - ivas_split_rend_bitstream_write_int32( pBits, psPredictionEncoder->piPredChanEnable[c], 1 ); - iBitsWritten += 1; - - if ( psPredictionEncoder->piPredChanEnable[c] == 1 ) - { - ivas_split_rend_bitstream_write_int32( pBits, psPredictionEncoder->piNumPredBands[c], 6 ); - iBitsWritten += 6; - - for ( b = 0; b < psPredictionEncoder->piNumPredBands[c]; b++ ) - { - ivas_split_rend_bitstream_write_int32( pBits, psPredictionEncoder->ppiPredBandEnable[c][b], 1 ); - iBitsWritten += 1; - - if ( psPredictionEncoder->ppiPredBandEnable[c][b] == 1 ) - { - int32_t iA1Mag; - int32_t iA1Phase; - - iA1Mag = psPredictionEncoder->ppiA1Mag[c][b]; - iA1Phase = psPredictionEncoder->ppiA1Phase[c][b] - PRED_QUANT_FILTER_PHASE_MIN; - ivas_split_rend_bitstream_write_int32( pBits, iA1Mag, PRED_QUNAT_FILTER_MAG_BITS ); - iBitsWritten += PRED_QUNAT_FILTER_MAG_BITS; - ivas_split_rend_bitstream_write_int32( pBits, iA1Phase, PRED_QUANT_FILTER_PHASE_BITS ); - iBitsWritten += PRED_QUANT_FILTER_PHASE_BITS; - } - } - } - } - - return iBitsWritten; -} -#endif #endif diff --git a/lib_rend/ivas_RMSEnvGrouping.c b/lib_rend/ivas_RMSEnvGrouping.c index 81deff1759..f19f86d1ee 100644 --- a/lib_rend/ivas_RMSEnvGrouping.c +++ b/lib_rend/ivas_RMSEnvGrouping.c @@ -700,11 +700,7 @@ void ComputeEnvelopeGrouping( /* Perform grouping via Greedy Merge */ /* Allows control over max groups can call using 16 if want same as previous call */ -#ifdef SPLIT_REND_LCLD_5MS ComputeGreedyGroups3( psRMSEnvelopeGrouping, iChannels, iNumBands, piBandwidths, psRMSEnvelopeGrouping->iNumBlocks ); -#else - ComputeGreedyGroups3( psRMSEnvelopeGrouping, iChannels, iNumBands, piBandwidths, LCLD_BLOCKS_PER_FRAME ); -#endif /* Calc Groups from Merge Results */ *piNumGroups = 0; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 8a45c47fdb..e55279c60f 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1605,9 +1605,7 @@ void ivas_rend_closeCldfbRend( } ivas_binRenderer_close( &pCldfbRend->hCldfbRend ); -#ifdef SPLIT_REND_LCLD_5MS ivas_binaural_hrtf_close( &pCldfbRend->hHrtfFastConv ); -#endif ivas_HRTF_fastconv_binary_close( &pCldfbRend->hHrtfFastConv ); return; diff --git a/lib_rend/ivas_lcld_decoder.c b/lib_rend/ivas_lcld_decoder.c index 067b1ede71..b98b4f4e00 100644 --- a/lib_rend/ivas_lcld_decoder.c +++ b/lib_rend/ivas_lcld_decoder.c @@ -341,18 +341,11 @@ static void CreateDecodeTable( LCLDDecoder *psLCLDDecoder, int32_t num, const ui * *------------------------------------------------------------------------------------------*/ -#ifndef SPLIT_REND_LCLD_5MS -ivas_error CreateLCLDDecoder( - LCLDDecoder **psLCLDDecoder_out, - const int32_t iSampleRate, - const int32_t iChannels ) -#else ivas_error CreateLCLDDecoder( LCLDDecoder **psLCLDDecoder_out, const int32_t iSampleRate, const int32_t iChannels, const int32_t iNumBlocks ) -#endif { int32_t n; int32_t read_length; @@ -360,27 +353,17 @@ ivas_error CreateLCLDDecoder( LCLDDecoder *psLCLDDecoder = NULL; assert( iSampleRate == 48000 ); -#ifdef SPLIT_REND_LCLD_5MS assert( iNumBlocks == 16 || iNumBlocks == 8 || iNumBlocks == 4 ); -#endif if ( ( psLCLDDecoder = (LCLDDecoder *) malloc( sizeof( LCLDDecoder ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LCLD encoder Module \n" ) ); } psLCLDDecoder->iSampleRate = iSampleRate; psLCLDDecoder->iChannels = iChannels; -#ifdef SPLIT_REND_LCLD_5MS psLCLDDecoder->iNumBlocks = iNumBlocks; -#else - psLCLDDecoder->iNumBlocks = LCLD_BLOCKS_PER_FRAME; -#endif psLCLDDecoder->iAllocOffset = 0; -#ifdef SPLIT_REND_LCLD_5MS psLCLDDecoder->iNumBands = 0; /* read from bitstream*/ -#else - psLCLDDecoder->iNumBands = MAX_BANDS_48; /* Fix */ -#endif psLCLDDecoder->piBandwidths = c_aiBandwidths48; psLCLDDecoder->iMSMode = 0; @@ -713,11 +696,7 @@ void DeleteLCLDDecoder( LCLDDecoder *psLCLDDecoder ) static void ApplyRMSEnvelope( const int32_t iNumBands, const int32_t *piBandwidths, const int32_t iNumGroups, const int32_t *piGroupLengths, int32_t **ppiRMSEnvelope, float **ppfReal, float **ppfImag ); -#ifdef SPLIT_REND_LCLD_5MS static void ReplaceSign( const int32_t iNumBlocks, const int32_t iNumLCLDBands, int32_t **ppiSignReal, int32_t **ppiSignImag, float **ppfReal, float **ppfImag, const int32_t *piBandwidths ); -#else -static void ReplaceSign( const int32_t iNumBlocks, const int32_t iNumLCLDBands, int32_t **ppiSignReal, int32_t **ppiSignImag, float **ppfReal, float **ppfImag ); -#endif static void InvQuantizeSpectrum( const int32_t iNumGroups, const int32_t *piGroupLengths, const int32_t iNumBands, const int32_t *piBandwidths, int32_t **ppiAlloc, int32_t **ppiQReal, int32_t **ppiQImag, float **ppfReal, float **ppfImag, NoiseGen *psNoiseGen ); @@ -823,17 +802,10 @@ int32_t DecodeLCLDFrame( pppfLCLDReal[n], pppfLCLDImag[n], psLCLDDecoder->psNoiseGen ); -#ifdef SPLIT_REND_LCLD_5MS ReplaceSign( psLCLDDecoder->iNumBlocks, psLCLDDecoder->iNumBands, psLCLDDecoder->pppiLCLDSignReal[n], psLCLDDecoder->pppiLCLDSignImag[n], pppfLCLDReal[n], pppfLCLDImag[n], psLCLDDecoder->piBandwidths ); -#else - ReplaceSign( psLCLDDecoder->iNumBlocks, LCLD_BANDS, - psLCLDDecoder->pppiLCLDSignReal[n], - psLCLDDecoder->pppiLCLDSignImag[n], - pppfLCLDReal[n], pppfLCLDImag[n] ); -#endif } #ifdef DEBUG_WRITE_PREDICTORS { @@ -850,11 +822,7 @@ int32_t DecodeLCLDFrame( } #endif -#ifdef SPLIT_REND_LCLD_5MS ApplyInversePredictors( psLCLDDecoder->psPredictionDecoder, pppfLCLDReal, pppfLCLDImag ); -#else - ApplyInversePredictros( psLCLDDecoder->psPredictionDecoder, pppfLCLDReal, pppfLCLDImag ); -#endif for ( n = 0; n < psLCLDDecoder->iChannels; n++ ) { @@ -926,7 +894,6 @@ static void ApplyRMSEnvelope( return; } -#ifdef SPLIT_REND_LCLD_5MS static void ReplaceSign( const int32_t iNumBlocks, const int32_t iNumLCLDBands, @@ -935,24 +902,12 @@ static void ReplaceSign( float **ppfReal, float **ppfImag, const int32_t *piBandwidths ) -#else -static void ReplaceSign( - const int32_t iNumBlocks, - const int32_t iNumLCLDBands, - int32_t **ppiSignReal, - int32_t **ppiSignImag, - float **ppfReal, - float **ppfImag ) -#endif { int32_t b, n; -#ifdef SPLIT_REND_LCLD_5MS int32_t m, idx; -#endif for ( n = 0; n < iNumBlocks; n++ ) { -#ifdef SPLIT_REND_LCLD_5MS idx = 0; for ( b = 0; b < iNumLCLDBands; b++ ) { @@ -970,20 +925,6 @@ static void ReplaceSign( idx++; } } -#else - for ( b = 0; b < iNumLCLDBands; b++ ) - { - if ( ppiSignReal[n][b] == 1 ) - { - ppfReal[n][b] = -ppfReal[n][b]; - } - - if ( ppiSignImag[n][b] == 1 ) - { - ppfImag[n][b] = -ppfImag[n][b]; - } - } -#endif } return; @@ -1075,11 +1016,7 @@ static void InvMSCoding( { int32_t b; int32_t iFBOffset; -#ifdef SPLIT_REND_LCLD_5MS int32_t bMSPred = 0; -#else - int32_t bms = 0; -#endif iFBOffset = 0; for ( b = 0; b < iNumBands; b++ ) @@ -1087,12 +1024,10 @@ static void InvMSCoding( if ( piMSFlags[b] == 1 ) { int32_t n; -#ifdef SPLIT_REND_LCLD_5MS int32_t phaseIdx; float fPred; phaseIdx = piLRPhaseDiffs[bMSPred] - PHASE_MIN_VAL; fPred = dequantPred( piMSPredCoefs[bMSPred] ); -#endif for ( n = 0; n < piBandwidths[b]; n++ ) { int32_t k; @@ -1105,10 +1040,6 @@ static void InvMSCoding( if ( iMSMode == 3 ) { -#ifndef SPLIT_REND_LCLD_5MS - float fPred; - fPred = dequantPred( piMSPredCoefs[bms] ); -#endif pppfReal[1][k][iFBOffset] += fPred * pppfReal[0][k][iFBOffset]; pppfImag[1][k][iFBOffset] += fPred * pppfImag[0][k][iFBOffset]; } @@ -1120,10 +1051,6 @@ static void InvMSCoding( if ( iMSMode == 3 ) { -#ifndef SPLIT_REND_LCLD_5MS - int32_t phaseIdx; - phaseIdx = piLRPhaseDiffs[bms] - PHASE_MIN_VAL; -#endif cplxmult( &fRightReal, &fRightImag, c_afRotRealImag[phaseIdx][0], -c_afRotRealImag[phaseIdx][1] ); } @@ -1134,11 +1061,7 @@ static void InvMSCoding( } iFBOffset++; } -#ifdef SPLIT_REND_LCLD_5MS bMSPred++; -#else - bms++; -#endif } else { diff --git a/lib_rend/ivas_lcld_encoder.c b/lib_rend/ivas_lcld_encoder.c index bab9409157..4ad176ec0d 100644 --- a/lib_rend/ivas_lcld_encoder.c +++ b/lib_rend/ivas_lcld_encoder.c @@ -52,9 +52,6 @@ struct LCLD_ENCODER int32_t iNumBlocks; int32_t iTargetBitRate; -#ifndef SPLIT_REND_LCLD_5MS - int32_t iTargetBitsPerFrame; -#endif int32_t iNumBands; const int32_t *piBandwidths; @@ -88,7 +85,6 @@ struct LCLD_ENCODER PredictionEncoder *psPredictionEncoder; }; -#ifdef SPLIT_REND_LCLD_5MS /*------------------------------------------------------------------------------------------* * Function Quantize() * @@ -139,7 +135,6 @@ static float UnQuantize( } return fVal; } -#endif /*------------------------------------------------------------------------------------------* * Function CreateLCLDEncoder() @@ -147,7 +142,6 @@ static float UnQuantize( * *------------------------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS ivas_error CreateLCLDEncoder( LCLDEncoder **psLCLDEncoder_out, const int32_t iSampleRate, @@ -156,27 +150,15 @@ ivas_error CreateLCLDEncoder( const int32_t iAllowSidePred, const int16_t iNumBlocks, const int16_t iNumSubSets ) -#else -ivas_error CreateLCLDEncoder( - LCLDEncoder **psLCLDEncoder_out, - const int32_t iSampleRate, - const int32_t iChannels, - const int32_t iTargetBitRate, - const int32_t iAllowSidePred ) -#endif { int32_t n; LCLDEncoder *psLCLDEncoder; ivas_error error; -#ifdef SPLIT_REND_LCLD_5MS int32_t iMaxNumPredBands = 0; -#endif assert( iSampleRate == 48000 ); // Fix -#ifdef SPLIT_REND_LCLD_5MS assert( iNumBlocks == 16 || iNumBlocks == 8 || iNumBlocks == 4 ); assert( iNumSubSets > 0 && iNumSubSets <= LCLD_MAX_NUM_PRED_SUBSETS ); -#endif if ( ( psLCLDEncoder = (LCLDEncoder *) malloc( sizeof( LCLDEncoder ) ) ) == NULL ) { @@ -185,28 +167,17 @@ ivas_error CreateLCLDEncoder( psLCLDEncoder->iSampleRate = iSampleRate; psLCLDEncoder->iChannels = iChannels; -#ifdef SPLIT_REND_LCLD_5MS psLCLDEncoder->iNumBlocks = (int32_t) iNumBlocks; -#else - psLCLDEncoder->iNumBlocks = LCLD_BLOCKS_PER_FRAME; -#endif psLCLDEncoder->iAllocOffset = 0; psLCLDEncoder->iTargetBitRate = iTargetBitRate; -#ifndef SPLIT_REND_LCLD_5MS - psLCLDEncoder->iTargetBitsPerFrame = iTargetBitRate * LCLD_BLOCKS_PER_FRAME * LCLD_BANDS / iSampleRate; -#endif psLCLDEncoder->piBandwidths = c_aiBandwidths48; -#ifdef SPLIT_REND_LCLD_5MS psLCLDEncoder->iNumBands = DEF_BANDS_48; /* 22 bands = 50 CLDFB bands (rather than 23 bands) */ for ( n = 0; n < psLCLDEncoder->iNumBands; n++ ) { iMaxNumPredBands += psLCLDEncoder->piBandwidths[n]; } -#else - psLCLDEncoder->iNumBands = MAX_BANDS_48; -#endif psLCLDEncoder->iMSMode = 0; @@ -371,17 +342,10 @@ ivas_error CreateLCLDEncoder( } } -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = CreatePredictionEncoder( &( psLCLDEncoder->psPredictionEncoder ), iChannels, psLCLDEncoder->iNumBlocks, (int32_t) iNumSubSets, iMaxNumPredBands ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = CreatePredictionEncoder( &( psLCLDEncoder->psPredictionEncoder ), iChannels, psLCLDEncoder->iNumBlocks ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif *psLCLDEncoder_out = psLCLDEncoder; @@ -559,11 +523,7 @@ static int32_t WriteAllocInformation( const int32_t iAllocOffset, IVAS_SPLIT_REN static int32_t WriteLCLDData( const int32_t iNumGroups, const int32_t *piGroupLengths, const int32_t iNumBands, const int32_t *piBandwidths, const int32_t *piPredEnable, int32_t **ppiAlloc, int32_t **ppiSignReal, int32_t **ppiSignImag, int32_t **ppiQReal, int32_t **ppiQImag, IVAS_SPLIT_REND_BITS_HANDLE pBits ); -#ifdef SPLIT_REND_LCLD_5MS static int32_t ComputeAllocation( const int32_t iChannels, const int32_t *piNumGroups, int32_t **ppiGroupLengths, const int32_t iNumBands, const int32_t *piBandwidths, float ***pppfReal, float ***pppfImag, int32_t ***pppiSMR, const int32_t iAvailableBits, int32_t *piAllocOffset, int32_t ***pppiAlloc, int32_t ***pppiQReal, int32_t ***pppiQImag, int32_t ***pppiSignReal, int32_t ***pppiSignImag, PredictionEncoder *psPredictionEncoder ); -#else -static int32_t ComputeAllocation( const int32_t iChannels, const int32_t *piNumGroups, int32_t **ppiGroupLengths, const int32_t iNumBands, const int32_t *piBandwidths, float ***pppfReal, float ***pppfImag, int32_t ***pppiSMR, const int32_t iAvailableBits, int32_t *piAllocOffset, int32_t ***pppiAlloc, int32_t ***pppiQReal, int32_t ***pppiQImag, int32_t ***pppiSignReal, int32_t ***pppiSignImag, int32_t **ppiPredEnable, float **ppfA1Real, float **ppfA1Imag ); -#endif /*------------------------------------------------------------------------------------------* * Function EncodeLCLDFrame() @@ -584,9 +544,7 @@ int32_t EncodeLCLDFrame( int32_t iNumMSBands = 0; iAvailableBits = available_bits; // HCBR for now iBitsWritten = 0; -#ifdef SPLIT_REND_LCLD_5MS assert( available_bits <= pBits->buf_len * 8 ); -#endif /* Do MS calc here */ if ( psLCLDEncoder->iChannels == 2 ) @@ -737,14 +695,7 @@ int32_t EncodeLCLDFrame( psLCLDEncoder->pppiQLCLDImag, psLCLDEncoder->pppiLCLDSignReal, psLCLDEncoder->pppiLCLDSignImag, -#ifdef SPLIT_REND_LCLD_5MS psLCLDEncoder->psPredictionEncoder ); -#else - psLCLDEncoder->psPredictionEncoder->ppiPredBandEnable, - psLCLDEncoder->psPredictionEncoder->ppfA1Real, - psLCLDEncoder->psPredictionEncoder->ppfA1Imag ); - -#endif iBitsWritten += WriteAllocInformation( psLCLDEncoder->iAllocOffset, pBits ); @@ -787,7 +738,6 @@ int32_t GetNumGroups( LCLDEncoder *psLCLDEncoder ) * *------------------------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS enum MSPred_Types { MS_PHASE_AND_PRED = 0, /* LR phase alignment + real-valued M/S prediction */ @@ -878,9 +828,6 @@ static int32_t MSModeCalculation( int32_t tabIdx = 0; float fNumLines = (float) ( iNumBlocks * piBandwidths[b] * 2 ); /* per band per channel */ float fLevelToSMRdBFactor = (float) c_aiDefaultTheta48[b] / (float) ( 1 << PERCEPTUAL_MODEL_SLGAIN_SHIFT ); /* frequency dependent SMR slope in psy model */ -#ifndef SPLIT_REND_LCLD_5MS - fLevelToSMRdBFactor = (float) c_aiDefaultTheta48[b] / 16.0f; /* this is a bug due to a change of PERCEPTUAL_MODEL_SLGAIN_SHIFT */ -#endif fLeftEnergy = 0.0f; fRightEnergy = 0.0f; fMidEnergy = 0.0f; @@ -996,10 +943,8 @@ static int32_t MSModeCalculation( /* find the best M/S Pred type */ iMSPredType = MS_PHASE_AND_PRED; -#ifdef SPLIT_REND_LCLD_5MS iMSPredType = ( pfMSPredBitGain[MS_PRED_ONLY] > pfMSPredBitGain[iMSPredType] ? MS_PRED_ONLY : iMSPredType ); iMSPredType = ( pfMSPredBitGain[MS_PHASE_ONLY] > pfMSPredBitGain[iMSPredType] ? MS_PHASE_ONLY : iMSPredType ); -#endif /* plain M/S */ iMsInfoBits = CountMSBits( iNumBands, MS_SOME, piMSFlags, NULL, NULL ); @@ -1124,316 +1069,6 @@ static int32_t MSModeCalculation( return iNumMSBands; } -#else -static int32_t MSModeCalculation( - const int32_t iNumBlocks, - const int32_t iNumBands, - const int32_t *piBandwidths, - float ***pppfReal, - float ***pppfImag, - int32_t *piMSMode, - int32_t *piLRPhaseDiffs, - int32_t *piMSPredCoefs, - const int32_t iAllowSidePred, - int32_t *piMSFlags ) -{ - int32_t b; - int32_t iFBOffset; - int32_t iNumMSBands; - int32_t piMSPredFlags[MAX_BANDS]; - int32_t iNumMSPredBands = 0; - float msBitsReduction = 0.0f; - float msPredBitsReduction = 0.0f; - int32_t msBits; - int32_t msPredBits; - float fPred; -#if defined SIMPLE_PHASE - void( *pFuncPhaseRotateOptions[4] ) = { &rot_zero, &rot_p_pi_2, &rot_pm_pi, &rot_m_pi_2 }; -#endif - const float one_by_log10_2 = 3.32192809488736f; - - set_l( piMSPredFlags, 0, MAX_BANDS ); - *piMSMode = 0; - iFBOffset = 0; - iNumMSBands = 0; - for ( b = 0; b < iNumBands; b++ ) - { - int32_t n; - float fLeftEnergy; - float fRightEnergy; - float fMidEnergy; - float fSideEnergy; - float fLRRatio; - float fMSRatio; - float fMSPredRatio; - float fMidEnergyPred; - float fSideEnergyPred; - float fLRCovReal = 0.0f; - float fLRCovImag = 0.0f; - int32_t iPhase; - int32_t iPred; - int32_t tabIdx = 0; - - fLeftEnergy = 0.0f; - fRightEnergy = 0.0f; - fMidEnergy = 0.0; - fSideEnergy = 0.0; - - for ( n = 0; n < piBandwidths[b]; n++ ) - { - int32_t k; - for ( k = 0; k < iNumBlocks; k++ ) - { - float fMidReal; - float fMidImag; - float fSideReal; - float fSideImag; - - fMidReal = 0.5f * ( pppfReal[0][k][iFBOffset] + pppfReal[1][k][iFBOffset] ); - fMidImag = 0.5f * ( pppfImag[0][k][iFBOffset] + pppfImag[1][k][iFBOffset] ); - fSideReal = 0.5f * ( pppfReal[0][k][iFBOffset] - pppfReal[1][k][iFBOffset] ); - fSideImag = 0.5f * ( pppfImag[0][k][iFBOffset] - pppfImag[1][k][iFBOffset] ); - - fLeftEnergy += ( pppfReal[0][k][iFBOffset] * pppfReal[0][k][iFBOffset] + pppfImag[0][k][iFBOffset] * pppfImag[0][k][iFBOffset] ); - fRightEnergy += ( pppfReal[1][k][iFBOffset] * pppfReal[1][k][iFBOffset] + pppfImag[1][k][iFBOffset] * pppfImag[1][k][iFBOffset] ); - fMidEnergy += ( fMidReal * fMidReal + fMidImag * fMidImag ); - fSideEnergy += ( fSideReal * fSideReal + fSideImag * fSideImag ); - - fLRCovReal += ( pppfReal[0][k][iFBOffset] * pppfReal[1][k][iFBOffset] + pppfImag[0][k][iFBOffset] * pppfImag[1][k][iFBOffset] ); - fLRCovImag += ( pppfImag[0][k][iFBOffset] * pppfReal[1][k][iFBOffset] - pppfImag[1][k][iFBOffset] * pppfReal[0][k][iFBOffset] ); - } - - iFBOffset++; - } - - /* compute L/R phase difference if high coherence */ - if ( fLRCovReal * fLRCovReal + fLRCovImag * fLRCovImag > 0.5f * fLeftEnergy * fRightEnergy ) - { - float fPhase = (float) atan2( fLRCovImag, fLRCovReal ); // ToDo: replace by atan2f() - iPhase = quantPhase( fPhase ); - } - else - { - iPhase = 0; - } - piLRPhaseDiffs[b] = iPhase; - - /* adjust covariance based on phase rotation */ -#ifdef SIMPLE_PHASE - cplxmult( &fLRCovReal, &fLRCovImag, c_afRotRealImagSimple[iPhase][0], -c_afRotRealImagSimple[iPhase][1] ); -#else - tabIdx = iPhase - PHASE_MIN_VAL; - cplxmult( &fLRCovReal, &fLRCovImag, c_afRotRealImag[tabIdx][0], -c_afRotRealImag[tabIdx][1] ); -#endif - /* compute MS prediction coefficient based on LR covariance*/ - fMidEnergyPred = 0.25f * ( fLeftEnergy + fRightEnergy + 2.0f * fLRCovReal ); - fSideEnergyPred = 0.25f * ( fLeftEnergy + fRightEnergy - 2.0f * fLRCovReal ); - - /* M/S prediction */ - fPred = fMidEnergyPred == 0.0f ? 0.0f : 0.25f * ( fLeftEnergy - fRightEnergy ) / fMidEnergyPred; - iPred = quantPred( fPred ); - fPred = dequantPred( iPred ); - piMSPredCoefs[b] = iPred; - - /* evaluation */ - fSideEnergyPred += ( fPred * fPred * fMidEnergyPred - 2.0f * fPred * 0.25f * ( fLeftEnergy - fRightEnergy ) ); - /* -= fPred * fPred * fMidEnergyPred doesn't work because fPred is quantized and does not match MS/MM exactly */ - fMSPredRatio = log10f( ( fMidEnergyPred + 1e-12f ) / ( fSideEnergyPred + 1e-12f ) ); - - fLeftEnergy = log10f( fLeftEnergy + 1e-12f ); - fRightEnergy = log10f( fRightEnergy + 1e-12f ); - fMidEnergy = log10f( fMidEnergy + 1e-12f ); - fSideEnergy = log10f( fSideEnergy + 1e-12f ); - - if ( fLeftEnergy > fRightEnergy ) - { - fLRRatio = fLeftEnergy - fRightEnergy; - } - else - { - fLRRatio = fRightEnergy - fLeftEnergy; - } - - if ( fMidEnergy > fSideEnergy ) - { - fMSRatio = fMidEnergy - fSideEnergy; - } - else - { - fMSRatio = fSideEnergy - fMidEnergy; - } - - if ( fMSRatio > fLRRatio ) - { - iNumMSBands++; - piMSFlags[b] = 1; - } - else - { - piMSFlags[b] = 0; - } - - if ( fMSRatio > fLRRatio ) - { - float maskThresShift_dB_by_10 = ( fMSRatio - fLRRatio ) * (float) c_aiDefaultTheta48[b] / 16.0f; - msBitsReduction += (float) ( piBandwidths[b] * iNumBlocks * 2 ) * one_by_log10_2 * maskThresShift_dB_by_10; /* * 2 for real/imag */ - } - - if ( fMSPredRatio > fLRRatio ) - { - float maskThresShift_dB_by_10 = ( fMSPredRatio - fLRRatio ) * (float) c_aiDefaultTheta48[b] / 16.0f; - msPredBitsReduction += (float) ( piBandwidths[b] * iNumBlocks * 2 ) * one_by_log10_2 * maskThresShift_dB_by_10; - iNumMSPredBands++; - piMSPredFlags[b] = 1; - } - else - { - piMSPredFlags[b] = 0; - } - } - - msPredBits = CountMSBits( iNumBands, 3, piMSPredFlags, piLRPhaseDiffs, piMSPredCoefs ); - msPredBitsReduction = max( msPredBitsReduction - (float) msPredBits, 0.0f ); - msBits = CountMSBits( iNumBands, 2, piMSFlags, NULL, NULL ); - msBitsReduction = max( msBitsReduction - (float) msBits, 0.0f ); -#ifdef DEBUG_WRITE_MS_PRED - { - static FILE *fid = 0; - if ( !fid ) - { - fid = fopen( "bit_red.txt", "wt" ); - } - fprintf( fid, "%.1f %.1f %d %d\n", msBitsReduction, msPredBitsReduction, msBits, msPredBits ); - } -#endif - - if ( iAllowSidePred && msPredBitsReduction > 1.1f * msBitsReduction ) - { - *piMSMode = 3; - for ( b = 0; b < iNumBands; b++ ) - { - piMSFlags[b] = piMSPredFlags[b]; - } - iNumMSBands = iNumMSPredBands; - } - else if ( iNumMSBands == iNumBands ) - { - *piMSMode = 1; - } - else if ( iNumMSBands > 0 ) - { - *piMSMode = 2; - } - else - { - *piMSMode = 0; - } - - if ( *piMSMode > 0 ) - { - iFBOffset = 0; - for ( b = 0; b < iNumBands; b++ ) - { -#if defined SIMPLE_PHASE - void ( *pFuncPhaseRotate )( float *, float * ) = pFuncPhaseRotateOptions[piLRPhaseDiffs[b]]; -#endif - if ( piMSFlags[b] == 1 ) - { - int32_t n; - for ( n = 0; n < piBandwidths[b]; n++ ) - { - int32_t k; - for ( k = 0; k < iNumBlocks; k++ ) - { - float fMidReal; - float fMidImag; - float fSideReal; - float fSideImag; - - if ( *piMSMode == 3 ) - { -#ifdef SIMPLE_PHASE - ( *pFuncPhaseRotate )( &pppfReal[1][k][iFBOffset], &pppfImag[1][k][iFBOffset] ); -#else - int32_t phaseIdx; - - phaseIdx = piLRPhaseDiffs[b] - PHASE_MIN_VAL; - cplxmult( &pppfReal[1][k][iFBOffset], &pppfImag[1][k][iFBOffset], c_afRotRealImag[phaseIdx][0], c_afRotRealImag[phaseIdx][1] ); -#endif - } - - fMidReal = 0.5f * ( pppfReal[0][k][iFBOffset] + pppfReal[1][k][iFBOffset] ); - fMidImag = 0.5f * ( pppfImag[0][k][iFBOffset] + pppfImag[1][k][iFBOffset] ); - fSideReal = 0.5f * ( pppfReal[0][k][iFBOffset] - pppfReal[1][k][iFBOffset] ); - fSideImag = 0.5f * ( pppfImag[0][k][iFBOffset] - pppfImag[1][k][iFBOffset] ); - - if ( *piMSMode == 3 ) - { - fPred = dequantPred( piMSPredCoefs[b] ); - fSideReal -= fPred * fMidReal; - fSideImag -= fPred * fMidImag; - } - - pppfReal[0][k][iFBOffset] = fMidReal; - pppfReal[1][k][iFBOffset] = fSideReal; - pppfImag[0][k][iFBOffset] = fMidImag; - pppfImag[1][k][iFBOffset] = fSideImag; - } - iFBOffset++; - } - } - else - { - iFBOffset += piBandwidths[b]; - } - } - } - -#ifdef DEBUG_WRITE_MS_PRED - { - static FILE *fid = 0; - if ( !fid ) - { - fid = fopen( "ms_mode_enc_raw.txt", "wt" ); - } - writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumBands, iNumBands, fid, piMSFlags ); - } -#endif - if ( *piMSMode == 3 ) - { - /* Differential Coding of Phase Data*/ - PrepEncode( piLRPhaseDiffs, piMSFlags, iNumBands ); - PrepEncode( piMSPredCoefs, piMSFlags, iNumBands ); -#ifdef DEBUG_WRITE_MS_PRED - { - static FILE *fid = 0; - if ( !fid ) - { - fid = fopen( "ms_mode_enc.txt", "wt" ); - } - writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumMSBands, iNumBands, fid, piMSFlags ); - } -#endif - /* Differential Coding*/ -#ifndef SIMPLE_PHASE - EncodePhase( piLRPhaseDiffs, iNumMSBands, PHASE_DIFF_DIM ); -#endif - EncodePredCoef( piMSPredCoefs, iNumMSBands ); -#ifdef DEBUG_WRITE_MS_PRED - { - static FILE *fid = 0; - if ( !fid ) - { - fid = fopen( "ms_mode_enc_diff.txt", "wt" ); - } - writeMSPred( piLRPhaseDiffs, piMSPredCoefs, *piMSMode, iNumMSBands, iNumBands, fid, piMSFlags ); - } -#endif - } - - return iNumMSBands; -} -#endif static void RemoveRMSEnvelope( @@ -1473,7 +1108,6 @@ static void RemoveRMSEnvelope( return; } -#ifdef SPLIT_REND_LCLD_5MS static void QuantizeSpectrumDPCM_Opt( const int32_t iNumGroups, const int32_t *piGroupLengths, @@ -1585,149 +1219,6 @@ static void QuantizeSpectrumDPCM_Opt( } /* bandwidth */ } /* bands */ } -#else -static void QuantizeSpectrumDPCM_Opt( - const int32_t iNumGroups, - const int32_t *piGroupLengths, - const int32_t iNumBands, - const int32_t *piBandwidths, - int32_t **ppiAlloc, - float **ppfReal, - float **ppfImag, - int32_t **ppiQReal, - int32_t **ppiQImag, - int32_t **ppiSignReal, - int32_t **ppiSignImag, - int32_t *piPredEnable, - float *pfA1Real, - float *pfA1Imag ) /* Pass in 2 previous value buffers NULLABLE */ -{ - int32_t b, m, n, iBlockOffset; - float fVal, fPrevReal, fPrevImag, fPredReal, fPredImag; - int32_t iFBOffset; - int32_t k, iAlloc, iQuantValue, iMaxQuantVal; - float fSCFGain, fInvSCFGain; - - iFBOffset = 0; - for ( b = 0; b < iNumBands; b++ ) - { - for ( m = 0; m < piBandwidths[b]; m++ ) - { - iBlockOffset = 0; - fPrevReal = 0.0; - fPrevImag = 0.0; - for ( n = 0; n < iNumGroups; n++ ) - { - iAlloc = ppiAlloc[n][b]; - iMaxQuantVal = c_aiQuantMaxValues[iAlloc]; - fSCFGain = c_afScaleFactor[iAlloc]; - fInvSCFGain = c_afInvScaleFactor[iAlloc]; - - if ( piPredEnable[iFBOffset] == 1 ) - { - for ( k = 0; k < piGroupLengths[n]; k++ ) - { - fPredReal = 0.0; - fPredImag = 0.0; - - fPredReal = pfA1Real[iFBOffset] * fPrevReal - pfA1Imag[iFBOffset] * fPrevImag; - fPredImag = pfA1Real[iFBOffset] * fPrevImag + pfA1Imag[iFBOffset] * fPrevReal; - - fVal = ppfReal[iBlockOffset][iFBOffset] + fPredReal; - if ( fVal > 0.0 ) - { - iQuantValue = (int32_t) ( fSCFGain * fVal + 0.5 ); - ppiSignReal[iBlockOffset][iFBOffset] = 0; - } - else - { - iQuantValue = (int32_t) ( -fSCFGain * fVal + 0.5 ); - ppiSignReal[iBlockOffset][iFBOffset] = 1; - } - iQuantValue = ( iQuantValue < iMaxQuantVal ) ? iQuantValue : iMaxQuantVal; - - ppiQReal[iBlockOffset][iFBOffset] = iQuantValue; - - fVal = ppfImag[iBlockOffset][iFBOffset] + fPredImag; - if ( fVal > 0.0 ) - { - iQuantValue = (int32_t) ( fSCFGain * fVal + 0.5 ); - ppiSignImag[iBlockOffset][iFBOffset] = 0; - } - else - { - iQuantValue = (int32_t) ( -fSCFGain * fVal + 0.5 ); - ppiSignImag[iBlockOffset][iFBOffset] = 1; - } - - iQuantValue = ( iQuantValue < iMaxQuantVal ) ? iQuantValue : iMaxQuantVal; - ppiQImag[iBlockOffset][iFBOffset] = iQuantValue; - - - if ( ppiSignReal[iBlockOffset][iFBOffset] == 0 ) - { - fPrevReal = fInvSCFGain * (float) ppiQReal[iBlockOffset][iFBOffset] - fPredReal; - } - else - { - fPrevReal = -fInvSCFGain * (float) ppiQReal[iBlockOffset][iFBOffset] - fPredReal; - } - if ( ppiSignImag[iBlockOffset][iFBOffset] == 0 ) - { - fPrevImag = fInvSCFGain * (float) ppiQImag[iBlockOffset][iFBOffset] - fPredImag; - } - else - { - fPrevImag = -fInvSCFGain * (float) ppiQImag[iBlockOffset][iFBOffset] - fPredImag; - } - - iBlockOffset++; - } - } - else - { - for ( k = 0; k < piGroupLengths[n]; k++ ) - { - fVal = ppfReal[iBlockOffset][iFBOffset]; - if ( fVal > 0.0 ) - { - iQuantValue = (int32_t) ( fSCFGain * fVal + 0.5 ); - ppiSignReal[iBlockOffset][iFBOffset] = 0; - } - else - { - iQuantValue = (int32_t) ( -fSCFGain * fVal + 0.5 ); - ppiSignReal[iBlockOffset][iFBOffset] = 1; - } - iQuantValue = ( iQuantValue < iMaxQuantVal ) ? iQuantValue : iMaxQuantVal; - - ppiQReal[iBlockOffset][iFBOffset] = iQuantValue; - - fVal = ppfImag[iBlockOffset][iFBOffset]; - if ( fVal > 0.0 ) - { - iQuantValue = (int32_t) ( fSCFGain * fVal + 0.5 ); - ppiSignImag[iBlockOffset][iFBOffset] = 0; - } - else - { - iQuantValue = (int32_t) ( -fSCFGain * fVal + 0.5 ); - ppiSignImag[iBlockOffset][iFBOffset] = 1; - } - iQuantValue = ( iQuantValue < iMaxQuantVal ) ? iQuantValue : iMaxQuantVal; - ppiQImag[iBlockOffset][iFBOffset] = iQuantValue; - iBlockOffset++; - } - } - } - - iFBOffset++; - } - } - - return; -} -#endif static int32_t CountLCLDBits( const int32_t iNumGroups, @@ -2220,13 +1711,7 @@ static int32_t ComputeAllocation( int32_t ***pppiQImag, int32_t ***pppiSignReal, int32_t ***pppiSignImag, -#ifdef SPLIT_REND_LCLD_5MS PredictionEncoder *psPredictionEncoder ) -#else - int32_t **ppiPredEnable, - float **ppfA1Real, - float **ppfA1Imag ) -#endif { int32_t iBitsUsed, iDone, iDelta; int32_t b, k, n; @@ -2260,13 +1745,11 @@ static int32_t ComputeAllocation( } } -#ifdef SPLIT_REND_LCLD_5MS if ( psPredictionEncoder->iNumSubSets > 1 ) { mvr2r( psPredictionEncoder->ppfPredStateReal[n], psPredictionEncoder->ppfPredStateRealTmp[n], LCLD_BANDS ); mvr2r( psPredictionEncoder->ppfPredStateImag[n], psPredictionEncoder->ppfPredStateImagTmp[n], LCLD_BANDS ); } -#endif QuantizeSpectrumDPCM_Opt( piNumGroups[n], (const int32_t *) ppiGroupLengths[n], @@ -2279,7 +1762,6 @@ static int32_t ComputeAllocation( pppiQImag[n], pppiSignReal[n], pppiSignImag[n], -#ifdef SPLIT_REND_LCLD_5MS psPredictionEncoder->iNumSubSets, psPredictionEncoder->iSubSetId, psPredictionEncoder->ppiPredBandEnable[n], @@ -2287,21 +1769,12 @@ static int32_t ComputeAllocation( psPredictionEncoder->ppfA1Imag[n], psPredictionEncoder->ppfPredStateRealTmp[n], psPredictionEncoder->ppfPredStateImagTmp[n] ); -#else - ppiPredEnable[n], - ppfA1Real[n], - ppfA1Imag[n] ); -#endif iBitsUsed += CountLCLDBits( piNumGroups[n], (const int32_t *) ppiGroupLengths[n], iNumBands, piBandwidths, -#ifdef SPLIT_REND_LCLD_5MS (const int32_t *) psPredictionEncoder->ppiPredBandEnable[n], -#else - (const int32_t *) ppiPredEnable[n], -#endif pppiAlloc[n], pppiQReal[n], pppiQImag[n] ); @@ -2348,7 +1821,6 @@ static int32_t ComputeAllocation( } } -#ifdef SPLIT_REND_LCLD_5MS if ( psPredictionEncoder->iNumSubSets > 1 ) { for ( n = 0; n < iChannels; n++ ) @@ -2361,7 +1833,6 @@ static int32_t ComputeAllocation( psPredictionEncoder->iSubSetId = 0; } } -#endif // printf("%d\n",*piAllocOffset); // printf("%d\t%d\t%d\n",pppiAlloc[0][0][0],pppiAlloc[0][0][1],pppiAlloc[0][0][22]); diff --git a/lib_rend/ivas_lcld_prot.h b/lib_rend/ivas_lcld_prot.h index f83ef8ae8b..6fbc250fcc 100644 --- a/lib_rend/ivas_lcld_prot.h +++ b/lib_rend/ivas_lcld_prot.h @@ -42,7 +42,6 @@ typedef struct LCLD_ENCODER LCLDEncoder; -#ifdef SPLIT_REND_LCLD_5MS ivas_error CreateLCLDEncoder( LCLDEncoder **psLCLDEncoder_out, const int32_t iSampleRate, @@ -51,14 +50,6 @@ ivas_error CreateLCLDEncoder( const int32_t iAllowSidePred, const int16_t iNumBlocks, const int16_t iNumSubSets ); -#else -ivas_error CreateLCLDEncoder( - LCLDEncoder **psLCLDEncoder, - const int32_t iSampleRate, - const int32_t iChannels, - const int32_t iTargetBitRate, - const int32_t iAllowSidePred ); -#endif void DeleteLCLDEncoder( LCLDEncoder *psLCLDEncoder @@ -79,18 +70,11 @@ int32_t GetNumGroups( typedef struct LCLD_DECODER LCLDDecoder; -#ifndef SPLIT_REND_LCLD_5MS -ivas_error CreateLCLDDecoder( - LCLDDecoder **psLCLDDecoder_out, - const int32_t iSampleRate, - const int32_t iChannels ); -#else ivas_error CreateLCLDDecoder( LCLDDecoder **psLCLDDecoder_out, const int32_t iSampleRate, const int32_t iChannels, const int32_t iNumBlocks ); -#endif void DeleteLCLDDecoder( LCLDDecoder *psLCLDDecoder @@ -243,7 +227,6 @@ typedef struct PREDICTION_ENCODER int32_t iChannels; int32_t iNumBlocks; -#ifdef SPLIT_REND_LCLD_5MS int32_t iSubSetId; int32_t iNumSubSets; int32_t iMaxNumPredBands; @@ -255,7 +238,6 @@ typedef struct PREDICTION_ENCODER float **ppfPredStateImagTmp; float **ppfInpPrevReal; /* channels, bands */ float **ppfInpPrevImag; -#endif float *pfWindow; float pfRxxReal[2]; @@ -263,10 +245,6 @@ typedef struct PREDICTION_ENCODER int32_t *piPredChanEnable; int32_t *piNumPredBands; -#ifndef SPLIT_REND_LCLD_5MS - float **ppfEstPredGain; - float **ppfEstPredBitGain; -#endif int32_t **ppiPredBandEnable; float **ppfA1Real; @@ -276,7 +254,6 @@ typedef struct PREDICTION_ENCODER int32_t **ppiA1Phase; } PredictionEncoder; -#ifdef SPLIT_REND_LCLD_5MS ivas_error CreatePredictionEncoder( PredictionEncoder **psPredictionEncoder_out, const int32_t iChannels, @@ -284,31 +261,16 @@ ivas_error CreatePredictionEncoder( const int32_t iNumSubSets, const int32_t iMaxNumPredBands ); -#else -ivas_error CreatePredictionEncoder( - PredictionEncoder **psPredictionEncoder_out, - const int32_t iChannels, - const int32_t iNumBlocks -); -#endif void DeletePredictionEncoder( PredictionEncoder *psPredictionEncoder ); -#ifdef SPLIT_REND_LCLD_5MS void ComputePredictors( PredictionEncoder *psPredictionEncoder, float ***pppfReal, float ***pppfImag ); -#else -int32_t ComputePredictors( - PredictionEncoder *psPredictionEncoder, - float ***pppfReal, - float ***pppfImag -); -#endif void ApplyForwardPredictors( PredictionEncoder *psPredictionEncoder, @@ -325,19 +287,12 @@ typedef struct PREDICTION_DECODER { int32_t iChannels; int32_t iNumBlocks; - #ifdef SPLIT_REND_LCLD_5MS int32_t iSubSetId; int32_t iNumSubSets; float **ppfPredStateReal; float **ppfPredStateImag; - #endif int32_t *piPredChanEnable; - #ifndef SPLIT_REND_LCLD_5MS - int32_t *piNumPredBands; - - float **ppfEstPredGain; - #endif int32_t **ppiPredBandEnable; float **ppfA1Real; @@ -367,11 +322,7 @@ int32_t ReadPredictors( IVAS_SPLIT_REND_BITS_HANDLE pBits ); -#ifdef SPLIT_REND_LCLD_5MS void ApplyInversePredictors( -#else -void ApplyInversePredictros( -#endif PredictionDecoder *psPredictionDecoder, float ***pppfReal, float ***pppfImag diff --git a/lib_rend/ivas_lcld_rom_tables.c b/lib_rend/ivas_lcld_rom_tables.c index 0499ded47c..c562624ffa 100644 --- a/lib_rend/ivas_lcld_rom_tables.c +++ b/lib_rend/ivas_lcld_rom_tables.c @@ -39,14 +39,6 @@ /* clang-format off */ -#ifndef SPLIT_REND_LCLD_5MS -const float c_afRotRealImagSimple[SIMPLE_PHASE_MAX_VAL + 1][2] = { - { 1.0f, 0.0f }, /* zero */ - { 0.0f, 1.0f }, /* pi/2 */ - { -1.0f, 0.0f }, /* pi */ - { 0.0f, -1.0f }, /* 3*pi/2 */ -}; -#endif /* phi = (-12:12)'/12 *pi; tmp = [cos(phi),sin(phi)]; tmp = tmp';sprintf('{%.8ff, %.8ff},\n',tmp(:)) */ const float c_afRotRealImag[PHASE_MAX_VAL - PHASE_MIN_VAL + 1][2] = diff --git a/lib_rend/ivas_lcld_rom_tables.h b/lib_rend/ivas_lcld_rom_tables.h index 15a8e29211..8deb0aadf5 100644 --- a/lib_rend/ivas_lcld_rom_tables.h +++ b/lib_rend/ivas_lcld_rom_tables.h @@ -45,16 +45,12 @@ #define LCLD_BLOCKS_PER_FRAME ( 16 ) #define LCLD_MAX_BLOCKS_PER_FRAME ( 16 ) #define LCLD_BANDS ( 60 ) -#ifdef SPLIT_REND_LCLD_5MS #define LCLD_PRED_WIN_LEN ( 16 ) #define LCLD_MAX_NUM_PRED_SUBSETS ( 8 ) -#endif #define MAX_BANDS ( 23 ) #define MAX_BANDS_48 ( 23 ) -#ifdef SPLIT_REND_LCLD_5MS #define DEF_BANDS_48 ( 22 ) -#endif #define ENV_MIN ( -64 ) #define ENV_MAX ( 64 ) @@ -95,15 +91,6 @@ #define PHASE_DIFF_DIM ( 2 ) #define PHASE_BAND0_BITS ( 5 ) -#ifndef SPLIT_REND_LCLD_5MS -#define SIMPLE_PHASE_MAX_VAL ( 3 ) -#define SIMPLE_PHASE_MIN_VAL ( 0 ) -#define SIMPLE_PHASE_BITS ( 2 ) -#define SIMPLE_PHASE_QUANT_FACTOR ( 2.0f / _PI_ ) - -#define TON_QUOTA_ABS_THRESHOLD ( 8.0f ) -#define TON_QUOTA_INC_THRESHOLD ( 4.0f ) -#endif #define PERCEPTUAL_MODEL_SLGAIN_SHIFT ( 8 ) //#define USE_DEMOD_TABLES @@ -111,9 +98,6 @@ #define HUFF_DEC_TABLE_SIZE ( 16 ) extern const float c_afRotRealImag[PRED_MAX_VAL - PRED_MIN_VAL + 1][2]; -#ifndef SPLIT_REND_LCLD_5MS -extern const float c_afRotRealImagSimple[SIMPLE_PHASE_MAX_VAL + 1][2]; -#endif extern const int32_t c_aiDefaultTheta48[MAX_BANDS_48]; extern const float c_afScaleFactor[ALLOC_TABLE_SIZE]; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 80b53d508d..3767a7fea2 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1466,7 +1466,6 @@ void ivas_init_split_post_rend_handles( SPLIT_POST_REND_WRAPPER *hSplitRendWrapper ); -#ifdef SPLIT_REND_LCLD_5MS ivas_error ivas_split_renderer_open( SPLIT_REND_WRAPPER *hSplitBinRend, const IVAS_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, @@ -1475,22 +1474,11 @@ ivas_error ivas_split_renderer_open( const int16_t pcm_out_flag, const int16_t num_subframes ); -#else -ivas_error ivas_split_renderer_open( - SPLIT_REND_WRAPPER *hSplitBinRend, - const IVAS_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, - const int32_t output_Fs, - const int16_t cldfb_in_flag, - const int16_t pcm_out_flag, - const int16_t is_5ms_frame -); -#endif void ivas_split_renderer_close( SPLIT_REND_WRAPPER *hSplitBinRend ); -#ifdef SPLIT_REND_LCLD_5MS ivas_error ivas_splitBinLCLDEncOpen( BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, const int32_t iSampleRate, @@ -1499,14 +1487,6 @@ ivas_error ivas_splitBinLCLDEncOpen( const int16_t iNumBlocks, const int16_t iNumIterations ); -#else -ivas_error ivas_splitBinLCLDEncOpen( - BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, - const int32_t iSampleRate, - const int16_t iChannels, - const int32_t iDataRate -); -#endif void ivas_splitBinLCLDEncClose( BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc @@ -1520,7 +1500,6 @@ void ivas_splitBinLCLDEncProcess( IVAS_SPLIT_REND_BITS_HANDLE pBits ); -#ifdef SPLIT_REND_LCLD_5MS ivas_error ivas_splitBinLCLDDecOpen( BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, const int32_t iSampleRate, @@ -1528,13 +1507,6 @@ ivas_error ivas_splitBinLCLDDecOpen( const int16_t iNumBlocks, const int16_t iNumIterations ); -#else -ivas_error ivas_splitBinLCLDDecOpen( - BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, - const int32_t iSampleRate, - const int16_t iChannels -); -#endif void ivas_splitBinLCLDDecClose( BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec @@ -1644,7 +1616,6 @@ void ivas_splitBinRendPLCClose( SPLIT_REND_PLC_HANDLE* phSplitRendPLC ); -#ifdef SPLIT_REND_LCLD_5MS void ivas_splitBinRendPLCsaveState( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -1653,16 +1624,7 @@ void ivas_splitBinRendPLCsaveState( const int16_t iNumBlocks, const int16_t iNumIterations ); -#else -void ivas_splitBinRendPLCsaveState( - SPLIT_REND_PLC_HANDLE hSplitRendPLC, - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const int16_t num_chs -); -#endif -#ifdef SPLIT_REND_LCLD_5MS void ivas_splitBinRendPLC_xf( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -1671,16 +1633,7 @@ void ivas_splitBinRendPLC_xf( const int16_t iNumBlocks, const int16_t iNumIterations ); -#else -void ivas_splitBinRendPLC_xf( - SPLIT_REND_PLC_HANDLE hSplitRendPLC, - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const int16_t num_chs -); -#endif -#ifdef SPLIT_REND_LCLD_5MS void ivas_splitBinRendPLC( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -1689,14 +1642,6 @@ void ivas_splitBinRendPLC( const int16_t iNumBlocks, const int16_t iNumIterations ); -#else -void ivas_splitBinRendPLC( - SPLIT_REND_PLC_HANDLE hSplitRendPLC, - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const int16_t num_chs -); -#endif #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG void ivas_log_cldfb2wav_data( @@ -1977,12 +1922,10 @@ int32_t ivas_split_rend_bitstream_read_int32( const int32_t bits ); -#ifdef SPLIT_REND_LCLD_5MS int32_t get_bit( const int32_t state, const int32_t bit_id ); -#endif void ivas_rend_closeCldfbRend( CLDFB_REND_WRAPPER *pCldfbRend @@ -2034,7 +1977,6 @@ void ivas_split_rend_get_quant_params( int16_t *num_complex_bands ); -#ifdef SPLIT_REND_LCLD_5MS ivas_error ivas_split_rend_choose_default_codec( IVAS_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ int16_t *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ @@ -2042,14 +1984,6 @@ ivas_error ivas_split_rend_choose_default_codec( const int16_t pcm_out_flag, /* i : flag to indicate PCM output */ const int16_t num_subframes /* i : number of subframes */ ); -#else -ivas_error ivas_split_rend_choose_default_codec( - IVAS_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ - int16_t *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ - const int16_t cldfb_in_flag, /* i : flag indicating rendering in CLDFB */ - const int16_t pcm_out_flag /* i : flag to indicate PCM output */ -); -#endif #endif diff --git a/lib_rend/ivas_splitRend_lcld_dec.c b/lib_rend/ivas_splitRend_lcld_dec.c index feb11fe89b..9493d076af 100644 --- a/lib_rend/ivas_splitRend_lcld_dec.c +++ b/lib_rend/ivas_splitRend_lcld_dec.c @@ -48,19 +48,12 @@ * *------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS ivas_error ivas_splitBinLCLDDecOpen( BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, const int32_t iSampleRate, const int16_t iChannels, const int16_t iNumBlocks, const int16_t iNumIterations ) -#else -ivas_error ivas_splitBinLCLDDecOpen( - BIN_HR_SPLIT_LCLD_DEC_HANDLE *hSplitBinLCLDDec, - const int32_t iSampleRate, - const int16_t iChannels ) -#endif { int16_t n; BIN_HR_SPLIT_LCLD_DEC_HANDLE splitBinLCLDDec; @@ -75,17 +68,10 @@ ivas_error ivas_splitBinLCLDDecOpen( splitBinLCLDDec->iChannels = iChannels; -#ifndef SPLIT_REND_LCLD_5MS - if ( ( error = CreateLCLDDecoder( &splitBinLCLDDec->psLCLDDecoder, iSampleRate, iChannels ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = CreateLCLDDecoder( &splitBinLCLDDec->psLCLDDecoder, iSampleRate, iChannels, iNumBlocks ) ) != IVAS_ERR_OK ) { return error; } -#endif if ( ( splitBinLCLDDec->pppfDecLCLDReal = (float ***) malloc( iChannels * sizeof( float ** ) ) ) == NULL ) { @@ -125,10 +111,8 @@ ivas_error ivas_splitBinLCLDDecOpen( { return error; } -#ifdef SPLIT_REND_LCLD_5MS splitBinLCLDDec->iNumBlocks = iNumBlocks; splitBinLCLDDec->iNumIterations = iNumIterations; -#endif *hSplitBinLCLDDec = splitBinLCLDDec; @@ -192,9 +176,7 @@ void ivas_splitBinLCLDDecProcess( const int16_t bfi ) { int16_t k, n; -#ifdef SPLIT_REND_LCLD_5MS int16_t itr; -#endif push_wmops( "ivas_splitBinLCLDDecProcess" ); assert( hSplitBinLCLDDec != NULL ); @@ -207,14 +189,11 @@ void ivas_splitBinLCLDDecProcess( #endif if ( !bfi ) { -#ifdef SPLIT_REND_LCLD_5MS for ( itr = 0; itr < hSplitBinLCLDDec->iNumIterations; itr++ ) { -#endif /* Initialized with zeros....... */ for ( n = 0; n < hSplitBinLCLDDec->iChannels; n++ ) { -#ifdef SPLIT_REND_LCLD_5MS for ( k = 0; k < hSplitBinLCLDDec->iNumBlocks; k++ ) { hSplitBinLCLDDec->pppfDecLCLDReal[n][k] = Cldfb_Out_Real[n][hSplitBinLCLDDec->iNumBlocks * itr + k]; @@ -222,15 +201,6 @@ void ivas_splitBinLCLDDecProcess( set_f( hSplitBinLCLDDec->pppfDecLCLDReal[n][k], 0, CLDFB_NO_CHANNELS_MAX ); set_f( hSplitBinLCLDDec->pppfDecLCLDImag[n][k], 0, CLDFB_NO_CHANNELS_MAX ); } -#else - for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) - { - hSplitBinLCLDDec->pppfDecLCLDReal[n][k] = Cldfb_Out_Real[n][k]; - hSplitBinLCLDDec->pppfDecLCLDImag[n][k] = Cldfb_Out_Imag[n][k]; - set_f( hSplitBinLCLDDec->pppfDecLCLDReal[n][k], 0, CLDFB_NO_CHANNELS_MAX ); - set_f( hSplitBinLCLDDec->pppfDecLCLDImag[n][k], 0, CLDFB_NO_CHANNELS_MAX ); - } -#endif } DecodeLCLDFrame( hSplitBinLCLDDec->psLCLDDecoder, pBits, hSplitBinLCLDDec->pppfDecLCLDReal, hSplitBinLCLDDec->pppfDecLCLDImag ); @@ -257,32 +227,18 @@ void ivas_splitBinLCLDDecProcess( if ( hSplitBinLCLDDec->hSplitRendPLC->prev_bfi != 0 ) { /* cross-fade recovered frame into good frame */ -#ifdef SPLIT_REND_LCLD_5MS ivas_splitBinRendPLC_xf( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations ); -#else - ivas_splitBinRendPLC_xf( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels ); -#endif } -#ifdef SPLIT_REND_LCLD_5MS } -#endif } else { /* do PLC for lost split renderer frame */ -#ifdef SPLIT_REND_LCLD_5MS ivas_splitBinRendPLC( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations ); -#else - ivas_splitBinRendPLC( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels ); -#endif } /* save PLC state */ -#ifdef SPLIT_REND_LCLD_5MS ivas_splitBinRendPLCsaveState( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations ); -#else - ivas_splitBinRendPLCsaveState( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real, Cldfb_Out_Imag, (int16_t) hSplitBinLCLDDec->iChannels ); -#endif pop_wmops(); diff --git a/lib_rend/ivas_splitRend_lcld_enc.c b/lib_rend/ivas_splitRend_lcld_enc.c index c18d188d1d..6903989dd1 100644 --- a/lib_rend/ivas_splitRend_lcld_enc.c +++ b/lib_rend/ivas_splitRend_lcld_enc.c @@ -47,7 +47,6 @@ * *------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS ivas_error ivas_splitBinLCLDEncOpen( BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, const int32_t iSampleRate, @@ -55,13 +54,6 @@ ivas_error ivas_splitBinLCLDEncOpen( const int32_t iDataRate, const int16_t iNumBlocks, const int16_t iNumIterations ) -#else -ivas_error ivas_splitBinLCLDEncOpen( - BIN_HR_SPLIT_LCLD_ENC_HANDLE *hSplitBinLCLDEnc, - const int32_t iSampleRate, - const int16_t iChannels, - const int32_t iDataRate ) -#endif { BIN_HR_SPLIT_LCLD_ENC_HANDLE splitBinLCLDEnc; ivas_error error; @@ -74,17 +66,10 @@ ivas_error ivas_splitBinLCLDEncOpen( splitBinLCLDEnc->pLcld_enc = NULL; /* place holder for CLDFB encoder handle*/ splitBinLCLDEnc->iChannels = iChannels; -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = CreateLCLDEncoder( &( splitBinLCLDEnc->psLCLDEncoder ), iSampleRate, iChannels, iDataRate, 1, iNumBlocks, (int16_t) CLDFB_NO_COL_MAX / iNumBlocks ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = CreateLCLDEncoder( &( splitBinLCLDEnc->psLCLDEncoder ), iSampleRate, iChannels, iDataRate, 1 ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif if ( ( splitBinLCLDEnc->pppfLCLDReal = (float ***) malloc( iChannels * sizeof( float ** ) ) ) == NULL ) { @@ -107,10 +92,8 @@ ivas_error ivas_splitBinLCLDEncOpen( } } -#ifdef SPLIT_REND_LCLD_5MS splitBinLCLDEnc->iNumIterations = iNumIterations; splitBinLCLDEnc->iNumBlocks = iNumBlocks; -#endif #ifdef CLDFB_DEBUG splitBinLCLDEnc->numFrame = 0; @@ -180,11 +163,7 @@ void ivas_splitBinLCLDEncProcess( const int32_t available_bits, IVAS_SPLIT_REND_BITS_HANDLE pBits ) { -#ifdef SPLIT_REND_LCLD_5MS int32_t iBitsWritten, itr, available_bits_itr, rem_itr, available_bits_local; -#else - int32_t iBitsWritten; -#endif push_wmops( "ivas_splitBinLCLDEncProcess" ); assert( hSplitBinLCLDEnc != NULL ); @@ -192,11 +171,8 @@ void ivas_splitBinLCLDEncProcess( assert( Cldfb_In_Imag != NULL ); assert( pBits != NULL ); -#ifdef SPLIT_REND_LCLD_5MS available_bits_local = available_bits; -#endif /* A conversion is needed for the 3d pointer interface here ........ */ -#ifdef SPLIT_REND_LCLD_5MS for ( itr = 0; itr < hSplitBinLCLDEnc->iNumIterations; itr++ ) { @@ -211,40 +187,19 @@ void ivas_splitBinLCLDEncProcess( hSplitBinLCLDEnc->pppfLCLDImag[n][k] = Cldfb_In_Imag[n][hSplitBinLCLDEnc->iNumBlocks * itr + k]; } } -#else - for ( int32_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) - { - for ( int32_t k = 0; k < CLDFB_NO_COL_MAX; k++ ) - { - hSplitBinLCLDEnc->pppfLCLDReal[n][k] = Cldfb_In_Real[n][k]; - hSplitBinLCLDEnc->pppfLCLDImag[n][k] = Cldfb_In_Imag[n][k]; - } - } -#endif #ifdef CLDFB_DEBUG int16_t readByte = 0; -#ifdef SPLIT_REND_LCLD_5MS for ( int16_t k = 0; k < hSplitBinLCLDEnc->iNumBlocks; k++ ) -#else - for ( int16_t k = 0; k < CLDFB_NO_COL_MAX; k++ ) -#endif { for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) { for ( int16_t n = 0; n < hSplitBinLCLDEnc->iChannels; n++ ) { -#ifdef SPLIT_REND_LCLD_5MS readByte = fread( &hSplitBinLCLDEnc->pppfLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); if ( readByte != 1 ) break; readByte = fread( &hSplitBinLCLDEnc->pppfLCLDReal[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); -#else - readByte = fread( &Cldfb_In_Real[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); - if ( readByte != 1 ) - break; - readByte = fread( &Cldfb_In_Imag[n][k][b], sizeof( float ), 1, hSplitBinLCLDEnc->cldfbIn ); -#endif } } } @@ -256,11 +211,7 @@ void ivas_splitBinLCLDEncProcess( else { printf( "Writing zeroes...\n" ); -#ifdef SPLIT_REND_LCLD_5MS for ( int16_T k = 0; k < hSplitBinLCLDEnc->iNumBlocks; k++ ) -#else - for ( int16_T k = 0; k < CLDFB_NO_COL_MAX; k++ ) -#endif { for ( int16_t b = 0; b < CLDFB_NO_CHANNELS_MAX; b++ ) { @@ -273,30 +224,17 @@ void ivas_splitBinLCLDEncProcess( } } #endif -#ifdef SPLIT_REND_LCLD_5MS EncodeLCLDFrame( hSplitBinLCLDEnc->psLCLDEncoder, hSplitBinLCLDEnc->pppfLCLDReal, hSplitBinLCLDEnc->pppfLCLDImag, &iBitsWritten, available_bits_itr, pBits ); -#else - EncodeLCLDFrame( hSplitBinLCLDEnc->psLCLDEncoder, hSplitBinLCLDEnc->pppfLCLDReal, hSplitBinLCLDEnc->pppfLCLDImag, &iBitsWritten, available_bits, pBits ); -#endif -#ifdef SPLIT_REND_LCLD_5MS available_bits_local -= iBitsWritten; #ifdef DEBUGGING assert( available_bits_local >= 0 ); #endif -#else -#ifdef DEBUGGING - if ( iBitsWritten > available_bits ) - assert( iBitsWritten <= available_bits ); -#endif -#endif #ifdef CLDFB_DEBUG printf( "Bits written = %d\n", iBitsWritten ); #endif -#ifdef SPLIT_REND_LCLD_5MS } -#endif pop_wmops(); return; diff --git a/lib_rend/ivas_splitRendererPLC.c b/lib_rend/ivas_splitRendererPLC.c index 197be5a394..114233fcf6 100644 --- a/lib_rend/ivas_splitRendererPLC.c +++ b/lib_rend/ivas_splitRendererPLC.c @@ -74,10 +74,8 @@ static void adaptive_polar_ext_plc( float xf_alp[CLDFB_PLC_XF], float xf_bet[CLDFB_PLC_XF] #endif -#ifdef SPLIT_REND_LCLD_5MS , const int16_t iNumCols -#endif ) { float uth[CLDFB_NO_COL_MAX], uthu[CLDFB_NO_COL_MAX], urh[CLDFB_NO_COL_MAX]; @@ -86,10 +84,6 @@ static void adaptive_polar_ext_plc( float start_real, start_imag, abs_fac, abs_fac_powj, comp_fac, fac_powj_real, fac_powj_imag, temp, abs2inv; float fac_ph_real, fac_ph_imag, rat_real, rat_imag, abs_temp; int32_t k, j; -#ifndef SPLIT_REND_LCLD_5MS - int16_t iNumCols; - iNumCols = CLDFB_NO_COL_MAX; -#endif /* reset of accumulators */ ph_adj = 0.0f; @@ -409,7 +403,6 @@ void ivas_splitBinRendPLCClose( * *------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS void ivas_splitBinRendPLCsaveState( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -417,22 +410,11 @@ void ivas_splitBinRendPLCsaveState( const int16_t num_chs, const int16_t iNumBlocks, const int16_t iNumIterations ) -#else -void ivas_splitBinRendPLCsaveState( - SPLIT_REND_PLC_HANDLE hSplitRendPLC, - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const int16_t num_chs ) -#endif { int16_t k, n; /* Save Cldfb frame */ -#ifdef SPLIT_REND_LCLD_5MS for ( k = 0; k < ( iNumBlocks * iNumIterations ); k++ ) -#else - for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) -#endif { for ( n = 0; n < num_chs; n++ ) { @@ -451,7 +433,6 @@ void ivas_splitBinRendPLCsaveState( * Cross-fade of preceding bad frame into good frame *------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS void ivas_splitBinRendPLC_xf( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -459,13 +440,6 @@ void ivas_splitBinRendPLC_xf( const int16_t num_chs, const int16_t iNumBlocks, const int16_t iNumIterations ) -#else -void ivas_splitBinRendPLC_xf( - SPLIT_REND_PLC_HANDLE hSplitRendPLC, - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const int16_t num_chs ) -#endif { int16_t n, i, k; @@ -484,13 +458,8 @@ void ivas_splitBinRendPLC_xf( #if CLDFB_PLC_XF > 0 for ( k = 0; k < CLDFB_PLC_XF; k++ ) { -#ifdef SPLIT_REND_LCLD_5MS Cldfb_RealBuffer_Binaural[n][k][i] = hSplitRendPLC->CldfbPLC_state.xf_bet[n][i][k] * Cldfb_RealBuffer_Binaural[n][k][i] + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k + ( iNumBlocks * iNumIterations )][i]; Cldfb_ImagBuffer_Binaural[n][k][i] = hSplitRendPLC->CldfbPLC_state.xf_bet[n][i][k] * Cldfb_ImagBuffer_Binaural[n][k][i] + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag[n][k + ( iNumBlocks * iNumIterations )][i]; -#else - Cldfb_RealBuffer_Binaural[n][k][i] = hSplitRendPLC->CldfbPLC_state.xf_bet[n][i][k] * Cldfb_RealBuffer_Binaural[n][k][i] + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k + CLDFB_NO_COL_MAX][i]; - Cldfb_ImagBuffer_Binaural[n][k][i] = hSplitRendPLC->CldfbPLC_state.xf_bet[n][i][k] * Cldfb_ImagBuffer_Binaural[n][k][i] + hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag[n][k + CLDFB_NO_COL_MAX][i]; -#endif } #endif } @@ -506,7 +475,6 @@ void ivas_splitBinRendPLC_xf( * Conceal bad frame *------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS void ivas_splitBinRendPLC( SPLIT_REND_PLC_HANDLE hSplitRendPLC, float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -514,13 +482,6 @@ void ivas_splitBinRendPLC( const int16_t num_chs, const int16_t iNumBlocks, const int16_t iNumIterations ) -#else -void ivas_splitBinRendPLC( - SPLIT_REND_PLC_HANDLE hSplitRendPLC, - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const int16_t num_chs ) -#endif { int32_t i, n, k; float fade_fac; @@ -528,11 +489,9 @@ void ivas_splitBinRendPLC( #if CLDFB_PLC_XF > 0 float xf_alp[CLDFB_PLC_XF]; #endif -#ifdef SPLIT_REND_LCLD_5MS int16_t iNumCols, fade_start_cntr, mute_cntr, fade_val; iNumCols = iNumBlocks * iNumIterations; -#endif /* Indicate that next transition will be from a bad frame */ hSplitRendPLC->prev_bfi = 1; @@ -549,11 +508,7 @@ void ivas_splitBinRendPLC( { for ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { -#ifdef SPLIT_REND_LCLD_5MS for ( k = 0; k < iNumCols; k++ ) -#else - for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) -#endif { prev_real[k] = hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k][i]; prev_imag[k] = hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag[n][k][i]; @@ -564,17 +519,11 @@ void ivas_splitBinRendPLC( , xf_alp, hSplitRendPLC->CldfbPLC_state.xf_bet[n][i] #endif -#ifdef SPLIT_REND_LCLD_5MS , iNumCols -#endif ); -#ifdef SPLIT_REND_LCLD_5MS for ( k = 0; k < iNumCols; k++ ) -#else - for ( k = 0; k < CLDFB_NO_COL_MAX; k++ ) -#endif { Cldfb_RealBuffer_Binaural[n][k][i] = rec_real[k]; hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k][i] = rec_real[k]; @@ -583,11 +532,7 @@ void ivas_splitBinRendPLC( } #if CLDFB_PLC_XF > 0 -#ifdef SPLIT_REND_LCLD_5MS for ( k = iNumCols; k < iNumCols + CLDFB_PLC_XF; k++ ) -#else - for ( k = CLDFB_NO_COL_MAX; k < CLDFB_NO_COL_MAX + CLDFB_PLC_XF; k++ ) -#endif { hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinReal[n][k][i] = rec_real[k]; hSplitRendPLC->CldfbPLC_state.Cldfb_Prev_BinImag[n][k][i] = rec_imag[k]; @@ -598,7 +543,6 @@ void ivas_splitBinRendPLC( /* Check bf counter */ -#ifdef SPLIT_REND_LCLD_5MS fade_start_cntr = SR_PLC_FADE_START * CLDFB_NO_COL_MAX / iNumCols; mute_cntr = SR_PLC_MUTE * CLDFB_NO_COL_MAX / iNumCols; @@ -631,23 +575,6 @@ void ivas_splitBinRendPLC( hSplitRendPLC->bf_count = mute_cntr; } } -#else - if ( hSplitRendPLC->bf_count++ >= SR_PLC_FADE_START ) - { - if ( hSplitRendPLC->bf_count < SR_PLC_MUTE ) - { - fade_fac = powf( 10, ( hSplitRendPLC->bf_count - SR_PLC_FADE_START ) * SR_PLC_FADE_DEGREE / 20.0f ); - v_multc( &Cldfb_RealBuffer_Binaural[0][0][0], fade_fac, &Cldfb_RealBuffer_Binaural[0][0][0], (int16_t) ( (CLDFB_NO_COL_MAX) *num_chs * CLDFB_NO_CHANNELS_MAX ) ); - v_multc( &Cldfb_ImagBuffer_Binaural[0][0][0], fade_fac, &Cldfb_ImagBuffer_Binaural[0][0][0], (int16_t) ( (CLDFB_NO_COL_MAX) *num_chs * CLDFB_NO_CHANNELS_MAX ) ); - } - else - { - set_zero( &Cldfb_RealBuffer_Binaural[0][0][0], (int16_t) ( (CLDFB_NO_COL_MAX) *num_chs * CLDFB_NO_CHANNELS_MAX ) ); - set_zero( &Cldfb_ImagBuffer_Binaural[0][0][0], (int16_t) ( (CLDFB_NO_COL_MAX) *num_chs * CLDFB_NO_CHANNELS_MAX ) ); - hSplitRendPLC->bf_count = SR_PLC_MUTE; - } - } -#endif return; } diff --git a/lib_rend/ivas_splitRendererPost.c b/lib_rend/ivas_splitRendererPost.c index 3a4172020e..002229d8b8 100644 --- a/lib_rend/ivas_splitRendererPost.c +++ b/lib_rend/ivas_splitRendererPost.c @@ -1289,15 +1289,6 @@ static void interpolate_rend_md( gd2 = rot_md[idx2 - 1][sf_idx][band_idx].gd; gd4 = rot_md[idx2 - 1][sf_idx][band_idx].gd2; } -#if 0 - diff = gd1 / gd2; - pitch_gain_l = gd2 * powf( diff, 1.0f - interp_pitch_fact ); - pitch_gain_l = max( 0.0f, pitch_gain_l ); - - diff = gd3 / gd4; - pitch_gain_r = gd4 * powf( diff, 1.0f - interp_pitch_fact ); - pitch_gain_r = max( 0.0f, pitch_gain_r ); -#else diff = gd1 - gd2; pitch_gain_l = gd1 - ( diff * interp_pitch_fact ); pitch_gain_l = max( 0.0f, pitch_gain_l ); @@ -1305,7 +1296,6 @@ static void interpolate_rend_md( diff = gd3 - gd4; pitch_gain_r = gd3 - ( diff * interp_pitch_fact ); pitch_gain_r = max( 0.0f, pitch_gain_r ); -#endif for ( ch_idx1 = 0; ch_idx1 < BINAURAL_CHANNELS; ch_idx1++ ) { diff --git a/lib_rend/ivas_splitRendererPre.c b/lib_rend/ivas_splitRendererPre.c index b9dd7e9a7a..25bc04dfb5 100644 --- a/lib_rend/ivas_splitRendererPre.c +++ b/lib_rend/ivas_splitRendererPre.c @@ -640,69 +640,9 @@ static void ComputeCoeffs( } } -#if 0 - if ( 1 ) - { -#endif gd2 = 0.0f; sigma_d = 0.0f; hMd->gd = 0.0f; -#if 0 - } - else - { - - sigma_d = cov_ii_norm_re[0][0] + cov_ii_norm_re[1][1] + cov_ii_norm_re[0][1] + cov_ii_norm_re[1][0] + EPSILON; - - rho_hat = max( EPSILON, sqrtf( postpred_cov_re[0][0] * postpred_cov_re[1][1] ) ); - rho_hat = postpred_cov_re[0][1] / rho_hat; - rho = max( EPSILON, sqrtf( cov_oo_norm_re[0][0] * cov_oo_norm_re[1][1] ) ); - rho = cov_oo_norm_re[0][1] / rho; - rho_hat = min( max( rho_hat, -0.9999f ), 0.9999f ); - rho = min( max( rho, -0.9999f ), 0.9999f ); - - // Compute decorrelator gain : gd2 = 0; - gd = 0; - gd2 = 0; - - aa = ( sigma_d * sigma_d ) * ( ( rho_hat * rho_hat ) - 1 ) + EPSILON; - bb = -( rho_hat * rho_hat ) * sigma_d * ( cov_oo_norm_re[0][0] + cov_oo_norm_re[1][1] ); - cc = ( rho_hat * rho_hat ) * cov_oo_norm_re[0][0] * cov_oo_norm_re[1][1]; - cc -= cov_oo_norm_re[0][1] * cov_oo_norm_re[0][1]; - - sign = +1.0f; - if ( rho < ( rho_hat - 0.0001 ) ) - { - bb -= 2 * sigma_d * cov_oo_norm_re[0][1]; - sign = -1.0f; - } - else if ( rho > ( rho_hat + 0.0001 ) ) - { - bb += 2 * sigma_d * cov_oo_norm_re[0][1]; - } - dd = bb * bb - ( 4 * aa * cc ); - if ( dd >= 0 ) - { - float gd2_1, gd2_2; - gd2_1 = ( -bb + sqrtf( dd ) ) / ( 2 * aa ); - gd2_2 = ( -bb - sqrtf( dd ) ) / ( 2 * aa ); - if ( ( gd2_1 >= 0 ) && ( gd2_2 >= 0 ) ) - { - gd2 = min( gd2_1, gd2_2 ); - } - else - { - gd2 = max( 0, max( gd2_1, gd2_2 ) ); - } - gd = sign * sqrtf( gd2 ); - } - - gd = min( IVAS_SPLIT_REND_D_MAX_VAL, max( gd, IVAS_SPLIT_REND_D_MIN_VAL ) ); - hMd->gd = SPLIT_REND_DECOR_ALPHA * gd + ( 1 - SPLIT_REND_DECOR_ALPHA ) * hMd->gd; - gd2 = min( gd2, cov_oo_norm_re[0][0] / sigma_d ); - gd2 = min( gd2, cov_oo_norm_re[1][1] / sigma_d ); - } -#endif /* 0 */ if ( postpred_cov_re[0][0] > EPSILON ) { @@ -1457,17 +1397,6 @@ void ivas_rend_CldfbSplitPreRendProcess( QuaternionsPost[sf_idx].z = 0.0f; } -#if 0 - read_off = pBits->bits_read; - write_off = pBits->bits_written; - ivas_splitBinPostRendMdDec( - pBits, - hBinHrSplitPreRend->hBinHrSplitPostRend, - pMultiBinPoseData ); - pMultiBinPoseData->poseCorrectionMode = IVAS_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; - pBits->bits_read = read_off; - pBits->bits_written = write_off; -#else hBinHrSplitPreRend->hBinHrSplitPostRend->low_Res = 1; set_fix_rotation_mat( hBinHrSplitPreRend->hBinHrSplitPostRend->fix_pos_rot_mat, pMultiBinPoseData ); set_pose_types( hBinHrSplitPreRend->hBinHrSplitPostRend->pose_type, pMultiBinPoseData ); @@ -1486,7 +1415,6 @@ void ivas_rend_CldfbSplitPreRendProcess( for ( b = 0; b < MAX_SPLIT_REND_MD_BANDS; b++ ) { hBinHrSplitPreRend->hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b] = hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; -#if 1 BIN_HR_SPLIT_REND_MD_HANDLE hMd; hMd = &hBinHrSplitPreRend->hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; minv = -1.4f; @@ -1523,12 +1451,10 @@ void ivas_rend_CldfbSplitPreRendProcess( hMd->pred_mat_im[ch1][ch2] = quant_val * step; } } -#endif } } } -#endif for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { mvr2r( (float *) Cldfb_In_BinReal[0][sf_idx * MAX_PARAM_SPATIAL_SUBFRAMES], (float *) Cldfb_RealBuffer_Binaural_5ms[0], MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX ); @@ -1795,39 +1721,18 @@ void ivas_init_split_rend_handles( * *------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS static ivas_error split_renderer_open_lc3plus( SPLIT_REND_WRAPPER *hSplitRendWrapper, const IVAS_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, const int32_t OutSampleRate, const int16_t num_subframes ) -#else -static ivas_error split_renderer_open_lc3plus( - SPLIT_REND_WRAPPER *hSplitRendWrapper, - const IVAS_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, - const int32_t OutSampleRate, - const int16_t is_5ms_frame ) -#endif { ivas_error error; int16_t i, delayBufferLength; LC3PLUS_CONFIG config; -#ifdef SPLIT_REND_LCLD_5MS config.lc3plus_frame_duration_us = pSplitRendConfig->codec_frame_size_ms * 1000; config.ivas_frame_duration_us = ( pSplitRendConfig->dof == 0 ) ? config.lc3plus_frame_duration_us * num_subframes : 20000; -#else - if ( is_5ms_frame ) - { - config.lc3plus_frame_duration_us = pSplitRendConfig->codec_frame_size_ms * 1000; - config.ivas_frame_duration_us = ( pSplitRendConfig->dof == 0 ) ? config.lc3plus_frame_duration_us : 20000; - } - else - { - config.lc3plus_frame_duration_us = 5000; - config.ivas_frame_duration_us = 20000; - } -#endif config.samplerate = OutSampleRate; config.channels = BINAURAL_CHANNELS; @@ -1885,7 +1790,6 @@ static ivas_error split_renderer_open_lc3plus( * *------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS ivas_error ivas_split_renderer_open( SPLIT_REND_WRAPPER *hSplitRendWrapper, const IVAS_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, @@ -1893,15 +1797,6 @@ ivas_error ivas_split_renderer_open( const int16_t cldfb_in_flag, const int16_t pcm_out_flag, const int16_t num_subframes ) -#else -ivas_error ivas_split_renderer_open( - SPLIT_REND_WRAPPER *hSplitRendWrapper, - const IVAS_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, - const int32_t OutSampleRate, - const int16_t cldfb_in_flag, - const int16_t pcm_out_flag, - const int16_t is_5ms_frame ) -#endif { ivas_error error, ch, num_ch; #ifndef SPLIT_REND_WITH_HEAD_ROT @@ -2008,21 +1903,13 @@ ivas_error ivas_split_renderer_open( { if ( pSplitRendConfig->codec == IVAS_SPLIT_REND_CODEC_LC3PLUS ) { -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = split_renderer_open_lc3plus( hSplitRendWrapper, pSplitRendConfig, OutSampleRate, num_subframes ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = split_renderer_open_lc3plus( hSplitRendWrapper, pSplitRendConfig, OutSampleRate, is_5ms_frame ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } else { -#ifdef SPLIT_REND_LCLD_5MS int16_t iNumBlocksPerFrame; iNumBlocksPerFrame = ( CLDFB_NO_COL_MAX * pSplitRendConfig->codec_frame_size_ms ) / 20; @@ -2030,12 +1917,6 @@ ivas_error ivas_split_renderer_open( { return error; } -#else - if ( ( error = ivas_splitBinLCLDEncOpen( &hSplitRendWrapper->hSplitBinLCLDEnc, OutSampleRate, BINAURAL_CHANNELS, ivas_get_lcld_bitrate( pSplitRendConfig->splitRendBitRate, hSplitRendWrapper->multiBinPoseData.poseCorrectionMode ) ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } } @@ -2195,9 +2076,7 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( uint8_t useLc3plus; float *in_delayed[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; int16_t i; -#ifdef SPLIT_REND_LCLD_5MS int32_t num_slots; -#endif push_wmops( "ivas_renderMultiTDBinToSplitBinaural" ); @@ -2230,14 +2109,7 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( actual_md_bits = pBits->bits_written; if ( ( hSplitBin->multiBinPoseData.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) || ( !useLc3plus && !pcm_out_flag ) ) { -#ifndef SPLIT_REND_LCLD_5MS - if ( !useLc3plus && codec_frame_size_ms != 20 && !pcm_out_flag ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_BUFFER_SIZE, "Unsupported framing for LCLD codec!" ); - } -#else num_slots = ( hSplitBin->multiBinPoseData.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ? CLDFB_NO_COL_MAX : ( hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ); -#endif num_cldfb_bands = hSplitBin->hCldfbHandles->cldfbAna[0]->no_channels; /* CLDFB Analysis*/ @@ -2261,11 +2133,7 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( #endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { -#ifdef SPLIT_REND_LCLD_5MS for ( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) -#else - for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) -#endif { cldfbAnalysis_ts( &( in_delayed[pos_idx * BINAURAL_CHANNELS + ch][num_cldfb_bands * slot_idx] ), Cldfb_In_BinReal[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], Cldfb_In_BinImag[pos_idx * BINAURAL_CHANNELS + ch][slot_idx], @@ -2291,17 +2159,10 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( if ( !useLc3plus ) { -#ifdef SPLIT_REND_LCLD_5MS available_bits = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); actual_md_bits = pBits->bits_written - actual_md_bits; available_bits -= actual_md_bits; pBits->codec_frame_size_ms = codec_frame_size_ms; -#else - available_bits = SplitRendBitRate * L_FRAME48k / 48000; - actual_md_bits = pBits->bits_written - actual_md_bits; - available_bits -= actual_md_bits; - pBits->codec_frame_size_ms = 20; -#endif ivas_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, Cldfb_In_BinReal, Cldfb_In_BinImag, available_bits, pBits ); } @@ -2328,11 +2189,7 @@ static ivas_error ivas_renderMultiTDBinToSplitBinaural( { if ( !useLc3plus ) { -#ifdef SPLIT_REND_LCLD_5MS bit_len = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); -#else - bit_len = SplitRendBitRate / FRAMES_PER_SEC; -#endif } else { @@ -2451,17 +2308,10 @@ ivas_error ivas_renderMultiBinToSplitBinaural( /* Needs to be done at runtime. If this was in another API function, * there would be no guarantee that the user did not change * the split rendering config before calling the main rendering function */ -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = ivas_split_rend_choose_default_codec( &splitCodec, &codec_frame_size_ms, cldfb_in_flag, pcm_out_flag, 0 ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = ivas_split_rend_choose_default_codec( &splitCodec, &codec_frame_size_ms, cldfb_in_flag, pcm_out_flag ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif if ( cldfb_in_flag == 0 ) @@ -2497,38 +2347,24 @@ ivas_error ivas_renderMultiBinToSplitBinaural( if ( splitCodec == IVAS_SPLIT_REND_CODEC_LCLD ) { -#ifdef SPLIT_REND_LCLD_5MS available_bits = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); actual_md_bits = pBits->bits_written - actual_md_bits; available_bits -= actual_md_bits; pBits->codec_frame_size_ms = codec_frame_size_ms; -#else - available_bits = SplitRendBitRate * L_FRAME48k / 48000; - actual_md_bits = pBits->bits_written - actual_md_bits; - available_bits -= actual_md_bits; -#endif ivas_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, Cldfb_In_BinReal, Cldfb_In_BinImag, available_bits, pBits ); } else { -#ifdef SPLIT_REND_LCLD_5MS int16_t ch, slot_idx, num_slots, ivas_fs; ivas_fs = (int16_t) hSplitBin->hLc3plusEnc->config.ivas_frame_duration_us / 1000; num_slots = (int16_t) ( CLDFB_NO_COL_MAX * ivas_fs ) / 20; -#else - int16_t ch, slot_idx; -#endif /* CLDFB synthesis of main pose */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { float *Cldfb_In_BinReal_p[CLDFB_NO_COL_MAX]; float *Cldfb_In_BinImag_p[CLDFB_NO_COL_MAX]; -#ifdef SPLIT_REND_LCLD_5MS for ( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) -#else - for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) -#endif { Cldfb_In_BinReal_p[slot_idx] = Cldfb_In_BinReal[ch][slot_idx]; Cldfb_In_BinImag_p[slot_idx] = Cldfb_In_BinImag[ch][slot_idx]; @@ -2536,11 +2372,7 @@ ivas_error ivas_renderMultiBinToSplitBinaural( #ifndef SPLIT_REND_WITH_HEAD_ROT cldfbSynthesis( Cldfb_In_BinReal_p, Cldfb_In_BinImag_p, output[ch], hSplitBin->hCldfbHandles->cldfbAna[0]->no_channels * CLDFB_NO_COL_MAX, hSplitBin->hCldfbHandles->cldfbAna[ch] ); #else -#ifdef SPLIT_REND_LCLD_5MS cldfbSynthesis( Cldfb_In_BinReal_p, Cldfb_In_BinImag_p, output[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); -#else - cldfbSynthesis( Cldfb_In_BinReal_p, Cldfb_In_BinImag_p, output[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); -#endif #endif } @@ -2585,11 +2417,7 @@ ivas_error ivas_renderMultiBinToSplitBinaural( { if ( splitCodec == IVAS_SPLIT_REND_CODEC_LCLD ) { -#ifdef SPLIT_REND_LCLD_5MS bit_len = ( SplitRendBitRate * hSplitBin->hSplitBinLCLDEnc->iNumBlocks * hSplitBin->hSplitBinLCLDEnc->iNumIterations ) / ( 16 * FRAMES_PER_SEC ); -#else - bit_len = SplitRendBitRate / FRAMES_PER_SEC; -#endif } else { diff --git a/lib_rend/ivas_splitRenderer_utils.c b/lib_rend/ivas_splitRenderer_utils.c index c330a63f88..da9ba62801 100644 --- a/lib_rend/ivas_splitRenderer_utils.c +++ b/lib_rend/ivas_splitRenderer_utils.c @@ -724,11 +724,7 @@ ivas_error ivas_split_rend_validate_config( if ( pSplitRendConfig->codec_frame_size_ms != 0 ) /* 0 means "default for current codec", will be set to actual value at a later stage */ { -#ifdef SPLIT_REND_LCLD_5MS if ( pSplitRendConfig->codec == IVAS_SPLIT_REND_CODEC_LCLD && pSplitRendConfig->codec_frame_size_ms != 5 && pSplitRendConfig->codec_frame_size_ms != 10 && pSplitRendConfig->codec_frame_size_ms != 20 ) -#else - if ( pSplitRendConfig->codec == IVAS_SPLIT_REND_CODEC_LCLD && pSplitRendConfig->codec_frame_size_ms != 20 ) -#endif { return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Invalid framing for LCLD codec" ); } @@ -1053,7 +1049,6 @@ void ivas_init_multi_bin_pose_data( * *------------------------------------------------------------------------*/ -#ifdef SPLIT_REND_LCLD_5MS ivas_error ivas_split_rend_choose_default_codec( IVAS_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ int16_t *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ @@ -1061,14 +1056,6 @@ ivas_error ivas_split_rend_choose_default_codec( const int16_t pcm_out_flag, /* i : flag to indicate PCM output */ const int16_t num_subframes /* i : number of subframes */ ) -#else -ivas_error ivas_split_rend_choose_default_codec( - IVAS_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ - int16_t *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ - const int16_t cldfb_in_flag, /* i : flag indicating rendering in TD */ - const int16_t pcm_out_flag /* i : flag to indicate PCM output */ -) -#endif { if ( pcm_out_flag == 0 ) { @@ -1087,11 +1074,7 @@ ivas_error ivas_split_rend_choose_default_codec( switch ( *pCodec ) { case IVAS_SPLIT_REND_CODEC_LCLD: -#ifdef SPLIT_REND_LCLD_5MS *pCodec_frame_size_ms = num_subframes * 5; -#else - *pCodec_frame_size_ms = 20; -#endif break; case IVAS_SPLIT_REND_CODEC_LC3PLUS: case IVAS_SPLIT_REND_CODEC_NONE: @@ -1106,7 +1089,6 @@ ivas_error ivas_split_rend_choose_default_codec( } #endif -#ifdef SPLIT_REND_LCLD_5MS /*-------------------------------------------------------------------* * Function get_bit() * @@ -1119,4 +1101,3 @@ int32_t get_bit( { return ( state & ( 1 << bit_id ) ); } -#endif diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index d5701c81f6..516d6a7ee2 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1455,10 +1455,8 @@ typedef struct ivas_binaural_head_rot_split_rendering_lcld_enc_struct FILE *cldfbIn; int16_t numFrame; #endif -#ifdef SPLIT_REND_LCLD_5MS int16_t iNumIterations; int16_t iNumBlocks; -#endif } BIN_HR_SPLIT_LCLD_ENC, *BIN_HR_SPLIT_LCLD_ENC_HANDLE; @@ -1492,10 +1490,8 @@ typedef struct ivas_binaural_head_rot_split_rendering_lcld_dec_struct int16_t numFrame; #endif SPLIT_REND_PLC_HANDLE hSplitRendPLC; -#ifdef SPLIT_REND_LCLD_5MS int16_t iNumBlocks; int16_t iNumIterations; -#endif } BIN_HR_SPLIT_LCLD_DEC, *BIN_HR_SPLIT_LCLD_DEC_HANDLE; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index fec022e19f..cef7480443 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3041,7 +3041,6 @@ static void clearInputMasa( } #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef SPLIT_REND_LCLD_5MS static ivas_error initSplitRend( SPLIT_REND_WRAPPER *pSplitRendWrapper, IVAS_REND_AudioBuffer *pSplitRendEncBuffer, @@ -3051,17 +3050,6 @@ static ivas_error initSplitRend( const AUDIO_CONFIG outConfig, const int16_t cldfb_in_flag, const int16_t num_subframes ) -#else -static ivas_error initSplitRend( - SPLIT_REND_WRAPPER *pSplitRendWrapper, - IVAS_REND_AudioBuffer *pSplitRendEncBuffer, - const IVAS_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, - IVAS_REND_HeadRotData headRotData, - const int32_t outputSampleRate, - const AUDIO_CONFIG outConfig, - const int16_t cldfb_in_flag, - const int16_t is_5ms_frame ) -#endif { ivas_error error; IVAS_REND_AudioBufferConfig bufConfig; @@ -3077,17 +3065,10 @@ static ivas_error initSplitRend( ivas_renderSplitUpdateNoCorrectionPoseData( pSplit_rend_config, &pSplitRendWrapper->multiBinPoseData ); } -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = ivas_split_renderer_open( pSplitRendWrapper, pSplit_rend_config, outputSampleRate, cldfb_in_flag, outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM, num_subframes ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = ivas_split_renderer_open( pSplitRendWrapper, pSplit_rend_config, outputSampleRate, cldfb_in_flag, outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM, is_5ms_frame ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif /*allocate for CLDFB in and change to TD during process if needed*/ bufConfig.numSamplesPerChannel = MAX_CLDFB_BUFFER_LENGTH_PER_CHANNEL; @@ -3811,7 +3792,6 @@ ivas_error IVAS_REND_AddInput( int16_t cldfb_in_flag; cldfb_in_flag = getCldfbRendFlag( hIvasRend, getAudioConfigType( inConfig ) ); -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = ivas_split_rend_choose_default_codec( &hIvasRend->hRendererConfig->split_rend_config.codec, &hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM, hIvasRend->num_subframes ) ) != IVAS_ERR_OK ) { return error; @@ -3821,17 +3801,6 @@ ivas_error IVAS_REND_AddInput( { return error; } -#else - if ( ( error = ivas_split_rend_choose_default_codec( &hIvasRend->hRendererConfig->split_rend_config.codec, &hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( ( error = initSplitRend( &hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer, &hIvasRend->hRendererConfig->split_rend_config, hIvasRend->headRotData, hIvasRend->sampleRateOut, hIvasRend->outputConfig, cldfb_in_flag, ( hIvasRend->num_subframes == 1 ) ? 1 : 0 ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } #endif @@ -4308,12 +4277,10 @@ ivas_error IVAS_REND_GetDelay( { latency_ns += IVAS_FB_DEC_DELAY_NS; } -#ifdef SPLIT_REND_LCLD_5MS else if ( hIvasRend->inputsSplitPost[i].splitPostRendWrapper.hSplitBinLCLDDec != NULL ) { latency_ns += IVAS_FB_DEC_DELAY_NS; } -#endif max_latency_ns = max( max_latency_ns, latency_ns ); } } @@ -4705,7 +4672,6 @@ int16_t IVAS_REND_FeedRenderConfig( cldfb_in_flag = getCldfbRendFlag( hIvasRend, IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ); closeSplitRend( &hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer ); -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = ivas_split_rend_choose_default_codec( &hIvasRend->hRendererConfig->split_rend_config.codec, &hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM, hIvasRend->num_subframes ) ) != IVAS_ERR_OK ) { return error; @@ -4715,17 +4681,6 @@ int16_t IVAS_REND_FeedRenderConfig( { return error; } -#else - if ( ( error = ivas_split_rend_choose_default_codec( &hIvasRend->hRendererConfig->split_rend_config.codec, &hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, cldfb_in_flag, hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( ( error = initSplitRend( &hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer, &hIvasRend->hRendererConfig->split_rend_config, hIvasRend->headRotData, hIvasRend->sampleRateOut, hIvasRend->outputConfig, cldfb_in_flag, ( hIvasRend->num_subframes == 1 ) ? 1 : 0 ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } #endif @@ -6903,10 +6858,8 @@ static ivas_error renderSplitBinauralWithPostRot( int16_t outBufNumSamplesPerChannel, outBufNumColPerChannel; int16_t numSamplesPerChannelCacheSize, numColPerChannelCacheSize; float *readPtr, *writePtr; -#ifdef SPLIT_REND_LCLD_5MS LC3PLUS_CONFIG config; int16_t iNumBlocksPerFrame, iNumLCLDIterationsPerFrame; -#endif isPostRendInputCldfb = 0; push_wmops( "renderSplitBinauralWithPostRot" ); @@ -6916,7 +6869,6 @@ static ivas_error renderSplitBinauralWithPostRot( hSplitBin = &splitBinInput->splitPostRendWrapper; convertBitsBufferToInternalBitsBuff( *splitBinInput->hBits, &bits ); -#ifdef SPLIT_REND_LCLD_5MS config.lc3plus_frame_duration_us = bits.codec_frame_size_ms * 1000; if ( pCombinedOrientationData->num_subframes != MAX_PARAM_SPATIAL_SUBFRAMES ) { @@ -6949,41 +6901,16 @@ static ivas_error renderSplitBinauralWithPostRot( config.channels = BINAURAL_CHANNELS; config.samplerate = *splitBinInput->base.ctx.pOutSampleRate; -#endif if ( bits.codec == IVAS_SPLIT_REND_CODEC_LCLD && splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec == NULL ) { -#ifdef SPLIT_REND_LCLD_5MS if ( ( error = ivas_splitBinLCLDDecOpen( &splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec, *splitBinInput->base.ctx.pOutSampleRate, BINAURAL_CHANNELS, iNumBlocksPerFrame, iNumLCLDIterationsPerFrame ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = ivas_splitBinLCLDDecOpen( &splitBinInput->splitPostRendWrapper.hSplitBinLCLDDec, *splitBinInput->base.ctx.pOutSampleRate, BINAURAL_CHANNELS ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } else if ( bits.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS && splitBinInput->splitPostRendWrapper.hLc3plusDec == NULL ) { -#ifndef SPLIT_REND_LCLD_5MS - LC3PLUS_CONFIG config; - - if ( outAudio.config.numSamplesPerChannel == 240 ) - { - config.lc3plus_frame_duration_us = bits.codec_frame_size_ms * 1000; - config.ivas_frame_duration_us = ( bits.pose_correction == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ? config.lc3plus_frame_duration_us : 20000; - } - else - { - config.lc3plus_frame_duration_us = 5000; - config.ivas_frame_duration_us = 20000; - } - config.channels = BINAURAL_CHANNELS; - config.samplerate = *splitBinInput->base.ctx.pOutSampleRate; - -#endif if ( ( error = IVAS_LC3PLUS_DEC_Open( config, &splitBinInput->splitPostRendWrapper.hLc3plusDec ) ) != IVAS_ERR_OK ) { @@ -7027,20 +6954,12 @@ static ivas_error renderSplitBinauralWithPostRot( { isPostRendInputCldfb = 1; } -#ifdef SPLIT_REND_LCLD_5MS preRendFrameSize_ms = (int16_t) ( config.ivas_frame_duration_us ) / 1000; -#else - preRendFrameSize_ms = bits.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS ? (int16_t) ( hSplitBin->hLc3plusDec->config.ivas_frame_duration_us ) / 1000 : 20; -#endif numSamplesPerChannelCacheSize = (int16_t) ( *splitBinInput->base.ctx.pOutSampleRate * ( preRendFrameSize_ms - bits.codec_frame_size_ms ) / 1000 ); outBufNumColPerChannel = MAX_PARAM_SPATIAL_SUBFRAMES; -#ifdef SPLIT_REND_LCLD_5MS numColPerChannelCacheSize = ( iNumBlocksPerFrame * iNumLCLDIterationsPerFrame ) - outBufNumColPerChannel; -#else - numColPerChannelCacheSize = CLDFB_NO_COL_MAX - outBufNumColPerChannel; -#endif for ( sf_idx = 0; sf_idx < pCombinedOrientationData->num_subframes; sf_idx++ ) { @@ -7063,11 +6982,7 @@ static ivas_error renderSplitBinauralWithPostRot( /* cache the remaining 15ms */ splitBinInput->numCachedSamples = numColPerChannelCacheSize; writePtr = splitBinInput->bufferData; -#ifdef SPLIT_REND_LCLD_5MS for ( slotIdx = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slotIdx < ( iNumBlocksPerFrame * iNumLCLDIterationsPerFrame ); ++slotIdx ) -#else - for ( slotIdx = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; slotIdx < CLDFB_NO_COL_MAX; ++slotIdx ) -#endif { for ( chnlIdx = 0; chnlIdx < BINAURAL_CHANNELS; ++chnlIdx ) { @@ -7135,7 +7050,6 @@ static ivas_error renderSplitBinauralWithPostRot( else { copyBufferTo2dArray( splitBinInput->base.inputBuffer, tmpCrendBuffer ); -#ifdef SPLIT_REND_LCLD_5MS if ( splitBinInput->numCachedSamples == 0 ) { preRendFrameSize_ms = (int16_t) ( config.ivas_frame_duration_us ) / 1000; @@ -7147,7 +7061,6 @@ static ivas_error renderSplitBinauralWithPostRot( { splitBinInput->numCachedSamples -= outAudio.config.numSamplesPerChannel; } -#endif } /* apply pose correction if enabled */ @@ -8512,18 +8425,10 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream( cldfb_in_flag = getCldfbRendFlag( hIvasRend, IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ); hIvasRend->splitRendEncBuffer.config.is_cldfb = cldfb_in_flag; -#ifdef SPLIT_REND_LCLD_5MS if ( hIvasRend->hRendererConfig->split_rend_config.dof == 0 || hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) { hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = outAudio.config.numSamplesPerChannel; } -#else - if ( hIvasRend->hRendererConfig->split_rend_config.codec == IVAS_SPLIT_REND_CODEC_LC3PLUS && - ( hIvasRend->hRendererConfig->split_rend_config.dof == 0 || hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode == IVAS_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) - { - hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms * hIvasRend->num_subframes * (int16_t) ( hIvasRend->sampleRateOut / 1000 ); - } -#endif else { hIvasRend->splitRendEncBuffer.config.numSamplesPerChannel = (int16_t) ( hIvasRend->sampleRateOut / FRAMES_PER_SEC ); -- GitLab From a30bba1b80f8ce4c8494756e65306398e5ecc9f7 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 27 Feb 2024 17:06:48 +1100 Subject: [PATCH 427/601] clang fixes --- lib_dec/lib_dec.c | 2 +- lib_rend/ivas_RMSEnvGrouping.c | 4 ++-- lib_rend/ivas_splitRendererPLC.c | 10 ++++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index fad1c0b53e..d06e882f4d 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1118,7 +1118,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return error; } -/* change buffer layout */ + /* change buffer layout */ for ( i = 0; i < numSamplesPerChannelToDecode; ++i ) { for ( j = 0; j < BINAURAL_CHANNELS * numPoses; ++j ) diff --git a/lib_rend/ivas_RMSEnvGrouping.c b/lib_rend/ivas_RMSEnvGrouping.c index f19f86d1ee..b67b8c1f75 100644 --- a/lib_rend/ivas_RMSEnvGrouping.c +++ b/lib_rend/ivas_RMSEnvGrouping.c @@ -698,8 +698,8 @@ void ComputeEnvelopeGrouping( psRMSEnvelopeGrouping->psGMNodes[n].psNext = NULL; } -/* Perform grouping via Greedy Merge */ -/* Allows control over max groups can call using 16 if want same as previous call */ + /* Perform grouping via Greedy Merge */ + /* Allows control over max groups can call using 16 if want same as previous call */ ComputeGreedyGroups3( psRMSEnvelopeGrouping, iChannels, iNumBands, piBandwidths, psRMSEnvelopeGrouping->iNumBlocks ); /* Calc Groups from Merge Results */ diff --git a/lib_rend/ivas_splitRendererPLC.c b/lib_rend/ivas_splitRendererPLC.c index 114233fcf6..299430f28e 100644 --- a/lib_rend/ivas_splitRendererPLC.c +++ b/lib_rend/ivas_splitRendererPLC.c @@ -75,8 +75,7 @@ static void adaptive_polar_ext_plc( float xf_bet[CLDFB_PLC_XF] #endif , - const int16_t iNumCols -) + const int16_t iNumCols ) { float uth[CLDFB_NO_COL_MAX], uthu[CLDFB_NO_COL_MAX], urh[CLDFB_NO_COL_MAX]; float ph_adj, ph_diff, ph_adj_t, quot, drho, srho, diff, dth, sth, fac_real, fac_imag; @@ -413,7 +412,7 @@ void ivas_splitBinRendPLCsaveState( { int16_t k, n; -/* Save Cldfb frame */ + /* Save Cldfb frame */ for ( k = 0; k < ( iNumBlocks * iNumIterations ); k++ ) { for ( n = 0; n < num_chs; n++ ) @@ -520,8 +519,7 @@ void ivas_splitBinRendPLC( xf_alp, hSplitRendPLC->CldfbPLC_state.xf_bet[n][i] #endif , - iNumCols - ); + iNumCols ); for ( k = 0; k < iNumCols; k++ ) { @@ -542,7 +540,7 @@ void ivas_splitBinRendPLC( } -/* Check bf counter */ + /* Check bf counter */ fade_start_cntr = SR_PLC_FADE_START * CLDFB_NO_COL_MAX / iNumCols; mute_cntr = SR_PLC_MUTE * CLDFB_NO_COL_MAX / iNumCols; -- GitLab From 006bb8f647a131962b8ab849ddd447e22a8a077c Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 27 Feb 2024 11:45:08 +0100 Subject: [PATCH 428/601] remove explicit 5ms test cases from self_test.prm --- scripts/config/self_test.prm | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 4d7d53e22e..339f7e50a5 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -685,10 +685,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit ../IVAS_dec 5_1_2 48 bit testv/stv3OA48c.wav_SBA_48000_48-48_5_1_2.tst -// SBA at 48 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_48000_48-48_binaural_ht_fr5.tst - // SBA at 64 kbps, 32kHz in, 32kHz out, FOA out, DTX, random FER at 5% ../IVAS_cod -dtx -sba 1 64000 32 testv/stvFOA32c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error @@ -806,10 +802,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_Binaural_Headrot_EXOF.tst -// SBA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural_ht_fr5.tst - // SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 48 testv/stvFOA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_sw_48-48_BINAURAL.tst @@ -1236,18 +1228,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC714.tst -// Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, fr 5ms -../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit -../IVAS_dec -fr 5 BINAURAL_ROOM_IR 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC_binaural_room_fr5.tst - -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, with headtracking, BINAURAL out, fr 5ms -../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_ht_fr5.tst - -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural_ht_fr5.tst - // Multi-channel 5_1_2 at 32 kbps, 48kHz in, 48kHz out, STEREO out, random FER at 5% ../IVAS_cod -mc 5_1_2 32000 48 testv/stv512MC48c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error -- GitLab From d8c6014430cb9d84c7863c4ba341c5f3f825feb2 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 27 Feb 2024 12:01:04 +0100 Subject: [PATCH 429/601] fix CI --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2682a7fdf1..e86dc9458c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -553,7 +553,7 @@ pytest-compare-20ms-and-5ms-rendering: - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 || exit_code1=$? - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 || exit_code2=$? - zero_errors=$(cat report-junit-5ms.xml report-junit-10ms.xml | grep -c 'errors="0"') || true - - exit_code = 0 + - exit_code=0 - if [ $exit_code -eq 1] || [ $exit_code2 -eq 1]; then exit_code=1; fi - *merge-request-comparison-check artifacts: -- GitLab From e228d75c4137c258ba5ade7e3f4e8a14fb108357 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 27 Feb 2024 13:04:14 +0100 Subject: [PATCH 430/601] fix CI --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e86dc9458c..ebbf74dbe2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -553,8 +553,10 @@ pytest-compare-20ms-and-5ms-rendering: - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 || exit_code1=$? - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 || exit_code2=$? - zero_errors=$(cat report-junit-5ms.xml report-junit-10ms.xml | grep -c 'errors="0"') || true + # map to usual values + - if [ $zero_errors -eq 2 ]; then zero_errors=1; else zero_errors=0; fi - exit_code=0 - - if [ $exit_code -eq 1] || [ $exit_code2 -eq 1]; then exit_code=1; fi + - if [ $exit_code1 -eq 1] || [ $exit_code2 -eq 1]; then exit_code=1; fi - *merge-request-comparison-check artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" -- GitLab From 30751c5582ab140f6a3ef334dd80234683d4a469 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 27 Feb 2024 13:05:14 +0100 Subject: [PATCH 431/601] implement downmixing of HOA3 to stereo for the reverberator input --- lib_com/options.h | 3 +- lib_dec/ivas_binRenderer_internal.c | 50 ++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index cdd45dbd68..86ea6322c7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -177,7 +177,8 @@ #ifdef SPLIT_REND_WITH_HEAD_ROT #define SPLIT_REND_LCLD_5MS /* Dlb: LCLD 5ms framing operation */ #endif -#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_A /* FhG: issue 987: fix broken output with ParamMC to BINAURAL_REVERB rendering */ +//#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_A /* FhG: issue 987: solution a: switch to SD */ +#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_B /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ #define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index feb59980cf..97b80e3f1a 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -952,22 +952,48 @@ static void ivas_binaural_obtain_DMX( set_zero( outRealRightPtr, CLDFB_NO_CHANNELS_MAX ); set_zero( outImagRightPtr, CLDFB_NO_CHANNELS_MAX ); - for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) - { - float foa_const = hBinRenderer->hReverb->foa_enc[chIdx][1]; +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_B + /*Ambisonics input requires different processing*/ + if ( hBinRenderer->nInChannels == 16 ) + { + float *inRealPtr_W, *inImagPtr_W; + float *inRealPtr_Y, *inImagPtr_Y; - inRealPtr = (float *) &( RealBuffer[chIdx][k][0] ); - inImagPtr = (float *) &( ImagBuffer[chIdx][k][0] ); + inRealPtr_W = (float *) &( RealBuffer[0][k][0] ); + inImagPtr_W = (float *) &( ImagBuffer[0][k][0] ); + + inRealPtr_Y = (float *) &( RealBuffer[1][k][0] ); + inImagPtr_Y = (float *) &( ImagBuffer[1][k][0] ); for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - outRealLeftPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f + foa_const ); - outImagLeftPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f + foa_const ); - - outRealRightPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f - foa_const ); - outImagRightPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f - foa_const ); - } - } + outRealLeftPtr[bandIdx] = inRealPtr_W[bandIdx] + inRealPtr_Y[bandIdx]; + outImagLeftPtr[bandIdx] = inImagPtr_W[bandIdx] + inImagPtr_Y[bandIdx]; + + outRealRightPtr[bandIdx] = inRealPtr_W[bandIdx] - inRealPtr_Y[bandIdx]; + outImagRightPtr[bandIdx] = inImagPtr_W[bandIdx] - inImagPtr_Y[bandIdx]; + } + } + else +#endif + { + for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + float foa_const = hBinRenderer->hReverb->foa_enc[chIdx][1]; + + inRealPtr = (float *) &( RealBuffer[chIdx][k][0] ); + inImagPtr = (float *) &( ImagBuffer[chIdx][k][0] ); + + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + outRealLeftPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f + foa_const ); + outImagLeftPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f + foa_const ); + + outRealRightPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f - foa_const ); + outImagRightPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f - foa_const ); + } + } + } } } -- GitLab From fb3c47a76822ba026a2a603e044ff0852736beb0 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 27 Feb 2024 13:14:26 +0100 Subject: [PATCH 432/601] fix formatting --- lib_dec/ivas_binRenderer_internal.c | 50 ++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 97b80e3f1a..b48a352a71 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -954,15 +954,15 @@ static void ivas_binaural_obtain_DMX( #ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_B /*Ambisonics input requires different processing*/ - if ( hBinRenderer->nInChannels == 16 ) - { + if ( hBinRenderer->nInChannels == 16 ) + { float *inRealPtr_W, *inImagPtr_W; float *inRealPtr_Y, *inImagPtr_Y; inRealPtr_W = (float *) &( RealBuffer[0][k][0] ); inImagPtr_W = (float *) &( ImagBuffer[0][k][0] ); - inRealPtr_Y = (float *) &( RealBuffer[1][k][0] ); + inRealPtr_Y = (float *) &( RealBuffer[1][k][0] ); inImagPtr_Y = (float *) &( ImagBuffer[1][k][0] ); for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) @@ -970,30 +970,30 @@ static void ivas_binaural_obtain_DMX( outRealLeftPtr[bandIdx] = inRealPtr_W[bandIdx] + inRealPtr_Y[bandIdx]; outImagLeftPtr[bandIdx] = inImagPtr_W[bandIdx] + inImagPtr_Y[bandIdx]; - outRealRightPtr[bandIdx] = inRealPtr_W[bandIdx] - inRealPtr_Y[bandIdx]; + outRealRightPtr[bandIdx] = inRealPtr_W[bandIdx] - inRealPtr_Y[bandIdx]; outImagRightPtr[bandIdx] = inImagPtr_W[bandIdx] - inImagPtr_Y[bandIdx]; - } - } - else + } + } + else #endif - { - for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) - { - float foa_const = hBinRenderer->hReverb->foa_enc[chIdx][1]; - - inRealPtr = (float *) &( RealBuffer[chIdx][k][0] ); - inImagPtr = (float *) &( ImagBuffer[chIdx][k][0] ); - - for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - outRealLeftPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f + foa_const ); - outImagLeftPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f + foa_const ); - - outRealRightPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f - foa_const ); - outImagRightPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f - foa_const ); - } - } - } + { + for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + float foa_const = hBinRenderer->hReverb->foa_enc[chIdx][1]; + + inRealPtr = (float *) &( RealBuffer[chIdx][k][0] ); + inImagPtr = (float *) &( ImagBuffer[chIdx][k][0] ); + + for ( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + outRealLeftPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f + foa_const ); + outImagLeftPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f + foa_const ); + + outRealRightPtr[bandIdx] += inRealPtr[bandIdx] * ( 1.f - foa_const ); + outImagRightPtr[bandIdx] += inImagPtr[bandIdx] * ( 1.f - foa_const ); + } + } + } } } -- GitLab From 80e9d9f14fc472c5bde5c7f6be264127aa7414ea Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 27 Feb 2024 13:31:34 +0100 Subject: [PATCH 433/601] improve verbosity of 5/10ms BE test --- .gitlab-ci.yml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ebbf74dbe2..aac618e440 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -548,16 +548,17 @@ pytest-compare-20ms-and-5ms-rendering: - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -m create_ref_part2 ### run pytest - exit_code=0 - # dummy, is needed for using the comparison anchor later - - non_be_flag=0 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 || exit_code1=$? - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 || exit_code2=$? - - zero_errors=$(cat report-junit-5ms.xml report-junit-10ms.xml | grep -c 'errors="0"') || true - # map to usual values - - if [ $zero_errors -eq 2 ]; then zero_errors=1; else zero_errors=0; fi - - exit_code=0 - - if [ $exit_code1 -eq 1] || [ $exit_code2 -eq 1]; then exit_code=1; fi - - *merge-request-comparison-check + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 || exit_code5=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 || exit_code10=$? + - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true + - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true + - zero_errors=1 + - if [ $zero_errors5 -eq 0 ]; then echo "run error in with 5ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors10 -eq 0 ]; then echo "run error in with 10ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors != 1 ]; then exit $EXIT_CODE_FAIL; fi + - if [ $exit_code5 -eq 1 ]; then echo "Non-bitexact cases encountered with 5ms rendering!"; exit_code=1; fi + - if [ $exit_code10 -eq 1 ]; then echo "Non-bitexact cases encountered with 10ms rendering!"; exit_code=1; fi + - if [ $exit_code -eq 1 ]; exit $EXIT_CODE_FAIL; fi artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" expire_in: 1 week -- GitLab From 29e3f74b44c1af98a699b7b7095b61ab2ebc3ff7 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 27 Feb 2024 13:53:28 +0100 Subject: [PATCH 434/601] run 5/10ms BE test always as long as the code compiles under Linux --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aac618e440..e3ab34a85c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -533,6 +533,7 @@ pytest-compare-20ms-and-5ms-rendering: - .test-job-linux - .rules-merge-request stage: test + needs: ["build-codec-linux-cmake", "build-codec-linux-make", "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] script: - *print-common-info - *disable-limiter -- GitLab From 5200e49dd7222c5663f51eeca8ae6752a0eb93f2 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 27 Feb 2024 14:07:11 +0100 Subject: [PATCH 435/601] fix shell commands for 5/10 ms BE test --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e3ab34a85c..1352eb875b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -554,12 +554,12 @@ pytest-compare-20ms-and-5ms-rendering: - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true - zero_errors=1 - - if [ $zero_errors5 -eq 0 ]; then echo "run error in with 5ms rendering encountered"; zero_errors=0 ; fi - - if [ $zero_errors10 -eq 0 ]; then echo "run error in with 10ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors5 != 1 ]; then echo "run error in with 5ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors10 != 1 ]; then echo "run error in with 10ms rendering encountered"; zero_errors=0 ; fi - if [ $zero_errors != 1 ]; then exit $EXIT_CODE_FAIL; fi - if [ $exit_code5 -eq 1 ]; then echo "Non-bitexact cases encountered with 5ms rendering!"; exit_code=1; fi - if [ $exit_code10 -eq 1 ]; then echo "Non-bitexact cases encountered with 10ms rendering!"; exit_code=1; fi - - if [ $exit_code -eq 1 ]; exit $EXIT_CODE_FAIL; fi + - if [ $exit_code -eq 1 ]; then exit $EXIT_CODE_FAIL; fi artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" expire_in: 1 week -- GitLab From f4fa0d24d474fbafe718e7c3bd017860b51407d8 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 27 Feb 2024 16:52:35 +0100 Subject: [PATCH 436/601] synch self_test.prm and self_test_ltv.prm --- scripts/config/self_test_ltv.prm | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 623f474e92..6bdeaaf0a8 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -685,10 +685,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 48000 48 testv/ltv48_HOA3.wav bit ../IVAS_dec 5_1_2 48 bit testv/ltv48_HOA3.wav_SBA_48000_48-48_5_1_2.tst -// SBA at 48 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -sba 3 48000 48 testv/ltv48_HOA3.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/ltv48_HOA3.wav_SBA_48000_48-48_binaural_ht_fr5.tst - // SBA at 64 kbps, 32kHz in, 32kHz out, FOA out, DTX, random FER at 5% ../IVAS_cod -dtx -sba 1 64000 32 testv/ltv32_FOA.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error @@ -806,10 +802,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 512000 48 testv/ltv48_HOA3.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/ltv48_HOA3.wav_SBA_512000_48-48_Binaural_Headrot_EXOF.tst -// SBA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -sba 3 512000 48 testv/ltv48_HOA3.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/ltv48_HOA3.wav_SBA_512000_48-48_binaural_ht_fr5.tst - // SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 48 testv/ltv48_FOA.wav bit ../IVAS_dec BINAURAL 48 bit testv/ltv48_FOA.wav_sw_48-48_BINAURAL.tst @@ -1237,18 +1229,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 7_1_4 160000 48 testv/ltv48_MC714.wav bit ../IVAS_dec 7_1_4 48 bit testv/ltv48_MC714.wav_MC714_160000_48-48_MC714.tst -// Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, fr 5ms -../IVAS_cod -mc 7_1_4 160000 48 testv/ltv48_MC714.wav bit -../IVAS_dec -fr 5 BINAURAL_ROOM_IR 48 bit testv/ltv48_MC714.wav_MC714_160000_48-48_MC_binaural_room_fr5.tst - -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, with headtracking, BINAURAL out, fr 5ms -../IVAS_cod -mc 7_1_4 512000 48 testv/ltv48_MC714.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/ltv48_MC714.wav_MC714_512000_48-48_MC_binaural_ht_fr5.tst - -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, fr 5ms -../IVAS_cod -mc 5_1 512000 48 testv/ltv48_MC51.wav bit -../IVAS_dec -fr 5 -t testv/headrot.csv BINAURAL 48 bit testv/ltv48_MC714.wav_MC51_512000_48-48_MC_binaural_ht_fr5.tst - // Multi-channel 5_1_2 at 32 kbps, 48kHz in, 48kHz out, STEREO out, random FER at 5% ../IVAS_cod -mc 5_1_2 32000 48 testv/ltv48_MC512.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error -- GitLab From 8f787919d58bc9b0ef98fd2cc99df1c48c18cc33 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 28 Feb 2024 08:01:59 +0100 Subject: [PATCH 437/601] fix for #1014, #1015, #1016, update info about rendered frames and slots in the TC buffer in the correct way in the discrete ISM renderer --- lib_com/options.h | 2 +- lib_dec/ivas_ism_renderer.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 12730e95f0..736211a7f2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -184,7 +184,7 @@ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ -#define NONBE_FIX_1014_OSBA_JBM_STEREO /* FhG: issue #1014: fix stereo output for OSBA*/ +#define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 07d6217cc4..d5364a4bb6 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -279,8 +279,10 @@ void ivas_ism_render_sf( ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); n_samples_rendered_loop += n_samples_in_subframe; -#ifdef NONBE_FIX_1014_OSBA_JBM_STEREO - if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_OSBA_STEREO ) +#ifdef NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO + /* update rendered subframe and slots info for all cases apart from a following crend call, the update will + then happen in the crend call*/ + if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) #else if ( st_ivas->renderer_type == RENDERER_TD_PANNING ) #endif -- GitLab From dcf6b7e71574b62efbe4684d2ae8528f43c3668b Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 28 Feb 2024 08:05:35 +0100 Subject: [PATCH 438/601] fix for #1014, #1015, #1016, adress formatting comment --- lib_dec/ivas_ism_renderer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index d5364a4bb6..6f5a2d90eb 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -172,6 +172,7 @@ void ivas_ism_render_sf( assert( slots_to_render == 0 ); assert( last_sf <= st_ivas->hTcBuffer->nb_subframes ); #endif + num_objects = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) { -- GitLab From 644c1857bb7961bba88b305d430f45625a993933 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:35:35 +0100 Subject: [PATCH 439/601] [cleanup] accept FIX_777_COMBI_RENDER_CONFIG_FILE --- lib_com/options.h | 1 - lib_util/render_config_reader.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 00b3446f52..6eb8d096c6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI /* FhG: fix and undef behaviour bug in the harmonic TCX model arithmetic coder */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 678f760a0b..a6229dc659 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2301,11 +2301,7 @@ ivas_error RenderConfigReader_read( /* RT60 */ else if ( strcmp( item, "RT60" ) == 0 ) { -#ifdef FIX_777_COMBI_RENDER_CONFIG_FILE if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) -#else - if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) -#endif { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; @@ -2315,11 +2311,7 @@ ivas_error RenderConfigReader_read( /* DSR */ else if ( strcmp( item, "DSR" ) == 0 ) { -#ifdef FIX_777_COMBI_RENDER_CONFIG_FILE if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) -#else - if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) -#endif { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; -- GitLab From 66f4cdf7abcb75de309a68286f208848f6998fb2 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 10:39:53 +0100 Subject: [PATCH 440/601] add --decoder_only option and use it in test_param_files.py --- .../test_param_file.py | 88 +++++++++++-------- tests/conftest.py | 15 ++++ 2 files changed, 66 insertions(+), 37 deletions(-) diff --git a/tests/codec_be_on_mr_nonselection/test_param_file.py b/tests/codec_be_on_mr_nonselection/test_param_file.py index 824608066c..226b0794bc 100644 --- a/tests/codec_be_on_mr_nonselection/test_param_file.py +++ b/tests/codec_be_on_mr_nonselection/test_param_file.py @@ -127,6 +127,7 @@ def convert_test_string_to_tag(test_string): @pytest.mark.parametrize("test_tag", list(param_file_test_dict.keys())) def test_param_file_tests( record_property, + decoder_only, dut_encoder_frontend: EncoderFrontend, dut_decoder_frontend: DecoderFrontend, ref_encoder_frontend: EncoderFrontend, @@ -185,18 +186,19 @@ def test_param_file_tests( # -> construct bitstream filename bitstream_file = f"{testv_base}_{tag_str}.192" - encode( - dut_encoder_frontend, - ref_encoder_frontend, - reference_path, - dut_base_path, - bitrate, - sampling_rate, - testv_file, - bitstream_file, - enc_split, - update_ref, - ) + if not decoder_only: + encode( + dut_encoder_frontend, + ref_encoder_frontend, + reference_path, + dut_base_path, + bitrate, + sampling_rate, + testv_file, + bitstream_file, + enc_split, + update_ref, + ) if sba_br_switching_dtx == 1 and not keep_files: is_exist = os.path.exists(cut_file) if is_exist: @@ -230,6 +232,7 @@ def test_param_file_tests( sim_split, update_ref, rootdir, + decoder_only, ) # check for eid-xor command line @@ -255,6 +258,7 @@ def test_param_file_tests( eid_split, update_ref, rootdir, + decoder_only, ) # evaluate decoder options @@ -320,6 +324,7 @@ def test_param_file_tests( dec_split, update_ref, tracefile_dec, + decoder_only, ) if update_ref in [0, 2]: @@ -373,14 +378,15 @@ def test_param_file_tests( # remove DUT output files when test result is OK (to save disk space) if not keep_files: - os.remove(f"{dut_base_path}/param_file/enc/{bitstream_file}") os.remove(f"{dut_base_path}/param_file/dec/{output_file}") - if sim_opts != "": - os.remove(f"{dut_base_path}/param_file/enc/{testv_base}_{tag_str}.192") - os.remove(f"{dut_base_path}/param_file/enc/{netsim_trace_outfile}") - os.remove(f"{dut_base_path}/param_file/dec/{tracefile_dec}") - elif eid_opts != "": - os.remove(f"{dut_base_path}/param_file/enc/{testv_base}_{tag_str}.192") + if not decoder_only: + os.remove(f"{dut_base_path}/param_file/enc/{bitstream_file}") + if sim_opts != "": + os.remove(f"{dut_base_path}/param_file/enc/{testv_base}_{tag_str}.192") + os.remove(f"{dut_base_path}/param_file/enc/{netsim_trace_outfile}") + os.remove(f"{dut_base_path}/param_file/dec/{tracefile_dec}") + elif eid_opts != "": + os.remove(f"{dut_base_path}/param_file/enc/{testv_base}_{tag_str}.192") def encode( @@ -449,6 +455,7 @@ def simulate( sim_opts_list, update_ref, rootdir, + decoder_only, ): """ Call network simulator on REF and/or DUT encoder output. @@ -477,21 +484,20 @@ def simulate( else: assert False, f"networkSimulator_g192 not available for {platform.system()}" - if update_ref == 1 or update_ref == 2 and not os.path.exists(ref_out_file): + cmd_opts = sim_opts_list + if update_ref == 1 or (update_ref == 2 and not os.path.exists(ref_out_file)) or decoder_only: # call network simulator on REF encoder output - cmd_opts = sim_opts_list cmd_opts[1] = f"{ref_out_dir}/{netsim_infile}" - cmd_opts[2] = f"{ref_out_dir}/{netsim_outfile}" # ref_out_file - cmd_opts[3] = f"{ref_out_dir}/{netsim_tracefile}" - run(netsim + cmd_opts, check=False) - - if update_ref in [0, 2]: + elif update_ref in [0, 2]: # call network simulator on DUT encoder output - cmd_opts = sim_opts_list cmd_opts[1] = f"{dut_out_dir}/{netsim_infile}" - cmd_opts[2] = f"{dut_out_dir}/{netsim_outfile}" # dut_out_file + + if update_ref == 1 or (update_ref == 2 and not os.path.exists(ref_out_file)): + cmd_opts[3] = f"{ref_out_dir}/{netsim_tracefile}" + elif update_ref in [0, 2]: cmd_opts[3] = f"{dut_out_dir}/{netsim_tracefile}" - run(netsim + cmd_opts, check=False) + + run(netsim + cmd_opts, check=False) def error_insertion( @@ -500,6 +506,7 @@ def error_insertion( eid_opts_list, update_ref, rootdir, + decoder_only, ): """ Call eid-xor to insert frame erasure on REF and/or DUT encoder output. @@ -522,19 +529,21 @@ def error_insertion( else: assert False, f"eid-xor not available for {platform.system()}" - if update_ref == 1 or update_ref == 2 and not os.path.exists(ref_out_file): + cmd_opts = eid_opts_list + + if update_ref == 1 or (update_ref == 2 and not os.path.exists(ref_out_file)) or decoder_only: # call eid-xor on REF encoder output - cmd_opts = eid_opts_list cmd_opts[-3] = f"{ref_out_dir}/{eid_xor_infile}" - cmd_opts[-1] = f"{ref_out_dir}/{eid_xor_outfile}" # ref_out_file - run(eid_xor + cmd_opts, check=False) - - if update_ref in [0, 2]: + elif update_ref in [0, 2]: # call eid-xor on DUT encoder output - cmd_opts = eid_opts_list cmd_opts[-3] = f"{dut_out_dir}/{eid_xor_infile}" + + if update_ref == 1 or (update_ref == 2 and not os.path.exists(ref_out_file)): + cmd_opts[-1] = f"{ref_out_dir}/{eid_xor_outfile}" # ref_out_file + elif update_ref in [0, 2]: cmd_opts[-1] = f"{dut_out_dir}/{eid_xor_outfile}" # ref_out_file - run(eid_xor + cmd_opts, check=False) + + run(eid_xor + cmd_opts, check=False) def decode( @@ -549,6 +558,7 @@ def decode( dec_opts_list, update_ref, tracefile_dec, + decoder_only, ): """ Call REF and/or DUT decoder. @@ -589,6 +599,10 @@ def decode( x if x != "tracefile_dec" else f"{dut_out_dir}/{tracefile_dec}" for x in dec_opts_list ] + + if decoder_only: + dut_in_file = ref_in_file + # call DUT decoder decoder_frontend.run( output_config, diff --git a/tests/conftest.py b/tests/conftest.py index 1e54c4ed07..76572eadd4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -191,6 +191,13 @@ def pytest_addoption(parser): default=20, ) + parser.addoption( + "--decoder_only", + help="Only run decoder parts of tests in 'codec_be_on_mr_nonselection'. Use ref encoder output bitstreams.", + action="store_true", + default=False, + ) + @pytest.fixture(scope="session", autouse=True) def update_ref(request): """ @@ -692,6 +699,14 @@ def dut_base_path(request) -> str: return path +@pytest.fixture(scope="session", autouse=True) +def decoder_only(request) -> bool: + """ + Return value of cmdl param --decoder_only + """ + return request.config.getoption("--decoder_only") + + def pytest_configure(config): config.addinivalue_line("markers", "serial: mark test to run only in serial") config.addinivalue_line( -- GitLab From 7dfe775561973d6e2566a0894feb97e25fec5137 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:40:28 +0100 Subject: [PATCH 441/601] [cleanup] accept FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI --- lib_com/ari_hm.c | 4 ---- lib_com/options.h | 1 - 2 files changed, 5 deletions(-) diff --git a/lib_com/ari_hm.c b/lib_com/ari_hm.c index 0e9a18085c..7fe4d282d1 100644 --- a/lib_com/ari_hm.c +++ b/lib_com/ari_hm.c @@ -280,11 +280,7 @@ void tcx_hm_modify_envelope( const int16_t L_frame /* i : number of spectral lines */ ) { -#ifdef FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI int32_t h, x, k; -#else - int16_t k, h, x; -#endif Word16 inv_shape[2 * kTcxHmParabolaHalfWidth + 1]; /* Q15 */ if ( gain == 0 ) diff --git a/lib_com/options.h b/lib_com/options.h index 6eb8d096c6..0b344c9d78 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI /* FhG: fix and undef behaviour bug in the harmonic TCX model arithmetic coder */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ -- GitLab From b6b0e802846184f0b4cc32591f13fd14a077bb79 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:41:46 +0100 Subject: [PATCH 442/601] [cleanup] accept FIX_699_FILE_READER_JBM_TSM --- apps/decoder.c | 4 ---- apps/encoder.c | 4 ---- lib_com/options.h | 1 - 3 files changed, 9 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index aca1635eae..ac560234ce 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2301,11 +2301,7 @@ static ivas_error decodeG192( { if ( ( error = TsmScaleFileReader_readScale( tsmScaleFileReader, &scale ) ) != IVAS_ERR_OK ) { -#ifdef FIX_699_FILE_READER_JBM_TSM fprintf( stderr, "\nError (%s) when reading TSM data from %s \n\n", arg.inputBitstreamFilename, TsmScaleFileReader_getFilePath( tsmScaleFileReader ) ); -#else - fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename ); -#endif goto cleanup; } int16_t maxScaling; diff --git a/apps/encoder.c b/apps/encoder.c index 835c4d18f9..b00f4f75fd 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -686,11 +686,7 @@ int main( { if ( ( error = JbmFileReader_readCAconfig( jbmReader, &caConfig ) ) != IVAS_ERR_OK ) { -#ifdef FIX_699_FILE_READER_JBM_TSM fprintf( stderr, "\nError (%s) while reading Channel-Aware Config. from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), JbmFileReader_getFilePath( jbmReader ) ); -#else - fprintf( stderr, "JbmFileReader_readCAconfig() failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); -#endif goto cleanup; } diff --git a/lib_com/options.h b/lib_com/options.h index 0b344c9d78..a29183f7e5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ -- GitLab From 55e32cf99cf47905c5e045e10c269db19aa4d5da Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:43:20 +0100 Subject: [PATCH 443/601] [cleanup] accept FIX_997_REMOVE_SPAR_DEC_UPMIXER --- lib_com/ivas_prot.h | 8 --- lib_com/options.h | 1 - lib_dec/ivas_spar_decoder.c | 134 ------------------------------------ 3 files changed, 143 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e091ce7305..840a459c79 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4368,14 +4368,6 @@ void ivas_spar_dec_upmixer_sf( const int16_t nchan_internal /* i : number of internal channels */ ); -#ifndef FIX_997_REMOVE_SPAR_DEC_UPMIXER -void ivas_spar_dec_upmixer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* i/o: input/output audio channels */ - const int16_t nchan_internal, /* i : number of internal channels */ - const int16_t output_frame /* i : output frame length */ -); -#endif /* MD module */ ivas_error ivas_spar_md_enc_open( ivas_spar_md_enc_state_t **hMdEnc, /* i/o: SPAR MD encoder handle */ diff --git a/lib_com/options.h b/lib_com/options.h index a29183f7e5..5d054f07b2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 776f606c4d..2e0f4ae0eb 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1250,19 +1250,11 @@ void ivas_spar_dec_set_render_map( return; } -#ifdef FIX_997_REMOVE_SPAR_DEC_UPMIXER /*-------------------------------------------------------------------* * ivas_spar_dec_set_render_params() * * IVAS SPAR set rendering parameters *-------------------------------------------------------------------*/ -#else -/*-------------------------------------------------------------------* - * ivas_spar_dec_upmixer() - * - * IVAS SPAR upmixer - *-------------------------------------------------------------------*/ -#endif void ivas_spar_dec_set_render_params( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -1369,132 +1361,6 @@ void ivas_spar_dec_digest_tc( return; } -#ifndef FIX_997_REMOVE_SPAR_DEC_UPMIXER -/*-------------------------------------------------------------------* - * ivas_spar_dec_upmixer() - * - * - *-------------------------------------------------------------------*/ - -void ivas_spar_dec_upmixer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* i/o: input/output audio channels */ - const int16_t nchan_internal, /* i : number of internal channels */ - const int16_t output_frame /* i : output frame length */ -) -{ - SPAR_DEC_HANDLE hSpar; - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - int16_t nchan_transport, nchan_out; - int16_t subframe_idx, n, i; - int16_t n_samples_sf; - float *output_f_local[MAX_OUTPUT_CHANNELS]; - float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - float *pPcm_tmp[MAX_OUTPUT_CHANNELS]; - int16_t nchan_internal_total; - int16_t sba_ch_offset; - - hSpar = st_ivas->hSpar; - nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; - nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; - n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); - - nchan_internal_total = nchan_internal; - sba_ch_offset = 0; - if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) - { - nchan_internal_total += st_ivas->nchan_ism; - sba_ch_offset = st_ivas->nchan_ism; - } - - for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) - { - output_f_local[n] = output[n + sba_ch_offset]; - } - - for ( n = 0; n < nchan_internal_total; n++ ) - { - st_ivas->hTcBuffer->tc[n] = output[n]; - } - - /*---------------------------------------------------------------------* - * TD decorrelation - *---------------------------------------------------------------------*/ - - for ( i = 0; i < nchan_internal; i++ ) - { - pPcm_tmp[i] = Pcm_tmp[i]; - } - - if ( hSpar->hMdDec->td_decorr_flag ) - { - if ( hSpar->hTdDecorr ) - { - ivas_td_decorr_process( hSpar->hTdDecorr, output_f_local, pPcm_tmp, output_frame ); - - if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) - { - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal_total - 1 - i], output_frame ); - } - } - else - { - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) - { - set_zero( st_ivas->hTcBuffer->tc[nchan_internal_total - 1 - i], output_frame ); - } - - for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal_total - 1 - i], output_frame ); - } - } - } - } - - ivas_spar_dec_set_render_params( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); - - if ( st_ivas->hDirAC != 0 ) - { - ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); - } - - for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) - { - ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); - - for ( n = 0; n < nchan_out; n++ ) - { - output_f_local[n] += n_samples_sf; - } - - /* update combined orientation access index */ - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf ); - } - - for ( n = 0; n < nchan_internal_total; n++ ) - { - st_ivas->hTcBuffer->tc[n] = NULL; - } - - if ( st_ivas->hDirAC != NULL && st_ivas->hSpatParamRendCom != NULL ) - { - hSpatParamRendCom = st_ivas->hSpatParamRendCom; - if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) - { - hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hSpatParamRendCom->dirac_md_buffer_length; - } - else - { - hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hSpatParamRendCom->dirac_md_buffer_length; - } - } - - return; -} -#endif /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer_sf() -- GitLab From acc9810984a3378aeb7b755a302f303a3572237e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:44:49 +0100 Subject: [PATCH 444/601] [cleanup] accept FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec.c | 7 ------- 2 files changed, 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5d054f07b2..e0a29920c5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index d631bfeec2..31018089c1 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -143,13 +143,6 @@ ivas_error ivas_jbm_dec_tc( { hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } -#ifndef FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO - - if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) - { - ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); - } -#endif } else if ( st_ivas->ivas_format == ISM_FORMAT ) { -- GitLab From 1b8737802723ad2b93ddf44837fb797952ed0bfe Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:46:47 +0100 Subject: [PATCH 445/601] [cleanup] accept FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN --- lib_com/options.h | 1 - lib_dec/ivas_ism_dec.c | 7 ------- 2 files changed, 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e0a29920c5..192c87c7a2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ #define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 1d0f523222..4c0c0601cc 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -355,13 +355,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( tc_nchan_allocate_new = tc_nchan_tc_new; tc_nchan_full_new = tc_nchan_tc_new; -#ifndef FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN - if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) - { - tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; - tc_nchan_full_new = tc_nchan_allocate_new; - } -#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { -- GitLab From d50098d3c1cb654348a23a95c06bdeb361c20af2 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:48:30 +0100 Subject: [PATCH 446/601] [cleanup] accept FIX_1001_ARI_HM_OVERFLOW --- lib_com/ari_hm.c | 8 -------- lib_com/options.h | 1 - lib_com/prot.h | 8 -------- lib_dec/ari_hm_dec.c | 8 -------- lib_enc/ari_hm_enc.c | 16 ---------------- 5 files changed, 41 deletions(-) diff --git a/lib_com/ari_hm.c b/lib_com/ari_hm.c index 7fe4d282d1..b0d65b4404 100644 --- a/lib_com/ari_hm.c +++ b/lib_com/ari_hm.c @@ -205,11 +205,7 @@ int16_t CountIndexBits( *-------------------------------------------------------------------*/ int16_t tcx_hm_render( -#ifdef FIX_1001_ARI_HM_OVERFLOW const int32_t lag, /* i : pitch lag */ -#else - const int16_t lag, /* i : pitch lag */ -#endif const int16_t fract_res, /* i : fractional resolution of the lag */ Word16 p[] /* o : harmonic model (Q13) */ ) @@ -269,11 +265,7 @@ int16_t tcx_hm_render( void tcx_hm_modify_envelope( const Word16 gain, /* i : HM gain (Q11) */ -#ifdef FIX_1001_ARI_HM_OVERFLOW const int32_t lag, -#else - const int16_t lag, -#endif const int16_t fract_res, const Word16 p[], /* i : harmonic model (Q13) */ Word32 env[], /* i/o: envelope (Q16) */ diff --git a/lib_com/options.h b/lib_com/options.h index 192c87c7a2..72393d1d2d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ #define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 10477f3587..9a88ea6d19 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -7830,22 +7830,14 @@ int16_t DecodeIndex( #define GET_ADJ2( T, L, F ) ( ( ( L ) << ( F ) ) - ( T ) ) int16_t tcx_hm_render( -#ifdef FIX_1001_ARI_HM_OVERFLOW const int32_t lag, /* i : pitch lag */ -#else - const int16_t lag, /* i : pitch lag */ -#endif const int16_t fract_res, /* i : fractional resolution of the lag */ Word16 p[] /* o : harmonic model (Q13) */ ); void tcx_hm_modify_envelope( const Word16 gain, /* i : HM gain (Q11) */ -#ifdef FIX_1001_ARI_HM_OVERFLOW const int32_t lag, -#else - const int16_t lag, -#endif const int16_t fract_res, const Word16 p[], /* i : harmonic model (Q13) */ Word32 env[], /* i/o: envelope (Q16) */ diff --git a/lib_dec/ari_hm_dec.c b/lib_dec/ari_hm_dec.c index 2a0e8bde04..d061a7d633 100644 --- a/lib_dec/ari_hm_dec.c +++ b/lib_dec/ari_hm_dec.c @@ -120,11 +120,7 @@ void tcx_hm_decode( int16_t *hm_bits /* o : bit consumption */ ) { -#ifdef FIX_1001_ARI_HM_OVERFLOW int32_t lag; -#else - int16_t lag; -#endif int32_t tmpL; int16_t NumTargetBits, fract_res; Word16 p[2 * kTcxHmParabolaHalfWidth + 1], gain; @@ -148,11 +144,7 @@ void tcx_hm_decode( /* Convert the index to lag */ UnmapIndex( prm_hm[1], L_frame >= 256, LtpPitchLag, ( NumTargetBits <= kSmallerLagsTargetBitsThreshold ) || ( L_frame < 256 ), &fract_res, &tmpL ); -#ifdef FIX_1001_ARI_HM_OVERFLOW lag = tmpL; -#else - lag = (int16_t) tmpL; -#endif /* Render the harmonic model */ if ( tcx_hm_render( lag, fract_res, p ) ) diff --git a/lib_enc/ari_hm_enc.c b/lib_enc/ari_hm_enc.c index 0a18a007ab..0b255f19b6 100644 --- a/lib_enc/ari_hm_enc.c +++ b/lib_enc/ari_hm_enc.c @@ -418,11 +418,7 @@ static void PeakFilter( static float tcx_hm_get_re( const float x[], /* i : absolute spectrum */ const Word16 gain, /* i : HM gain (Q11) */ -#ifdef FIX_1001_ARI_HM_OVERFLOW const int32_t lag, -#else - const int16_t lag, -#endif const int16_t fract_res, const Word16 p[], /* i : harmonic model (Q13) */ const Word32 env[], /* i : envelope (Q16) */ @@ -471,11 +467,7 @@ static float tcx_hm_get_re( static void tcx_hm_quantize_gain( const float x[], /* i : absolute spectrum */ const Word32 env[], /* i : envelope (Q16) */ -#ifdef FIX_1001_ARI_HM_OVERFLOW const int32_t lag, -#else - const int16_t lag, -#endif const int16_t fract_res, Word16 p[], /* i : harmonic model (Q13) */ const int16_t L_frame, /* i : number of spectral lines */ @@ -565,11 +557,7 @@ void tcx_hm_analyse( int16_t *hm_bits /* o : bit consumption */ ) { -#ifdef FIX_1001_ARI_HM_OVERFLOW int32_t lag; -#else - int16_t lag; -#endif int32_t tmpL; int16_t fract_res; float fspec[N_MAX_ARI], RelativeScore; @@ -595,11 +583,7 @@ void tcx_hm_analyse( /* Convert the index to lag */ UnmapIndex( prm_hm[1], L_frame >= 256, LtpPitchLag, ( targetBits - *hm_bits <= kSmallerLagsTargetBitsThreshold ) || ( L_frame < 256 ), &fract_res, &tmpL ); -#ifdef FIX_1001_ARI_HM_OVERFLOW lag = tmpL; -#else - lag = (int16_t) tmpL; -#endif /* Render harmonic model */ tcx_hm_render( lag, fract_res, p ); -- GitLab From 5c7128e0bf202819fd893bc52c501fc717fbf780 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:49:55 +0100 Subject: [PATCH 447/601] [cleanup] accept FIX_901_PARAMMC_DEAD_CODE --- lib_com/ivas_cnst.h | 8 - lib_com/ivas_mc_param_com.c | 135 --------------- lib_com/ivas_prot.h | 22 --- lib_com/ivas_rom_com.c | 61 ------- lib_com/ivas_stat_com.h | 7 - lib_com/options.h | 1 - lib_dec/ivas_mc_param_dec.c | 114 ------------ lib_enc/ivas_mc_param_enc.c | 334 ------------------------------------ 8 files changed, 682 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index db4e1a7c5b..e4946e9725 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1390,17 +1390,9 @@ typedef enum #define PARAM_MC_ICC_ERROR_BIAS_FAC (1.15f) /* factor for favouring past ICC maps in the adaptive ICC map decision */ #define PARAM_MC_TRANSIENT_BAND_STEP 2 /* Number of parameter bands combined in case of a transient frame*/ #define PARAM_MC_MAX_DECORR_CLDFB_BANDS 20 /* Maximum number of CLDFB bands with decorrelation */ -#ifdef FIX_901_PARAMMC_DEAD_CODE #define PARAM_MC_MAX_TRANSPORT_CHANS 3 /* Number of down mix channels */ -#else -#define PARAM_MC_MAX_TRANSPORT_CHANS 4 /* Number of down mix channels */ -#endif #define PARAM_MC_MAX_ILD_REF_CHANNELS 2 /* Maximum number of reference channels for a coded ILD */ -#ifdef FIX_901_PARAMMC_DEAD_CODE #define PARAM_MC_NUM_CONFIGS 14 /* Number of available Parametric MC configurations */ -#else -#define PARAM_MC_NUM_CONFIGS 15 /* Number of available Parametric MC configurations */ -#endif #define PARAM_MC_MAX_BAND_LFE 1 /* Number of parameter bands for LFE coding */ #define PARAM_MC_SZ_ICC_MAP 11 /* Maximum number of transmitted ICCs per parameter band */ #define PARAM_MC_SZ_ILD_MAP 12 /* Maximum number of transmitted channel energies per band*/ diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index 5a11a90d86..b080263506 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -87,22 +87,11 @@ uint16_t ivas_param_mc_get_configuration_index( void ivas_param_mc_metadata_open( const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ -#ifndef FIX_901_PARAMMC_DEAD_CODE - const int16_t lfe_index, /* i : channel index of LFE */ -#endif const int32_t ivas_total_brate, /* i : IVAS total bitrate */ HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ ) { -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t i; -#endif uint16_t config_index; -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t nchan_setup; - - nchan_setup = ivas_mc_ls_setup_get_num_channels( mc_ls_setup ); -#endif /* get coding band mappings */ set_s( hMetadataPMC->coding_band_mapping, 0, PARAM_MC_MAX_PARAMETER_BANDS ); @@ -135,26 +124,12 @@ void ivas_param_mc_metadata_open( assert( 0 && "nbands must be 20 or 14!" ); } -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* create map of all possible ICCs */ - ivas_param_mc_create_full_icc_mapping( nchan_setup, lfe_index, hMetadataPMC->icc_map_full, &hMetadataPMC->icc_map_size_full ); -#endif hMetadataPMC->icc_mapping_conf = ivas_param_mc_conf[config_index].icc_mapping_conf; hMetadataPMC->ild_mapping_conf = ivas_param_mc_conf[config_index].ild_mapping_conf; hMetadataPMC->ild_factors = ivas_param_mc_conf[config_index].ild_factors; -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* set default ICC maps */ - for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) - { - ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[i] ); - } -#endif /* init remaining flags and indices */ hMetadataPMC->param_frame_idx = 0; -#ifndef FIX_901_PARAMMC_DEAD_CODE - hMetadataPMC->flag_use_adaptive_icc_map = 0; -#endif hMetadataPMC->bAttackPresent = 0; hMetadataPMC->attackIndex = 0; hMetadataPMC->lfe_on = 1; @@ -209,32 +184,6 @@ void ivas_param_mc_set_coded_bands( return; } -#ifndef FIX_901_PARAMMC_DEAD_CODE -/*------------------------------------------------------------------------- - * ivas_param_mc_metadata_close() - * - * Parametric MC parameter coding state close function - *------------------------------------------------------------------------*/ - -void ivas_param_mc_metadata_close( - HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ -) -{ - uint16_t i; - - /* adaptive ICC mapping */ - for ( i = 0; i < 2; i++ ) - { - if ( hMetadataPMC->icc_map_full[i] ) - { - free( hMetadataPMC->icc_map_full[i] ); - hMetadataPMC->icc_map_full[i] = NULL; - } - } - - return; -} -#endif /*------------------------------------------------------------------------- * ivas_param_mc_getNumTransportChannels() @@ -258,85 +207,6 @@ int16_t ivas_param_mc_getNumTransportChannels( return nchan_transport; } -#ifndef FIX_901_PARAMMC_DEAD_CODE -/*------------------------------------------------------------------------- - * ivas_param_mc_create_full_icc_mapping() - * - * create the map of all possible ICCs for a certain internal setup - * indicated by the number of channels and LFE index - *------------------------------------------------------------------------*/ - -void ivas_param_mc_create_full_icc_mapping( - const int16_t n_channels, /* i : number of channels with LFE for the internal setup */ - const int16_t lfe_index, /* i : channel index of the LFE */ - int16_t *icc_map[2], /* o : map of all possible ICCs */ - int16_t *icc_map_size_full /* o : number of all possible ICCs */ -) -{ - int16_t i, k, l; - - l = 0; - - /* number of all possible ICCs is the number of non-diagonal upper elements of a - * ICC matrix for all channels not including the LFE plus one static ICC for the - * combination (LFE/center) */ - *icc_map_size_full = ( n_channels - 2 ) * ( n_channels - 1 ) / 2 + 1; - - /* allocate memory for the map */ - for ( i = 0; i < 2; i++ ) - { - icc_map[i] = (int16_t *) malloc( *icc_map_size_full * sizeof( int16_t ) ); - } - - /* create map (non-LFE ICCs) */ - for ( i = 0; i < n_channels; i++ ) - { - if ( i != lfe_index ) - { - for ( k = i + 1; k < n_channels; k++ ) - { - if ( k != lfe_index ) - { - icc_map[0][l] = i; - icc_map[1][l] = k; - l++; - } - } - } - } - - /* last one is the fixed mapping center -> LFE */ - assert( l == *icc_map_size_full - 1 ); - - icc_map[0][l] = 2; - icc_map[1][l] = lfe_index; - - return; -} - -/*------------------------------------------------------------------------- - * ivas_param_mc_default_icc_map() - * - * get the default ICC map for a certain internal setup - * indicated by the number of channels from the table ROM - *------------------------------------------------------------------------*/ - -void ivas_param_mc_default_icc_map( - const PARAM_MC_ICC_MAPPING *hIccMapping, /* i : ICC mapping table */ - int16_t icc_map[PARAM_MC_SZ_ICC_MAP][2] /* o : copy of map from ROM table */ -) -{ - int16_t i; - - for ( i = 0; i < hIccMapping->icc_map_size_lfe; i++ ) - { - icc_map[i][0] = hIccMapping->icc_mapping[i][0]; - icc_map[i][1] = hIccMapping->icc_mapping[i][1]; - } - - return; -} -#endif /*------------------------------------------------------------------------- @@ -419,11 +289,6 @@ static int16_t ivas_param_mc_get_num_param_bands( case IVAS_128k: num_parameter_bands = 14; break; -#ifndef FIX_901_PARAMMC_DEAD_CODE - case IVAS_160k: - num_parameter_bands = 20; - break; -#endif } break; default: diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 840a459c79..f0fe6d3cb4 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3808,9 +3808,6 @@ void ivas_mc_paramupmix_dec_render( void ivas_param_mc_metadata_open( const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ -#ifndef FIX_901_PARAMMC_DEAD_CODE - const int16_t lfe_index, /* i : channel index of LFE */ -#endif const int32_t ivas_total_brate, /* i : IVAS total bitrate */ HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ ); @@ -3819,18 +3816,6 @@ void ivas_param_mc_set_coded_bands( HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ ); -#ifndef FIX_901_PARAMMC_DEAD_CODE -void ivas_param_mc_metadata_close( - HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ -); - -void ivas_param_mc_create_full_icc_mapping( - const int16_t n_channels, /* i : number of channels with LFE for the internal setup */ - const int16_t lfe_index, /* i : channel index of the LFE */ - int16_t *icc_map[2], /* o : map of all possible ICCs */ - int16_t *icc_map_size_full /* o : number of all possible ICCs */ -); -#endif /*! r: number of IVAS transport channels */ int16_t ivas_param_mc_getNumTransportChannels( const int32_t ivas_total_bitrate, /* i : IVAS total bitrate */ @@ -3895,13 +3880,6 @@ void ivas_param_mc_dec( float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ); -#ifndef FIX_901_PARAMMC_DEAD_CODE -void ivas_param_mc_default_icc_map( - const PARAM_MC_ICC_MAPPING * hIccMapping, /* i : handle to ICC mapping configuration */ - int16_t icc_map[PARAM_MC_SZ_ICC_MAP][2] /* o : copy of map from the configuration */ -); - -#endif /*! r: number of cldfb synthesis instances */ int16_t param_mc_get_num_cldfb_syntheses( Decoder_Struct *st_ivas /* i : IVAS decoder structure */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 8ab2c86821..68169f10d4 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1973,24 +1973,6 @@ const float ivas_param_mc_ild_fac_CICP19_3tc[12] = 0.5f }; -#ifndef FIX_901_PARAMMC_DEAD_CODE -const float ivas_param_mc_ild_fac_CICP19_4tc[12] = -{ - 0.35f, - 0.35f, - 0.17f, - 0.22f, - 0.2f, - 0.2f, - 0.2f, - 0.5f, - 0.5f, - 0.5f, - 0.5f, - 0.2f, -}; - -#endif const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP6_2tc = { 5, @@ -2054,17 +2036,6 @@ const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_3tc = {{0},{1},{0},{1},{0},{1},{0},{1},{0},{1},{2},{2}} }; -#ifndef FIX_901_PARAMMC_DEAD_CODE -const PARAM_MC_ILD_MAPPING ivas_param_mc_ild_mapping_CICP19_4tc = -{ - 11, - 12, - {0,1,2,4,5,6,7,8,9,10,11,3}, - {1,1,2,1,1,1,1,1,1,1,1,2}, - {{0},{1},{0,1},{0},{1},{0},{1},{2},{3},{2},{3},{0,1}} -}; - -#endif const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP6_2tc = { 4, @@ -2165,24 +2136,6 @@ const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_3tc = } }; -#ifndef FIX_901_PARAMMC_DEAD_CODE -const PARAM_MC_ICC_MAPPING ivas_param_mc_icc_mapping_CICP19_4tc = -{ - 8, - 9, - { { 0, 4 }, /* L/LS */ - { 1, 5 }, /* R/RS */ - { 0, 2 }, /* L/C */ - { 1, 2 }, /* R/C */ - { 0, 6 }, /* L/LBS */ - { 1, 7 }, /* R/RBS */ - { 8, 10 }, /*UFL/UBL */ - { 9, 11 }, /*UFR/UBR */ - { 2, 3 } /* C/LFE */ - } -}; - -#endif const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = { /* CICP6 48000 */ @@ -2339,20 +2292,6 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_dmx_fac_CICP19_3tc[0], &ivas_param_mc_ild_fac_CICP19_3tc[0] } -#ifndef FIX_901_PARAMMC_DEAD_CODE - , - /* CICP19 160000 */ - { - MC_LS_SETUP_7_1_4, - 12, - 4, - IVAS_160k, - &ivas_param_mc_ild_mapping_CICP19_4tc, - &ivas_param_mc_icc_mapping_CICP19_4tc, - &ivas_param_mc_dmx_fac_CICP19_4tc[0], - &ivas_param_mc_ild_fac_CICP19_4tc[0] - } -#endif }; const float ivas_param_mc_quant_ild_5d1_48[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 1f55909a23..6feb8efd99 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -595,15 +595,8 @@ typedef struct ivas_parametric_mc_metadata_struct { const PARAM_MC_ILD_MAPPING *ild_mapping_conf; const PARAM_MC_ICC_MAPPING *icc_mapping_conf; -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t icc_mapping[PARAM_MC_PARAMETER_FRAMES][PARAM_MC_SZ_ICC_MAP][2]; - int16_t *icc_map_full[2]; -#endif int16_t icc_map_size_full; int16_t param_frame_idx; -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t flag_use_adaptive_icc_map; -#endif const float *ild_factors; int16_t coding_band_mapping[PARAM_MC_MAX_PARAMETER_BANDS]; int16_t nbands_in_param_frame[PARAM_MC_PARAMETER_FRAMES]; diff --git a/lib_com/options.h b/lib_com/options.h index 72393d1d2d..1942bd5405 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ #define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 45ed71c978..70f01eb927 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -114,9 +114,6 @@ ivas_error ivas_param_mc_dec_open( { int16_t k, nchan_transport; PARAM_MC_DEC_HANDLE hParamMC; -#ifndef FIX_901_PARAMMC_DEAD_CODE - IVAS_OUTPUT_SETUP hTransportSetup; -#endif int16_t nchan_out_transport; int16_t nchan_out_cov; float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -148,9 +145,6 @@ ivas_error ivas_param_mc_dec_open( output_Fs = st_ivas->hDecoderConfig->output_Fs; output_config = st_ivas->hDecoderConfig->output_config; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; -#ifndef FIX_901_PARAMMC_DEAD_CODE - hTransportSetup = st_ivas->hTransSetup; -#endif mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; hParamMC->hoa_encoder = NULL; @@ -231,11 +225,7 @@ ivas_error ivas_param_mc_dec_open( hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; -#ifndef FIX_901_PARAMMC_DEAD_CODE - ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); -#else ivas_param_mc_metadata_open( mc_ls_setup, ivas_total_brate, hParamMC->hMetadataPMC ); -#endif /* init arrays for quantized parameters */ if ( ( hParamMC->icc_q = (float *) malloc( hParamMC->hMetadataPMC->num_parameter_bands * hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe * sizeof( float ) ) ) == NULL ) @@ -558,9 +548,6 @@ ivas_error ivas_param_mc_dec_reconfig( { int16_t k, nchan_transport; PARAM_MC_DEC_HANDLE hParamMC; -#ifndef FIX_901_PARAMMC_DEAD_CODE - IVAS_OUTPUT_SETUP hTransportSetup; -#endif int16_t nchan_out_transport; int16_t nchan_out_cov; float proto_matrix[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -589,9 +576,6 @@ ivas_error ivas_param_mc_dec_reconfig( output_Fs = st_ivas->hDecoderConfig->output_Fs; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; -#ifndef FIX_901_PARAMMC_DEAD_CODE - hTransportSetup = st_ivas->hTransSetup; -#endif mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ); nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; @@ -635,29 +619,9 @@ ivas_error ivas_param_mc_dec_reconfig( hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* deallocate the full icc map, gets newly allocated in the metadata open function */ - - for ( k = 0; k < 2; k++ ) - { -#ifdef DEBUGGING - assert( hParamMC->hMetadataPMC->icc_map_full[k] != NULL ); -#endif - if ( hParamMC->hMetadataPMC->icc_map_full[k] != NULL ) - { - free( hParamMC->hMetadataPMC->icc_map_full[k] ); - hParamMC->hMetadataPMC->icc_map_full[k] = NULL; - } - } - -#endif mvs2s( hParamMC->band_grouping, band_grouping_old, hParamMC->hMetadataPMC->num_parameter_bands + 1 ); -#ifndef FIX_901_PARAMMC_DEAD_CODE - ivas_param_mc_metadata_open( mc_ls_setup, hTransportSetup.index_lfe[0], ivas_total_brate, hParamMC->hMetadataPMC ); -#else ivas_param_mc_metadata_open( mc_ls_setup, ivas_total_brate, hParamMC->hMetadataPMC ); -#endif /* Band Grouping */ if ( hParamMC->hMetadataPMC->num_parameter_bands == 20 ) @@ -1114,9 +1078,6 @@ void ivas_param_mc_dec_close( /* parameter decoding */ if ( hParamMC->hMetadataPMC != NULL ) { -#ifndef FIX_901_PARAMMC_DEAD_CODE - ivas_param_mc_metadata_close( hParamMC->hMetadataPMC ); -#endif free( hParamMC->hMetadataPMC ); hParamMC->hMetadataPMC = NULL; } @@ -1233,9 +1194,6 @@ void ivas_param_mc_dec_read_BS( int16_t num_param_bands; int16_t metadata_bit_pos; int16_t i, j, k; -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t l; -#endif int16_t icc_map_size; int16_t icc_map_size_wo_lfe; int16_t ild_map_size; @@ -1324,67 +1282,6 @@ void ivas_param_mc_dec_read_BS( num_lfe_bands = 0; } -#ifndef FIX_901_PARAMMC_DEAD_CODE - if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 ) - { - int16_t icc_mapping_index[PARAM_MC_SZ_ICC_MAP]; - - k = 0; - for ( i = 0; i < hMetadataPMC->icc_map_size_full - 1; i++ ) - { - if ( bit_buffer[bit_pos++] == 1 ) - { - icc_mapping_index[k++] = i; - } - } - - /* last one is always C/LFE */ - icc_mapping_index[k] = hMetadataPMC->icc_map_size_full - 1; - - /* save icc mapping of the previous frame*/ - /* build icc map for the current frame */ - for ( k = 0; k < icc_map_size; k++ ) - { - hMetadataPMC->icc_mapping[param_frame_idx][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; - hMetadataPMC->icc_mapping[param_frame_idx][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; - } - - if ( hMetadataPMC->bAttackPresent ) - { - for ( k = 0; k < icc_map_size; k++ ) - { - for ( l = 0; l < PARAM_MC_PARAMETER_FRAMES; l++ ) - { - hMetadataPMC->icc_mapping[l][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; - hMetadataPMC->icc_mapping[l][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; - } - } - } - else - { - for ( k = 0; k < icc_map_size; k++ ) - { - hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx][k][0] = hMetadataPMC->icc_map_full[0][icc_mapping_index[k]]; - hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx][k][1] = hMetadataPMC->icc_map_full[1][icc_mapping_index[k]]; - } - } - } - else - { - if ( hMetadataPMC->bAttackPresent ) - { - for ( l = 0; l < PARAM_MC_PARAMETER_FRAMES; l++ ) - { - ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[param_frame_idx] ); - } - } - else - { - ivas_param_mc_default_icc_map( hMetadataPMC->icc_mapping_conf, hMetadataPMC->icc_mapping[hMetadataPMC->param_frame_idx] ); - } - } - -#endif ivas_param_mc_bs_decode_parameter_values( bit_buffer, &bit_pos, bits_to_copy, &st->BER_detect, hMetadataPMC, &hMetadataPMC->icc_coding, icc_map_size_wo_lfe, icc_map_size, num_lfe_bands, band_step, num_param_bands, hParamMC->icc_q ); if ( !st->BER_detect ) @@ -2731,15 +2628,9 @@ static void ivas_param_mc_dequantize_cov( int16_t l; float *Cyp; float ap; -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t param_frame_idx; -#endif const PARAM_MC_ILD_MAPPING *h_ild_mapping; float Cy_state_int[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; -#ifndef FIX_901_PARAMMC_DEAD_CODE - param_frame_idx = hParamMC->hMetadataPMC->param_frame_idx; -#endif set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); h_ild_mapping = hParamMC->hMetadataPMC->ild_mapping_conf; @@ -2780,13 +2671,8 @@ static void ivas_param_mc_dequantize_cov( /* replace some estimated ICCs with transmitted values */ for ( k = 0; k < hParamMC->hMetadataPMC->icc_mapping_conf->icc_map_size_lfe; k++ ) { -#ifndef FIX_901_PARAMMC_DEAD_CODE - Cy_state_int[hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][0] + nY_int * hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][1]] = icc_q[k]; - Cy_state_int[hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][1] + nY_int * hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][0]] = icc_q[k]; -#else Cy_state_int[hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0] + nY_int * hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1]] = icc_q[k]; Cy_state_int[hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1] + nY_int * hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0]] = icc_q[k]; -#endif } if ( param_band_index >= PARAM_MC_MAX_BAND_LFE || !hParamMC->hMetadataPMC->lfe_on ) diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index b32bb1ce5d..4269103937 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -62,10 +62,6 @@ static void ivas_param_mc_parameter_quantizer( const float *x, const int16_t L, static void ivas_param_mc_transient_detection( PARAM_MC_ENC_HANDLE hParamMC, TRAN_DET_HANDLE hTranDet, int16_t *bAttackPresent, int16_t *attackIdx ); -#ifndef FIX_901_PARAMMC_DEAD_CODE -static void ivas_param_mc_enc_find_icc_map( PARAM_MC_ENC_HANDLE hParamMC, float Cx_sum[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], float Cy_sum[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], float ILD_q[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP], const int16_t nchan_input, const int16_t nchan_transport ); - -#endif static void ivas_param_mc_quantize_iccs( PARAM_MC_ENC_HANDLE hParamMC, float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], const int16_t freq_idx, const int16_t nchan_input, int16_t *ICC_idx_out ); static void ivas_param_mc_quantize_ilds( PARAM_MC_ENC_HANDLE hParamMC, float Cy[MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], float Cx[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], const int16_t freq_idx, const int16_t nchan_input, const int16_t nchan_transport, int16_t *ILD_idx_out, float ILD_q[PARAM_MC_SZ_ILD_MAP] ); @@ -89,9 +85,6 @@ ivas_error ivas_param_mc_enc_open( ) { int16_t i; -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t k, l; -#endif IVAS_FB_CFG *fb_cfg; PARAM_MC_ENC_HANDLE hParamMC; uint16_t config_index; @@ -157,29 +150,7 @@ ivas_error ivas_param_mc_enc_open( } /* open/init parameter coding */ -#ifndef FIX_901_PARAMMC_DEAD_CODE - ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); -#else ivas_param_mc_metadata_open( mc_input_setup, ivas_total_brate, &hParamMC->hMetadataPMC ); -#endif -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* init icc index states */ - for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) - { - set_s( hParamMC->icc_map_index[i], -1, PARAM_MC_SZ_ICC_MAP ); - - for ( l = 0; l < hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_lfe; l++ ) - { - for ( k = 0; k < hParamMC->hMetadataPMC.icc_map_size_full; k++ ) - { - if ( hParamMC->hMetadataPMC.icc_mapping[i][l][0] == hParamMC->hMetadataPMC.icc_map_full[0][k] && hParamMC->hMetadataPMC.icc_mapping[i][l][1] == hParamMC->hMetadataPMC.icc_map_full[1][k] ) - { - hParamMC->icc_map_index[i][l] = k; - } - } - } - } -#endif /* Band Grouping */ if ( hParamMC->hMetadataPMC.num_parameter_bands == 20 ) @@ -246,9 +217,6 @@ ivas_error ivas_param_mc_enc_reconfig( ) { int16_t i; -#ifndef FIX_901_PARAMMC_DEAD_CODE - int16_t k, l; -#endif PARAM_MC_ENC_HANDLE hParamMC; uint16_t config_index; MC_LS_SETUP mc_input_setup; @@ -293,47 +261,9 @@ ivas_error ivas_param_mc_enc_reconfig( /* get dmx factors */ hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* deallocate the full icc map, gets newly allocated in the metadata open function */ - for ( i = 0; i < 2; i++ ) - { -#ifdef DEBUGGING - assert( hParamMC->hMetadataPMC.icc_map_full[i] != NULL ); -#endif - if ( hParamMC->hMetadataPMC.icc_map_full[i] != NULL ) - { - free( hParamMC->hMetadataPMC.icc_map_full[i] ); - hParamMC->hMetadataPMC.icc_map_full[i] = NULL; - } - } - -#endif /* open/init parameter coding */ -#ifndef FIX_901_PARAMMC_DEAD_CODE - ivas_param_mc_metadata_open( mc_input_setup, hParamMC->lfe_index, ivas_total_brate, &hParamMC->hMetadataPMC ); -#else ivas_param_mc_metadata_open( mc_input_setup, ivas_total_brate, &hParamMC->hMetadataPMC ); -#endif - -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* init icc index states */ - for ( i = 0; i < PARAM_MC_PARAMETER_FRAMES; i++ ) - { - set_s( hParamMC->icc_map_index[i], -1, PARAM_MC_SZ_ICC_MAP ); - - for ( l = 0; l < hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_lfe; l++ ) - { - for ( k = 0; k < hParamMC->hMetadataPMC.icc_map_size_full; k++ ) - { - if ( hParamMC->hMetadataPMC.icc_mapping[i][l][0] == hParamMC->hMetadataPMC.icc_map_full[0][k] && hParamMC->hMetadataPMC.icc_mapping[i][l][1] == hParamMC->hMetadataPMC.icc_map_full[1][k] ) - { - hParamMC->icc_map_index[i][l] = k; - } - } - } - } -#endif /* Band Grouping */ if ( hParamMC->hMetadataPMC.num_parameter_bands == 20 ) { @@ -396,9 +326,6 @@ void ivas_param_mc_enc_close( return; } -#ifndef FIX_901_PARAMMC_DEAD_CODE - ivas_param_mc_metadata_close( &( *hParamMC )->hMetadataPMC ); -#endif ivas_FB_mixer_close( &( *hParamMC )->hFbMixer, sampling_rate, 0 ); free( ( *hParamMC ) ); @@ -532,18 +459,6 @@ void ivas_param_mc_enc( ivas_param_mc_quantize_ilds( hParamMC, Cy_sum[k], Cx_sum[k], k, nchan_inp, st_ivas->nchan_transport, ILD_idx, ILD_q[k] ); } -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* get icc map */ - if ( hParamMC->hMetadataPMC.flag_use_adaptive_icc_map == 1 ) - { - ivas_param_mc_enc_find_icc_map( hParamMC, Cx_sum, Cy_sum, ILD_q, nchan_inp, st_ivas->nchan_transport ); - } - else - { - ivas_param_mc_default_icc_map( hParamMC->hMetadataPMC.icc_mapping_conf, hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx] ); - } - -#endif /* ICC parameter quantization */ for ( k = 0; k < hParamMC->hMetadataPMC.nbands_coded; k += band_step ) { @@ -1010,230 +925,6 @@ static void ivas_param_mc_param_est_enc( return; } -#ifndef FIX_901_PARAMMC_DEAD_CODE -/*------------------------------------------------------------------------- - * ivas_param_mc_enc_find_icc_map() - * - * decide which ICCs out of all possible ICCs should be sent - *------------------------------------------------------------------------*/ - -static void ivas_param_mc_enc_find_icc_map( - PARAM_MC_ENC_HANDLE hParamMC, /* i/o: Parametric MC encoder handle */ - float Cx_sum[][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS], /* i : Covariance matrix for the downmixed frame */ - float Cy_sum[][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS], /* i : Covariance matrix for the original frame */ - float ILD_q[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_SZ_ILD_MAP], /* i : quantized ILDs */ - const int16_t nchan_input, /* i : number of input channels */ - const int16_t nchan_transport /* i : number of transport channels */ -) -{ - float Cproto_band[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - float Cx_band[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float mat_mult_buffer1[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - float mapped_error[55]; /* max number of possible mappings for 7.1+4 */ - int16_t icc_map_index[PARAM_MC_SZ_ICC_MAP]; - int16_t map_idx; - float *sorted_error_desc[PARAM_MC_SZ_ICC_MAP]; - int16_t cur_param_band, k, m, i; - int16_t bandstep; - int16_t last_element, el; - int16_t num_parameter_bands; - int16_t ch_idx1, ch_idx2; - int16_t icc_map_size; - int16_t icc_map_size_wo_lfe; - float Nrqq[MAX_OUTPUT_CHANNELS]; - float a[MAX_OUTPUT_CHANNELS]; - float Cy_band[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; - - /* Initialisations */ - num_parameter_bands = hParamMC->hMetadataPMC.nbands_coded; - bandstep = hParamMC->hMetadataPMC.bAttackPresent ? 2 : 1; - set_f( mapped_error, 0.0f, 55 ); - set_s( icc_map_index, -1, PARAM_MC_SZ_ICC_MAP ); - icc_map_size_wo_lfe = hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_wo_lfe; - icc_map_size = hParamMC->hMetadataPMC.icc_mapping_conf->icc_map_size_lfe; - - set_zero( Cy_band, nchan_input * nchan_input ); - - /* Estimate the target covariance like in the decoder using the - * already available qunantised ICLDs */ - for ( cur_param_band = 0; cur_param_band < num_parameter_bands; cur_param_band += bandstep ) - { - if ( hParamMC->hMetadataPMC.bAttackPresent || hParamMC->hMetadataPMC.coding_band_mapping[cur_param_band] == hParamMC->hMetadataPMC.param_frame_idx ) - { - /* transfer Cx_sum band to columnwise matrix */ - for ( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) - { - for ( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) - { - Cx_band[ch_idx1 + nchan_transport * ch_idx2] = Cx_sum[cur_param_band][ch_idx1][ch_idx2]; - } - } - - /* get estimated Cy from Cx and proto matrix */ - matrix_product( hParamMC->dmx_factors, nchan_input, nchan_transport, 0, - Cx_band, nchan_transport, nchan_transport, 0, - mat_mult_buffer1 ); - - matrix_product( mat_mult_buffer1, nchan_input, nchan_transport, 0, - hParamMC->dmx_factors, nchan_input, nchan_transport, 1, - Cproto_band ); - - set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); - - /*get back Nrg*/ - for ( k = 0; k < nchan_input; k++ ) - { - float ref_ener = 0.0f; - int16_t ref_channel_cnt; - int16_t ref_channel_idx; - - for ( ref_channel_cnt = 0; ref_channel_cnt < hParamMC->hMetadataPMC.ild_mapping_conf->num_ref_channels[k]; ref_channel_cnt++ ) - { - ref_channel_idx = hParamMC->hMetadataPMC.ild_mapping_conf->ref_channel_idx[k][ref_channel_cnt]; - ref_ener += Cx_band[ref_channel_idx + ref_channel_idx * nchan_transport]; - } - Nrqq[hParamMC->hMetadataPMC.ild_mapping_conf->ild_index[k]] = powf( 10, ILD_q[cur_param_band][k] / 10.0f ) * hParamMC->hMetadataPMC.ild_factors[k] * ref_ener; - } - - /* apply quantized ICLDs in the estimated covariance */ - for ( k = 0; k < nchan_input; k++ ) - { - a[k] = sqrtf( Nrqq[k] ) / ( sqrtf( Cproto_band[k + nchan_input * k] ) + EPSILON ); - v_multc( Cproto_band + k * nchan_input, a[k], Cproto_band + k * nchan_input, nchan_input ); - } - - for ( k = 0; k < nchan_input; k++ ) - { - int16_t l; - float *Cyp = Cproto_band + k; - float ap = a[k]; - - for ( l = 0; l < nchan_input; l++ ) - { - ( *Cyp ) *= ap; - Cyp += nchan_input; - } - } - - /* transfer Cy_sum band to columnwise matrix */ - for ( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) - { - for ( ch_idx2 = 0; ch_idx2 < nchan_input; ++ch_idx2 ) - { - Cy_band[ch_idx1 + nchan_transport * ch_idx2] = Cy_sum[cur_param_band][ch_idx1][ch_idx2]; - } - } - - /* apply quantized ICLDs on the input covariance */ - for ( k = 0; k < nchan_input; k++ ) - { - a[k] = sqrtf( Nrqq[k] ) / ( sqrtf( Cy_band[k + nchan_input * k] ) + EPSILON ); - v_multc( Cy_band + k * nchan_input, a[k], Cy_band + k * nchan_input, nchan_input ); - } - - for ( k = 0; k < nchan_input; k++ ) - { - int16_t l; - float *Cyp = Cy_band + k; - float ap = a[k]; - - for ( l = 0; l < nchan_input; l++ ) - { - ( *Cyp ) *= ap; - Cyp += nchan_input; - } - } - - /* for all possible mappings, get the cumulated error between estimated and real Cy */ - for ( map_idx = 0; map_idx < hParamMC->hMetadataPMC.icc_map_size_full - 1; map_idx++ ) - { - int16_t idx0 = hParamMC->hMetadataPMC.icc_map_full[0][map_idx]; - int16_t idx1 = hParamMC->hMetadataPMC.icc_map_full[1][map_idx]; - mapped_error[map_idx] += fabsf( Cproto_band[idx0 + idx1 * nchan_input] - Cy_band[idx0 + idx1 * nchan_input] ); - } - } - } - - /* put a small bias on the error for the past transmitted indices*/ - if ( !hParamMC->hMetadataPMC.bAttackPresent ) - { - for ( i = 0; i < icc_map_size_wo_lfe; i++ ) - { - mapped_error[hParamMC->icc_map_index[hParamMC->hMetadataPMC.param_frame_idx][i]] *= PARAM_MC_ICC_ERROR_BIAS_FAC; - } - } - - /* get the mappings with the biggest expected errors as those who will be transmitted */ - for ( i = 0; i < hParamMC->hMetadataPMC.icc_map_size_full - 1; i++ ) - { - for ( k = 0; k < icc_map_size_wo_lfe; k++ ) - { - if ( icc_map_index[k] == -1 ) - { - /* not filled yet, take the value */ - icc_map_index[k] = i; - sorted_error_desc[k] = &mapped_error[i]; - break; - } - else if ( mapped_error[i] > *sorted_error_desc[k] ) - { - /* push all others down and insert value here */ - for ( m = icc_map_size_wo_lfe - 1; m >= k + 1; m-- ) - { - icc_map_index[m] = icc_map_index[m - 1]; - sorted_error_desc[m] = sorted_error_desc[m - 1]; - } - icc_map_index[k] = i; - sorted_error_desc[k] = &mapped_error[i]; - break; - } - } - } - - /* the indices in ascending order, simple bubble sort */ - for ( last_element = icc_map_size_wo_lfe - 1; last_element >= 0; last_element-- ) - { - for ( el = 0; el < last_element; el++ ) - { - if ( icc_map_index[el] > icc_map_index[el + 1] ) - { - int16_t swp_el = icc_map_index[el]; - icc_map_index[el] = icc_map_index[el + 1]; - icc_map_index[el + 1] = swp_el; - } - } - } - - /* last icc map element is always the C/LFE icc */ - icc_map_index[icc_map_size - 1] = hParamMC->hMetadataPMC.icc_map_size_full - 1; - - /* create map and map index, map index is sorted in ascending order*/ - if ( hParamMC->hMetadataPMC.bAttackPresent ) - { - for ( k = 0; k < PARAM_MC_PARAMETER_FRAMES; k++ ) - { - for ( i = 0; i < icc_map_size; i++ ) - { - hParamMC->hMetadataPMC.icc_mapping[k][i][0] = hParamMC->hMetadataPMC.icc_map_full[0][icc_map_index[i]]; - hParamMC->hMetadataPMC.icc_mapping[k][i][1] = hParamMC->hMetadataPMC.icc_map_full[1][icc_map_index[i]]; - } - mvs2s( icc_map_index, hParamMC->icc_map_index[k], icc_map_size ); - } - } - else - { - for ( i = 0; i < icc_map_size; i++ ) - { - hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][i][0] = hParamMC->hMetadataPMC.icc_map_full[0][icc_map_index[i]]; - hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][i][1] = hParamMC->hMetadataPMC.icc_map_full[1][icc_map_index[i]]; - } - - mvs2s( icc_map_index, hParamMC->icc_map_index[hParamMC->hMetadataPMC.param_frame_idx], icc_map_size ); - } - - return; -} -#endif /*------------------------------------------------------------------------- * ivas_param_mc_quantize_ilds() @@ -1471,13 +1162,8 @@ static void ivas_param_mc_quantize_iccs( /* Reduce set of parameters and quantize them */ for ( k = 0; k < num_iccs_to_code; ++k ) { -#ifndef FIX_901_PARAMMC_DEAD_CODE - tmp_map[0] = hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][k][0]; - tmp_map[1] = hParamMC->hMetadataPMC.icc_mapping[hParamMC->hMetadataPMC.param_frame_idx][k][1]; -#else tmp_map[0] = hParamMC->hMetadataPMC.icc_mapping_conf->icc_mapping[k][0]; tmp_map[1] = hParamMC->hMetadataPMC.icc_mapping_conf->icc_mapping[k][1]; -#endif ICC_vect[k] = Cy[tmp_map[0]][tmp_map[1]]; } @@ -1655,26 +1341,6 @@ static void ivas_param_mc_write_bs( nbands = hParamMC->hMetadataPMC.nbands_coded / band_step + ( ( hParamMC->hMetadataPMC.nbands_coded % band_step ) ? 1 : 0 ); } -#ifndef FIX_901_PARAMMC_DEAD_CODE - /* Encoding of the ICC mapping done as simple bitmap */ - if ( hParamMC->hMetadataPMC.flag_use_adaptive_icc_map == 1 ) - { - uint16_t *bit_buffer_icc_mapping = &bit_buffer[*bit_pos]; - - for ( i = 0; i < hParamMC->hMetadataPMC.icc_map_size_full - 1; i++ ) - { - bit_buffer_icc_mapping[i] = 0; - } - - for ( i = 0; i < icc_map_size_wo_lfe; i++ ) - { - bit_buffer_icc_mapping[hParamMC->icc_map_index[hParamMC->hMetadataPMC.param_frame_idx][i]] = 1; - } - - *bit_pos += hParamMC->hMetadataPMC.icc_map_size_full - 1; - } - -#endif ivas_param_mc_encode_parameter( ICC_idx, &hParamMC->hMetadataPMC, &hParamMC->hMetadataPMC.icc_coding, nbands, band_step, icc_map_size_wo_lfe, icc_map_size, bit_buffer, bit_pos ); -- GitLab From 589ef91e302eaf44cc60c0a0fd337fc2268423e5 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:50:49 +0100 Subject: [PATCH 448/601] [cleanup] accept FIX_1008_EXTORIENT_TARGET_INTERPOLATION --- lib_com/options.h | 1 - lib_rend/ivas_rotation.c | 11 ----------- 2 files changed, 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1942bd5405..6873d94adc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index b9f05c9f2d..48c52995cb 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -898,18 +898,7 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->num_subframes = num_subframes; ( *hCombinedOrientationData )->interpolationCoefficient = 1.0f; ( *hCombinedOrientationData )->interpolationIncrement = 1.0f; -#ifndef FIX_1008_EXTORIENT_TARGET_INTERPOLATION - if ( num_subframes == 1 ) - { - ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 2000; - } - else - { -#endif ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; -#ifndef FIX_1008_EXTORIENT_TARGET_INTERPOLATION - } -#endif ( *hCombinedOrientationData )->lrSwitchedNext = 0; ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; ( *hCombinedOrientationData )->lrSwitchInterpVal = 0.0f; -- GitLab From 21f0026a3b0988b3a262a7fe03358bd5842d9fcc Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:56:04 +0100 Subject: [PATCH 449/601] [cleanup] accept NONBE_FIX_978_MC_TDREND_REVERB --- lib_com/options.h | 1 - lib_dec/ivas_init_dec.c | 4 ---- lib_dec/ivas_ism_dec.c | 4 ---- lib_dec/ivas_objectRenderer_internal.c | 8 -------- 4 files changed, 17 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6873d94adc..d3b35a40e1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ #define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 1e6ac794eb..f91b897ea7 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2010,11 +2010,7 @@ ivas_error ivas_init_decoder( { return error; } -#ifdef NONBE_FIX_978_MC_TDREND_REVERB if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#endif // DEBUG { if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 4c0c0601cc..1a43d3ef07 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -199,11 +199,7 @@ static ivas_error ivas_ism_bitrate_switching_dec( { return error; } -#ifdef NONBE_FIX_978_MC_TDREND_REVERB if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#endif { if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 8a3189bc99..907affdae1 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -187,11 +187,7 @@ ivas_error ivas_td_binaural_renderer_sf( { return error; } -#ifdef NONBE_FIX_978_MC_TDREND_REVERB if ( st_ivas->hRenderConfig != NULL && st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#endif { if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) { @@ -206,11 +202,7 @@ ivas_error ivas_td_binaural_renderer_sf( { return error; } -#ifdef NONBE_FIX_978_MC_TDREND_REVERB if ( st_ivas->hRenderConfig != NULL && st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#endif { /* add reverb to rendered signals */ v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame ); -- GitLab From 6bb65670ee6f8f723622d65a59e817f501f9e46f Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:58:01 +0100 Subject: [PATCH 450/601] [cleanup] accept NONBE_FIX_984_OMASA_EXT_OUTPUT --- apps/decoder.c | 28 --------------- apps/renderer.c | 4 --- lib_com/ivas_cnst.h | 4 --- lib_com/ivas_prot.h | 2 -- lib_com/options.h | 1 - lib_dec/ivas_init_dec.c | 20 ----------- lib_dec/ivas_jbm_dec.c | 20 ----------- lib_dec/ivas_masa_dec.c | 31 ---------------- lib_dec/ivas_omasa_dec.c | 47 ------------------------ lib_dec/ivas_output_config.c | 4 --- lib_dec/ivas_sba_dec.c | 4 --- lib_dec/ivas_stat_dec.h | 4 --- lib_dec/lib_dec.c | 26 -------------- lib_enc/ivas_masa_enc.c | 12 ------- lib_rend/ivas_output_init.c | 2 -- lib_util/masa_file_writer.c | 70 ------------------------------------ lib_util/masa_file_writer.h | 4 --- 17 files changed, 283 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index ac560234ce..142c8a4ac6 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1990,12 +1990,8 @@ static ivas_error initOnFirstGoodFrame( for ( int16_t j = 0; j < numInitialBadFrames; ++j ) { -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT float delayMs = (float) ( pFullDelayNumSamples[0] ) / (float) ( *delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); return error; @@ -2501,7 +2497,6 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t fullDelayNumSamples[3]; float delayMs; @@ -2510,19 +2505,14 @@ static ivas_error decodeG192( { fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); } -#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -2657,7 +2647,6 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t fullDelayNumSamples[3]; float delayMs; @@ -2665,19 +2654,14 @@ static ivas_error decodeG192( { fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); } -#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -3352,7 +3336,6 @@ static ivas_error decodeVoIP( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t fullDelayNumSamples[3]; float delayMs; @@ -3361,19 +3344,14 @@ static ivas_error decodeVoIP( { fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); } -#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 1 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -3459,7 +3437,6 @@ static ivas_error decodeVoIP( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t fullDelayNumSamples[3]; float delayMs; @@ -3468,19 +3445,14 @@ static ivas_error decodeVoIP( { fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); } -#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; diff --git a/apps/renderer.c b/apps/renderer.c index 007ef477e7..8a9e0b48f8 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -2110,11 +2110,7 @@ int main( } } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput, NULL ) ) != IVAS_ERR_OK ) /* NULL -> use default metadata delay settings */ -#else - if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); } diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e4946e9725..4960db4712 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -118,13 +118,9 @@ typedef enum RENDERER_NON_DIEGETIC_DOWNMIX, RENDERER_OSBA_STEREO, RENDERER_OSBA_AMBI, -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT RENDERER_OSBA_LS, RENDERER_OMASA_OBJECT_EXT, RENDERER_OMASA_MIX_EXT -#else - RENDERER_OSBA_LS -#endif } RENDERER_TYPE; #ifdef SPLIT_REND_WITH_HEAD_ROT diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index f0fe6d3cb4..e0e3a40dff 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5768,7 +5768,6 @@ void ivas_omasa_rearrange_channels( const int16_t output_frame /* i : output frame length per channel */ ); -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT ivas_error ivas_omasa_combine_separate_ism_with_masa_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); @@ -5791,7 +5790,6 @@ void ivas_omasa_render_objects_from_mix( const int16_t output_frame /* i : output frame length per channel */ ); -#endif void ivas_omasa_dirac_rend_jbm( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamplesAsked, /* i : number of samples requested */ diff --git a/lib_com/options.h b/lib_com/options.h index d3b35a40e1..7a1293a32f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ #define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index f91b897ea7..ffb0dbacd0 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -385,7 +385,6 @@ ivas_error ivas_dec_setup( st_ivas->nchan_transport = 1; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* this should be non-zero if original input format was MASA_ISM_FORMAT */ st_ivas->nchan_ism = st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 3] + 2 * st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 2]; @@ -401,7 +400,6 @@ ivas_error ivas_dec_setup( element_mode_flag = 1; } -#endif if ( st_ivas->ini_frame > 0 ) { /* reconfigure in case a change of operation mode is detected */ @@ -1156,11 +1154,7 @@ ivas_error ivas_init_decoder( hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); hDecoderConfig->nchan_out += st_ivas->nchan_ism; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) -#else - else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) -#endif { hDecoderConfig->nchan_out = st_ivas->nchan_transport + st_ivas->nchan_ism; } @@ -2112,7 +2106,6 @@ ivas_error ivas_init_decoder( return error; } } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { @@ -2137,7 +2130,6 @@ ivas_error ivas_init_decoder( return error; } } -#endif } if ( ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && @@ -3001,7 +2993,6 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbSyntheses = 0; } break; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT case RENDERER_OMASA_OBJECT_EXT: *numCldfbAnalyses = st_ivas->nchan_transport; *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; @@ -3010,7 +3001,6 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbAnalyses = st_ivas->nchan_transport + 1; *numCldfbSyntheses = 0; break; -#endif default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } @@ -3149,16 +3139,6 @@ static ivas_error doSanityChecks_IVAS( return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); } } -#ifndef NONBE_FIX_984_OMASA_EXT_OUTPUT - - if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) - { - if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); - } - } -#endif #ifdef DEBUGGING if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != IVAS_AUDIO_CONFIG_BINAURAL && output_config != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 31018089c1..851d1397e7 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -311,7 +311,6 @@ ivas_error ivas_jbm_dec_tc( if ( st_ivas->ivas_format == MASA_FORMAT ) { ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* external output */ if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) @@ -323,7 +322,6 @@ ivas_error ivas_jbm_dec_tc( ivas_omasa_rearrange_channels( p_output, st_ivas->nchan_ism, output_frame ); } -#endif } else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { @@ -400,7 +398,6 @@ ivas_error ivas_jbm_dec_tc( } else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); @@ -415,15 +412,6 @@ ivas_error ivas_jbm_dec_tc( /* Extract objects from MASA, output MASA + all objects (i.e., extracted and separated objects) */ ivas_omasa_render_objects_from_mix( st_ivas, p_output, st_ivas->nchan_ism, output_frame ); } -#else - /* sanity check in case of bitrate switching */ - if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); - } - - ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame ); -#endif ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); } @@ -906,7 +894,6 @@ void ivas_jbm_dec_feed_tc_to_renderer( } else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); @@ -914,7 +901,6 @@ void ivas_jbm_dec_feed_tc_to_renderer( } else { -#endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size ); @@ -949,9 +935,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( delay_signal( st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size ); } } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT } -#endif } else if ( st_ivas->ivas_format == MC_FORMAT ) { @@ -1217,13 +1201,11 @@ ivas_error ivas_jbm_dec_render( { ivas_omasa_dirac_rend_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT || st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT ) { ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); ivas_omasa_rearrange_channels( p_output, st_ivas->nchan_ism, *nSamplesRendered ); } -#endif } else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) { @@ -2731,10 +2713,8 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( case RENDERER_PARAM_ISM: case RENDERER_BINAURAL_MIXER_CONV: case RENDERER_BINAURAL_MIXER_CONV_ROOM: -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT case RENDERER_OMASA_OBJECT_EXT: case RENDERER_OMASA_MIX_EXT: -#endif case RENDERER_OSBA_AMBI: case RENDERER_OSBA_LS: buffer_mode = TC_BUFFER_MODE_RENDERER; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 3984b79c54..3957fa0c5f 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -250,7 +250,6 @@ ivas_error ivas_masa_decode( } } } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* read 2 bits: '00' - MASA format at the encoder @@ -270,20 +269,6 @@ ivas_error ivas_masa_decode( { hMasa->config.input_ivas_format = MASA_ISM_FORMAT; } -#else - /* read the MASA_ISM_FORMAT bit */ - byteBuffer = st->bit_stream[( st->next_bit_pos )--]; - if ( byteBuffer == 1 ) - { - hMasa->config.input_ivas_format = MASA_ISM_FORMAT; - } - else - { - hMasa->config.input_ivas_format = MASA_FORMAT; - } - /* reserved bit */ - byteBuffer = st->bit_stream[( st->next_bit_pos )--]; -#endif *nb_bits_read += MASA_HEADER_BITS; /* read number of directions */ @@ -365,13 +350,11 @@ ivas_error ivas_masa_decode( } } } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ); } -#endif else { *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, @@ -491,12 +474,10 @@ ivas_error ivas_masa_decode( dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */ ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 ); } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length; } -#endif if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { @@ -616,14 +597,12 @@ ivas_error ivas_masa_dec_open( } ism_total_brate = 0; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* ISM metadata */ if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hIsmMetaData[0] != NULL && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { /* these are not needed -> clean. EXT metafile writer in OMASA needs only the number of ISMs and writes default null-data */ ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); } -#endif if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) { for ( i = 0; i < st_ivas->nSCE; i++ ) @@ -694,13 +673,11 @@ ivas_error ivas_masa_dec_open( nchan_transport = 1; nchan_to_allocate = 1; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) ) { nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism; nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism; } -#endif else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC ) ) { /* addtl channel for CNG */ @@ -1499,16 +1476,12 @@ ivas_error ivas_masa_dec_reconfigure( if ( st_ivas->ivas_format == MASA_FORMAT ) { -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) { st_ivas->nchan_ism = 0; /* Initialization if it has not been already read from the end of the bitstream at the same time with reading of the format: nchan_ism is needed in MASA format because for the EXT output in MASA-only (pre-rendering mode of OMASA) the number of ISMs to output correct number of empty objects is needed */ } -#else - st_ivas->nchan_ism = 0; -#endif st_ivas->ism_mode = ISM_MODE_NONE; } @@ -1564,13 +1537,11 @@ ivas_error ivas_masa_dec_reconfigure( /* addtl channel for CNG */ tc_nchan_to_allocate++; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) ) { tc_nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism; tc_nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism; } -#endif if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || buffer_mode_new != st_ivas->hTcBuffer->tc_buffer_mode ) { @@ -2546,13 +2517,11 @@ static int16_t ivas_decode_masaism_metadata( { hMasaIsmData->energy_ratio_ism[dir][meta_write_index][b] = energy_ratio_ism[i][band][dir]; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( hMasaIsmData->hExtData != NULL ) { hMasaIsmData->hExtData->masa_render_masa_to_total[meta_write_index][b] = hMasaIsmData->masa_to_total_energy_ratio[i][band]; } -#endif } } } diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index ab032e2440..763c37a709 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -32,9 +32,7 @@ #include "options.h" #include -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #include -#endif #include "ivas_cnst.h" #include "ivas_prot.h" #include "prot.h" @@ -45,13 +43,11 @@ #endif #include "wmc_auto.h" -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /*------------------------------------------------------------------------- * Local constants *------------------------------------------------------------------------*/ #define EXT_RENDER_IIR_FAC 0.95f -#endif /*-------------------------------------------------------------------* * ivas_omasa_data_open() @@ -107,7 +103,6 @@ ivas_error ivas_omasa_data_open( set_s( hMasaIsmData->azimuth_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); set_s( hMasaIsmData->elevation_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT hMasaIsmData->hExtData = NULL; if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { @@ -141,7 +136,6 @@ ivas_error ivas_omasa_data_open( hMasaIsmData->hExtData = hExtData; } -#endif st_ivas->hMasaIsmData = hMasaIsmData; return IVAS_ERR_OK; @@ -175,14 +169,12 @@ void ivas_omasa_data_close( ( *hMasaIsmData )->delayBuffer = NULL; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( ( *hMasaIsmData )->hExtData != NULL ) { free( ( *hMasaIsmData )->hExtData ); ( *hMasaIsmData )->hExtData = NULL; } -#endif free( *hMasaIsmData ); *hMasaIsmData = NULL; @@ -305,7 +297,6 @@ ivas_error ivas_omasa_dec_config( /* ISM MD reconfig. */ n_MD = 0; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { /* the full number of hIsmMetaData are needed for EXT output */ @@ -347,33 +338,6 @@ ivas_error ivas_omasa_dec_config( ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); } -#else - if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) - { - n_MD = 1; - - if ( st_ivas->hIsmMetaData[0] == NULL ) - { - if ( ( error = ivas_ism_metadata_dec_create( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) - { - n_MD = st_ivas->nchan_ism; - - ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); - - if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); -#endif st_ivas->hCPE[0]->element_brate = ivas_total_brate - ism_total_brate; @@ -403,14 +367,9 @@ ivas_error ivas_omasa_dec_config( } /* objects renderer reconfig. */ -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->hMasaIsmData != NULL || st_ivas->hIsmRendererData != NULL ) { /* this calls also ivas_ism_renderer_close() closing st_ivas->hIsmRendererData used by the EXT renderers. also cleans st_ivas->hMasaIsmData */ -#else - if ( st_ivas->hMasaIsmData != NULL ) - { -#endif ivas_omasa_separate_object_renderer_close( st_ivas ); } @@ -463,7 +422,6 @@ ivas_error ivas_omasa_dec_config( } } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT ) { /* Allocate 'hIsmRendererData' handle */ @@ -490,7 +448,6 @@ ivas_error ivas_omasa_dec_config( } } -#endif /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ @@ -692,7 +649,6 @@ ivas_error ivas_omasa_ism_metadata_dec( } } } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->azimuth + 0.5f ); @@ -709,7 +665,6 @@ ivas_error ivas_omasa_ism_metadata_dec( st_ivas->hMasaIsmData->elevation_separated_ism[block] = elevation_ism; } } -#endif } return IVAS_ERR_OK; @@ -835,7 +790,6 @@ void ivas_omasa_rearrange_channels( return; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /*-------------------------------------------------------------------------* * ivas_omasa_combine_separate_ism_with_masa_open() @@ -1305,4 +1259,3 @@ void ivas_omasa_render_objects_from_mix( return; } -#endif diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index c93b16dcdb..1be9e61829 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -419,7 +419,6 @@ void ivas_renderer_select( } else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { *renderer_type = RENDERER_OMASA_OBJECT_EXT; @@ -432,9 +431,6 @@ void ivas_renderer_select( { *renderer_type = RENDERER_DISABLE; } -#else - *renderer_type = RENDERER_DISABLE; -#endif } } else if ( st_ivas->ivas_format == MC_FORMAT ) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 897df0c96f..af102dd96e 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -693,11 +693,7 @@ void ivas_sba_dec_digest_tc( int16_t ch_idx, nchan_transport; /* set the md map */ -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( st_ivas->hDirAC || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) -#else - if ( st_ivas->hDirAC ) -#endif { ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index dccd1391a5..4deb6748e2 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -873,7 +873,6 @@ typedef struct ivas_masa_decoder_struct } MASA_DECODER, *MASA_DECODER_HANDLE; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* Data structure for MASA_ISM EXT rendering */ typedef struct ivas_masa_ism_ext_data_structure { @@ -886,7 +885,6 @@ typedef struct ivas_masa_ism_ext_data_structure float masa_render_masa_to_total[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR][CLDFB_NO_CHANNELS_MAX]; } MASA_ISM_EXT_DATA, *MASA_ISM_EXT_DATA_HANDLE; -#endif /* Data structure for MASA_ISM rendering */ typedef struct ivas_masa_ism_data_structure @@ -918,9 +916,7 @@ typedef struct ivas_masa_ism_data_structure int16_t delayBuffer_size; int16_t delayBuffer_nchan; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_ISM_EXT_DATA_HANDLE hExtData; -#endif } MASA_ISM_DATA, *MASA_ISM_DATA_HANDLE; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index d06e882f4d..4e9dc2ac03 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1436,16 +1436,13 @@ ivas_error IVAS_DEC_GetNumObjects( uint16_t *numObjects /* o : number of objects for which the decoder has been configured */ ) { -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t is_masa_ism; is_masa_ism = 0; -#endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( hIvasDec->st_ivas->hMasa != NULL ) { @@ -1455,9 +1452,6 @@ ivas_error IVAS_DEC_GetNumObjects( } } if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT || is_masa_ism ) -#else - if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT ) -#endif { *numObjects = hIvasDec->st_ivas->nchan_ism; } @@ -1491,12 +1485,10 @@ ivas_error IVAS_DEC_GetFormat( *format = IVAS_DEC_BS_UNKOWN; } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( *format == IVAS_DEC_BS_MASA && hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) { *format = IVAS_DEC_BS_MASA_ISM; } -#endif return IVAS_ERR_OK; } @@ -1605,10 +1597,8 @@ ivas_error IVAS_DEC_GetObjectMetadata( { Decoder_Struct *st_ivas; ISM_METADATA_HANDLE hIsmMeta; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t is_masa_ism; is_masa_ism = 0; -#endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { @@ -1616,7 +1606,6 @@ ivas_error IVAS_DEC_GetObjectMetadata( } st_ivas = hIvasDec->st_ivas; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( hIvasDec->st_ivas->hMasa != NULL ) { if ( hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) @@ -1625,9 +1614,6 @@ ivas_error IVAS_DEC_GetObjectMetadata( } } if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT && is_masa_ism == 0 ) -#else - if ( st_ivas->ivas_format != ISM_FORMAT && st_ivas->ivas_format != MASA_ISM_FORMAT && st_ivas->ivas_format != SBA_ISM_FORMAT ) -#endif { return IVAS_ERR_WRONG_MODE; } @@ -1639,11 +1625,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( hIsmMeta = st_ivas->hIsmMetaData[objectIdx]; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( hIsmMeta == NULL || zero_flag || ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) -#else - if ( hIsmMeta == NULL || zero_flag ) -#endif { metadata->azimuth = 0.f; metadata->elevation = 0.f; @@ -2222,18 +2204,10 @@ ivas_error IVAS_DEC_GetDelay( st_ivas = hIvasDec->st_ivas; hDecoderConfig = st_ivas->hDecoderConfig; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #ifdef SPLIT_REND_WITH_HEAD_ROT nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbSynDec[0], hDecoderConfig->output_config ) ); #else nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbSynDec[0] ) ); -#endif -#else -#ifdef SPLIT_REND_WITH_HEAD_ROT - nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0], hDecoderConfig->output_config ) ); -#else - nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0] ) ); -#endif #endif nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index ac46219e40..831e343d72 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -418,7 +418,6 @@ ivas_error ivas_masa_encode( } else { -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { /* use the MASA number of transport channels bit to signal if there are 3 or 4 objects */ @@ -433,18 +432,14 @@ ivas_error ivas_masa_encode( } else { -#endif /* write the number of MASA transport channels */ push_next_indice( hMetaData, nchan_transport - 1, MASA_TRANSP_BITS ); -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT } -#endif hQMetaData->metadata_max_bits -= MASA_TRANSP_BITS; } if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( nchan_ism <= 3 ) { push_next_indice( hMetaData, nchan_ism, MASA_HEADER_BITS ); @@ -454,13 +449,6 @@ ivas_error ivas_masa_encode( push_next_indice( hMetaData, nchan_ism - 1, MASA_HEADER_BITS ); } hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; -#else - /* signal MASA_ISM_FORMAT to decoder */ - push_next_indice( hMetaData, 1, 1 ); - /* write reserved bit */ - push_next_indice( hMetaData, 0, MASA_HEADER_BITS - 1 ); - hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; -#endif } else { diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index 1ac22a5543..5d7d4d610f 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -337,12 +337,10 @@ int16_t ivas_get_nchan_buffers_dec( nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); } -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->nchan_ism > 0 ) { nchan_out_buff = st_ivas->nchan_ism + CPE_CHANNELS; } -#endif } else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 1f708d7b1b..12bcd65b19 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -41,20 +41,12 @@ typedef struct masaMetaDelayStorage { MASA_DECRIPTIVE_META descriptiveMeta; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; uint8_t prevDelay; -#else - uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; - uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; -#endif } MASA_META_DELAY_STORAGE; struct MasaFileWriter @@ -96,23 +88,16 @@ static void getExtMasaMetadataFileName( static void delayMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: New input metadata which is inplace replaced with delayed metadata frame */ -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ uint8_t delayNsf -#else - MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ -#endif ) { int16_t dir, sf, band; uint8_t currentNumberOfDirections; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT int16_t storeReadOffset; -#endif /* Move meta to delay and output. Always use two directions as the metadata is prepared to contain zero energy second direction * if there is 1dir meta. */ -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* stable state expected results delay change expected results delayNsf = 2 delayNsf = 3 delayNsf = 3 (from 2) delayNsf = 2 (from 3) ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[0] (prev ext[1]) ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[1] (prev ext[2]) @@ -183,43 +168,6 @@ static void delayMasaMetadata( } } -#else - for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES - DELAY_MASA_PARAM_DEC_SFR; sf++ ) - { - for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) - { - uint16_t temp_u16; - uint8_t temp_u8; - for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) - { - temp_u16 = delayStorage->directionIndex[dir][sf][band]; - delayStorage->directionIndex[dir][sf][band] = extOutMeta->directionIndex[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->directionIndex[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->directionIndex[dir][sf][band]; - extOutMeta->directionIndex[dir][sf][band] = temp_u16; - - temp_u8 = delayStorage->directToTotalRatio[dir][sf][band]; - delayStorage->directToTotalRatio[dir][sf][band] = extOutMeta->directToTotalRatio[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->directToTotalRatio[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->directToTotalRatio[dir][sf][band]; - extOutMeta->directToTotalRatio[dir][sf][band] = temp_u8; - - temp_u8 = delayStorage->spreadCoherence[dir][sf][band]; - delayStorage->spreadCoherence[dir][sf][band] = extOutMeta->spreadCoherence[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->spreadCoherence[dir][sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->spreadCoherence[dir][sf][band]; - extOutMeta->spreadCoherence[dir][sf][band] = temp_u8; - } - - temp_u8 = delayStorage->surroundCoherence[sf][band]; - delayStorage->surroundCoherence[sf][band] = extOutMeta->surroundCoherence[sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->surroundCoherence[sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->surroundCoherence[sf][band]; - extOutMeta->surroundCoherence[sf][band] = temp_u8; - - temp_u8 = delayStorage->diffuseToTotalRatio[sf][band]; - delayStorage->diffuseToTotalRatio[sf][band] = extOutMeta->diffuseToTotalRatio[sf + DELAY_MASA_PARAM_DEC_SFR][band]; - extOutMeta->diffuseToTotalRatio[sf + DELAY_MASA_PARAM_DEC_SFR][band] = extOutMeta->diffuseToTotalRatio[sf][band]; - extOutMeta->diffuseToTotalRatio[sf][band] = temp_u8; - } - } -#endif /* Finalize descriptive meta by using new frame except for number of directions which is the larger of the two */ currentNumberOfDirections = extOutMeta->descriptiveMeta.numberOfDirections; @@ -229,10 +177,8 @@ static void delayMasaMetadata( } delayStorage->descriptiveMeta.numberOfDirections = currentNumberOfDirections; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT delayStorage->prevDelay = delayNsf; -#endif return; } @@ -275,9 +221,7 @@ ivas_error MasaFileWriter_open( if ( !delayCompensationEnabled ) { self->delayStorage = calloc( sizeof( MASA_META_DELAY_STORAGE ), 1 ); -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT self->delayStorage->prevDelay = DELAY_MASA_PARAM_DEC_SFR; -#endif } *masaWriter = self; @@ -294,12 +238,8 @@ ivas_error MasaFileWriter_open( ivas_error MasaFileWriter_writeFrame( MasaFileWriter *self, /* i/o: MasaFileWriter handle */ -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ -#else - MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ -#endif ) { if ( self == NULL ) @@ -311,7 +251,6 @@ ivas_error MasaFileWriter_writeFrame( int16_t i, sf, dir, numDirections; uint8_t writeTempOther[MASA_FREQUENCY_BANDS]; -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* If delay storage has been reserved, then we are in the normal mode for the decoder * (i.e., no delay compensation for PCM) which means that metadata should be delayed * by two or three subframes (10 or 15 ms). Descriptive metadata is a combined result. */ @@ -321,15 +260,6 @@ ivas_error MasaFileWriter_writeFrame( delayMasaMetadata( hMasaExtOutMeta, self->delayStorage, delayFrames ); } -#else - /* If delay storage has been reserved, then we are in the normal mode for the decoder - * (i.e., no delay compensation for PCM) which means that metadata should be delayed - * by two subframes (10 ms). Descriptive metadata is a combined result. */ - if ( self->delayStorage ) - { - delayMasaMetadata( hMasaExtOutMeta, self->delayStorage ); - } -#endif numDirections = hMasaExtOutMeta->descriptiveMeta.numberOfDirections + 1; diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index 11495a53f0..c6caf0a3f9 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -49,12 +49,8 @@ ivas_error MasaFileWriter_open( ivas_error MasaFileWriter_writeFrame( MasaFileWriter *self, /* i/o: MasaFileWriter handle */ -#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ -#else - IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ -#endif ); void MasaFileWriter_close( -- GitLab From aed5ed563aa9b3b850f0ab8a0a2f7d8f91579082 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:58:46 +0100 Subject: [PATCH 451/601] [cleanup] accept NONBE_FIX_1000_G1_G2_SWB_TBE --- lib_com/options.h | 1 - lib_com/swb_tbe_com.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7a1293a32f..8e54f7d35e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1000_G1_G2_SWB_TBE /* VA: issue 1000: avoid div by zero due to g1 + g2 being zero in SWB TBE */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index 8e21ef1748..310c583218 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -939,12 +939,10 @@ void GenShapedSHBExcitation( den = 4.0f * c0 * c2 - c4 * c4; -#ifdef NONBE_FIX_1000_G1_G2_SWB_TBE if ( den == 0.0f ) { den = 1e-7f; } -#endif g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; @@ -972,7 +970,6 @@ void GenShapedSHBExcitation( else { /* normalize gain */ -#ifdef NONBE_FIX_1000_G1_G2_SWB_TBE temp = 0.0f; if ( g1 + g2 == 0.0f ) { @@ -980,9 +977,6 @@ void GenShapedSHBExcitation( } g = g2 / ( g1 + g2 + temp ); -#else - g = g2 / ( g1 + g2 ); -#endif /* quantization of the mixing factor */ cbsize = 1 << NUM_BITS_SHB_VF; -- GitLab From bb1f29a75903483a18ce26e305b02ff2c98b03b0 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 10:59:32 +0100 Subject: [PATCH 452/601] [cleanup] accept NONBE_FIX_999_JBM_MCT_FLUSH --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8e54f7d35e..e640cbc495 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 851d1397e7..128754273c 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1682,11 +1682,7 @@ ivas_error ivas_jbm_dec_flush_renderer( ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); } -#ifdef NONBE_FIX_999_JBM_MCT_FLUSH else if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD ) -#else - else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) -#endif { if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) { @@ -1695,12 +1691,10 @@ ivas_error ivas_jbm_dec_flush_renderer( ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); } -#ifdef NONBE_FIX_999_JBM_MCT_FLUSH else { return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong renderer in MCT VoIP renderer flushing!" ); } -#endif } else { -- GitLab From 1252e78bf92b727a13f3c145778a588b57c55946 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 11:00:14 +0100 Subject: [PATCH 453/601] [cleanup] accept NONBE_FIX_991_PARAMBIN_BINARY_HRTF --- lib_com/options.h | 1 - lib_dec/ivas_dirac_dec.c | 4 - lib_dec/ivas_init_dec.c | 4 - lib_dec/ivas_ism_dec.c | 8 -- lib_rend/ivas_dirac_dec_binaural_functions.c | 84 -------------------- lib_rend/ivas_prot_rend.h | 4 - lib_rend/ivas_stat_rend.h | 16 ---- lib_rend/lib_rend.c | 18 ----- 8 files changed, 139 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e640cbc495..59c66a6a6b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ #define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 8e3f383fea..cd277123bb 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -872,11 +872,7 @@ 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; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index ffb0dbacd0..b92dc19ded 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1989,11 +1989,7 @@ 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; } diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 1a43d3ef07..b23b16ca63 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -263,11 +263,7 @@ 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; } @@ -298,11 +294,7 @@ 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; } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index f4e55a63d4..f318efbf53 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -119,17 +119,9 @@ 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] ); @@ -149,11 +141,7 @@ 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; @@ -185,9 +173,7 @@ 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; @@ -239,11 +225,7 @@ 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 ) || @@ -258,11 +240,7 @@ 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; } @@ -326,9 +304,7 @@ 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; @@ -1316,11 +1292,7 @@ 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->phHrtfParambin ); -#else - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked ); -#endif if ( hDiracDecBin->renderStereoOutputInsteadOfBinaural ) { @@ -1363,11 +1335,7 @@ 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->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; @@ -1377,11 +1345,7 @@ 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->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; @@ -1770,11 +1734,7 @@ 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 ) { @@ -1817,11 +1777,7 @@ 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; @@ -1831,11 +1787,7 @@ 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; @@ -2219,11 +2171,7 @@ 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; @@ -2998,12 +2946,8 @@ static void getDirectPartGains( const uint8_t renderStereoOutputInsteadOfBinaural, float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF const int16_t isHeadtracked, HRTFS_PARAMBIN_HANDLE hHrtfParambin -#else - const int16_t isHeadtracked -#endif ) { float aziRad, eleRad; @@ -3049,11 +2993,7 @@ 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 { @@ -3063,11 +3003,7 @@ 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 } } @@ -3084,21 +3020,15 @@ static void hrtfShGetHrtf( float *rRealp, float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF const int16_t useCachedValue, HRTFS_PARAMBIN_HANDLE hHrtfParambin -#else - const int16_t useCachedValue -#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; @@ -3112,17 +3042,10 @@ 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 @@ -3136,17 +3059,10 @@ 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]; } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 3767a7fea2..196ed72f5e 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -245,11 +245,7 @@ void ivas_masa_ext_rend_parambin_render( ); 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 ); void ivas_dirac_dec_close_binaural_data( diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 516d6a7ee2..672f264211 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -500,7 +500,6 @@ typedef struct ivas_diffuse_distribution_data_structure } DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE; -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Parametric binaural renderer HRTF structure */ typedef struct ivas_hrtfs_parambin_struct { @@ -512,7 +511,6 @@ typedef struct ivas_hrtfs_parambin_struct float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; } HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; -#endif /* Parametric binaural data structure */ typedef struct ivas_dirac_dec_binaural_data_structure @@ -549,9 +547,7 @@ typedef struct ivas_dirac_dec_binaural_data_structure ivas_td_decorr_state_t *hTdDecorr; float reqularizationFactor; -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF HRTFS_PARAMBIN_HANDLE *phHrtfParambin; -#endif DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; @@ -1331,18 +1327,6 @@ typedef struct ivas_hrtfs_fastconv_struct } HRTFS_FASTCONV, *HRTFS_FASTCONV_HANDLE; -#ifndef NONBE_FIX_991_PARAMBIN_BINARY_HRTF -typedef struct ivas_hrtfs_parambin_struct -{ - float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; - float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; - - float parametricReverberationTimes[CLDFB_NO_CHANNELS_MAX]; - float parametricReverberationEneCorrections[CLDFB_NO_CHANNELS_MAX]; - float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; - -} HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; -#endif typedef struct ivas_hrtfs_statistics_struct { diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index cef7480443..a6ddac23a9 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -9167,11 +9167,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF HRTFS_PARAMBIN_HANDLE *phHrtfParambin; -#else - HRTFS_PARAMBIN_HANDLE hHrtfParambin; -#endif int16_t nBins; int32_t output_Fs; RENDERER_TYPE renderer_type; @@ -9185,11 +9181,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( error = IVAS_ERR_OK; -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF phHrtfParambin = inputMasa->hMasaExtRend->hHrtfParambin; -#else - hHrtfParambin = *( inputMasa->hMasaExtRend->hHrtfParambin ); -#endif /* Set common variables and defaults */ output_Fs = *( inputMasa->base.ctx.pOutSampleRate ); @@ -9259,11 +9251,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( } 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 #ifdef SPLIT_REND_WITH_HEAD_ROT if ( hDiracDecBin->hReverb == NULL && pos_idx == 0 ) /* open reverb only for the main direction */ @@ -9271,11 +9259,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( if ( hDiracDecBin->hReverb == NULL ) #endif { -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes, ( *phHrtfParambin )->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -9316,9 +9300,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( /* External renderer uses constant regularization factor */ hDiracDecBin->reqularizationFactor = 0.4f; -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF hDiracDecBin->phHrtfParambin = phHrtfParambin; -#endif #ifdef SPLIT_REND_WITH_HEAD_ROT inputMasa->hMasaExtRend->hDiracDecBin[pos_idx] = hDiracDecBin; -- GitLab From 9ea4cb60830d03d232afa7e78d9e29d17db6229f Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 11:01:21 +0100 Subject: [PATCH 454/601] [cleanup] accept NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE --- lib_com/options.h | 1 - lib_dec/ivas_mct_dec.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 59c66a6a6b..2f26539d5c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ #define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index bfa2a6ad07..1df83b0ce5 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -774,10 +774,8 @@ static ivas_error ivas_mc_dec_reconfig( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); /* transfer subframe info from DirAC or ParamMC to central tc buffer */ -#ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE if ( st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER ) { -#endif if ( last_mc_mode == MC_MODE_PARAMMC ) { st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; @@ -794,9 +792,7 @@ static ivas_error ivas_mc_dec_reconfig( st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } -#ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE } -#endif /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv render what still fits in the new granularity */ -- GitLab From 2cc5e4f83d8cb896cecde44badee6a806b5b6a4e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Feb 2024 11:05:52 +0100 Subject: [PATCH 455/601] formatting --- lib_com/ari_hm.c | 2 +- lib_com/ivas_mc_param_com.c | 3 +-- lib_com/prot.h | 2 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 8 +++----- lib_rend/ivas_rotation.c | 2 +- lib_util/masa_file_writer.c | 7 +++---- lib_util/masa_file_writer.h | 2 +- 7 files changed, 11 insertions(+), 15 deletions(-) diff --git a/lib_com/ari_hm.c b/lib_com/ari_hm.c index b0d65b4404..d3c78833c6 100644 --- a/lib_com/ari_hm.c +++ b/lib_com/ari_hm.c @@ -205,7 +205,7 @@ int16_t CountIndexBits( *-------------------------------------------------------------------*/ int16_t tcx_hm_render( - const int32_t lag, /* i : pitch lag */ + const int32_t lag, /* i : pitch lag */ const int16_t fract_res, /* i : fractional resolution of the lag */ Word16 p[] /* o : harmonic model (Q13) */ ) diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index b080263506..e44e51a8be 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -86,7 +86,7 @@ uint16_t ivas_param_mc_get_configuration_index( *------------------------------------------------------------------------*/ void ivas_param_mc_metadata_open( - const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ + const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* o : handle for the Parametric MC parameter coding state */ ) @@ -208,7 +208,6 @@ int16_t ivas_param_mc_getNumTransportChannels( } - /*------------------------------------------------------------------------- * ivas_param_mc_get_num_param_bands() * diff --git a/lib_com/prot.h b/lib_com/prot.h index 9a88ea6d19..87f01a9161 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -7830,7 +7830,7 @@ int16_t DecodeIndex( #define GET_ADJ2( T, L, F ) ( ( ( L ) << ( F ) ) - ( T ) ) int16_t tcx_hm_render( - const int32_t lag, /* i : pitch lag */ + const int32_t lag, /* i : pitch lag */ const int16_t fract_res, /* i : fractional resolution of the lag */ Word16 p[] /* o : harmonic model (Q13) */ ); diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index f318efbf53..33a33cdcf3 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -140,7 +140,7 @@ 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 */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ HRTFS_PARAMBIN_HANDLE *phHrtfParambin /* i : HRTF structure for rendering */ ) { @@ -2947,8 +2947,7 @@ static void getDirectPartGains( float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t isHeadtracked, - HRTFS_PARAMBIN_HANDLE hHrtfParambin -) + HRTFS_PARAMBIN_HANDLE hHrtfParambin ) { float aziRad, eleRad; float y, mappedX, aziRadMapped, A, A2, A3; @@ -3021,8 +3020,7 @@ static void hrtfShGetHrtf( float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t useCachedValue, - HRTFS_PARAMBIN_HANDLE hHrtfParambin -) + HRTFS_PARAMBIN_HANDLE hHrtfParambin ) { int16_t k; float( *hrtfShCoeffsReInt )[16][60]; diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 48c52995cb..adf6bec226 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -898,7 +898,7 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->num_subframes = num_subframes; ( *hCombinedOrientationData )->interpolationCoefficient = 1.0f; ( *hCombinedOrientationData )->interpolationIncrement = 1.0f; - ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; + ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; ( *hCombinedOrientationData )->lrSwitchedNext = 0; ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; ( *hCombinedOrientationData )->lrSwitchInterpVal = 0.0f; diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 12bcd65b19..73ce19d593 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -88,9 +88,8 @@ static void getExtMasaMetadataFileName( static void delayMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: New input metadata which is inplace replaced with delayed metadata frame */ - MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ - uint8_t delayNsf -) + MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ + uint8_t delayNsf ) { int16_t dir, sf, band; uint8_t currentNumberOfDirections; @@ -237,7 +236,7 @@ ivas_error MasaFileWriter_open( *---------------------------------------------------------------------*/ ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ ) diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index c6caf0a3f9..3644881f35 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -48,7 +48,7 @@ ivas_error MasaFileWriter_open( ); ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ ); -- GitLab From 81f977c7131ab434dd698b1cca0bad6977454133 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 11:25:00 +0100 Subject: [PATCH 456/601] implement --decoder_only for masa tests --- .../test_masa_enc_dec.py | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index 4f8872fc36..51fd1870e9 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -109,6 +109,7 @@ def test_masa_enc_dec( output_mode, get_mld, get_mld_lim, + decoder_only, ): # Input parameters in_fs = 48 @@ -153,7 +154,7 @@ def test_masa_enc_dec( dec_met_output_ref = None dec_met_output_dut = None - if update_ref == 2 or update_ref == 1: + if (update_ref == 2 or update_ref == 1): # Encode REF ivas_enc( ref_encoder_frontend, @@ -176,17 +177,20 @@ def test_masa_enc_dec( ) if update_ref == 2 or update_ref == 0: - # Encode DUT - ivas_enc( - dut_encoder_frontend, - masa_channel_count, - masa_path, - ivas_br, - in_fs, - input_audio_path, - output_bitstream_dut, - dtx, - ) + if decoder_only: + output_bitstream_dut = output_bitstream_ref + else: + # Encode DUT + ivas_enc( + dut_encoder_frontend, + masa_channel_count, + masa_path, + ivas_br, + in_fs, + input_audio_path, + output_bitstream_dut, + dtx, + ) # Decode DUT ivas_dec( @@ -256,16 +260,6 @@ def test_masa_enc_dec( record_property("MLD", "0") print("Comparison bit exact") - # remove_output( - # keep_files, - # output_bitstream_ref, - # output_bitstream_dut, - # dec_output_ref, - # dec_output_dut, - # dec_met_output_ref, - # dec_met_output_dut, - # ) - ######################################################### # -------------------- test function -------------------- -- GitLab From 1a3b444e1928f1e4e4f12a37091e96a36ccfea31 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 12:15:49 +0100 Subject: [PATCH 457/601] implement --decoder_only for sba tests --- .../test_sba_bs_enc.py | 221 ++++++++++-------- 1 file changed, 119 insertions(+), 102 deletions(-) diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index 3f394b0c2a..fb10b2974e 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -104,6 +104,7 @@ def test_pca_enc( fs, get_mld, get_mld_lim, + decoder_only, ): pca = True tag = tag + fs + "c" @@ -114,27 +115,28 @@ def test_pca_enc( sba_order = "+1" output_config = "FOA" - # enc - sba_enc( - dut_encoder_frontend, - test_vector_path, - ref_encoder_frontend, - reference_path, - dut_base_path, - None, - tag, - fs, - ivas_br, - dtx, - None, - max_bw, - sba_order, - update_ref, - gain_flag, - keep_files, - cut_testv=True, - pca=pca, - ) + if not decoder_only: + # enc + sba_enc( + dut_encoder_frontend, + test_vector_path, + ref_encoder_frontend, + reference_path, + dut_base_path, + None, + tag, + fs, + ivas_br, + dtx, + None, + max_bw, + sba_order, + update_ref, + gain_flag, + keep_files, + cut_testv=True, + pca=pca, + ) # dec sba_dec( @@ -153,6 +155,7 @@ def test_pca_enc( update_ref, gain_flag, keep_files, + decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, pca=pca, @@ -186,6 +189,7 @@ def test_sba_enc_system( SID, get_mld, get_mld_lim, + decoder_only, ): if dtx == "1" and ivas_br not in ["13200", "16400", "24400", "32000", "64000"]: # skip high bitrates for DTX until DTX issue is resolved @@ -215,28 +219,30 @@ def test_sba_enc_system( cut_gain = ".004" else: cut_gain = "1.0" - # enc - sba_enc( - dut_encoder_frontend, - test_vector_path, - ref_encoder_frontend, - reference_path, - dut_base_path, - br_switch_file_path, - tag, - fs, - ivas_br, - dtx, - SID, - max_bw, - sba_order, - update_ref, - gain_flag, - keep_files, - cut_gain=cut_gain, - create_dutenc=True, - cut_testv=True, - ) + + if not decoder_only: + # enc + sba_enc( + dut_encoder_frontend, + test_vector_path, + ref_encoder_frontend, + reference_path, + dut_base_path, + br_switch_file_path, + tag, + fs, + ivas_br, + dtx, + SID, + max_bw, + sba_order, + update_ref, + gain_flag, + keep_files, + cut_gain=cut_gain, + create_dutenc=True, + cut_testv=True, + ) # dec sba_dec( @@ -255,6 +261,7 @@ def test_sba_enc_system( update_ref, gain_flag, keep_files, + decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, ) @@ -278,6 +285,7 @@ def test_spar_hoa2_enc_system( tag, get_mld, get_mld_lim, + decoder_only, ): fs = "48" dtx = "0" @@ -288,25 +296,26 @@ def test_spar_hoa2_enc_system( sba_order = "+2" output_config = "HOA2" - # enc - sba_enc( - dut_encoder_frontend, - test_vector_path, - ref_encoder_frontend, - reference_path, - dut_base_path, - None, - tag, - fs, - ivas_br, - dtx, - None, - max_bw, - sba_order, - update_ref, - gain_flag, - keep_files, - ) + if not decoder_only: + # enc + sba_enc( + dut_encoder_frontend, + test_vector_path, + ref_encoder_frontend, + reference_path, + dut_base_path, + None, + tag, + fs, + ivas_br, + dtx, + None, + max_bw, + sba_order, + update_ref, + gain_flag, + keep_files, + ) # dec sba_dec( @@ -325,6 +334,7 @@ def test_spar_hoa2_enc_system( update_ref, gain_flag, keep_files, + decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, ) @@ -348,6 +358,7 @@ def test_spar_hoa3_enc_system( tag, get_mld, get_mld_lim, + decoder_only, ): fs = "48" dtx = "0" @@ -358,25 +369,26 @@ def test_spar_hoa3_enc_system( sba_order = "+3" output_config = "HOA3" - # enc - sba_enc( - dut_encoder_frontend, - test_vector_path, - ref_encoder_frontend, - reference_path, - dut_base_path, - None, - tag, - fs, - ivas_br, - dtx, - None, - max_bw, - sba_order, - update_ref, - gain_flag, - keep_files, - ) + if not decoder_only: + # enc + sba_enc( + dut_encoder_frontend, + test_vector_path, + ref_encoder_frontend, + reference_path, + dut_base_path, + None, + tag, + fs, + ivas_br, + dtx, + None, + max_bw, + sba_order, + update_ref, + gain_flag, + keep_files, + ) # dec sba_dec( @@ -395,6 +407,7 @@ def test_spar_hoa3_enc_system( update_ref, gain_flag, keep_files, + decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, ) @@ -422,6 +435,7 @@ def test_sba_enc_BWforce_system( sample_rate_bw_idx, get_mld, get_mld_lim, + decoder_only, ): if dtx == "1" and ivas_br not in ["32000", "64000"]: # skip high bitrates for DTX until DTX issue is resolved @@ -437,26 +451,27 @@ def test_sba_enc_BWforce_system( sba_order = "+1" output_config = "FOA" - # enc - sba_enc( - dut_encoder_frontend, - test_vector_path, - ref_encoder_frontend, - reference_path, - dut_base_path, - None, - tag, - fs, - ivas_br, - dtx, - None, - bw, - sba_order, - update_ref, - gain_flag, - keep_files, - cut_testv=True, - ) + if not decoder_only: + # enc + sba_enc( + dut_encoder_frontend, + test_vector_path, + ref_encoder_frontend, + reference_path, + dut_base_path, + None, + tag, + fs, + ivas_br, + dtx, + None, + bw, + sba_order, + update_ref, + gain_flag, + keep_files, + cut_testv=True, + ) # dec sba_dec( @@ -475,6 +490,7 @@ def test_sba_enc_BWforce_system( update_ref, gain_flag, keep_files, + decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, ) @@ -642,6 +658,7 @@ def sba_dec( update_ref, gain_flag, keep_files, + decoder_only, get_mld=False, get_mld_lim=0, pca=False, @@ -693,7 +710,7 @@ def sba_dec( decoder_frontend.run( output_config, sampling_rate, - dut_in_pkt, + dut_in_pkt if not decoder_only else ref_in_pkt, dut_out_raw, ) -- GitLab From cab508e68eb1043244d1c18555f1fccd50450000 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 12:17:48 +0100 Subject: [PATCH 458/601] format changed files --- .../test_masa_enc_dec.py | 2 +- .../test_param_file.py | 22 ++++++++++++++----- .../test_sba_bs_enc.py | 2 +- tests/conftest.py | 16 +++++++++----- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index 51fd1870e9..75b01db382 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -154,7 +154,7 @@ def test_masa_enc_dec( dec_met_output_ref = None dec_met_output_dut = None - if (update_ref == 2 or update_ref == 1): + if update_ref == 2 or update_ref == 1: # Encode REF ivas_enc( ref_encoder_frontend, diff --git a/tests/codec_be_on_mr_nonselection/test_param_file.py b/tests/codec_be_on_mr_nonselection/test_param_file.py index 226b0794bc..0a494d7248 100644 --- a/tests/codec_be_on_mr_nonselection/test_param_file.py +++ b/tests/codec_be_on_mr_nonselection/test_param_file.py @@ -382,11 +382,15 @@ def test_param_file_tests( if not decoder_only: os.remove(f"{dut_base_path}/param_file/enc/{bitstream_file}") if sim_opts != "": - os.remove(f"{dut_base_path}/param_file/enc/{testv_base}_{tag_str}.192") + os.remove( + f"{dut_base_path}/param_file/enc/{testv_base}_{tag_str}.192" + ) os.remove(f"{dut_base_path}/param_file/enc/{netsim_trace_outfile}") os.remove(f"{dut_base_path}/param_file/dec/{tracefile_dec}") elif eid_opts != "": - os.remove(f"{dut_base_path}/param_file/enc/{testv_base}_{tag_str}.192") + os.remove( + f"{dut_base_path}/param_file/enc/{testv_base}_{tag_str}.192" + ) def encode( @@ -485,7 +489,11 @@ def simulate( assert False, f"networkSimulator_g192 not available for {platform.system()}" cmd_opts = sim_opts_list - if update_ref == 1 or (update_ref == 2 and not os.path.exists(ref_out_file)) or decoder_only: + if ( + update_ref == 1 + or (update_ref == 2 and not os.path.exists(ref_out_file)) + or decoder_only + ): # call network simulator on REF encoder output cmd_opts[1] = f"{ref_out_dir}/{netsim_infile}" elif update_ref in [0, 2]: @@ -531,7 +539,11 @@ def error_insertion( cmd_opts = eid_opts_list - if update_ref == 1 or (update_ref == 2 and not os.path.exists(ref_out_file)) or decoder_only: + if ( + update_ref == 1 + or (update_ref == 2 and not os.path.exists(ref_out_file)) + or decoder_only + ): # call eid-xor on REF encoder output cmd_opts[-3] = f"{ref_out_dir}/{eid_xor_infile}" elif update_ref in [0, 2]: @@ -599,7 +611,7 @@ def decode( x if x != "tracefile_dec" else f"{dut_out_dir}/{tracefile_dec}" for x in dec_opts_list ] - + if decoder_only: dut_in_file = ref_in_file diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index fb10b2974e..e088196ff1 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -638,7 +638,7 @@ def sba_enc( with open(dut_pkt_file, "rb") as fp_in: with open(dut_pkt_file_cut, "wb") as fp_out: fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True) - if not keep_files: + if not keep_files: os.remove(dut_pkt_file) diff --git a/tests/conftest.py b/tests/conftest.py index 76572eadd4..1d2726dc44 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -192,11 +192,12 @@ def pytest_addoption(parser): ) parser.addoption( - "--decoder_only", - help="Only run decoder parts of tests in 'codec_be_on_mr_nonselection'. Use ref encoder output bitstreams.", - action="store_true", - default=False, - ) + "--decoder_only", + help="Only run decoder parts of tests in 'codec_be_on_mr_nonselection'. Use ref encoder output bitstreams.", + action="store_true", + default=False, + ) + @pytest.fixture(scope="session", autouse=True) def update_ref(request): @@ -569,7 +570,10 @@ def dut_decoder_frontend(dut_decoder_path, request) -> DecoderFrontend: Return a :class:`conftest.DecoderFrontend` instance as DUT for the test session. """ decoder = DecoderFrontend( - dut_decoder_path, "DUT", timeout=request.config.getoption("--testcase_timeout"), fr=request.config.option.dut_fr + dut_decoder_path, + "DUT", + timeout=request.config.getoption("--testcase_timeout"), + fr=request.config.option.dut_fr, ) yield decoder -- GitLab From 86ef7ef817b232300ba9fe8cc4dacaeb06f82212 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 12:18:56 +0100 Subject: [PATCH 459/601] use --decoder_only in 5ms/10ms comparison test --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1352eb875b..caa8267bff 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -549,8 +549,8 @@ pytest-compare-20ms-and-5ms-rendering: - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -m create_ref_part2 ### run pytest - exit_code=0 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 || exit_code5=$? - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 || exit_code10=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true - zero_errors=1 -- GitLab From 5431b64c6ec8eb265803b9548b0955b8256435b0 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 12:59:54 +0100 Subject: [PATCH 460/601] fix bug with netsim application --- tests/codec_be_on_mr_nonselection/test_param_file.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/codec_be_on_mr_nonselection/test_param_file.py b/tests/codec_be_on_mr_nonselection/test_param_file.py index 0a494d7248..459964a186 100644 --- a/tests/codec_be_on_mr_nonselection/test_param_file.py +++ b/tests/codec_be_on_mr_nonselection/test_param_file.py @@ -496,14 +496,18 @@ def simulate( ): # call network simulator on REF encoder output cmd_opts[1] = f"{ref_out_dir}/{netsim_infile}" + cmd_opts[2] = f"{ref_out_dir}/{netsim_outfile}" # ref_out_file elif update_ref in [0, 2]: # call network simulator on DUT encoder output cmd_opts[1] = f"{dut_out_dir}/{netsim_infile}" + cmd_opts[2] = f"{dut_out_dir}/{netsim_outfile}" # dut_out_file if update_ref == 1 or (update_ref == 2 and not os.path.exists(ref_out_file)): cmd_opts[3] = f"{ref_out_dir}/{netsim_tracefile}" + cmd_opts[2] = f"{ref_out_dir}/{netsim_outfile}" # ref_out_file elif update_ref in [0, 2]: cmd_opts[3] = f"{dut_out_dir}/{netsim_tracefile}" + cmd_opts[2] = f"{dut_out_dir}/{netsim_outfile}" # dut_out_file run(netsim + cmd_opts, check=False) -- GitLab From f93cf20eeb5c88ac3d80a7cb10e6f8ec64c69019 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 13:21:48 +0100 Subject: [PATCH 461/601] fix error in file removal --- tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index e088196ff1..01ac63afac 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -675,15 +675,15 @@ def sba_dec( if gain_flag != -1: short_tag_ext += f"_Gain{gain_flag}" if pca: - short_tag_ext += f"_pca" + short_tag_ext += "_pca" if SID == 1: - short_tag_ext += f"_SID_cut" + short_tag_ext += "_SID_cut" # to avoid conflicting names in case of parallel test execution, differentiate all cases long_tag_ext = "" if gain_flag != -1: long_tag_ext += f"_Gain{gain_flag}" if SID == 1: - long_tag_ext += f"_SID_cut" + long_tag_ext += "_SID_cut" dut_out_dir = f"{dut_base_path}/sba_bs/raw" ref_out_dir = f"{reference_path}/sba_bs/raw" @@ -706,11 +706,14 @@ def sba_dec( ) if update_ref == 0: + if decoder_only: + dut_in_pkt = ref_in_pkt + # call DUT decoder decoder_frontend.run( output_config, sampling_rate, - dut_in_pkt if not decoder_only else ref_in_pkt, + dut_in_pkt dut_out_raw, ) -- GitLab From cbfe430d127a91f56565824749a2421990810e48 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 13:53:10 +0100 Subject: [PATCH 462/601] correct file removal --- tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py | 5 +++-- tests/conftest.py | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index 01ac63afac..4f4c1a3271 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -713,7 +713,7 @@ def sba_dec( decoder_frontend.run( output_config, sampling_rate, - dut_in_pkt + dut_in_pkt, dut_out_raw, ) @@ -738,5 +738,6 @@ def sba_dec( # remove DUT output files when test result is OK (to save disk space) if not keep_files: - os.remove(dut_in_pkt) os.remove(dut_out_raw) + if not decoder_only: + os.remove(dut_in_pkt) diff --git a/tests/conftest.py b/tests/conftest.py index 1d2726dc44..bbe16f4715 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -506,10 +506,8 @@ class DecoderFrontend: try: if not os.path.exists(str(input_bitstream_path) + eid_output_suffix): result = run(eid_command, check=True) - except Exception as e: - print(result.stderr) - print(result.stdout) - pytest.fail(f"eid-xor operation failed!") + except Exception: + pytest.fail("eid-xor operation failed!") input_bitstream_path += eid_output_suffix -- GitLab From 9af5b4d83c65cdc88c94ee4bd413507e6758ac97 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 28 Feb 2024 14:39:55 +0100 Subject: [PATCH 463/601] add shorter renderer framesize tests to coverage report --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index caa8267bff..ee7c7ea915 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2040,6 +2040,8 @@ coverage-test-on-main-scheduled: - python3 tests/create_short_testvectors.py - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v -n auto --update_ref 1 -m create_ref --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v -n auto --update_ref 1 -m create_ref_part2 --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 5 --decoder_only + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 10 --decoder_only - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_cut - lcov -c -d obj -o coverage_stv.info # extract coverage of short test vectors here -- GitLab From 0be39a6acaa2be01d34de00c4ef2dd41ddc06fa9 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 28 Feb 2024 16:35:11 +0100 Subject: [PATCH 464/601] delete code under ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_A --- lib_com/options.h | 3 +-- lib_dec/ivas_binRenderer_internal.c | 2 +- lib_dec/ivas_output_config.c | 4 ---- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 42c1122dab..fa896a857a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -183,8 +183,7 @@ #define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ -//#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_A /* FhG: issue 987: solution a: switch to SD */ -#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_B /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ +#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index b48a352a71..68d630909f 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -952,7 +952,7 @@ static void ivas_binaural_obtain_DMX( set_zero( outRealRightPtr, CLDFB_NO_CHANNELS_MAX ); set_zero( outImagRightPtr, CLDFB_NO_CHANNELS_MAX ); -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_B +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /*Ambisonics input requires different processing*/ if ( hBinRenderer->nInChannels == 16 ) { diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 57876353a6..c93b16dcdb 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -248,11 +248,7 @@ void ivas_renderer_select( *renderer_type = RENDERER_BINAURAL_FASTCONV; } -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING_A - if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && !( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) -#endif { /* force HOA3 domain for rotation*/ *internal_config = IVAS_AUDIO_CONFIG_HOA3; -- GitLab From 4864891a1528f499e6fd596d8793fbe032b1e157 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 28 Feb 2024 16:50:53 +0100 Subject: [PATCH 465/601] do not initialize foa_enc when generating reverb from an ambisonics signal --- lib_dec/ivas_binRenderer_internal.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 68d630909f..58d24b87ae 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1280,7 +1280,11 @@ ivas_error ivas_binRenderer_open( if ( hBinRenderer->hReverb != NULL ) { +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 ) +#else if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) +#endif { for ( k = 0; k < 11; k++ ) { -- GitLab From 2e6cbc922864b96c1f38aac1cf39ab4da85018df Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 28 Feb 2024 17:02:01 +0100 Subject: [PATCH 466/601] Renderer config reader: fix for erronous acoustic environment structure access --- lib_com/options.h | 4 ++-- lib_util/render_config_reader.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2f26539d5c..a83219ba32 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,8 +155,8 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ - +#define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ +#define FIX_1020_AEID_SELECTION_ERRORS /* Philips: issue #1020: fix for acoustic environment ID selection errors */ /* #################### End BE switches ################################## */ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index a6229dc659..8c455278c9 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2241,7 +2241,11 @@ ivas_error RenderConfigReader_read( return IVAS_ERR_INVALID_RENDER_CONFIG; } idx = strtol( strtok( NULL, ":" ), NULL, 0 ); +#ifdef FIX_1020_AEID_SELECTION_ERRORS + pRenderConfigReader->pAE[acIdx].id = idx; +#else pRenderConfigReader->pAE->id = idx; +#endif aeHasFgIdx = aeHasPredelay = aeHasRt60 = aeHasDsr = FALSE; aeHasERsize = aeHasERabs = FALSE; -- GitLab From 002745f9b6d0ce470d4dc5e17e6bd452dea89161 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 29 Feb 2024 12:10:30 +0100 Subject: [PATCH 467/601] Remove "sba_order < 0" conditions --- lib_com/ivas_sba_config.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index ddb59b2ed5..eb4e8e49be 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -64,19 +64,19 @@ void ivas_sba_config( int16_t *element_mode /* o : element mode of the core coder */ ) { +#ifndef FIX_993_REMOVE_SBA_GET_ORDER if ( ( sba_order < 0 ) && ( nb_channels < 0 ) ) { assert( 0 && "Either order or number of channels must be positive" ); } else if ( sba_order < 0 ) { -#ifdef FIX_993_REMOVE_SBA_GET_ORDER - assert( !"SBA order cannot be negative!" ); -#else sba_order = ivas_sba_get_order( nb_channels, sba_planar ); -#endif } else if ( nb_channels < 0 ) +#else + if ( nb_channels < 0 ) +#endif { nb_channels = ivas_sba_get_nchan( sba_order, sba_planar ); } -- GitLab From b4c0d7fcc038ae3c813394c9b9da6fc2c3dab24d Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 29 Feb 2024 12:18:45 +0100 Subject: [PATCH 468/601] Remove setting of nb_channels - the parameter is not really used --- lib_com/ivas_sba_config.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index eb4e8e49be..f7f32c6a9a 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -74,13 +74,13 @@ void ivas_sba_config( sba_order = ivas_sba_get_order( nb_channels, sba_planar ); } else if ( nb_channels < 0 ) -#else - if ( nb_channels < 0 ) -#endif { nb_channels = ivas_sba_get_nchan( sba_order, sba_planar ); } else +#else + if ( nb_channels > 0 ) +#endif { if ( sba_planar ) { -- GitLab From 420310052b5c7acfd725b5377e855e9963813412 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 4 Mar 2024 08:55:23 +0100 Subject: [PATCH 469/601] Added fix FIX_1006_PAST_DMX_NRG_ERROR --- lib_com/options.h | 2 +- lib_dec/ivas_stereo_dft_dec_dmx.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 49d3c4b0fb..5fe84c86d4 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -160,7 +160,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ - +#define FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index 3a4b6be208..a8b623c519 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -229,7 +229,11 @@ void stereo_dft_unify_dmx( if ( st0->bfi && !prev_bfi ) { int16_t idx_k0, idx_k1; +#ifdef FIX_1006_PAST_DMX_NRG_ERROR + idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; +#else idx_k0 = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; +#endif idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX; /*dmx energy memory*/ -- GitLab From 91e5cd03a56ad7b6cdcc1911188c5a7f568e6809 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 4 Mar 2024 10:20:47 +0100 Subject: [PATCH 470/601] Added NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO to address issue 1010 --- lib_com/options.h | 1 + lib_dec/ivas_stereo_dft_dec.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 1e291c1721..f55aaeb4cd 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -169,6 +169,7 @@ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ +#define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO /* Eri: Issue 1010: Division by zero in Stereo CNG */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 1b3615f416..c6fe667c9b 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -2967,7 +2967,11 @@ void stereo_dft_dec_smooth_parameters( } /* xfade */ +#ifdef NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO + if ( hStereoDft->ipd_xfade_prev != hStereoDft->ipd_xfade_target && hStereoDft->ipd_xfade_counter < ( STEREO_DFT_ITD_CNG_XFADE - 1 ) && hStereoDft->last_active_element_brate <= 24400 ) +#else if ( hStereoDft->ipd_xfade_prev != hStereoDft->ipd_xfade_target && hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 ) +#endif { hStereoDft->gipd[k + k_offset] = hStereoDft->ipd_xfade_prev + hStereoDft->ipd_xfade_step; hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset]; -- GitLab From 25781b8e26dc2487782e2c6047acd7f218ef1241 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 4 Mar 2024 10:24:47 +0100 Subject: [PATCH 471/601] Renamed switch to NONBE_FIX_1006_PAST_DMX_NRG_ERROR since it is non-BE --- lib_com/options.h | 2 +- lib_dec/ivas_stereo_dft_dec_dmx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 97d60e76c9..8c33ff99f3 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,6 @@ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ -#define FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ /* #################### End BE switches ################################## */ @@ -170,6 +169,7 @@ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ +#define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index a8b623c519..f3f9982ec8 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -229,7 +229,7 @@ void stereo_dft_unify_dmx( if ( st0->bfi && !prev_bfi ) { int16_t idx_k0, idx_k1; -#ifdef FIX_1006_PAST_DMX_NRG_ERROR +#ifdef NONBE_FIX_1006_PAST_DMX_NRG_ERROR idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; #else idx_k0 = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; -- GitLab From 8cf6af7f3a2b91280d8af39da804f5182763764c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 4 Mar 2024 13:47:48 +0100 Subject: [PATCH 472/601] Change to a check on the integer counter which is a safer fix. Expand to include ITD xfade. --- lib_dec/ivas_stereo_dft_dec.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index c6fe667c9b..3ae77707f0 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -2947,7 +2947,11 @@ void stereo_dft_dec_smooth_parameters( if ( hStereoDft->frame_sid_nodata ) { /* set new xfade target if new itd received */ +#ifdef NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO + if ( hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE ) +#else if ( hStereoDft->gipd[k + k_offset] != hStereoDft->ipd_xfade_target ) +#endif { if ( ( hStereoDft->gipd[k + k_offset] - hStereoDft->ipd_xfade_prev ) > EVS_PI ) { @@ -2967,11 +2971,7 @@ void stereo_dft_dec_smooth_parameters( } /* xfade */ -#ifdef NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO - if ( hStereoDft->ipd_xfade_prev != hStereoDft->ipd_xfade_target && hStereoDft->ipd_xfade_counter < ( STEREO_DFT_ITD_CNG_XFADE - 1 ) && hStereoDft->last_active_element_brate <= 24400 ) -#else if ( hStereoDft->ipd_xfade_prev != hStereoDft->ipd_xfade_target && hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 ) -#endif { hStereoDft->gipd[k + k_offset] = hStereoDft->ipd_xfade_prev + hStereoDft->ipd_xfade_step; hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset]; @@ -2997,7 +2997,11 @@ void stereo_dft_dec_smooth_parameters( if ( hStereoDft->frame_sid_nodata ) { /* set new xfade target if new itd received */ +#ifdef NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO + if ( hStereoDft->itd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE ) +#else if ( hStereoDft->itd[k + k_offset] != hStereoDft->itd_xfade_target ) +#endif { hStereoDft->itd_xfade_target = hStereoDft->itd[k + k_offset]; hStereoDft->itd_xfade_step = ( hStereoDft->itd_xfade_target - hStereoDft->itd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->itd_xfade_counter ); -- GitLab From 91fba47d49f6205efdedfaecb2178a587c0981ac Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 5 Mar 2024 13:03:40 +0100 Subject: [PATCH 473/601] Added (commented out) test cases for selecting acoustic environment from a combined renderer configuration file --- scripts/config/self_test.prm | 4 +++- scripts/config/self_test_ltv.prm | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 4e24a5b737..e1250757b9 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -878,7 +878,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba -1 128000 48 testv/stvFOA48c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stvFOA48c.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst - +// SBA 3OA at 128 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB combined renderer configuration with selected acoustic environment +//../IVAS_cod -sba 3 128000 48 testv/stv3OA48c.wav bit +//../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1 BINAURAL_ROOM_REVERB 48 bit testv/stv3OA48c.pcm_SBA_12800048-48_BinauralRoomReverb_Config_renderer_combined_AEID_1.tst // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_SWB.txt -masa 1 testv/stv1MASA1TC48c.met 13200 48 testv/stv1MASA1TC48c.wav bit diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 6bdeaaf0a8..1c124a82ca 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -878,6 +878,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba -1 128000 48 testv/ltv48_FOA.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/ltv48_FOA.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst +// SBA 3OA at 128 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB combined renderer configuration with selected acoustic environment +//../IVAS_cod -sba 3 128000 48 testv/ltv48_HOA3.wav bit +//../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_HOA3.pcm_SBA_12800048-48_BinauralRoomReverb_Config_renderer_combined_AEID_1.tst // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching -- GitLab From 22797817d774fd8cf3b75d41e849bd1c4ae9cca9 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 5 Mar 2024 13:52:13 +0100 Subject: [PATCH 474/601] fix for #1021, fix ISM renderer, always use the correct renderer to determine if the TC buffer sub frame info needs to be updated, use the correct number of objects --- lib_com/ivas_prot.h | 3 +++ lib_com/options.h | 1 + lib_dec/ivas_ism_renderer.c | 14 ++++++++++++-- lib_dec/ivas_jbm_dec.c | 12 ++++++++++++ lib_dec/ivas_osba_dec.c | 4 ++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e80b23aa15..6afc081227 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5223,6 +5223,9 @@ void ivas_ism_renderer_close( void ivas_ism_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + const RENDERER_TYPE renderer_type, /* i : current renderer type */ +#endif float *output_f[], /* i/o: core-coder transport channels/object output */ const int16_t n_samples_to_render /* i : output frame length per channel */ ); diff --git a/lib_com/options.h b/lib_com/options.h index b9333b1ff6..386221aa08 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,6 +171,7 @@ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ +#define NONBE_FIX_1021_ISM_BRIR_RS_FLUSH /* FhG: issue #1021: fix ISM with JBM and RS renderer flushing*/ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 6f5a2d90eb..09d6fd0e62 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -140,7 +140,10 @@ void ivas_ism_renderer_close( *-------------------------------------------------------------------------*/ void ivas_ism_render_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + const RENDERER_TYPE renderer_type, /* i: current renderer type */ +#endif float *output_f[], /* i/o: core-coder transport channels/object output */ const int16_t n_samples_to_render /* i : output frame length per channel */ ) @@ -172,12 +175,15 @@ void ivas_ism_render_sf( assert( slots_to_render == 0 ); assert( last_sf <= st_ivas->hTcBuffer->nb_subframes ); #endif - +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + num_objects = st_ivas->nchan_ism; +#else num_objects = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) { num_objects = st_ivas->nchan_ism; } +#endif nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; @@ -283,7 +289,11 @@ void ivas_ism_render_sf( #ifdef NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* update rendered subframe and slots info for all cases apart from a following crend call, the update will then happen in the crend call*/ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + if ( renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) +#else if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) +#endif #else if ( st_ivas->renderer_type == RENDERER_TD_PANNING ) #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 128754273c..224b862af0 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1093,7 +1093,11 @@ ivas_error ivas_jbm_dec_render( if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + ivas_ism_render_sf( st_ivas, st_ivas->renderer_type, p_output, *nSamplesRendered ); +#else ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); +#endif } else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { @@ -1235,7 +1239,11 @@ ivas_error ivas_jbm_dec_render( } /* render objects */ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + ivas_ism_render_sf( st_ivas, st_ivas->renderer_type, p_output, *nSamplesRendered ); +#else ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); +#endif /* add already rendered SBA part */ for ( n = 0; n < nchan_out; n++ ) @@ -1644,7 +1652,11 @@ ivas_error ivas_jbm_dec_flush_renderer( /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity ); +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + ivas_ism_render_sf( st_ivas, renderer_type_old, p_output, hTcBuffer->n_samples_granularity ); +#else ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); +#endif #if defined SPLIT_REND_WITH_HEAD_ROT if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index 6585db587e..65e05f78be 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -284,7 +284,11 @@ ivas_error ivas_osba_render_sf( if ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) { +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + ivas_ism_render_sf( st_ivas, st_ivas->renderer_type, p_output_ism, *nSamplesRendered ); +#else ivas_ism_render_sf( st_ivas, p_output_ism, *nSamplesRendered ); +#endif } for ( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) -- GitLab From b917cfed05fd17e8d021e624346d4ed524514dfc Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Tue, 5 Mar 2024 16:02:29 +0100 Subject: [PATCH 475/601] fix for issue 1002 with debug code, under define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE --- Workspace_msvc/decoder.vcxproj | 2 +- lib_com/options.h | 6 +- lib_dec/FEC_HQ_phase_ecu.c | 148 ++++++++++++++++++++++++++++++--- 3 files changed, 141 insertions(+), 15 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index 2228349d5e..157f6dc94e 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -45,7 +45,7 @@ <_ProjectFileVersion>15.0.27428.2015 - ..\ + (ProjectDir)\..\ .\Debug_$(ProjectName)\ false false diff --git a/lib_com/options.h b/lib_com/options.h index 7065d18d91..b3f34cc810 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -/*#define DEBUGGING*/ /* Activate debugging part of the code */ +/*#define DEBUGGING */ /*1002fix*/ /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ @@ -163,7 +163,9 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ -#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ +#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ +#define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16 */ + /* #################### End BE switches ################################## */ diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index ea604ef705..2fa0391fa7 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -288,9 +288,9 @@ static void trans_ana( *ph_dith = 0.0f; /* softly shift attenuation just a bit later for estimated "stable" music_content */ - burst_phdith_thresh = BURST_PHDITH_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); - burst_att_thresh = BURST_ATT_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); - att_per_frame = (float) ( ATT_PER_FRAME - (int16_t) ( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ + burst_phdith_thresh = BURST_PHDITH_THRESH + ( int16_t )( est_mus_content * 1.0f + 0.5f ); + burst_att_thresh = BURST_ATT_THRESH + ( int16_t )( est_mus_content * 1.0f + 0.5f ); + att_per_frame = (float) ( ATT_PER_FRAME - ( int16_t )( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ att_per_frame *= 0.1f; if ( burst_len > burst_phdith_thresh ) @@ -972,10 +972,13 @@ static void subst_spec( float one_peak_flag_mask; float alpha_local; float beta_local; +#ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE + float tmpf; +#endif sincos = sincos_t_ext + 128; - Lprot = (int16_t) ( L_PROT32k * output_frame / 640 ); + Lprot = ( int16_t )( L_PROT32k * output_frame / 640 ); Lprot_1 = 1.0f / Lprot; Lecu = output_frame * 2; @@ -1092,7 +1095,92 @@ static void subst_spec( } Xph = corr_phase[m]; - Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; +#ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE + +#ifdef DEBUGGING + /* old : Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; */ + /* the costly "%" modulo 32768 is not the correct way of obtaining the fractional part in Q10 resolution */ +#endif +#define WMC_TOOL_SKIP + tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ + tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd() , out: [0...1024.5[ */ + //tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) ; /* obtain fraction : floor(), sub(), mult() , out: [0...1023.x[ */ + Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() */ + + MULT( 2 ); + MISC( 1 ); /* floor */ + ADD( 2 ); /* sub, rnd */ + LOGIC( 1 ); /* s_and */ +#undef WMC_TOOL_SKIP + +#ifdef DEBUGGING + if ( 1 ) + { + int32_t ii; + +#define ONE_OVER_PI2 ( 1.0f / ( PI2 ) ) + float Xph_norm = Xph * ( ONE_OVER_PI2 ); + /* extract IEEE single precision mantissa and exponent values */ + int32_t n; + float frac_3 = frexpf( Xph_norm, &n ); /* a math.h function, currently not counted by WMC tool */ + int32_t L_frac_3 = ( int32_t )( frac_3 * (float) ( 1L << 23 ) ); /* make into Q(23+n) */ + int32_t Xph_int32 = L_frac_3 >> ( 23 - 10 - n ); /* make into Q10 , no rounding */ + int16_t Xph_short_new_frexpf = ( int16_t )( Xph_int32 & 0x03ff ); /* mask out fractional part */ + + /* approx cost: mul, frexpf, mult, add, shr, s_and , similar to 1024.0*(x-floor(x)) */ + + int16_t Xph_short_new = Xph_short; + int16_t Xph_short_orig = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; + + + assert( ( (abs( Xph_short - Xph_short_orig) <= 1 ) || ( abs( (Xph_short+1)&1023 - (Xph_short_orig+1)&1023 ) <= 1 ) ) && "Xph_short diff larger than rounding !! "); + for ( ii = 0; ii < 2048; ii++ ) + + { + float Xph_tst = Xph + ( ii / 2048.0f ) * PI2; + + float Xph_short_flt0 = ( Xph_tst * ( 1.0f / PI2 ) ); /* (x+"fr")*/ + float Xph_short_flt0_fr = Xph_short_flt0 - (float) floor( (double) Xph_short_flt0 ); /* "fr" in the range [0..1.0[ */ + float Xph_short_flt1 = 1024.0f * ( Xph_short_flt0_fr ); + + float Xph_short_flt2round = (float) floor( (double) ( Xph_short_flt1 + 0.5f ) ); + Xph_short_flt2round -= ( Xph_short_flt2round == 1024.0f ? 1024.0f : 0.0f ); /* wrap 1.0 to 0.0 */ + + float Xph_short_flt2floor = (float) floor( (double) Xph_short_flt1 ); + + + if ( ii == 0 ) + { + fprintf( stderr, "\n frame=%5d, m=%3d, ii=%4d, tst= %.15g rad, Xph_short_orig=%4d, Xph_short_flt2round=%4d, Xph_shortflt2floor=%4d, Xph_short_new=%4d ", + frame, m, ii, Xph_tst, Xph_short_orig, (int16_t) Xph_short_flt2round, (int16_t) Xph_short_flt2floor, Xph_short_new ); + } + + if ( ii == 0 && Xph_short_orig != Xph_short_new && ( ( abs( Xph_short_orig - Xph_short_new ) > 1 ) || abs( (Xph_short_orig+1)&1023 - (Xph_short_new+1)&1023) > 1) ) + { + fprintf( stderr, " MISS !! Xph_short_orig != Xph_short_new && diff > 1 !!" ); + } + assert( Xph_short_flt2floor >= 0.0 ); + assert( Xph_short_flt2floor <= 1023.0 ); + + if ( ii == 0 && Xph_short_flt2round != Xph_short_flt2floor ) + { + // fprintf( stderr, "\n frame=%5d, m=%3d, ii=%4d, tst= %.15g rad, Xph_short_orig=%4d, Xph_short_flt2round=%4d, Xph_shortflt2floor=%4d, Xph_short_new=%4d ", + // frame, m, ii, Xph_tst, Xph_short_orig, (int16_t) Xph_short_flt2round, (int16_t) Xph_short_flt2floor, Xph_short_new ); + + fprintf( stderr, " rounding change by %.2f !!**", Xph_short_flt2round - Xph_short_flt2floor ); + } + assert( Xph_short_flt2round >= 0.0 ); + assert( Xph_short_flt2round <= 1023.0 ); + + } /* end for */ + } +#endif + +#else + Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; +#endif + + if ( Xph_short >= 512 ) { sin_F = -sincos_t_ext[Xph_short - 512]; @@ -1136,7 +1224,43 @@ static void subst_spec( mag_chg_local *= 0.5f + ( 1.0f - ( 1.0f / PHASE_DITH ) * ph_dith ) * 0.5f; } - Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; +#ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE + /* fractional phase of Xph converted to an integer in the range [0..1023] */ + /* in BASOP this is simply a truncation (through extract_l(Word32)) of a 32bit value at the Q16 bimal point + shifting to a 10 bit index */ + + /* old: Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; */ /* yields out USAN of range for int16_t */ +#define WMC_TOOL_SKIP + tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ + tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ + Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ + + MULT( 2 ); + MISC( 1 ); /* floor */ + ADD( 2 ); /* sub, rnd */ + LOGIC( 1 ); /* s_and */ +#undef WMC_TOOL_SKIP + +#ifdef DEBUGGING + { + int16_t Xph_short_bad; + int16_t Xph_short_corrected; + + + Xph_short_bad = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* yields out USAN of range for int16 */ + /* negative number can be created in cat to int16_t , but wraps back with &0x03ff in MSVC */ + + Xph_short_corrected = Xph_short; + + assert( Xph_short_corrected >= 0 && Xph_short_corrected <= 1023 ); + if ( Xph_short_bad != Xph_short_corrected ) + { + fprintf( stderr, "\n fix1002 actually active %5d -> %5d !!**", Xph_short_bad, Xph_short_corrected ); + } + } +#endif +#else + Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* yields out of range for int16 */ +#endif if ( Xph_short >= 512 ) { @@ -1353,12 +1477,12 @@ static void rec_wtda( else { /* Smoothen onset of ECU frame */ - xf_len = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); + xf_len = ( int16_t )( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); p_ecu = xsubst_ + 2 * output_frame - Lprot + timesh; tbl_delta = 64.f / xf_len; /* 64 samples = 1/4 cycle in sincos_t */ for ( i = 0; i < xf_len; i++, p_ecu++ ) { - g = sincos_t[( (int16_t) ( i * tbl_delta ) )]; + g = sincos_t[( ( int16_t )( i * tbl_delta ) )]; g *= g; *p_ecu = g * ( *p_ecu ); } @@ -1530,7 +1654,7 @@ static void fec_ecu_pitch( /* Resampling to work at 8Khz */ fir_dwn( prevsynth, Asr_LP, prevsynth_LP, 2 * L, filt_size, *decimatefator ); /* resampling without delay */ - Lon20 = (int16_t) ( ( L / 20 ) / *decimatefator ); + Lon20 = ( int16_t )( ( L / 20 ) / *decimatefator ); /* Correlation analysis */ *min_corr = 0; @@ -1662,7 +1786,7 @@ static void fec_ecu_dft( Tfr[*Nfft - 1] = target[N - 1]; for ( i = 1; i < *Nfft - 1; i++ ) /* interpolation for FFT */ { - tmp_short = (int16_t) floor( i * tmp ); + tmp_short = (int16_t) floorf( i * tmp ); Tfr[i] = target[tmp_short] + ( (float) i * tmp - ( (float) tmp_short ) ) * ( target[tmp_short + 1] - target[tmp_short] ); } @@ -1951,7 +2075,7 @@ static void fec_noise_filling( kk = 0; } - Rnd_N_noise = (int16_t) ( (float) N_noise * tmp ); + Rnd_N_noise = ( int16_t )( (float) N_noise * tmp ); sinq( (const float) EVS_PI / ( 2.0f * (float) Rnd_N_noise ), (const float) EVS_PI / ( 4.0f * (float) Rnd_N_noise ), (const int16_t) Rnd_N_noise, SS ); @@ -2029,7 +2153,7 @@ static void fec_alg( fec_noise_filling( prevsynth, synthesis, output_frame, N * decimatefactor, HqVoicing, gapsynth, ni_seed_forfec, element_mode, old_out ); - n = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + n = ( int16_t )( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); wtda( synthesis + ( output_frame - n ), ecu_rec, NULL, ALDO_WINDOW, ALDO_WINDOW, output_frame ); return; -- GitLab From 6f5e4add68b768657a5a151d949a88b675fa559b Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Tue, 5 Mar 2024 16:32:43 +0100 Subject: [PATCH 476/601] fix for issue 1002 removed debug code, active define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE --- lib_com/options.h | 4 +- lib_dec/FEC_HQ_phase_ecu.c | 97 ++------------------------------------ 2 files changed, 5 insertions(+), 96 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b3f34cc810..3c928025ed 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -/*#define DEBUGGING */ /*1002fix*/ /* Activate debugging part of the code */ +/*#define DEBUGGING */ /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ @@ -164,7 +164,7 @@ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ #define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ -#define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16 */ +#define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16, non-BE for PLC-conditions */ diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index 2fa0391fa7..9fe4760c82 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -1096,86 +1096,16 @@ static void subst_spec( Xph = corr_phase[m]; #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE - -#ifdef DEBUGGING - /* old : Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; */ - /* the costly "%" modulo 32768 is not the correct way of obtaining the fractional part in Q10 resolution */ -#endif #define WMC_TOOL_SKIP - tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ - tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd() , out: [0...1024.5[ */ - //tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) ; /* obtain fraction : floor(), sub(), mult() , out: [0...1023.x[ */ - Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() */ + tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ + tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ + Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ MULT( 2 ); MISC( 1 ); /* floor */ ADD( 2 ); /* sub, rnd */ LOGIC( 1 ); /* s_and */ #undef WMC_TOOL_SKIP - -#ifdef DEBUGGING - if ( 1 ) - { - int32_t ii; - -#define ONE_OVER_PI2 ( 1.0f / ( PI2 ) ) - float Xph_norm = Xph * ( ONE_OVER_PI2 ); - /* extract IEEE single precision mantissa and exponent values */ - int32_t n; - float frac_3 = frexpf( Xph_norm, &n ); /* a math.h function, currently not counted by WMC tool */ - int32_t L_frac_3 = ( int32_t )( frac_3 * (float) ( 1L << 23 ) ); /* make into Q(23+n) */ - int32_t Xph_int32 = L_frac_3 >> ( 23 - 10 - n ); /* make into Q10 , no rounding */ - int16_t Xph_short_new_frexpf = ( int16_t )( Xph_int32 & 0x03ff ); /* mask out fractional part */ - - /* approx cost: mul, frexpf, mult, add, shr, s_and , similar to 1024.0*(x-floor(x)) */ - - int16_t Xph_short_new = Xph_short; - int16_t Xph_short_orig = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; - - - assert( ( (abs( Xph_short - Xph_short_orig) <= 1 ) || ( abs( (Xph_short+1)&1023 - (Xph_short_orig+1)&1023 ) <= 1 ) ) && "Xph_short diff larger than rounding !! "); - for ( ii = 0; ii < 2048; ii++ ) - - { - float Xph_tst = Xph + ( ii / 2048.0f ) * PI2; - - float Xph_short_flt0 = ( Xph_tst * ( 1.0f / PI2 ) ); /* (x+"fr")*/ - float Xph_short_flt0_fr = Xph_short_flt0 - (float) floor( (double) Xph_short_flt0 ); /* "fr" in the range [0..1.0[ */ - float Xph_short_flt1 = 1024.0f * ( Xph_short_flt0_fr ); - - float Xph_short_flt2round = (float) floor( (double) ( Xph_short_flt1 + 0.5f ) ); - Xph_short_flt2round -= ( Xph_short_flt2round == 1024.0f ? 1024.0f : 0.0f ); /* wrap 1.0 to 0.0 */ - - float Xph_short_flt2floor = (float) floor( (double) Xph_short_flt1 ); - - - if ( ii == 0 ) - { - fprintf( stderr, "\n frame=%5d, m=%3d, ii=%4d, tst= %.15g rad, Xph_short_orig=%4d, Xph_short_flt2round=%4d, Xph_shortflt2floor=%4d, Xph_short_new=%4d ", - frame, m, ii, Xph_tst, Xph_short_orig, (int16_t) Xph_short_flt2round, (int16_t) Xph_short_flt2floor, Xph_short_new ); - } - - if ( ii == 0 && Xph_short_orig != Xph_short_new && ( ( abs( Xph_short_orig - Xph_short_new ) > 1 ) || abs( (Xph_short_orig+1)&1023 - (Xph_short_new+1)&1023) > 1) ) - { - fprintf( stderr, " MISS !! Xph_short_orig != Xph_short_new && diff > 1 !!" ); - } - assert( Xph_short_flt2floor >= 0.0 ); - assert( Xph_short_flt2floor <= 1023.0 ); - - if ( ii == 0 && Xph_short_flt2round != Xph_short_flt2floor ) - { - // fprintf( stderr, "\n frame=%5d, m=%3d, ii=%4d, tst= %.15g rad, Xph_short_orig=%4d, Xph_short_flt2round=%4d, Xph_shortflt2floor=%4d, Xph_short_new=%4d ", - // frame, m, ii, Xph_tst, Xph_short_orig, (int16_t) Xph_short_flt2round, (int16_t) Xph_short_flt2floor, Xph_short_new ); - - fprintf( stderr, " rounding change by %.2f !!**", Xph_short_flt2round - Xph_short_flt2floor ); - } - assert( Xph_short_flt2round >= 0.0 ); - assert( Xph_short_flt2round <= 1023.0 ); - - } /* end for */ - } -#endif - #else Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; #endif @@ -1227,8 +1157,6 @@ static void subst_spec( #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* fractional phase of Xph converted to an integer in the range [0..1023] */ /* in BASOP this is simply a truncation (through extract_l(Word32)) of a 32bit value at the Q16 bimal point + shifting to a 10 bit index */ - - /* old: Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; */ /* yields out USAN of range for int16_t */ #define WMC_TOOL_SKIP tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ @@ -1239,25 +1167,6 @@ static void subst_spec( ADD( 2 ); /* sub, rnd */ LOGIC( 1 ); /* s_and */ #undef WMC_TOOL_SKIP - -#ifdef DEBUGGING - { - int16_t Xph_short_bad; - int16_t Xph_short_corrected; - - - Xph_short_bad = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* yields out USAN of range for int16 */ - /* negative number can be created in cat to int16_t , but wraps back with &0x03ff in MSVC */ - - Xph_short_corrected = Xph_short; - - assert( Xph_short_corrected >= 0 && Xph_short_corrected <= 1023 ); - if ( Xph_short_bad != Xph_short_corrected ) - { - fprintf( stderr, "\n fix1002 actually active %5d -> %5d !!**", Xph_short_bad, Xph_short_corrected ); - } - } -#endif #else Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* yields out of range for int16 */ #endif -- GitLab From fa2b3f818cf85721a5dee52c6b1b33222b1ffbc5 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Tue, 5 Mar 2024 16:42:58 +0100 Subject: [PATCH 477/601] clang format --- lib_dec/FEC_HQ_phase_ecu.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index 9fe4760c82..7459faaa0f 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -288,9 +288,9 @@ static void trans_ana( *ph_dith = 0.0f; /* softly shift attenuation just a bit later for estimated "stable" music_content */ - burst_phdith_thresh = BURST_PHDITH_THRESH + ( int16_t )( est_mus_content * 1.0f + 0.5f ); - burst_att_thresh = BURST_ATT_THRESH + ( int16_t )( est_mus_content * 1.0f + 0.5f ); - att_per_frame = (float) ( ATT_PER_FRAME - ( int16_t )( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ + burst_phdith_thresh = BURST_PHDITH_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); + burst_att_thresh = BURST_ATT_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); + att_per_frame = (float) ( ATT_PER_FRAME - (int16_t) ( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ att_per_frame *= 0.1f; if ( burst_len > burst_phdith_thresh ) @@ -978,7 +978,7 @@ static void subst_spec( sincos = sincos_t_ext + 128; - Lprot = ( int16_t )( L_PROT32k * output_frame / 640 ); + Lprot = (int16_t) ( L_PROT32k * output_frame / 640 ); Lprot_1 = 1.0f / Lprot; Lecu = output_frame * 2; @@ -1107,7 +1107,7 @@ static void subst_spec( LOGIC( 1 ); /* s_and */ #undef WMC_TOOL_SKIP #else - Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; + Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; #endif @@ -1168,7 +1168,7 @@ static void subst_spec( LOGIC( 1 ); /* s_and */ #undef WMC_TOOL_SKIP #else - Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* yields out of range for int16 */ + Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; /* yields out of range for int16 */ #endif if ( Xph_short >= 512 ) @@ -1386,12 +1386,12 @@ static void rec_wtda( else { /* Smoothen onset of ECU frame */ - xf_len = ( int16_t )( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); + xf_len = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); p_ecu = xsubst_ + 2 * output_frame - Lprot + timesh; tbl_delta = 64.f / xf_len; /* 64 samples = 1/4 cycle in sincos_t */ for ( i = 0; i < xf_len; i++, p_ecu++ ) { - g = sincos_t[( ( int16_t )( i * tbl_delta ) )]; + g = sincos_t[( (int16_t) ( i * tbl_delta ) )]; g *= g; *p_ecu = g * ( *p_ecu ); } @@ -1563,7 +1563,7 @@ static void fec_ecu_pitch( /* Resampling to work at 8Khz */ fir_dwn( prevsynth, Asr_LP, prevsynth_LP, 2 * L, filt_size, *decimatefator ); /* resampling without delay */ - Lon20 = ( int16_t )( ( L / 20 ) / *decimatefator ); + Lon20 = (int16_t) ( ( L / 20 ) / *decimatefator ); /* Correlation analysis */ *min_corr = 0; @@ -1984,7 +1984,7 @@ static void fec_noise_filling( kk = 0; } - Rnd_N_noise = ( int16_t )( (float) N_noise * tmp ); + Rnd_N_noise = (int16_t) ( (float) N_noise * tmp ); sinq( (const float) EVS_PI / ( 2.0f * (float) Rnd_N_noise ), (const float) EVS_PI / ( 4.0f * (float) Rnd_N_noise ), (const int16_t) Rnd_N_noise, SS ); @@ -2062,7 +2062,7 @@ static void fec_alg( fec_noise_filling( prevsynth, synthesis, output_frame, N * decimatefactor, HqVoicing, gapsynth, ni_seed_forfec, element_mode, old_out ); - n = ( int16_t )( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + n = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); wtda( synthesis + ( output_frame - n ), ecu_rec, NULL, ALDO_WINDOW, ALDO_WINDOW, output_frame ); return; -- GitLab From 5831e5bff86959ff82cb91f413c22bbca77416a1 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Tue, 5 Mar 2024 18:04:43 +0100 Subject: [PATCH 478/601] added element_mode != EVS_MONO logic --- lib_dec/FEC_HQ_phase_ecu.c | 52 ++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index 7459faaa0f..2bd0fea8ab 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -1096,16 +1096,23 @@ static void subst_spec( Xph = corr_phase[m]; #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE + if ( element_mode != EVS_MONO ) + { #define WMC_TOOL_SKIP - tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ - tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ - Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ - - MULT( 2 ); - MISC( 1 ); /* floor */ - ADD( 2 ); /* sub, rnd */ - LOGIC( 1 ); /* s_and */ + tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ + tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ))) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ + Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ + + MULT( 2 ); + MISC( 1 ); /* floor */ + ADD( 2 ); /* sub, rnd */ + LOGIC( 1 ); /* s_and */ #undef WMC_TOOL_SKIP + } + else + { + Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; /* WMC-costly % in use, no rounding */ + } #else Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; #endif @@ -1155,20 +1162,27 @@ static void subst_spec( } #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE - /* fractional phase of Xph converted to an integer in the range [0..1023] */ - /* in BASOP this is simply a truncation (through extract_l(Word32)) of a 32bit value at the Q16 bimal point + shifting to a 10 bit index */ + if ( element_mode != EVS_MONO ) + { + /* fractional phase of Xph converted to an integer in the range [0..1023] */ + /* in BASOP this is simply a truncation (through extract_l(Word32)) of a 32bit value at the Q16 bimal point + shifting to a 10 bit index */ #define WMC_TOOL_SKIP - tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ - tmpf = ( 1024.0f ) * ( tmpf - floorf( tmpf ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ - Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ - - MULT( 2 ); - MISC( 1 ); /* floor */ - ADD( 2 ); /* sub, rnd */ - LOGIC( 1 ); /* s_and */ + tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ + tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ) )) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ + Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ + + MULT( 2 ); + MISC( 1 ); /* floor */ + ADD( 2 ); /* sub, rnd */ + LOGIC( 1 ); /* s_and */ #undef WMC_TOOL_SKIP + } + else + { + Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* NB! USAN warning for cast from float to int16_t, no rounding */ + } #else - Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; /* yields out of range for int16 */ + Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; #endif if ( Xph_short >= 512 ) -- GitLab From cf0bb74d550f6b5d2b3000699944ff95d2427368 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Tue, 5 Mar 2024 18:08:52 +0100 Subject: [PATCH 479/601] clang format --- lib_dec/FEC_HQ_phase_ecu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index 2bd0fea8ab..a4ddf56ac9 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -1100,7 +1100,7 @@ static void subst_spec( { #define WMC_TOOL_SKIP tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ - tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ))) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ + tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ) ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ MULT( 2 ); @@ -1111,7 +1111,7 @@ static void subst_spec( } else { - Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; /* WMC-costly % in use, no rounding */ + Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; /* WMC-costly % in use, no rounding */ } #else Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; @@ -1168,7 +1168,7 @@ static void subst_spec( /* in BASOP this is simply a truncation (through extract_l(Word32)) of a 32bit value at the Q16 bimal point + shifting to a 10 bit index */ #define WMC_TOOL_SKIP tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ - tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ) )) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ + tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ) ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ MULT( 2 ); @@ -1179,10 +1179,10 @@ static void subst_spec( } else { - Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* NB! USAN warning for cast from float to int16_t, no rounding */ + Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; /* NB! USAN warning for cast from float to int16_t, no rounding */ } #else - Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; + Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; #endif if ( Xph_short >= 512 ) -- GitLab From a6f6c4462f003c7352c4aa6a6310ecfe7f59f19f Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 6 Mar 2024 09:02:19 +0100 Subject: [PATCH 480/601] ignore non-zero exit code from non-20ms render framesize pytest run --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ee7c7ea915..8621c49f54 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2040,8 +2040,9 @@ coverage-test-on-main-scheduled: - python3 tests/create_short_testvectors.py - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v -n auto --update_ref 1 -m create_ref --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v -n auto --update_ref 1 -m create_ref_part2 --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 5 --decoder_only - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 10 --decoder_only + # need to ignore non-zero exit codes as limiter is active and thus the different framesiszes will not be BE in all cases + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 5 --decoder_only || true + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 10 --decoder_only || true - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_cut - lcov -c -d obj -o coverage_stv.info # extract coverage of short test vectors here -- GitLab From d2d1481e117c3feacdfa1d456ebb2e5ba11d32b8 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 6 Mar 2024 09:09:36 +0100 Subject: [PATCH 481/601] set exit code vars to zero before running the tests --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8621c49f54..157c565d0f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -549,6 +549,8 @@ pytest-compare-20ms-and-5ms-rendering: - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -m create_ref_part2 ### run pytest - exit_code=0 + - exit_code5=0 + - exit_code10=0 - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true -- GitLab From 5c3588cc985f04e852ec8d1eba27a902109f7f7d Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 6 Mar 2024 12:12:40 +0100 Subject: [PATCH 482/601] issue 1022: remove unused function ivas_param_ism_dec(); under FIX_1022_REMOVE_PARAMISM_DEC --- lib_com/ivas_prot.h | 2 ++ lib_com/options.h | 1 + lib_dec/ivas_ism_param_dec.c | 14 +++++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e80b23aa15..dab1f1036f 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1097,11 +1097,13 @@ void ivas_param_ism_dec_close( const AUDIO_CONFIG output_config /* i : output audio configuration */ ); +#ifndef FIX_1022_REMOVE_PARAMISM_DEC void ivas_param_ism_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ); +#endif void ivas_ism_dec_digest_tc( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 52901ec9c4..32ee53a784 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,6 +159,7 @@ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ +#define FIX_1022_REMOVE_PARAMISM_DEC /* VA: issue 1022: remove unused function ivas_param_ism_dec() */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 9d1e179c8b..9337ccb08a 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -324,7 +324,7 @@ static void ivas_param_ism_render_slot( return; } - +#ifndef FIX_1022_REMOVE_PARAMISM_DEC static void ivas_param_ism_rendering( PARAM_ISM_DEC_HANDLE hParamIsmDec, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, @@ -361,7 +361,7 @@ static void ivas_param_ism_rendering( return; } - +#endif static ivas_error ivas_param_ism_rendering_init( PARAM_ISM_RENDERING_HANDLE hParamIsmRendering, @@ -729,7 +729,7 @@ void ivas_param_ism_dec_close( return; } - +#ifndef FIX_1022_REMOVE_PARAMISM_DEC /*-------------------------------------------------------------------------* * ivas_param_ism_dec() * @@ -973,7 +973,7 @@ void ivas_param_ism_dec( return; } - +#endif /*-------------------------------------------------------------------------* * ivas_ism_dec_digest_tc() @@ -1121,7 +1121,7 @@ void ivas_param_ism_dec_digest_tc( nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; } - push_wmops( "ivas_param_ism_dec" ); + push_wmops( "ivas_param_ism_dec_digest_tc" ); /* general setup */ ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hParamIsmDec->hParamIsmRendering->interpolator ); @@ -1533,8 +1533,10 @@ void ivas_param_ism_params_to_masa_param_mapping( st_ivas->hISMDTX.dtx_flag = 1; } +#ifndef FIX_1022_REMOVE_PARAMISM_DEC if ( st_ivas->nchan_ism > 1 ) { +#endif if ( st_ivas->hISMDTX.dtx_flag ) { float energy_ratio; @@ -1598,6 +1600,7 @@ void ivas_param_ism_params_to_masa_param_mapping( } } } +#ifndef FIX_1022_REMOVE_PARAMISM_DEC } else { @@ -1617,6 +1620,7 @@ void ivas_param_ism_params_to_masa_param_mapping( } } } +#endif return; } -- GitLab From a5474b69444093e86f513ecb173910a99e51cbe0 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 6 Mar 2024 12:21:52 +0100 Subject: [PATCH 483/601] issue 1023: remove unused function ivas_param_mc_dec(); under FIX_1023_REMOVE_PARAMMC_DEC --- lib_com/ivas_prot.h | 2 ++ lib_com/options.h | 1 + lib_dec/ivas_mc_param_dec.c | 7 +++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e80b23aa15..f2c04bf479 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3876,11 +3876,13 @@ void ivas_param_mc_dec_render( float *output_f[] /* o : rendered time signal */ ); +#ifndef FIX_1023_REMOVE_PARAMMC_DEC void ivas_param_mc_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ); +#endif /*! r: number of cldfb synthesis instances */ int16_t param_mc_get_num_cldfb_syntheses( Decoder_Struct *st_ivas /* i : IVAS decoder structure */ diff --git a/lib_com/options.h b/lib_com/options.h index 52901ec9c4..ac87228cde 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,6 +159,7 @@ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ +#define FIX_1023_REMOVE_PARAMMC_DEC /* VA: issue 1023: remove unused function ivas_param_mc_dec() */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 70f01eb927..7e9577a1a0 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1471,9 +1471,9 @@ void ivas_param_mc_dec_digest_tc( /*------------------------------------------------------------------------- - * ivas_param_mc_dec() + * ivas_param_mc_dec_render() * - * Parametric MC decoding process + * Parametric MC rendering process *------------------------------------------------------------------------*/ void ivas_param_mc_dec_render( @@ -1809,6 +1809,8 @@ void ivas_param_mc_dec_render( return; } + +#ifndef FIX_1023_REMOVE_PARAMMC_DEC /*------------------------------------------------------------------------- * ivas_param_mc_dec() * @@ -1848,6 +1850,7 @@ void ivas_param_mc_dec( pop_wmops(); return; } +#endif /*------------------------------------------------------------------------- * param_mc_dec_init() -- GitLab From 334abdb36158636a7faf35b7ddf8cdf3dc5e0b10 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 6 Mar 2024 12:39:41 +0100 Subject: [PATCH 484/601] issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices(); under FIX_1024_REMOVE_PARAMMC_MIXING_MAT --- lib_com/options.h | 1 + lib_dec/ivas_mc_param_dec.c | 10 ++++++++-- lib_dec/ivas_out_setup_conversion.c | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 52901ec9c4..6567112375 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,6 +159,7 @@ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ +#define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 70f01eb927..3ac207849c 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -88,8 +88,10 @@ static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hDirAC, float *ild static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); +#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); +#endif static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float *mixing_matrix[], float *mixing_matrix_res[], const uint16_t nX, const uint16_t nY ); static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator ); @@ -1454,15 +1456,19 @@ void ivas_param_mc_dec_digest_tc( } +#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); } else { +#endif /* generate mixing matrices */ ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); +#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT } +#endif pop_wmops(); @@ -2445,7 +2451,7 @@ static void ivas_param_mc_get_mixing_matrices( return; } - +#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT /*------------------------------------------------------------------------- * ivas_param_mc_get_mono_stereo_mixing_matrices() * @@ -2566,7 +2572,7 @@ static void ivas_param_mc_get_mono_stereo_mixing_matrices( return; } - +#endif /*------------------------------------------------------------------------- * param_mc_update_mixing_matrices() diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 75015f7aeb..b66e02e1ee 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -973,7 +973,11 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); set_zero( target_ch_ener, MAX_OUTPUT_CHANNELS ); +#ifdef FIX_1024_REMOVE_PARAMMC_MIXING_MAT + /* Step 1.2, get target channel energies for the transported format, Nrqq calculation */ +#else /* Step 1.2, get target channel energies for the transported format as in ivas_param_mc_get_mono_stereo_mixing_matrices(), Nrqq calculation */ +#endif ild_q = hParamMC->icld_q + bandIdx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; for ( chInIdx = 0; chInIdx < nchan_transport_format; chInIdx++ ) @@ -991,7 +995,11 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( Nrqq[hParamMC->hMetadataPMC->ild_mapping_conf->ild_index[chInIdx]] = powf( 10.0f, ild_q[chInIdx] / 10.0f ) * hParamMC->hMetadataPMC->ild_factors[chInIdx] * ref_ener; } +#ifdef FIX_1024_REMOVE_PARAMMC_MIXING_MAT + /* Step 1.3 get target Cy (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ +#else /* Step 1.3 get target Cy like in ivas_param_mc_get_mono_stereo_mixing_matrices() (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ +#endif for ( chOutIdx = 0; chOutIdx < nchan_out; chOutIdx++ ) { for ( i = 0; i < nchan_transport_format; i++ ) -- GitLab From fd47d26e6d98de5292faa80e5d976a6fb019b8f0 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Wed, 6 Mar 2024 15:07:33 +0100 Subject: [PATCH 485/601] revert to a lower complexity likely BE(IVAS and EVS-Mono) version without rounding --- lib_dec/FEC_HQ_phase_ecu.c | 105 ++++++++++++++++++++++++------------- 1 file changed, 68 insertions(+), 37 deletions(-) diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index a4ddf56ac9..f4c6505c9b 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -288,9 +288,9 @@ static void trans_ana( *ph_dith = 0.0f; /* softly shift attenuation just a bit later for estimated "stable" music_content */ - burst_phdith_thresh = BURST_PHDITH_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); - burst_att_thresh = BURST_ATT_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); - att_per_frame = (float) ( ATT_PER_FRAME - (int16_t) ( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ + burst_phdith_thresh = BURST_PHDITH_THRESH + ( int16_t )( est_mus_content * 1.0f + 0.5f ); + burst_att_thresh = BURST_ATT_THRESH + ( int16_t )( est_mus_content * 1.0f + 0.5f ); + att_per_frame = (float) ( ATT_PER_FRAME - ( int16_t )( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ att_per_frame *= 0.1f; if ( burst_len > burst_phdith_thresh ) @@ -978,7 +978,7 @@ static void subst_spec( sincos = sincos_t_ext + 128; - Lprot = (int16_t) ( L_PROT32k * output_frame / 640 ); + Lprot = ( int16_t )( L_PROT32k * output_frame / 640 ); Lprot_1 = 1.0f / Lprot; Lecu = output_frame * 2; @@ -1096,25 +1096,58 @@ static void subst_spec( Xph = corr_phase[m]; #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE - if ( element_mode != EVS_MONO ) - { + /* BE , but with maintained dual mult of a constant, bnut mask the 10 bits in Word32, truncation */ +#define WMC_TOOL_SKIP + Xph_short = ( int16_t )( 0x000003ff & ( int32_t )( ( Xph * 512 ) / EVS_PI ) ); + MULT( 2 ); /* mult with constant, twice due to legacy precedence use */ + LOGIC( 1 ); /* L_and */ + MISC( 1 ); /* extract_l */ +#undef WMC_TOOL_SKIP +#if 1 + int16_t Xph_short_orig = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; /* BE: 2 mults, 1 modulo */ /* bad line(for WMC): WMC-costly modulo % in use, no rounding */ + int16_t Xph_short_1mult_nonbe = ( int16_t )( 0x000003ff & ( int32_t )( ( Xph * ( 512.0 / EVS_PI ) ) ) ); /* nonBE: single mult, mask the 10 bits in Word32 , still no rounding */ + int16_t Xph_short_1mult_rnd_nonbe = ( int16_t )( 0x000003ff & ( ( 1L + ( ( int32_t )( Xph * ( 1024.0 / EVS_PI ) ) ) ) >> 1 ) ); /* nonBE: single mult, add 1(round) shift1, mask the 10 bits in Word32 , i.e. with rounding */ + + assert( Xph_short == Xph_short_orig && "Xph_short == Xph_short_orig" ); +#endif + +#ifdef DEBUGGING + + int32_t Xph_long_new = ( int32_t )( Xph * ( 512 / EVS_PI ) ); /* mult by a single constant and float cast to int32_t */ + int32_t Xph_long_old = ( int32_t )( ( Xph * 512 ) / EVS_PI ); /* mult by 2 constants ! and float cast to int32_t , (Xph<<9) / pi */ + int32_t Xph_long = Xph_long_old; + + //assert( Xph_long_new == Xph_long_old && __func__ && " Xph_long_new != Xph_long_old" ); // mat differ due to order of division + + int32_t L_tmp1 = Xph_long % 32768; /* counts as division: 6-25 cycles */ + int32_t L_tmp2 = Xph_long & 0x00007fff; /* L_and mask : 1 cycle */ + // assert( L_tmp1 == L_tmp2 && __func__ && " L_tmp1 != L_tmp2 " ); + + + Xph_long = ( Xph_long & 0x00007fff ); /* L_and() equivalent to % 32768 */ + int16_t Xph_short_new1 = ( (int16_t) Xph_long ) & 0x03ff; + int16_t Xph_short_new2 = ( int16_t )( Xph_long_old & 0x000003ff ); + + //assert( Xph_short == Xph_short_new1 && __func__ && " Xph_short != Xph_short_new1" ); + //assert( Xph_short == Xph_short_new2 && __func__ && " Xph_short != Xph_short_new2" ); + +#if 0 + /* guarantee no wrap around to negative side of 32 bit signed integer value */ #define WMC_TOOL_SKIP tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ) ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ - Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ + int16_t Xph_short_flt_correct = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ MULT( 2 ); MISC( 1 ); /* floor */ ADD( 2 ); /* sub, rnd */ LOGIC( 1 ); /* s_and */ #undef WMC_TOOL_SKIP - } - else - { - Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; /* WMC-costly % in use, no rounding */ - } +#endif +#endif + #else - Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; + Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; #endif @@ -1162,30 +1195,28 @@ static void subst_spec( } #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE - if ( element_mode != EVS_MONO ) - { - /* fractional phase of Xph converted to an integer in the range [0..1023] */ - /* in BASOP this is simply a truncation (through extract_l(Word32)) of a 32bit value at the Q16 bimal point + shifting to a 10 bit index */ #define WMC_TOOL_SKIP - tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ - tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ) ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ - Xph_short = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ - - MULT( 2 ); - MISC( 1 ); /* floor */ - ADD( 2 ); /* sub, rnd */ - LOGIC( 1 ); /* s_and */ + Xph_short = ( int16_t )( ( ( int32_t )( ( Xph * 512 ) / EVS_PI ) ) & 0x000003ff ); + MULT( 2 ); /* mult with constant, twice due to legacy precedence */ + LOGIC( 1 ); /* L_and */ + MISC( 1 ); /* extract_l */ #undef WMC_TOOL_SKIP - } - else - { - Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; /* NB! USAN warning for cast from float to int16_t, no rounding */ - } +#if 1 + int16_t Xph_short_orig_ph_dith = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* USAN bad cast, bad dual mults */ + assert( Xph_short == Xph_short_orig_ph_dith ); +#endif + +#ifdef DEBUGGING + /* NB! USAN undefined behaviour warning for float-> short cast adressed, no rounding required here as phase is scrambled anyway */ + /* applied also EVS_MONO */ +#endif + + #else - Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; + Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; #endif - if ( Xph_short >= 512 ) + if ( Xph_short >= 512 ) { sin_F = -sincos_t_ext[Xph_short - 512]; if ( Xph_short < 768 ) @@ -1400,12 +1431,12 @@ static void rec_wtda( else { /* Smoothen onset of ECU frame */ - xf_len = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); + xf_len = ( int16_t )( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); p_ecu = xsubst_ + 2 * output_frame - Lprot + timesh; tbl_delta = 64.f / xf_len; /* 64 samples = 1/4 cycle in sincos_t */ for ( i = 0; i < xf_len; i++, p_ecu++ ) { - g = sincos_t[( (int16_t) ( i * tbl_delta ) )]; + g = sincos_t[( ( int16_t )( i * tbl_delta ) )]; g *= g; *p_ecu = g * ( *p_ecu ); } @@ -1577,7 +1608,7 @@ static void fec_ecu_pitch( /* Resampling to work at 8Khz */ fir_dwn( prevsynth, Asr_LP, prevsynth_LP, 2 * L, filt_size, *decimatefator ); /* resampling without delay */ - Lon20 = (int16_t) ( ( L / 20 ) / *decimatefator ); + Lon20 = ( int16_t )( ( L / 20 ) / *decimatefator ); /* Correlation analysis */ *min_corr = 0; @@ -1998,7 +2029,7 @@ static void fec_noise_filling( kk = 0; } - Rnd_N_noise = (int16_t) ( (float) N_noise * tmp ); + Rnd_N_noise = ( int16_t )( (float) N_noise * tmp ); sinq( (const float) EVS_PI / ( 2.0f * (float) Rnd_N_noise ), (const float) EVS_PI / ( 4.0f * (float) Rnd_N_noise ), (const int16_t) Rnd_N_noise, SS ); @@ -2076,7 +2107,7 @@ static void fec_alg( fec_noise_filling( prevsynth, synthesis, output_frame, N * decimatefactor, HqVoicing, gapsynth, ni_seed_forfec, element_mode, old_out ); - n = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + n = ( int16_t )( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); wtda( synthesis + ( output_frame - n ), ecu_rec, NULL, ALDO_WINDOW, ALDO_WINDOW, output_frame ); return; -- GitLab From 74dc3e3a8074bfd1856943a20fd2e14738169599 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Wed, 6 Mar 2024 15:23:09 +0100 Subject: [PATCH 486/601] clang format --- lib_dec/FEC_HQ_phase_ecu.c | 54 +++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index f4c6505c9b..fb0fe74dca 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -288,9 +288,9 @@ static void trans_ana( *ph_dith = 0.0f; /* softly shift attenuation just a bit later for estimated "stable" music_content */ - burst_phdith_thresh = BURST_PHDITH_THRESH + ( int16_t )( est_mus_content * 1.0f + 0.5f ); - burst_att_thresh = BURST_ATT_THRESH + ( int16_t )( est_mus_content * 1.0f + 0.5f ); - att_per_frame = (float) ( ATT_PER_FRAME - ( int16_t )( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ + burst_phdith_thresh = BURST_PHDITH_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); + burst_att_thresh = BURST_ATT_THRESH + (int16_t) ( est_mus_content * 1.0f + 0.5f ); + att_per_frame = (float) ( ATT_PER_FRAME - (int16_t) ( est_mus_content * 1.0f + 0.5f ) ); /* only slighty less att for music */ att_per_frame *= 0.1f; if ( burst_len > burst_phdith_thresh ) @@ -978,7 +978,7 @@ static void subst_spec( sincos = sincos_t_ext + 128; - Lprot = ( int16_t )( L_PROT32k * output_frame / 640 ); + Lprot = (int16_t) ( L_PROT32k * output_frame / 640 ); Lprot_1 = 1.0f / Lprot; Lecu = output_frame * 2; @@ -1098,38 +1098,38 @@ static void subst_spec( #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* BE , but with maintained dual mult of a constant, bnut mask the 10 bits in Word32, truncation */ #define WMC_TOOL_SKIP - Xph_short = ( int16_t )( 0x000003ff & ( int32_t )( ( Xph * 512 ) / EVS_PI ) ); + Xph_short = (int16_t) ( 0x000003ff & (int32_t) ( ( Xph * 512 ) / EVS_PI ) ); MULT( 2 ); /* mult with constant, twice due to legacy precedence use */ LOGIC( 1 ); /* L_and */ MISC( 1 ); /* extract_l */ #undef WMC_TOOL_SKIP #if 1 - int16_t Xph_short_orig = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; /* BE: 2 mults, 1 modulo */ /* bad line(for WMC): WMC-costly modulo % in use, no rounding */ - int16_t Xph_short_1mult_nonbe = ( int16_t )( 0x000003ff & ( int32_t )( ( Xph * ( 512.0 / EVS_PI ) ) ) ); /* nonBE: single mult, mask the 10 bits in Word32 , still no rounding */ - int16_t Xph_short_1mult_rnd_nonbe = ( int16_t )( 0x000003ff & ( ( 1L + ( ( int32_t )( Xph * ( 1024.0 / EVS_PI ) ) ) ) >> 1 ) ); /* nonBE: single mult, add 1(round) shift1, mask the 10 bits in Word32 , i.e. with rounding */ + int16_t Xph_short_orig = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; /* BE: 2 mults, 1 modulo */ /* bad line(for WMC): WMC-costly modulo % in use, no rounding */ + int16_t Xph_short_1mult_nonbe = (int16_t) ( 0x000003ff & (int32_t) ( ( Xph * ( 512.0 / EVS_PI ) ) ) ); /* nonBE: single mult, mask the 10 bits in Word32 , still no rounding */ + int16_t Xph_short_1mult_rnd_nonbe = (int16_t) ( 0x000003ff & ( ( 1L + ( (int32_t) ( Xph * ( 1024.0 / EVS_PI ) ) ) ) >> 1 ) ); /* nonBE: single mult, add 1(round) shift1, mask the 10 bits in Word32 , i.e. with rounding */ assert( Xph_short == Xph_short_orig && "Xph_short == Xph_short_orig" ); #endif #ifdef DEBUGGING - int32_t Xph_long_new = ( int32_t )( Xph * ( 512 / EVS_PI ) ); /* mult by a single constant and float cast to int32_t */ - int32_t Xph_long_old = ( int32_t )( ( Xph * 512 ) / EVS_PI ); /* mult by 2 constants ! and float cast to int32_t , (Xph<<9) / pi */ + int32_t Xph_long_new = (int32_t) ( Xph * ( 512 / EVS_PI ) ); /* mult by a single constant and float cast to int32_t */ + int32_t Xph_long_old = (int32_t) ( ( Xph * 512 ) / EVS_PI ); /* mult by 2 constants ! and float cast to int32_t , (Xph<<9) / pi */ int32_t Xph_long = Xph_long_old; - //assert( Xph_long_new == Xph_long_old && __func__ && " Xph_long_new != Xph_long_old" ); // mat differ due to order of division + // assert( Xph_long_new == Xph_long_old && __func__ && " Xph_long_new != Xph_long_old" ); // mat differ due to order of division int32_t L_tmp1 = Xph_long % 32768; /* counts as division: 6-25 cycles */ int32_t L_tmp2 = Xph_long & 0x00007fff; /* L_and mask : 1 cycle */ - // assert( L_tmp1 == L_tmp2 && __func__ && " L_tmp1 != L_tmp2 " ); + // assert( L_tmp1 == L_tmp2 && __func__ && " L_tmp1 != L_tmp2 " ); Xph_long = ( Xph_long & 0x00007fff ); /* L_and() equivalent to % 32768 */ int16_t Xph_short_new1 = ( (int16_t) Xph_long ) & 0x03ff; - int16_t Xph_short_new2 = ( int16_t )( Xph_long_old & 0x000003ff ); + int16_t Xph_short_new2 = (int16_t) ( Xph_long_old & 0x000003ff ); - //assert( Xph_short == Xph_short_new1 && __func__ && " Xph_short != Xph_short_new1" ); - //assert( Xph_short == Xph_short_new2 && __func__ && " Xph_short != Xph_short_new2" ); + // assert( Xph_short == Xph_short_new1 && __func__ && " Xph_short != Xph_short_new1" ); + // assert( Xph_short == Xph_short_new2 && __func__ && " Xph_short != Xph_short_new2" ); #if 0 /* guarantee no wrap around to negative side of 32 bit signed integer value */ @@ -1143,11 +1143,11 @@ static void subst_spec( ADD( 2 ); /* sub, rnd */ LOGIC( 1 ); /* s_and */ #undef WMC_TOOL_SKIP -#endif +#endif #endif #else - Xph_short = ( int16_t )( ( ( int32_t )( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; + Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; #endif @@ -1196,14 +1196,14 @@ static void subst_spec( #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE #define WMC_TOOL_SKIP - Xph_short = ( int16_t )( ( ( int32_t )( ( Xph * 512 ) / EVS_PI ) ) & 0x000003ff ); + Xph_short = (int16_t) ( ( (int32_t) ( ( Xph * 512 ) / EVS_PI ) ) & 0x000003ff ); MULT( 2 ); /* mult with constant, twice due to legacy precedence */ LOGIC( 1 ); /* L_and */ MISC( 1 ); /* extract_l */ #undef WMC_TOOL_SKIP #if 1 - int16_t Xph_short_orig_ph_dith = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; /* USAN bad cast, bad dual mults */ - assert( Xph_short == Xph_short_orig_ph_dith ); + int16_t Xph_short_orig_ph_dith = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; /* USAN bad cast, bad dual mults */ + assert( Xph_short == Xph_short_orig_ph_dith ); #endif #ifdef DEBUGGING @@ -1213,10 +1213,10 @@ static void subst_spec( #else - Xph_short = ( int16_t )( Xph * 512 / EVS_PI ) & 0x03ff; + Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; #endif - if ( Xph_short >= 512 ) + if ( Xph_short >= 512 ) { sin_F = -sincos_t_ext[Xph_short - 512]; if ( Xph_short < 768 ) @@ -1431,12 +1431,12 @@ static void rec_wtda( else { /* Smoothen onset of ECU frame */ - xf_len = ( int16_t )( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); + xf_len = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); p_ecu = xsubst_ + 2 * output_frame - Lprot + timesh; tbl_delta = 64.f / xf_len; /* 64 samples = 1/4 cycle in sincos_t */ for ( i = 0; i < xf_len; i++, p_ecu++ ) { - g = sincos_t[( ( int16_t )( i * tbl_delta ) )]; + g = sincos_t[( (int16_t) ( i * tbl_delta ) )]; g *= g; *p_ecu = g * ( *p_ecu ); } @@ -1608,7 +1608,7 @@ static void fec_ecu_pitch( /* Resampling to work at 8Khz */ fir_dwn( prevsynth, Asr_LP, prevsynth_LP, 2 * L, filt_size, *decimatefator ); /* resampling without delay */ - Lon20 = ( int16_t )( ( L / 20 ) / *decimatefator ); + Lon20 = (int16_t) ( ( L / 20 ) / *decimatefator ); /* Correlation analysis */ *min_corr = 0; @@ -2029,7 +2029,7 @@ static void fec_noise_filling( kk = 0; } - Rnd_N_noise = ( int16_t )( (float) N_noise * tmp ); + Rnd_N_noise = (int16_t) ( (float) N_noise * tmp ); sinq( (const float) EVS_PI / ( 2.0f * (float) Rnd_N_noise ), (const float) EVS_PI / ( 4.0f * (float) Rnd_N_noise ), (const int16_t) Rnd_N_noise, SS ); @@ -2107,7 +2107,7 @@ static void fec_alg( fec_noise_filling( prevsynth, synthesis, output_frame, N * decimatefactor, HqVoicing, gapsynth, ni_seed_forfec, element_mode, old_out ); - n = ( int16_t )( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + n = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); wtda( synthesis + ( output_frame - n ), ecu_rec, NULL, ALDO_WINDOW, ALDO_WINDOW, output_frame ); return; -- GitLab From 0ad22373a08625c810f91aa227e9f0ca48b7035e Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Wed, 6 Mar 2024 15:39:45 +0100 Subject: [PATCH 487/601] removed debug code and alt2(with rounding) code --- lib_dec/FEC_HQ_phase_ecu.c | 56 +------------------------------------- 1 file changed, 1 insertion(+), 55 deletions(-) diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index fb0fe74dca..4313fb45a0 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -1096,56 +1096,13 @@ static void subst_spec( Xph = corr_phase[m]; #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE - /* BE , but with maintained dual mult of a constant, bnut mask the 10 bits in Word32, truncation */ + /* BE , but with maintained dual mult of a constant, mask the 10 bits in Word32, truncation */ #define WMC_TOOL_SKIP Xph_short = (int16_t) ( 0x000003ff & (int32_t) ( ( Xph * 512 ) / EVS_PI ) ); MULT( 2 ); /* mult with constant, twice due to legacy precedence use */ LOGIC( 1 ); /* L_and */ MISC( 1 ); /* extract_l */ #undef WMC_TOOL_SKIP -#if 1 - int16_t Xph_short_orig = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; /* BE: 2 mults, 1 modulo */ /* bad line(for WMC): WMC-costly modulo % in use, no rounding */ - int16_t Xph_short_1mult_nonbe = (int16_t) ( 0x000003ff & (int32_t) ( ( Xph * ( 512.0 / EVS_PI ) ) ) ); /* nonBE: single mult, mask the 10 bits in Word32 , still no rounding */ - int16_t Xph_short_1mult_rnd_nonbe = (int16_t) ( 0x000003ff & ( ( 1L + ( (int32_t) ( Xph * ( 1024.0 / EVS_PI ) ) ) ) >> 1 ) ); /* nonBE: single mult, add 1(round) shift1, mask the 10 bits in Word32 , i.e. with rounding */ - - assert( Xph_short == Xph_short_orig && "Xph_short == Xph_short_orig" ); -#endif - -#ifdef DEBUGGING - - int32_t Xph_long_new = (int32_t) ( Xph * ( 512 / EVS_PI ) ); /* mult by a single constant and float cast to int32_t */ - int32_t Xph_long_old = (int32_t) ( ( Xph * 512 ) / EVS_PI ); /* mult by 2 constants ! and float cast to int32_t , (Xph<<9) / pi */ - int32_t Xph_long = Xph_long_old; - - // assert( Xph_long_new == Xph_long_old && __func__ && " Xph_long_new != Xph_long_old" ); // mat differ due to order of division - - int32_t L_tmp1 = Xph_long % 32768; /* counts as division: 6-25 cycles */ - int32_t L_tmp2 = Xph_long & 0x00007fff; /* L_and mask : 1 cycle */ - // assert( L_tmp1 == L_tmp2 && __func__ && " L_tmp1 != L_tmp2 " ); - - - Xph_long = ( Xph_long & 0x00007fff ); /* L_and() equivalent to % 32768 */ - int16_t Xph_short_new1 = ( (int16_t) Xph_long ) & 0x03ff; - int16_t Xph_short_new2 = (int16_t) ( Xph_long_old & 0x000003ff ); - - // assert( Xph_short == Xph_short_new1 && __func__ && " Xph_short != Xph_short_new1" ); - // assert( Xph_short == Xph_short_new2 && __func__ && " Xph_short != Xph_short_new2" ); - -#if 0 - /* guarantee no wrap around to negative side of 32 bit signed integer value */ -#define WMC_TOOL_SKIP - tmpf = Xph * ( 1.0f / PI2 ); /* normalize : mult() with a constant */ - tmpf = ( 1024.0f * ( tmpf - floorf( tmpf ) ) ) + 0.5f; /* obtain fraction : floor(), sub(), mult(), rnd(), out: [0...1024.5[ */ - int16_t Xph_short_flt_correct = ( (int16_t) tmpf ) & 0x03ff; /* mask to [0..1023]: s_and() , out: [0...1023] */ - - MULT( 2 ); - MISC( 1 ); /* floor */ - ADD( 2 ); /* sub, rnd */ - LOGIC( 1 ); /* s_and */ -#undef WMC_TOOL_SKIP -#endif -#endif - #else Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; #endif @@ -1201,17 +1158,6 @@ static void subst_spec( LOGIC( 1 ); /* L_and */ MISC( 1 ); /* extract_l */ #undef WMC_TOOL_SKIP -#if 1 - int16_t Xph_short_orig_ph_dith = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; /* USAN bad cast, bad dual mults */ - assert( Xph_short == Xph_short_orig_ph_dith ); -#endif - -#ifdef DEBUGGING - /* NB! USAN undefined behaviour warning for float-> short cast adressed, no rounding required here as phase is scrambled anyway */ - /* applied also EVS_MONO */ -#endif - - #else Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; #endif -- GitLab From 34ec6f28cc62b4a42c4cff0ed403c23a19676c9b Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Wed, 6 Mar 2024 15:47:15 +0100 Subject: [PATCH 488/601] removed further debug code --- lib_com/options.h | 2 +- lib_dec/FEC_HQ_phase_ecu.c | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8d354de568..fafd80a242 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,7 +170,7 @@ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ -#define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16, non-BE for PLC-conditions */ +#define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16, kept BE for PLC-conditions */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index 4313fb45a0..f376aca8ea 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -972,10 +972,6 @@ static void subst_spec( float one_peak_flag_mask; float alpha_local; float beta_local; -#ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE - float tmpf; -#endif - sincos = sincos_t_ext + 128; Lprot = (int16_t) ( L_PROT32k * output_frame / 640 ); -- GitLab From cf8c7e2ba8a5db428dc123ae636efe08699319cc Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Wed, 6 Mar 2024 16:12:35 +0100 Subject: [PATCH 489/601] rvered chaneg to decoder project file --- Workspace_msvc/decoder.vcxproj | 2 +- lib_dec/FEC_HQ_phase_ecu.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index 157f6dc94e..2228349d5e 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -45,7 +45,7 @@ <_ProjectFileVersion>15.0.27428.2015 - (ProjectDir)\..\ + ..\ .\Debug_$(ProjectName)\ false false diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index f376aca8ea..c98222be76 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -1682,7 +1682,7 @@ static void fec_ecu_dft( Tfr[*Nfft - 1] = target[N - 1]; for ( i = 1; i < *Nfft - 1; i++ ) /* interpolation for FFT */ { - tmp_short = (int16_t) floorf( i * tmp ); + tmp_short = (int16_t) floor( i * tmp ); Tfr[i] = target[tmp_short] + ( (float) i * tmp - ( (float) tmp_short ) ) * ( target[tmp_short + 1] - target[tmp_short] ); } -- GitLab From 79c618cbb921cd072de69834e23db3cbbade32b7 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Wed, 6 Mar 2024 16:39:23 +0100 Subject: [PATCH 490/601] corrected automerged switches in options.h --- lib_com/options.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index fafd80a242..aae6e7807a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,16 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ - -#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ -#define FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI /* FhG: fix and undef behaviour bug in the harmonic TCX model arithmetic coder */ -#define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ -#define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ -#define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ -#define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ -#define FIX_1001_ARI_HM_OVERFLOW /* FhG: fix for undef behaviour in in the harmonic TCX model arithmetic coder */ -#define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ -#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ -- GitLab From 898f904c8b20833838056e42767ec6a986aa616e Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Wed, 6 Mar 2024 17:41:31 +0100 Subject: [PATCH 491/601] cleaned up comments , removed manual instrumentation --- lib_dec/FEC_HQ_phase_ecu.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index c98222be76..7deb7db646 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -1092,13 +1092,8 @@ static void subst_spec( Xph = corr_phase[m]; #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE - /* BE , but with maintained dual mult of a constant, mask the 10 bits in Word32, truncation */ -#define WMC_TOOL_SKIP + /* extract fractional phase integer index in the range [0...1023] */ Xph_short = (int16_t) ( 0x000003ff & (int32_t) ( ( Xph * 512 ) / EVS_PI ) ); - MULT( 2 ); /* mult with constant, twice due to legacy precedence use */ - LOGIC( 1 ); /* L_and */ - MISC( 1 ); /* extract_l */ -#undef WMC_TOOL_SKIP #else Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; #endif @@ -1148,12 +1143,7 @@ static void subst_spec( } #ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE -#define WMC_TOOL_SKIP Xph_short = (int16_t) ( ( (int32_t) ( ( Xph * 512 ) / EVS_PI ) ) & 0x000003ff ); - MULT( 2 ); /* mult with constant, twice due to legacy precedence */ - LOGIC( 1 ); /* L_and */ - MISC( 1 ); /* extract_l */ -#undef WMC_TOOL_SKIP #else Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; #endif -- GitLab From fde18adae70b25da7290b9f8903515428e2a167d Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 6 Mar 2024 17:59:15 +0100 Subject: [PATCH 492/601] issue 960: unused function syn_output() is removed; under FIX_960_SYN_OUTPUT --- lib_com/options.h | 1 + lib_com/prot.h | 2 ++ lib_dec/syn_outp.c | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 52901ec9c4..ad7191a8f3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,6 +159,7 @@ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ +#define FIX_960_SYN_OUTPUT /* VA: issue 960: unused function syn_output() is removed */ /* #################### End BE switches ################################## */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 87f01a9161..69688e87de 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -4822,12 +4822,14 @@ void dec_acelp_4t64( const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ ); +#ifndef FIX_960_SYN_OUTPUT uint32_t syn_output( float *synth, /* i/o: float synthesis signal */ const int16_t output_frame, /* i : output frame length */ int16_t *synth_out /* o : integer 16 bits synthesis signal */ ); +#endif void FEC_exc_estim( Decoder_State *st, /* i/o: Decoder static memory */ const int16_t L_frame, /* i : length of the frame */ diff --git a/lib_dec/syn_outp.c b/lib_dec/syn_outp.c index 8e60b31c85..865df569f3 100644 --- a/lib_dec/syn_outp.c +++ b/lib_dec/syn_outp.c @@ -44,6 +44,10 @@ #include "prot.h" #include "wmc_auto.h" + +#ifdef FIX_960_SYN_OUTPUT +/* Note: syn_output() is replaced by ivas_syn_output() in IVAS */ +#else /*-------------------------------------------------------------------* * syn_output() * @@ -65,6 +69,7 @@ uint32_t syn_output( /* integer conversion */ return mvr2s( synth, synth_out, output_frame ); } +#endif /*-------------------------------------------------------------------* -- GitLab From 7e709a30ca4006406c45236cb9b80360d4e3b4c7 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 6 Mar 2024 18:36:36 +0100 Subject: [PATCH 493/601] wrap function sum_l() under DEBUGGING --- lib_com/prot.h | 2 ++ lib_com/tools.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib_com/prot.h b/lib_com/prot.h index 87f01a9161..de16bd8342 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -161,12 +161,14 @@ int16_t sum_s( const int16_t lvec /* i : length of input vector */ ); +#ifdef DEBUGGING /*! r: sum of all vector elements */ int32_t sum_l( const int32_t *vec, /* i : input vector */ const int16_t lvec /* i : length of input vector */ ); +#endif /*! r: sum of all vector elements */ float sum_f( const float *vec, /* i : input vector */ diff --git a/lib_com/tools.c b/lib_com/tools.c index 10633883fd..9dfa8b9f81 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -138,6 +138,7 @@ int16_t sum_s( return tmp; } +#ifdef DEBUGGING /*! r: sum of all vector elements */ int32_t sum_l( const int32_t *vec, /* i : input vector */ @@ -156,6 +157,7 @@ int32_t sum_l( return tmpL; } +#endif /*! r: sum of all vector elements */ float sum_f( const float *vec, /* i : input vector */ -- GitLab From 55e3aeaf01b158c042899bd6549f27bf3eef9a2c Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 6 Mar 2024 18:54:00 +0100 Subject: [PATCH 494/601] add SBA PCA self-test condition --- scripts/config/self_test.prm | 4 ++++ scripts/config/self_test_ltv.prm | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 4e24a5b737..6a211e3c53 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -878,6 +878,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba -1 128000 48 testv/stvFOA48c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stvFOA48c.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst +// SBA at 256 kbps, 48kHz in, 48kHz out, PCA, BINAURAL out +../IVAS_cod -pca -sba 1 256000 48 testv/stvFOA48c.wav bit +../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_SBA_PCA_256000_48-48_BINAURAL.tst + // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 6bdeaaf0a8..5281b5edda 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -878,6 +878,11 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba -1 128000 48 testv/ltv48_FOA.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/ltv48_FOA.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst +// SBA at 256 kbps, 48kHz in, 48kHz out, PCA, BINAURAL out +../IVAS_cod -pca -sba 1 256000 48 testv/ltv48_FOA.wav bit +../IVAS_dec BINAURAL 48 bit testv/ltv48_FOA.wav_SBA_PCA_256000_48-48_BINAURAL.tst + + // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching -- GitLab From b9f765236c7c51124913da0d23e1baef0c70a596 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 7 Mar 2024 08:31:52 +0100 Subject: [PATCH 495/601] fix weird character in ci file --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 157c565d0f..42753e8e98 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2044,7 +2044,7 @@ coverage-test-on-main-scheduled: - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v -n auto --update_ref 1 -m create_ref_part2 --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec # need to ignore non-zero exit codes as limiter is active and thus the different framesiszes will not be BE in all cases - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 5 --decoder_only || true - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 10 --decoder_only || true + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --dut_encoder_path ./IVAS_cod --dut_decoder_path ./IVAS_dec --dut_fr 10 --decoder_only || true - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_ref - python3 -m pytest -q -n auto tests/renderer/test_renderer.py --create_cut - lcov -c -d obj -o coverage_stv.info # extract coverage of short test vectors here -- GitLab From cf9ccee6b7bc0b10f4e00cd88a34b89d3640ba6b Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 7 Mar 2024 09:18:44 +0100 Subject: [PATCH 496/601] remove unused planarCP static variable --- lib_com/ivas_stat_com.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 6feb8efd99..434ddc6080 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -242,7 +242,6 @@ typedef struct ivas_spar_md_com_cfg int16_t max_bits_per_blk; int16_t prev_quant_idx; int16_t agc_bits_ch_idx; - int16_t planarCP; int16_t num_umx_chs; int16_t max_md_bits_spar; -- GitLab From 67ef955e48ab432c50c8333cbdece7948c3fc4c3 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 7 Mar 2024 09:33:31 +0100 Subject: [PATCH 497/601] #fix for #1021, address formal comment --- lib_com/ivas_prot.h | 2 +- lib_dec/ivas_ism_renderer.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 6afc081227..9e27f96fcf 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5224,7 +5224,7 @@ void ivas_ism_renderer_close( void ivas_ism_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH - const RENDERER_TYPE renderer_type, /* i : current renderer type */ + const RENDERER_TYPE renderer_type, /* i : active renderer type */ #endif float *output_f[], /* i/o: core-coder transport channels/object output */ const int16_t n_samples_to_render /* i : output frame length per channel */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 09d6fd0e62..6f176ca0ca 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -142,7 +142,7 @@ void ivas_ism_renderer_close( void ivas_ism_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH - const RENDERER_TYPE renderer_type, /* i: current renderer type */ + const RENDERER_TYPE renderer_type, /* i : active renderer type */ #endif float *output_f[], /* i/o: core-coder transport channels/object output */ const int16_t n_samples_to_render /* i : output frame length per channel */ -- GitLab From 3d689af690ba336f70edec8e09c7053086127a6b Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 7 Mar 2024 10:50:28 +0100 Subject: [PATCH 498/601] add 5ms and 10ms runs to sanitizer tests --- .gitlab-ci.yml | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 157c565d0f..51a4bf0406 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -201,7 +201,16 @@ stages: - make clean - make -j CLANG=$CLANG_NUM - testcase_timeout=$SELFTEST_SANITY_TIMEOUT - - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 python3 -m pytest $SELF_TEST_PRM_FILE -v --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec + - export UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 + - exit_code20=0 + - exit_code10=0 + - exit_code5=0 + + - python3 -m pytest $SELF_TEST_PRM_FILE -v --update_ref 1 -m create_ref --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code20=$? + - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? + - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? + + - if [ $exit_code20 -ne 0 ] || [ $exit_code10 -ne 0 ] || [ $exit_code5 -ne 0 ]; then exit 1; fi # --------------------------------------------------------------- @@ -283,12 +292,18 @@ stages: expire_in: 1 week when: always paths: - - report-junit.xml - - report.html + - report-junit-20ms.xml + - report-junit-10ms.xml + - report-junit-5ms.xml + - report-20ms.html + - report-10ms.html + - report-5ms.html expose_as: "Sanitizer selftest results" reports: junit: - - report-junit.xml + - report-junit-20ms.xml + - report-junit-10ms.xml + - report-junit-5ms.xml .sanitizer-selftest-ltv: stage: test @@ -299,12 +314,18 @@ stages: expire_in: 2 week when: always paths: - - report-junit.xml - - report.html + - report-junit-20ms.xml + - report-junit-10ms.xml + - report-junit-5ms.xml + - report-20ms.html + - report-10ms.html + - report-5ms.html expose_as: "Sanitizer selftest results" reports: junit: - - report-junit.xml + - report-junit-20ms.xml + - report-junit-10ms.xml + - report-junit-5ms.xml # --------------------------------------------------------------- # .pre jobs for setting up things -- GitLab From 548762f4fb1cf61e29838f18773d681f7c15575e Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 7 Mar 2024 13:02:44 +0100 Subject: [PATCH 499/601] check for sanitizer errors in the reports instead --- .gitlab-ci.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 946af7aa44..4c2b943464 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -202,15 +202,30 @@ stages: - make -j CLANG=$CLANG_NUM - testcase_timeout=$SELFTEST_SANITY_TIMEOUT - export UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 + - exit_code20=0 - exit_code10=0 - exit_code5=0 + - errors20=0 + - errors10=0 + - errors5=0 + + - if [ $CLANG_NUM -eq 1 ]; then sanitizer_type="MemorySanitizer"; elif [ $CLANG_NUM -eq 2 ]; then sanitizer_type="AddressSanitizer"; elif [ $CLANG_NUM -eq 3 ]; then sanitizer_type="UndefinedBehaviorSanitizer"; else echo "Wrong CLANG_NUM $CLANG_NUM given!"; exit 1; fi + # ignore exit codes, instead search in the report for errors - python3 -m pytest $SELF_TEST_PRM_FILE -v --update_ref 1 -m create_ref --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code20=$? + - errors20=$(cat report-20ms.html | grep -c "$sanitizer_type") || true + - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? + - errors10=$(cat report-10ms.html | grep -c "$sanitizer_type") || true + - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? + - errors5=$(cat report-5ms.html | grep -c "sanitizer_type") || true - - if [ $exit_code20 -ne 0 ] || [ $exit_code10 -ne 0 ] || [ $exit_code5 -ne 0 ]; then exit 1; fi + - if [ $errors20 -ne 0 ]; then echo "CLANG $sanitizer_type found errors in 20ms framesize decoding"; fi + - if [ $errors10 -ne 0 ]; then echo "CLANG $sanitizer_type found errors in 10ms framesize decoding"; fi + - if [ $errors5 -ne 0 ]; then echo "CLANG $sanitizer_type found errors in 5ms framesize decoding"; fi + - if [ $errors20 -ne 0 ] || [ $errors10 -ne 0 ] || [ $errors5 -ne 0 ]; then exit 1; fi # --------------------------------------------------------------- -- GitLab From 7486a232ca32dacd576e712aeddb821a20f0765d Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 7 Mar 2024 14:32:18 +0100 Subject: [PATCH 500/601] reintroduce testing of rotation in SHD --- scripts/config/self_test.prm | 4 ++++ scripts/config/self_test_ltv.prm | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 6a211e3c53..434fa282b5 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1232,6 +1232,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC714.tst +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, HR +../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_hrot.tst + // Multi-channel 5_1_2 at 32 kbps, 48kHz in, 48kHz out, STEREO out, random FER at 5% ../IVAS_cod -mc 5_1_2 32000 48 testv/stv512MC48c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 5281b5edda..92e1f62f81 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -884,7 +884,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 - // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_SWB.txt -masa 1 testv/ltv48_MASA1TC.met 13200 48 testv/ltv48_MASA1TC.wav bit ../IVAS_dec BINAURAL 48 bit testv/ltv48_MASA1TC.wav_13200_48-48_BINAURAL.tst @@ -1029,7 +1028,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -max_band testv/ivas_bws_20fr_start_WB.txt -masa 2 testv/ltv48_MASA2TC.met 384000 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/ltv48_MASA2TC.wav_384000_48-48_BinauralRoom.tst - // MASA 2dir 2TC at 512 kbps, 48kHz in, 48kHz out, 5_1 out ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met 512000 48 testv/ltv48_MASA2TC.wav bit ../IVAS_dec 5_1 48 bit testv/ltv48_MASA2TC.wav_512000_48-48_5_1.tst @@ -1230,6 +1228,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -max_band testv/ivas_bws_20fr_start_WB.txt -mc 7_1_4 160000 48 testv/ltv48_MC714.wav bit ../IVAS_dec BINAURAL 48 bit testv/ltv48_MC714.wav_MC714_160000_48-48_MC_binaural.tst +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, HR +../IVAS_cod -mc 7_1_4 512000 48 testv/ltv48_MC714.wav bit +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/ltv48_MC714.wav_MC714_512000_48-48_MC_binaural_hrot.tst + // Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, 7_1_4 out ../IVAS_cod -mc 7_1_4 160000 48 testv/ltv48_MC714.wav bit ../IVAS_dec 7_1_4 48 bit testv/ltv48_MC714.wav_MC714_160000_48-48_MC714.tst @@ -1691,8 +1693,6 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g192 bit_error // ../IVAS_dec STEREO 32 bit_error testv/ltv48_OSBA_3ISM_2OA.wav_STEREO_sw_48-32_FER10.tst - - // OSBA 3ISM 3OA at bitrate switching 13.2 to 512 kbps, 48kHz in, 32kHz out, BINAURAL ROOM REVERB out ../IVAS_cod -ism_sba 3 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_OSBA_3ISM_HOA3.wav bit ../IVAS_dec BINAURAL_ROOM_REVERB 32 bit testv/ltv48_OSBA_3ISM_HOA3.wav_BINAURAL_ROOM_REVERB_sw_48-32.tst -- GitLab From 5de4cf7f83f302092db43bf87a7d6c7a0711d0b6 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 7 Mar 2024 14:49:39 +0100 Subject: [PATCH 501/601] fix USAN issue in GSC --- lib_com/options.h | 1 + lib_dec/gs_dec.c | 4 ++++ lib_enc/gs_enc.c | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 52901ec9c4..0c06d48288 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,6 +159,7 @@ #define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ +#define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c index 936518dbbd..705694bc36 100644 --- a/lib_dec/gs_dec.c +++ b/lib_dec/gs_dec.c @@ -643,7 +643,11 @@ void gsc_dec( } if ( concat_out[j] < 0 ) { +#ifdef FIX_1027_GSC_INT_OVERFLOW + seed_init = ( int16_t )( (int32_t) seed_init + 3 ); +#else seed_init += 3; +#endif } } diff --git a/lib_enc/gs_enc.c b/lib_enc/gs_enc.c index b8b28f6b9b..cbf33ea970 100644 --- a/lib_enc/gs_enc.c +++ b/lib_enc/gs_enc.c @@ -545,7 +545,11 @@ void gsc_enc( } if ( concat_out[j] < 0 ) { +#ifdef FIX_1027_GSC_INT_OVERFLOW + seed_init = ( int16_t )( (int32_t) seed_init + 3 ); +#else seed_init += 3; +#endif } } -- GitLab From 74567f85dd532765e14b3bc1898e68130c8bb4b1 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Thu, 7 Mar 2024 14:59:14 +0100 Subject: [PATCH 502/601] clang format --- lib_dec/gs_dec.c | 2 +- lib_enc/gs_enc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c index 705694bc36..7319a55615 100644 --- a/lib_dec/gs_dec.c +++ b/lib_dec/gs_dec.c @@ -644,7 +644,7 @@ void gsc_dec( if ( concat_out[j] < 0 ) { #ifdef FIX_1027_GSC_INT_OVERFLOW - seed_init = ( int16_t )( (int32_t) seed_init + 3 ); + seed_init = (int16_t) ( (int32_t) seed_init + 3 ); #else seed_init += 3; #endif diff --git a/lib_enc/gs_enc.c b/lib_enc/gs_enc.c index cbf33ea970..3ec78d8f11 100644 --- a/lib_enc/gs_enc.c +++ b/lib_enc/gs_enc.c @@ -546,7 +546,7 @@ void gsc_enc( if ( concat_out[j] < 0 ) { #ifdef FIX_1027_GSC_INT_OVERFLOW - seed_init = ( int16_t )( (int32_t) seed_init + 3 ); + seed_init = (int16_t) ( (int32_t) seed_init + 3 ); #else seed_init += 3; #endif -- GitLab From 8cf7c08d75c157f09425c1815cea10856c14d7e3 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Fri, 8 Mar 2024 10:06:34 +0100 Subject: [PATCH 503/601] Additional tests for acoustics environment selection from a renderer configuration file --- scripts/config/self_test.prm | 4 ++-- scripts/config/self_test_ltv.prm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index ecf2e33c92..93cf090fb6 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -879,8 +879,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stvFOA48c.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst // SBA 3OA at 128 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB combined renderer configuration with selected acoustic environment -//../IVAS_cod -sba 3 128000 48 testv/stv3OA48c.wav bit -//../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1 BINAURAL_ROOM_REVERB 48 bit testv/stv3OA48c.pcm_SBA_12800048-48_BinauralRoomReverb_Config_renderer_combined_AEID_1.tst +../IVAS_cod -sba 3 128000 48 testv/stv3OA48c.wav bit +../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1 BINAURAL_ROOM_REVERB 48 bit testv/stv3OA48c.pcm_SBA_12800048-48_BinauralRoomReverb_Config_renderer_combined_AEID_1.tst // SBA at 256 kbps, 48kHz in, 48kHz out, PCA, BINAURAL out ../IVAS_cod -pca -sba 1 256000 48 testv/stvFOA48c.wav bit diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 0d40b76c58..ba5672c027 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -879,8 +879,8 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/ltv48_FOA.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst // SBA 3OA at 128 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB combined renderer configuration with selected acoustic environment -//../IVAS_cod -sba 3 128000 48 testv/ltv48_HOA3.wav bit -//../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_HOA3.pcm_SBA_12800048-48_BinauralRoomReverb_Config_renderer_combined_AEID_1.tst +../IVAS_cod -sba 3 128000 48 testv/ltv48_HOA3.wav bit +../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_HOA3.pcm_SBA_12800048-48_BinauralRoomReverb_Config_renderer_combined_AEID_1.tst // SBA at 256 kbps, 48kHz in, 48kHz out, PCA, BINAURAL out ../IVAS_cod -pca -sba 1 256000 48 testv/ltv48_FOA.wav bit -- GitLab From a1c5c0e3dae7334e6aa9ece524bf4ef14bc9ec3b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 11 Mar 2024 09:52:04 +0100 Subject: [PATCH 504/601] [cleanup] accept FIX_998_UNUSED_FUNCTION --- lib_com/options.h | 1 - lib_dec/ivas_dirac_dec.c | 73 -------- lib_rend/ivas_dirac_output_synthesis_dec.c | 195 --------------------- lib_rend/ivas_dirac_rend.c | 8 - lib_rend/ivas_prot_rend.h | 8 - 5 files changed, 285 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9bfbf6050c..e27251eafe 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define FIX_1020_AEID_SELECTION_ERRORS /* Philips: issue #1020: fix for acoustic environment ID selection errors */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index a212e2a761..c8d52aa67e 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1840,39 +1840,6 @@ void ivas_dirac_dec_render_sf( set_zero( surCohRatio, hSpatParamRendCom->num_freq_bands ); } } -#ifndef FIX_998_UNUSED_FUNCTION - - if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 1 ) - { - ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, - hDirACRend, - st_ivas->hVBAPdata, - st_ivas->hMasa == NULL ? NULL : st_ivas->hMasa->data.band_mapping, - st_ivas->hMasaIsmData, - azimuth, - elevation, - md_idx, - surCohRatio, - st_ivas->hCombinedOrientationData->shd_rot_max_order, - p_Rmat, - hodirac_flag ); - } - else - { - ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, - hDirACRend, - st_ivas->hVBAPdata, - st_ivas->hMasa == NULL ? NULL : st_ivas->hMasa->data.band_mapping, - st_ivas->hMasaIsmData, - azimuth, - elevation, - md_idx, - surCohRatio, - 0, - NULL, - hodirac_flag ); - } -#else ivas_dirac_dec_compute_directional_responses( hSpatParamRendCom, hDirACRend, st_ivas->hVBAPdata, @@ -1883,7 +1850,6 @@ void ivas_dirac_dec_render_sf( md_idx, surCohRatio, hodirac_flag ); -#endif } if ( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 ) @@ -2213,44 +2179,6 @@ void ivas_dirac_dec_render_sf( } /*Compute PSDs*/ -#ifndef FIX_998_UNUSED_FUNCTION - if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - azimuth, - elevation, - hSpatParamRendCom->diffuseness_vector[md_idx], - hSpatParamRendCom, - hDirACRend, - st_ivas->hCombinedOrientationData->shd_rot_max_order, - p_Rmat, - st_ivas->hVBAPdata, - hDirACRend->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag, - hDirAC->hConfig->dec_param_estim ); - } - else - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - azimuth, - elevation, - hSpatParamRendCom->diffuseness_vector[md_idx], - hSpatParamRendCom, - hDirACRend, - 0, - 0, - st_ivas->hVBAPdata, - hDirACRend->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag, - hDirAC->hConfig->dec_param_estim ); - } -#else ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, azimuth, @@ -2264,7 +2192,6 @@ void ivas_dirac_dec_render_sf( md_idx, hodirac_flag, hDirAC->hConfig->dec_param_estim ); -#endif if ( hDirAC->hConfig->dec_param_estim ) { diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 4e9d7db6cb..0f368b967b 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -542,10 +542,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ -#ifndef FIX_998_UNUSED_FUNCTION - const int16_t sh_rot_max_order, - const float *p_Rmat, /* i : rotation matrix */ -#endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport, /* i : number of transport channels*/ @@ -592,10 +588,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( elevation, md_idx, NULL, -#ifndef FIX_998_UNUSED_FUNCTION - 2, - p_Rmat, -#endif hodirac_flag ); } @@ -642,10 +634,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( elevation, md_idx, NULL, -#ifndef FIX_998_UNUSED_FUNCTION - sh_rot_max_order, - p_Rmat, -#endif hodirac_flag ); if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) @@ -1576,169 +1564,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( return; } -#ifndef FIX_998_UNUSED_FUNCTION -/*------------------------------------------------------------------------- - * ivas_dirac_dec_get_response_split_order() - * - * calculate reponse, 1 degree resolution - *------------------------------------------------------------------------*/ - -static void ivas_dirac_dec_get_response_split_order( - const int16_t azimuth, - const int16_t elevation, - float *response, - const int16_t shd_rot_max_order, - const float *p_Rmat ) -{ - int16_t index_azimuth, index_elevation; - int16_t el, e, az; - float cos_1, cos_2, sin_1, cos_az[3]; - float sin_az[3]; - float f, c; - int16_t l, m; - int16_t b, b1, b_2, b1_2, a; - float dv_0, dv_1, dv_2, dv_r_0, dv_r_1, dv_r_2; - float w; - - push_wmops( "ivas_dirac_dec_get_response_split_order" ); - - index_azimuth = ( azimuth + 180 ) % 360; - index_elevation = elevation + 90; - e = index_elevation > 90 ? -1 : 1; - el = index_elevation > 90 ? 180 - index_elevation : index_elevation; - - az = index_azimuth > 180 ? 360 - index_azimuth : index_azimuth; - f = index_azimuth > 180 ? -1.0f : 1.0f; - - cos_1 = dirac_gains_trg_term[az][0]; - sin_1 = f * dirac_gains_trg_term[az][1]; - - cos_2 = cos_1 * cos_1; - - cos_az[0] = cos_1; - cos_az[1] = 2.0f * cos_2 - 1.0f; - cos_az[2] = 2.0f * cos_1 * cos_az[1] - cos_az[0]; - sin_az[0] = sin_1; - sin_az[1] = sin_1 * 2.0f * cos_1; - sin_az[2] = sin_1 * ( 4.0f * cos_2 - 1.0f ); - - response[0] = 1.0f; - for ( l = 1; l <= shd_rot_max_order; l++ ) - { - b_2 = l * l; - b1_2 = l * l + 2 * l; - for ( m = 0; m < l; m += 2 ) - { - b = b_2 + m; - a = dirac_gains_P_idx[b]; - c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - - response[b] = c * sin_az[l - m - 1]; - - b1 = b1_2 - m; - response[b1] = c * cos_az[l - m - 1]; - } - - for ( m = 1; m < l; m += 2 ) - { - b = b_2 + m; - a = dirac_gains_P_idx[b]; - c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - c = c * e; - - response[b] = c * sin_az[l - m - 1]; - - b1 = b1_2 - m; - response[b1] = c * cos_az[l - m - 1]; - } - - b = b_2 + l; - a = dirac_gains_P_idx[b]; - c = dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - if ( l % 2 == 1 ) - { - c = c * e; - } - - response[b] = c; - } - - /*Conversion spherical to cartesian coordinates*/ - w = -dirac_gains_trg_term[el][1]; - dv_0 = w * cos_1; - dv_1 = w * sin_1; - dv_2 = e * dirac_gains_trg_term[el][0]; - - /*Rotation mtx multiplication*/ - dv_r_0 = p_Rmat[0] * dv_0 + p_Rmat[1] * dv_1 + p_Rmat[2] * dv_2; - dv_r_1 = p_Rmat[3] * dv_0 + p_Rmat[4] * dv_1 + p_Rmat[5] * dv_2; - dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; - - index_azimuth = ( (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ) + 180 ) % 360; - index_elevation = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ) + 90; - e = index_elevation > 90 ? -1 : 1; - el = index_elevation > 90 ? 180 - index_elevation : index_elevation; - - az = index_azimuth > 180 ? 360 - index_azimuth : index_azimuth; - f = index_azimuth > 180 ? -1.0f : 1.0f; - - cos_1 = dirac_gains_trg_term[az][0]; - sin_1 = f * dirac_gains_trg_term[az][1]; - - cos_2 = cos_1 * cos_1; - - cos_az[0] = cos_1; - cos_az[1] = 2.0f * cos_2 - 1.0f; - cos_az[2] = 2.0f * cos_1 * cos_az[1] - cos_az[0]; - sin_az[0] = sin_1; - sin_az[1] = sin_1 * 2.0f * cos_1; - sin_az[2] = sin_1 * ( 4.0f * cos_2 - 1.0f ); - - for ( l = shd_rot_max_order + 1; l <= 3; l++ ) - { - b_2 = l * l; - b1_2 = l * l + 2 * l; - for ( m = 0; m < l; m += 2 ) - { - b = b_2 + m; - a = dirac_gains_P_idx[b]; - c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - - response[b] = c * sin_az[l - m - 1]; - - b1 = b1_2 - m; - response[b1] = c * cos_az[l - m - 1]; - } - - for ( m = 1; m < l; m += 2 ) - { - b = b_2 + m; - a = dirac_gains_P_idx[b]; - c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - c = c * e; - - response[b] = c * sin_az[l - m - 1]; - - b1 = b1_2 - m; - response[b1] = c * cos_az[l - m - 1]; - } - - b = b_2 + l; - a = dirac_gains_P_idx[b]; - c = dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - if ( l % 2 == 1 ) - { - c = c * e; - } - - response[b] = c; - } - - pop_wmops(); - - return; -} -#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_compute_directional_responses() @@ -1756,10 +1581,6 @@ void ivas_dirac_dec_compute_directional_responses( const int16_t *elevation, const int16_t md_idx, const float *surCohRatio, -#ifndef FIX_998_UNUSED_FUNCTION - const int16_t shd_rot_max_order, /* i : split-order rotation method */ - const float *p_Rmat, /* i : rotation matrix */ -#endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { @@ -1830,28 +1651,12 @@ void ivas_dirac_dec_compute_directional_responses( set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); -#ifndef FIX_998_UNUSED_FUNCTION - if ( p_Rmat != 0 ) - { - ivas_dirac_dec_get_response_split_order( azimuth[k], elevation[k], direct_response_hoa, shd_rot_max_order, p_Rmat ); - - if ( hodirac_flag ) - { - ivas_dirac_dec_get_response_split_order( azimuth2[k], elevation2[k], direct_response_dir2, shd_rot_max_order, p_Rmat ); - } - } - else - { -#endif ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirACRend->hOutSetup.ambisonics_order ); if ( hodirac_flag ) { ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirACRend->hOutSetup.ambisonics_order ); } -#ifndef FIX_998_UNUSED_FUNCTION - } -#endif if ( masa_band_mapping == NULL && hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c index 7cd26526c7..94982acb10 100644 --- a/lib_rend/ivas_dirac_rend.c +++ b/lib_rend/ivas_dirac_rend.c @@ -2216,10 +2216,6 @@ static void ivas_masa_ext_dirac_render_sf( elevation, md_idx, surCohRatio, -#ifndef FIX_998_UNUSED_FUNCTION - 0, - NULL, -#endif 0 ); @@ -2374,10 +2370,6 @@ static void ivas_masa_ext_dirac_render_sf( hSpatParamRendCom->diffuseness_vector[md_idx], hSpatParamRendCom, hDirACRend, -#ifndef FIX_998_UNUSED_FUNCTION - 0, - 0, -#endif hMasaExtRend->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 5f97008849..7de4ed3e8c 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -466,10 +466,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ -#ifndef FIX_998_UNUSED_FUNCTION - const int16_t sh_rot_max_order, - const float *p_Rmat, /* i : rotation matrix */ -#endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport, /* i : number of transport channels */ @@ -536,10 +532,6 @@ void ivas_dirac_dec_compute_directional_responses( const int16_t *elevation, const int16_t md_idx, const float *surCohRatio, -#ifndef FIX_998_UNUSED_FUNCTION - const int16_t shd_rot_max_order, /* i : split-order rotation method */ - const float *p_Rmat, /* i : rotation matrix */ -#endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); -- GitLab From 7485104e0b8dcc8b343fe9ef76ec585ee4279154 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 11 Mar 2024 09:52:52 +0100 Subject: [PATCH 505/601] [cleanup] accept FIX_1009_ISM_NONDIEGETIC_PANNING --- lib_com/ivas_prot.h | 2 -- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec.c | 4 ---- lib_dec/ivas_mono_dmx_renderer.c | 7 ------- 4 files changed, 14 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e80b23aa15..0902af5530 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -769,9 +769,7 @@ void dtx_read_padding_bits( ); void ivas_apply_non_diegetic_panning( -#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING float *input_f, /* i : non-diegetic object */ -#endif float *output_f[], /* o : core-coder transport mono channel/stereo output */ const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ const int16_t output_frame /* i : output frame length per channel */ diff --git a/lib_com/options.h b/lib_com/options.h index e27251eafe..bdec5fac48 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define FIX_1020_AEID_SELECTION_ERRORS /* Philips: issue #1020: fix for acoustic environment ID selection errors */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ #define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16, kept BE for PLC-conditions */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 128754273c..1783b8efed 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1097,11 +1097,7 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { -#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING ivas_apply_non_diegetic_panning( p_tc[0], p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); -#else - ivas_apply_non_diegetic_panning( p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered ); -#endif } #ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) diff --git a/lib_dec/ivas_mono_dmx_renderer.c b/lib_dec/ivas_mono_dmx_renderer.c index 7b6552707a..a2154bb774 100644 --- a/lib_dec/ivas_mono_dmx_renderer.c +++ b/lib_dec/ivas_mono_dmx_renderer.c @@ -221,9 +221,7 @@ void ivas_mono_stereo_downmix_mcmasa( *------------------------------------------------------------------------*/ void ivas_apply_non_diegetic_panning( -#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING float *input_f, /* i : non-diegetic object */ -#endif float *output_f[], /* o : core-coder transport mono channel/stereo output */ const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ const int16_t output_frame /* i : output frame length per channel */ @@ -233,13 +231,8 @@ void ivas_apply_non_diegetic_panning( pan_left = ( non_diegetic_pan_gain + 1.f ) * 0.5f; pan_right = 1.f - pan_left; -#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING v_multc( input_f, pan_right, output_f[1], output_frame ); v_multc( input_f, pan_left, output_f[0], output_frame ); -#else - v_multc( output_f[0], pan_right, output_f[1], output_frame ); - v_multc( output_f[0], pan_left, output_f[0], output_frame ); -#endif return; } -- GitLab From b43426f81e1a6a34ba5e6ccd609251f91362004d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 11 Mar 2024 09:53:52 +0100 Subject: [PATCH 506/601] [cleanup] accept NONBE_FIX_864_JBM_RENDER_FRAMESIZE --- apps/decoder.c | 6 ------ lib_com/options.h | 1 - lib_dec/lib_dec.c | 44 -------------------------------------------- 3 files changed, 51 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 142c8a4ac6..d993eb4144 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -3366,14 +3366,10 @@ static ivas_error decodeVoIP( } vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len; frame++; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE if ( vec_pos_update == 0 ) { systemTime_ms += vec_pos_len * systemTimeInc_ms; } -#else - systemTime_ms += systemTimeInc_ms; -#endif #ifdef WMOPS update_mem(); @@ -3382,7 +3378,6 @@ static ivas_error decodeVoIP( } -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE int16_t nSamplesFlushed = 0; /* decode and get samples */ @@ -3460,7 +3455,6 @@ static ivas_error decodeVoIP( } } } -#endif /*------------------------------------------------------------------------------------------* * Add zeros at the end to have equal length of synthesized signals diff --git a/lib_com/options.h b/lib_com/options.h index bdec5fac48..085ad89b76 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -167,7 +167,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ #define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 4e9dc2ac03..8c5d5d3ad0 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -57,9 +57,7 @@ struct IVAS_DEC_VOIP uint16_t lastDecodedWasActive; JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE int16_t nSamplesRendered20ms; /* how many samples have been rendered since the last 20ms render border*/ -#endif #ifdef SUPPORT_JBM_TRACEFILE IVAS_JBM_TRACE_DATA JbmTraceData; #endif @@ -81,9 +79,7 @@ struct IVAS_DEC bool Opt_VOIP; /* flag indicating VOIP mode with JBM */ int16_t tsm_scale; /* scale for TSM operation */ int16_t tsm_max_scaling; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE int16_t timeScalingDone; /* have we done already one TSM in a 20ms frame? */ -#endif float tsm_quality; float *apaExecBuffer; /* Buffer for APA scaling */ PCMDSP_APA_HANDLE hTimeScaler; @@ -131,9 +127,7 @@ static void *pcm_buffer_offset( void *buffer, const IVAS_DEC_PCM_TYPE pcmType, c static ivas_error set_pcm_buffer_to_zero( void *buffer, const IVAS_DEC_PCM_TYPE pcmType, const int16_t nZeroSamples ); #endif static int16_t get_render_frame_size_ms( IVAS_RENDER_FRAMESIZE render_framesize ); -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesRendered ); -#endif /*---------------------------------------------------------------------* * IVAS_DEC_Open() @@ -170,9 +164,7 @@ ivas_error IVAS_DEC_Open( hIvasDec->tsm_scale = 100; hIvasDec->tsm_max_scaling = 0; hIvasDec->tsm_quality = 1.0f; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE hIvasDec->timeScalingDone = 0; -#endif hIvasDec->needNewFrame = false; hIvasDec->nTransportChannelsOld = 0; hIvasDec->nSamplesAvailableNext = 0; @@ -718,9 +710,7 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->lastDecodedWasActive = 0; hIvasDec->hVoIP->hCurrentDataUnit = NULL; hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ); -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE hIvasDec->hVoIP->nSamplesRendered20ms = 0; -#endif #define WMC_TOOL_SKIP /* Bitstream conversion is not counted towards complexity and memory usage */ @@ -979,9 +969,7 @@ ivas_error IVAS_DEC_GetSamples( assert( nTimeScalerOutSamples <= APA_BUF ); nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE hIvasDec->timeScalingDone = 1; -#endif } else { @@ -1416,9 +1404,7 @@ static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( if ( hIvasDec->st_ivas->hTcBuffer != NULL ) { *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE *nSamplesBuffered += hIvasDec->hVoIP->nSamplesRendered20ms; -#endif } return IVAS_ERR_OK; @@ -2502,9 +2488,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( uint32_t extBufferedTime_ms, scale, maxScaling; JB4_DATAUNIT_HANDLE dataUnit; uint16_t extBufferedSamples; -#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - int16_t timeScalingDone; -#endif int16_t result; ivas_error error; int16_t nSamplesRendered; @@ -2513,9 +2496,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( st_ivas = hIvasDec->st_ivas; hDecoderConfig = st_ivas->hDecoderConfig; hVoIP = hIvasDec->hVoIP; -#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - timeScalingDone = 0; -#endif nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; nSamplesRendered = 0; @@ -2539,11 +2519,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } } -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE extBufferedSamples = nSamplesBuffered; -#else - extBufferedSamples = nSamplesRendered + nSamplesBuffered; -#endif extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; dataUnit = NULL; @@ -2566,20 +2542,10 @@ ivas_error IVAS_DEC_VoIP_GetSamples( /* avoid time scaling multiple times within one 20ms frame*/ if ( scale != 100U ) { -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE if ( hIvasDec->timeScalingDone ) -#else - if ( timeScalingDone ) -#endif { scale = 100; } -#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - else - { - timeScalingDone = 1; - } -#endif } /* limit scale to range supported by time scaler */ @@ -2668,9 +2634,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( nSamplesRendered += nSamplesToZero; hIvasDec->nSamplesRendered += nSamplesToZero; hIvasDec->nSamplesAvailableNext -= nSamplesToZero; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE update_voip_rendered20ms( hIvasDec, nSamplesToZero ); -#endif } else { @@ -2689,16 +2653,13 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } nSamplesRendered += nSamplesRendered_loop; -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); -#endif } } return IVAS_ERR_OK; } -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE /*---------------------------------------------------------------------* * update_voip_rendered20ms( ) * @@ -2719,7 +2680,6 @@ static void update_voip_rendered20ms( hIvasDec->hVoIP->nSamplesRendered20ms = nSamplesRenderedTotal % hIvasDec->hVoIP->nSamplesFrame; } -#endif /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_Flush( ) @@ -2748,23 +2708,19 @@ ivas_error IVAS_DEC_Flush( nSamplesToRender = (uint16_t) *nSamplesFlushed; /* render IVAS frames */ -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE error = IVAS_ERR_OK; if ( nSamplesToRender > 0 && hIvasDec->st_ivas->ivas_format != MONO_FORMAT ) { -#endif #ifdef SPLIT_REND_WITH_HEAD_ROT error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmType, pcmBuf ); #else error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); #endif -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE } else { *nSamplesFlushed = 0; } -#endif return error; } -- GitLab From 3866cddaa89fd37868824b8d19ead794e632e850 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 11 Mar 2024 09:55:49 +0100 Subject: [PATCH 507/601] [cleanup] accept NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec.c | 12 ------------ 2 files changed, 13 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 085ad89b76..ed007445a0 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -167,7 +167,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 1783b8efed..c7ad64a60a 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1561,12 +1561,7 @@ ivas_error ivas_jbm_dec_flush_renderer( int16_t n_slots_still_available; int16_t n_samples_to_render; DECODER_TC_BUFFER_HANDLE hTcBuffer; -#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER float *p_output[MAX_CICP_CHANNELS + MAX_NUM_OBJECTS]; -#else - float output[MAX_CICP_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - float *p_output[MAX_CICP_CHANNELS]; -#endif if ( !st_ivas->hDecoderConfig->Opt_tsm ) { @@ -1611,17 +1606,10 @@ ivas_error ivas_jbm_dec_flush_renderer( hTcBuffer->n_samples_flushed = n_samples_to_render; hTcBuffer->n_samples_rendered = 0; -#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER for ( ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) { p_output[ch_idx] = st_ivas->p_output_f[ch_idx]; } -#else - for ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) - { - p_output[ch_idx] = output[ch_idx]; - } -#endif if ( st_ivas->ivas_format == ISM_FORMAT ) { -- GitLab From db85cca9103da6c066e08ee1a5160f1895d420b8 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 11 Mar 2024 09:56:45 +0100 Subject: [PATCH 508/601] [cleanup] accept NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS --- lib_com/options.h | 1 - lib_dec/ivas_masa_dec.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ed007445a0..86f6379d5c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -167,7 +167,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 3957fa0c5f..3d05c01ad4 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -142,12 +142,10 @@ ivas_error ivas_masa_decode( st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 ); } -#ifdef NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS if ( ivas_format == MASA_FORMAT && ( masa_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) { hMasa->config.numberOfDirections = 1; } -#endif if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { -- GitLab From c9dcef1fbd11002d77d40532629ce01cbea8a93b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 11 Mar 2024 09:57:28 +0100 Subject: [PATCH 509/601] [cleanup] accept NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO --- lib_com/options.h | 1 - lib_dec/ivas_ism_renderer.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 86f6379d5c..e720e4b664 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -167,7 +167,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ #define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO /* Eri: Issue 1010: Division by zero in Stereo CNG */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 6f5a2d90eb..7b321c523b 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -280,13 +280,9 @@ void ivas_ism_render_sf( ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); n_samples_rendered_loop += n_samples_in_subframe; -#ifdef NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* update rendered subframe and slots info for all cases apart from a following crend call, the update will then happen in the crend call*/ if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) -#else - if ( st_ivas->renderer_type == RENDERER_TD_PANNING ) -#endif { st_ivas->hTcBuffer->subframes_rendered += 1; st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; -- GitLab From bef6171057909ea1cb1cd80c7eee87b940fbc823 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 11 Mar 2024 10:41:55 +0100 Subject: [PATCH 510/601] formatting --- lib_dec/ivas_mono_dmx_renderer.c | 2 +- lib_dec/lib_dec.c | 4 ++-- lib_rend/ivas_dirac_output_synthesis_dec.c | 16 ++++++++-------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_dec/ivas_mono_dmx_renderer.c b/lib_dec/ivas_mono_dmx_renderer.c index a2154bb774..84024ed209 100644 --- a/lib_dec/ivas_mono_dmx_renderer.c +++ b/lib_dec/ivas_mono_dmx_renderer.c @@ -221,7 +221,7 @@ void ivas_mono_stereo_downmix_mcmasa( *------------------------------------------------------------------------*/ void ivas_apply_non_diegetic_panning( - float *input_f, /* i : non-diegetic object */ + float *input_f, /* i : non-diegetic object */ float *output_f[], /* o : core-coder transport mono channel/stereo output */ const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ const int16_t output_frame /* i : output frame length per channel */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 8c5d5d3ad0..aeb8f84303 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -57,7 +57,7 @@ struct IVAS_DEC_VOIP uint16_t lastDecodedWasActive; JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ - int16_t nSamplesRendered20ms; /* how many samples have been rendered since the last 20ms render border*/ + int16_t nSamplesRendered20ms; /* how many samples have been rendered since the last 20ms render border*/ #ifdef SUPPORT_JBM_TRACEFILE IVAS_JBM_TRACE_DATA JbmTraceData; #endif @@ -2714,7 +2714,7 @@ ivas_error IVAS_DEC_Flush( #ifdef SPLIT_REND_WITH_HEAD_ROT error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmType, pcmBuf ); #else - error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); + error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); #endif } else diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 0f368b967b..54ea302165 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -542,9 +542,9 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ - const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ - const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport, /* i : number of transport channels*/ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const int16_t nchan_transport, /* i : number of transport channels*/ const int16_t md_idx, const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ const int16_t dec_param_estim ) @@ -1651,12 +1651,12 @@ void ivas_dirac_dec_compute_directional_responses( set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); - ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirACRend->hOutSetup.ambisonics_order ); + ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirACRend->hOutSetup.ambisonics_order ); - if ( hodirac_flag ) - { - ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirACRend->hOutSetup.ambisonics_order ); - } + if ( hodirac_flag ) + { + ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirACRend->hOutSetup.ambisonics_order ); + } if ( masa_band_mapping == NULL && hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { -- GitLab From fda282caaeaa42f7be4bb8c93796ff474cba6d5c Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 12 Mar 2024 09:31:04 +0100 Subject: [PATCH 511/601] in smoke test, pass ISM md to combined formats, too --- ci/smoke_test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index d08620679e..c6150043c8 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -82,8 +82,8 @@ echo "\n======================= 0. preparing combined format test inputs ======= # run all modes vanilla-fashion # treat ISM modes separately because passing the metadata files to MASA modes causes crashes -ism_modes=$(./scripts/runIvasCodec.py -l | grep ^ISM) -non_ism_modes=$(./scripts/runIvasCodec.py -l | grep -v ^ISM) +ism_modes=$(./scripts/runIvasCodec.py -l | grep ISM) +non_ism_modes=$(./scripts/runIvasCodec.py -l | grep -v ISM) echo "\n======================= 1. non-ism modes no FEC =======================\n\n" ./scripts/runIvasCodec.py $verbosity_cmd -m $non_ism_modes -p $cfg $duration_arg $timeout_cmd | tee smoke_test_output.txt echo "\n======================= 2. ism modes no FEC =======================\n\n" -- GitLab From 5c67159a088e8ab246638c7d5832e37841a05759 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 12 Mar 2024 09:54:13 +0100 Subject: [PATCH 512/601] corect mode selection for JBM and HRTF runs --- ci/smoke_test.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index c6150043c8..fc835585c4 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -94,28 +94,28 @@ echo "\n======================= 3. all modes with FEC =======================\n\ # run JBM modes - EXT is excluded as not supported yet # OMASA disabled for now -modes_with_no_ext_out=$(./scripts/runIvasCodec.py -l | grep -v ^MASA | grep -v ^ISM | grep -v OMASA) -modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM' | grep -v ^ISM+ | grep -v OMASA) +formats_with_no_ext_out=$(./scripts/runIvasCodec.py -L | grep -v MASA | grep -v ISM | grep -v OSBA) +formats_with_ext_out=$(./scripts/runIvasCodec.py -L | grep 'MASA\|ISM\|OSBA') echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" -./scripts/runIvasCodec.py $verbosity_cmd -m $modes_with_no_ext_out -p $cfg $duration_arg --decoder_only --jbm_file $dly_profile $timeout_cmd | tee smoke_test_output_jbm_noEXT.txt +./scripts/runIvasCodec.py $verbosity_cmd -m $formats_with_no_ext_out -p $cfg $duration_arg --decoder_only --jbm_file $dly_profile $timeout_cmd | tee smoke_test_output_jbm_noEXT.txt echo "\n======================= 5. JBM, modes with EXT =======================\n\n" -./scripts/runIvasCodec.py $verbosity_cmd -m $modes_with_ext_out -p $cfg $duration_arg --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM_IR mono stereo FOA HOA3 5_1 7_1_4 $timeout_cmd | tee -a smoke_test_output_jbm_noEXT.txt +./scripts/runIvasCodec.py $verbosity_cmd -m $formats_with_ext_out -p $cfg $duration_arg --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM_IR mono stereo FOA HOA3 5_1 7_1_4 $timeout_cmd | tee -a smoke_test_output_jbm_noEXT.txt # run all modes with binaural output using external files -modes_with_bin_out="FOA HOA2 HOA3 PlanarFOA PlanarHOA2 PlanarHOA3 MASA MC ISM1 ISM2 ISM3 ISM4" +formats_with_bin_out=$(./scripts/runIvasCodec.py -L | grep -v "mono\|tereo") bin_out_modes="BINAURAL BINAURAL_ROOM_IR" echo "\n======================= 6. binaural out with HRTF files - WB =======================\n\n" -wb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _wb_) +wb_modes=$(./scripts/runIvasCodec.py -l -C $formats_with_bin_out | grep _wb_) hrtf_wb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin" ./scripts/runIvasCodec.py $verbosity_cmd -p $cfg -m $wb_modes $duration_arg -D="-hrtf ${hrtf_wb}" --decoder_only --oc $bin_out_modes $timeout_cmd | tee -a smoke_test_output_hrtf.txt echo "\n======================= 7. binaural out with HRTF files - SWB =======================\n\n" -swb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _swb_) +swb_modes=$(./scripts/runIvasCodec.py -l -C $formats_with_bin_out | grep _swb_) hrtf_swb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin" ./scripts/runIvasCodec.py $verbosity_cmd -p $cfg -m $swb_modes $duration_arg -D="-hrtf ${hrtf_swb}" --decoder_only --oc $bin_out_modes $timeout_cmd | tee -a smoke_test_output_hrtf.txt echo "\n======================= 8. binaural out with HRTF files - FB =======================\n\n" -fb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _fb_) +fb_modes=$(./scripts/runIvasCodec.py -l -C $formats_with_bin_out | grep _fb_) hrtf_fb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin" ./scripts/runIvasCodec.py $verbosity_cmd -p $cfg -m $fb_modes $duration_arg -D="-hrtf ${hrtf_fb}" --decoder_only --oc $bin_out_modes $timeout_cmd | tee -a smoke_test_output_hrtf.txt -- GitLab From fd0091a0c4e1038f3cf6311a77862fb65ba43c25 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 12 Mar 2024 13:48:37 +0100 Subject: [PATCH 513/601] [cleanup] accept FIX_1020_AEID_SELECTION_ERRORS --- lib_com/options.h | 1 - lib_util/render_config_reader.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6e9f3d7710..bfd6a4ebf6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1020_AEID_SELECTION_ERRORS /* Philips: issue #1020: fix for acoustic environment ID selection errors */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ #define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16, kept BE for PLC-conditions */ #define FIX_960_SYN_OUTPUT /* VA: issue 960: unused function syn_output() is removed */ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 8c455278c9..decafb0a46 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2241,11 +2241,7 @@ ivas_error RenderConfigReader_read( return IVAS_ERR_INVALID_RENDER_CONFIG; } idx = strtol( strtok( NULL, ":" ), NULL, 0 ); -#ifdef FIX_1020_AEID_SELECTION_ERRORS pRenderConfigReader->pAE[acIdx].id = idx; -#else - pRenderConfigReader->pAE->id = idx; -#endif aeHasFgIdx = aeHasPredelay = aeHasRt60 = aeHasDsr = FALSE; aeHasERsize = aeHasERabs = FALSE; -- GitLab From 991388dfeb1be0518a34f5f004ec0bea2867c83d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 12 Mar 2024 13:49:35 +0100 Subject: [PATCH 514/601] [cleanup] accept FIX_993_REMOVE_SBA_GET_ORDER --- lib_com/ivas_prot.h | 7 ------ lib_com/ivas_sba_config.c | 47 --------------------------------------- lib_com/options.h | 1 - 3 files changed, 55 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0902af5530..62d3f730bc 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3497,13 +3497,6 @@ ivas_error ivas_cldfb_dec_reconfig( const int16_t numCldfbSyntheses_old /* i : number of CLDFB synthesis instances in previous frame */ ); -#ifndef FIX_993_REMOVE_SBA_GET_ORDER -/*! r: Ambisonic (SBA) order */ -int16_t ivas_sba_get_order( - const int16_t nb_channels, /* i : Number of ambisonic channels */ - const int16_t sba_planar /* i : SBA planar flag */ -); -#endif /*! r: Ambisonic (SBA) order used for analysis and coding */ int16_t ivas_sba_get_analysis_order( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index f7f32c6a9a..cb573d7f28 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -64,23 +64,7 @@ void ivas_sba_config( int16_t *element_mode /* o : element mode of the core coder */ ) { -#ifndef FIX_993_REMOVE_SBA_GET_ORDER - if ( ( sba_order < 0 ) && ( nb_channels < 0 ) ) - { - assert( 0 && "Either order or number of channels must be positive" ); - } - else if ( sba_order < 0 ) - { - sba_order = ivas_sba_get_order( nb_channels, sba_planar ); - } - else if ( nb_channels < 0 ) - { - nb_channels = ivas_sba_get_nchan( sba_order, sba_planar ); - } - else -#else if ( nb_channels > 0 ) -#endif { if ( sba_planar ) { @@ -121,37 +105,6 @@ void ivas_sba_config( return; } -#ifndef FIX_993_REMOVE_SBA_GET_ORDER -/*-------------------------------------------------------------------* - * ivas_sba_get_order() - * - * Get Ambisonic order from number of ambisonic channels - *-------------------------------------------------------------------*/ - -/*! r: Ambisonic (SBA) order */ -int16_t ivas_sba_get_order( - const int16_t nb_channels, /* i : Number of ambisonic channels */ - const int16_t sba_planar /* i : SBA Planar flag */ -) -{ - int16_t sba_order; - - if ( sba_planar ) - { - sba_order = ( nb_channels - 1 ) / 2; - assert( ( 2 * sba_order + 1 == nb_channels ) && "Number of channels not supported in Planar SBA!" ); - } - else - { - sba_order = (int16_t) sqrtf( (float) nb_channels ) - 1; - assert( ( ( sba_order + 1 ) * ( sba_order + 1 ) == nb_channels ) && "Number of channels not supported in SBA!" ); - } - - assert( ( sba_order <= 3 ) && "Error: SBA order must be <= 3!" ); - - return ( sba_order ); -} -#endif /*-------------------------------------------------------------------* * ivas_sba_get_analysis_order() diff --git a/lib_com/options.h b/lib_com/options.h index bfd6a4ebf6..2e754aed8d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ #define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16, kept BE for PLC-conditions */ #define FIX_960_SYN_OUTPUT /* VA: issue 960: unused function syn_output() is removed */ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ -- GitLab From aca651c893818be6085261b06577cc1ba456c39d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 12 Mar 2024 13:50:27 +0100 Subject: [PATCH 515/601] [cleanup] accept FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE --- lib_com/options.h | 1 - lib_dec/FEC_HQ_phase_ecu.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2e754aed8d..92427746f5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* Eri: issue #1002, usan-value-out-of-range-for-int16, kept BE for PLC-conditions */ #define FIX_960_SYN_OUTPUT /* VA: issue 960: unused function syn_output() is removed */ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ diff --git a/lib_dec/FEC_HQ_phase_ecu.c b/lib_dec/FEC_HQ_phase_ecu.c index 7deb7db646..425ff21fe9 100644 --- a/lib_dec/FEC_HQ_phase_ecu.c +++ b/lib_dec/FEC_HQ_phase_ecu.c @@ -1091,12 +1091,8 @@ static void subst_spec( } Xph = corr_phase[m]; -#ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE /* extract fractional phase integer index in the range [0...1023] */ Xph_short = (int16_t) ( 0x000003ff & (int32_t) ( ( Xph * 512 ) / EVS_PI ) ); -#else - Xph_short = (int16_t) ( ( (int32_t) ( Xph * 512 / EVS_PI ) ) % 32768 ) & 0x03ff; -#endif if ( Xph_short >= 512 ) @@ -1142,11 +1138,7 @@ static void subst_spec( mag_chg_local *= 0.5f + ( 1.0f - ( 1.0f / PHASE_DITH ) * ph_dith ) * 0.5f; } -#ifdef FIX_1002_DEC_PHASE_ECU_USAN_OF_PHASE Xph_short = (int16_t) ( ( (int32_t) ( ( Xph * 512 ) / EVS_PI ) ) & 0x000003ff ); -#else - Xph_short = (int16_t) ( Xph * 512 / EVS_PI ) & 0x03ff; -#endif if ( Xph_short >= 512 ) { -- GitLab From d94a298c313e80bdac6794502be18c601c379976 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 12 Mar 2024 13:51:37 +0100 Subject: [PATCH 516/601] [cleanup] accept FIX_960_SYN_OUTPUT --- lib_com/options.h | 1 - lib_com/prot.h | 8 -------- lib_dec/syn_outp.c | 24 ------------------------ 3 files changed, 33 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 92427746f5..b227a9c9d2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_960_SYN_OUTPUT /* VA: issue 960: unused function syn_output() is removed */ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ /* #################### End BE switches ################################## */ diff --git a/lib_com/prot.h b/lib_com/prot.h index c9d07b8831..1e08bbfec1 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -4824,14 +4824,6 @@ void dec_acelp_4t64( const int16_t Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ ); -#ifndef FIX_960_SYN_OUTPUT -uint32_t syn_output( - float *synth, /* i/o: float synthesis signal */ - const int16_t output_frame, /* i : output frame length */ - int16_t *synth_out /* o : integer 16 bits synthesis signal */ -); - -#endif void FEC_exc_estim( Decoder_State *st, /* i/o: Decoder static memory */ const int16_t L_frame, /* i : length of the frame */ diff --git a/lib_dec/syn_outp.c b/lib_dec/syn_outp.c index 865df569f3..9f4e20c86f 100644 --- a/lib_dec/syn_outp.c +++ b/lib_dec/syn_outp.c @@ -45,31 +45,7 @@ #include "wmc_auto.h" -#ifdef FIX_960_SYN_OUTPUT /* Note: syn_output() is replaced by ivas_syn_output() in IVAS */ -#else -/*-------------------------------------------------------------------* - * syn_output() - * - * Output synthesis signal with compensation for saturation - * returns number of clipped samples - *-------------------------------------------------------------------*/ - -/*! r: number of clipped samples */ -uint32_t syn_output( - float *synth, /* i/o: float synthesis signal */ - const int16_t output_frame, /* i : output frame length */ - int16_t *synth_out /* o : integer 16 bits synthesis signal */ -) -{ - /*-----------------------------------------------------------------* - * float to integer conversion with saturation control - *-----------------------------------------------------------------*/ - - /* integer conversion */ - return mvr2s( synth, synth_out, output_frame ); -} -#endif /*-------------------------------------------------------------------* -- GitLab From a7b4b50e3fdd192f551f693a4506656c1c4dc2be Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 12 Mar 2024 13:52:40 +0100 Subject: [PATCH 517/601] [cleanup] accept NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING --- lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b227a9c9d2..46f3f926fc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ #define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO /* Eri: Issue 1010: Division by zero in Stereo CNG */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 58d24b87ae..75a8247cc1 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -952,7 +952,6 @@ static void ivas_binaural_obtain_DMX( set_zero( outRealRightPtr, CLDFB_NO_CHANNELS_MAX ); set_zero( outImagRightPtr, CLDFB_NO_CHANNELS_MAX ); -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /*Ambisonics input requires different processing*/ if ( hBinRenderer->nInChannels == 16 ) { @@ -975,7 +974,6 @@ static void ivas_binaural_obtain_DMX( } } else -#endif { for ( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { @@ -1280,11 +1278,7 @@ ivas_error ivas_binRenderer_open( if ( hBinRenderer->hReverb != NULL ) { -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 ) -#else - if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) -#endif { for ( k = 0; k < 11; k++ ) { -- GitLab From 0e6921e09f7bb5486ea81174c5349bc753923621 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 12 Mar 2024 13:53:18 +0100 Subject: [PATCH 518/601] [cleanup] accept NONBE_FIX_1006_PAST_DMX_NRG_ERROR --- lib_com/options.h | 1 - lib_dec/ivas_stereo_dft_dec_dmx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 46f3f926fc..9b54699e91 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ #define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO /* Eri: Issue 1010: Division by zero in Stereo CNG */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index f3f9982ec8..4cc48bea4d 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -229,11 +229,7 @@ void stereo_dft_unify_dmx( if ( st0->bfi && !prev_bfi ) { int16_t idx_k0, idx_k1; -#ifdef NONBE_FIX_1006_PAST_DMX_NRG_ERROR idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; -#else - idx_k0 = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; -#endif idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX; /*dmx energy memory*/ -- GitLab From 1c74af56c7f4be0d16188c7015962312469e18d6 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 12 Mar 2024 13:53:53 +0100 Subject: [PATCH 519/601] [cleanup] accept NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO --- lib_com/options.h | 1 - lib_dec/ivas_stereo_dft_dec.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9b54699e91..52357d6c25 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO /* Eri: Issue 1010: Division by zero in Stereo CNG */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 3ae77707f0..6ce12cddaa 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -2947,11 +2947,7 @@ void stereo_dft_dec_smooth_parameters( if ( hStereoDft->frame_sid_nodata ) { /* set new xfade target if new itd received */ -#ifdef NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO if ( hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE ) -#else - if ( hStereoDft->gipd[k + k_offset] != hStereoDft->ipd_xfade_target ) -#endif { if ( ( hStereoDft->gipd[k + k_offset] - hStereoDft->ipd_xfade_prev ) > EVS_PI ) { @@ -2997,11 +2993,7 @@ void stereo_dft_dec_smooth_parameters( if ( hStereoDft->frame_sid_nodata ) { /* set new xfade target if new itd received */ -#ifdef NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO if ( hStereoDft->itd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE ) -#else - if ( hStereoDft->itd[k + k_offset] != hStereoDft->itd_xfade_target ) -#endif { hStereoDft->itd_xfade_target = hStereoDft->itd[k + k_offset]; hStereoDft->itd_xfade_step = ( hStereoDft->itd_xfade_target - hStereoDft->itd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->itd_xfade_counter ); -- GitLab From feebfe33cc4fe83b29eab34ad3f8ff4d324f35d2 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 12 Mar 2024 13:56:32 +0100 Subject: [PATCH 520/601] remove unused function from audiofile.py --- scripts/pyaudio3dtools/audiofile.py | 32 ----------------------------- 1 file changed, 32 deletions(-) diff --git a/scripts/pyaudio3dtools/audiofile.py b/scripts/pyaudio3dtools/audiofile.py index d3153e21db..e614bfbd49 100644 --- a/scripts/pyaudio3dtools/audiofile.py +++ b/scripts/pyaudio3dtools/audiofile.py @@ -36,7 +36,6 @@ import shutil import struct import subprocess as sp import warnings -from importlib import import_module from tempfile import TemporaryDirectory from typing import Optional, Tuple @@ -662,37 +661,6 @@ def loudnessinfo( return measured_loudness, scale_factor -def print_plot_play(x: np.ndarray, fs: int, text: Optional[str] = "") -> None: - """1. Prints information about an audio signal, 2. plots the waveform, and 3. Creates player - - Parameters - ---------- - x: np array - Input signal - fs: int - Input sampling rate - text: Optional[str] = '' - text to print - Returns - ------- - None - - """ - - plt = import_module("matplotlib.pyplot") - ipd = import_module("IPython.display") - - print("%s fs = %d, x.shape = %s, x.dtype = %s" % (text, fs, x.shape, x.dtype)) - plt.figure(figsize=(8, 2)) - plt.plot(x, color="gray") - plt.xlim([0, x.shape[0]]) - plt.xlabel("Time (samples)") - plt.ylabel("Amplitude") - plt.tight_layout() - plt.show() - ipd.display(ipd.Audio(data=x, rate=fs)) - - def get_wav_file_info(filename: str) -> dict: """ Get the format information from a WAV file. -- GitLab From 3ae50cb0ef76baac7f4aa7f8ff4b14c8be1284b6 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 12 Mar 2024 14:01:30 +0100 Subject: [PATCH 521/601] fix unused imports and redundant f-strings --- ci/complexity_measurements/mergeNewsletterRam.py | 1 - ci/complexity_measurements/mergeNewsletterRom.py | 1 - scripts/batch_comp_audio.py | 3 +-- scripts/mem_analysis.py | 3 --- scripts/prepare_combined_format_inputs.py | 3 +-- scripts/pyaudio3dtools/__init__.py | 1 - scripts/pyaudio3dtools/audio3dtools.py | 5 +---- scripts/pyivastest/IvasBaseClass.py | 1 - scripts/pyivastest/IvasModeCollector.py | 2 -- scripts/pyivastest/IvasModeRunner.py | 2 -- scripts/pyivastest/__init__.py | 10 ---------- scripts/self_test.py | 2 -- tests/codec_be_on_mr_nonselection/test_param_file.py | 4 ++-- tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py | 6 +++--- tests/codec_be_on_mr_selection/__init__.py | 2 +- tests/conftest.py | 3 +-- tests/create_short_testvectors.py | 2 +- tests/cut_pcm.py | 3 +-- tests/hrtf_binary_loading/constants.py | 2 +- tests/hrtf_binary_loading/test_codec_ROM_vs_file.py | 1 - tests/hrtf_binary_loading/utils.py | 5 ++--- tests/scale_pcm.py | 2 -- tests/split_rendering/constants.py | 8 -------- tests/split_rendering/utils.py | 2 +- tests/test_26444.py | 1 - tests/test_param_file_ltv.py | 4 ++-- 26 files changed, 18 insertions(+), 61 deletions(-) diff --git a/ci/complexity_measurements/mergeNewsletterRam.py b/ci/complexity_measurements/mergeNewsletterRam.py index 40b5f75c59..d578b51c56 100755 --- a/ci/complexity_measurements/mergeNewsletterRam.py +++ b/ci/complexity_measurements/mergeNewsletterRam.py @@ -29,7 +29,6 @@ # accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and # the United Nations Convention on Contracts on the International Sales of Goods. import csv -import re import sys newsletterFilename = "" diff --git a/ci/complexity_measurements/mergeNewsletterRom.py b/ci/complexity_measurements/mergeNewsletterRom.py index 0e75f26f58..b46e6c5570 100755 --- a/ci/complexity_measurements/mergeNewsletterRom.py +++ b/ci/complexity_measurements/mergeNewsletterRom.py @@ -29,7 +29,6 @@ # accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and # the United Nations Convention on Contracts on the International Sales of Goods. import csv -import re import sys newsletterFilename = "" diff --git a/scripts/batch_comp_audio.py b/scripts/batch_comp_audio.py index 6854f41f30..ce1f380c56 100755 --- a/scripts/batch_comp_audio.py +++ b/scripts/batch_comp_audio.py @@ -33,7 +33,6 @@ import argparse import concurrent.futures import os -import pathlib import re import shutil import subprocess @@ -132,7 +131,7 @@ def main(args): if num_files_diff > 0: print(f"{num_files_diff} files differ/don't exist") else: - print(f"All files are bitexact") + print("All files are bitexact") def compare_files(f, fol1, fol2, outputs_dict, tool): diff --git a/scripts/mem_analysis.py b/scripts/mem_analysis.py index e3f3d8afe4..18d1e3a554 100644 --- a/scripts/mem_analysis.py +++ b/scripts/mem_analysis.py @@ -1,10 +1,7 @@ #!/usr/bin/env python3 import argparse -import csv import os -import struct -import sys import matplotlib.pyplot as plt import numpy as np diff --git a/scripts/prepare_combined_format_inputs.py b/scripts/prepare_combined_format_inputs.py index c081b75bb1..bb406a30b6 100755 --- a/scripts/prepare_combined_format_inputs.py +++ b/scripts/prepare_combined_format_inputs.py @@ -33,8 +33,7 @@ __license__ = """ import os import shutil -import numpy as np -from pyaudio3dtools import audioarray, audiofile +from pyaudio3dtools import audiofile def main(): diff --git a/scripts/pyaudio3dtools/__init__.py b/scripts/pyaudio3dtools/__init__.py index ccf53c51e1..3df489f582 100644 --- a/scripts/pyaudio3dtools/__init__.py +++ b/scripts/pyaudio3dtools/__init__.py @@ -40,4 +40,3 @@ Imports functions class """ -from . import audioarray, audiofile, spatialaudioformat diff --git a/scripts/pyaudio3dtools/audio3dtools.py b/scripts/pyaudio3dtools/audio3dtools.py index 0fec5c6ce9..22c26e28e8 100755 --- a/scripts/pyaudio3dtools/audio3dtools.py +++ b/scripts/pyaudio3dtools/audio3dtools.py @@ -30,11 +30,8 @@ the United Nations Convention on Contracts on the International Sales of Goods. """ -import argparse import logging -import os -from pyaudio3dtools import audiofile, spatialaudioformat main_logger = logging.getLogger("__main__") logger = main_logger.getChild(__name__) @@ -43,7 +40,7 @@ logger.setLevel(logging.DEBUG) def main(): print( - f"These scripts have been deprecated! Please check out and use the latest version from https://forge.3gpp.org/rep/ivas-codec-pc/ivas-processing-scripts.git" + "These scripts have been deprecated! Please check out and use the latest version from https://forge.3gpp.org/rep/ivas-codec-pc/ivas-processing-scripts.git" ) diff --git a/scripts/pyivastest/IvasBaseClass.py b/scripts/pyivastest/IvasBaseClass.py index bad578f753..c7c734c5c9 100644 --- a/scripts/pyivastest/IvasBaseClass.py +++ b/scripts/pyivastest/IvasBaseClass.py @@ -30,7 +30,6 @@ the United Nations Convention on Contracts on the International Sales of Goods. """ -import filecmp import json import logging import logging.handlers diff --git a/scripts/pyivastest/IvasModeCollector.py b/scripts/pyivastest/IvasModeCollector.py index 3255dc3a8a..90274544dc 100644 --- a/scripts/pyivastest/IvasModeCollector.py +++ b/scripts/pyivastest/IvasModeCollector.py @@ -34,8 +34,6 @@ import json import logging import os import os.path -import platform -import re from copy import deepcopy from pyivastest import IvasBaseClass, constants diff --git a/scripts/pyivastest/IvasModeRunner.py b/scripts/pyivastest/IvasModeRunner.py index 27f013ee8d..41dd4d20ab 100644 --- a/scripts/pyivastest/IvasModeRunner.py +++ b/scripts/pyivastest/IvasModeRunner.py @@ -35,8 +35,6 @@ import json import logging import logging.handlers import os -import platform -import re import subprocess import threading import time diff --git a/scripts/pyivastest/__init__.py b/scripts/pyivastest/__init__.py index 5ab768973f..71ab3180d3 100644 --- a/scripts/pyivastest/__init__.py +++ b/scripts/pyivastest/__init__.py @@ -40,13 +40,3 @@ Imports functions class """ -from . import ( - IvasBaseClass, - IvasModeAnalyzer, - IvasModeCollector, - IvasModeRunner, - IvasScriptsCommon, - IvasSvnBuilder, - constants, - ivas_svn, -) diff --git a/scripts/self_test.py b/scripts/self_test.py index c41e199939..714366bcf1 100755 --- a/scripts/self_test.py +++ b/scripts/self_test.py @@ -32,8 +32,6 @@ import errno -import multiprocessing -import operator import os import platform import re diff --git a/tests/codec_be_on_mr_nonselection/test_param_file.py b/tests/codec_be_on_mr_nonselection/test_param_file.py index 459964a186..9a1405c27e 100644 --- a/tests/codec_be_on_mr_nonselection/test_param_file.py +++ b/tests/codec_be_on_mr_nonselection/test_param_file.py @@ -357,9 +357,9 @@ def test_param_file_tests( metadata_differs = True except FileNotFoundError: if not dut_metadata_file.exists(): - print(f"DUT output metadata missing for expected file: " + md_file) + print("DUT output metadata missing for expected file: " + md_file) if not ref_metadata_file.exists(): - print(f"REF output metadata missing for expected file: " + md_file) + print("REF output metadata missing for expected file: " + md_file) metadata_differs = True if get_mld and get_mld_lim > 0: diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index 4f4c1a3271..5782982e9d 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -542,15 +542,15 @@ def sba_enc( if gain_flag != -1: short_tag_ext += f"_Gain{gain_flag}" if SID == 1: - short_tag_ext += f"_SID" + short_tag_ext += "_SID" if pca: - short_tag_ext += f"_pca" + short_tag_ext += "_pca" # to avoid conflicting names in case of parallel test execution, differentiate all cases long_tag_ext = "" if gain_flag != -1: long_tag_ext += f"_Gain{gain_flag}" if SID == 1: - long_tag_ext += f"_SID" + long_tag_ext += "_SID" dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.192" ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.192" ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.192" diff --git a/tests/codec_be_on_mr_selection/__init__.py b/tests/codec_be_on_mr_selection/__init__.py index 2ee63a30a5..bf530e5ebc 100644 --- a/tests/codec_be_on_mr_selection/__init__.py +++ b/tests/codec_be_on_mr_selection/__init__.py @@ -174,7 +174,7 @@ def run_check( if not is_ref_creation: if compare_bitstream: if not is_be_to_ref(dut_bitstream): - pytest.fail(f"Bitstream file differs from reference") + pytest.fail("Bitstream file differs from reference") dut_bitstream_to_decoder = dut_bitstream if error_pattern is not None: diff --git a/tests/conftest.py b/tests/conftest.py index bbe16f4715..da56b79c05 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -37,10 +37,9 @@ import os from tests import testconfig import pytest import platform -import tempfile import textwrap from pathlib import Path -from subprocess import STDOUT, CalledProcessError, TimeoutExpired, run +from subprocess import TimeoutExpired, run from typing import Optional, Union logger = logging.getLogger(__name__) diff --git a/tests/create_short_testvectors.py b/tests/create_short_testvectors.py index d80a328c14..e51f018f45 100755 --- a/tests/create_short_testvectors.py +++ b/tests/create_short_testvectors.py @@ -67,7 +67,7 @@ def collect_files(file_ids): for f in TEST_VECTOR_DIR.iterdir() if f.suffix == ".wav" and any([id in f.name for id in file_ids]) - and not "_cut" in f.name + and "_cut" not in f.name ] return files diff --git a/tests/cut_pcm.py b/tests/cut_pcm.py index 644a2ba1bc..2abc86b624 100755 --- a/tests/cut_pcm.py +++ b/tests/cut_pcm.py @@ -47,7 +47,6 @@ import platform import sys from pathlib import Path -import numpy as np HERE = Path(__file__).parent.resolve() SCRIPTS_DIR = str(HERE.joinpath("../scripts").resolve()) @@ -81,7 +80,7 @@ def cut_samples( ) if sample_rate is None and not str(in_file).endswith(".wav"): - raise ValueError(f"For non-wav files, samplerate must be explicitly given") + raise ValueError("For non-wav files, samplerate must be explicitly given") elif sample_rate is None: # set to default of pyaudio3dtools.audiofile.readfile -> for wav files it will be ignored anyway sample_rate = 48000 diff --git a/tests/hrtf_binary_loading/constants.py b/tests/hrtf_binary_loading/constants.py index 1524e9bf57..e2f8523106 100644 --- a/tests/hrtf_binary_loading/constants.py +++ b/tests/hrtf_binary_loading/constants.py @@ -33,7 +33,7 @@ import re from pathlib import Path -from tests.renderer.constants import OUTPUT_FORMATS_BINAURAL, SCRIPTS_DIR, TESTV_DIR +from tests.renderer.constants import SCRIPTS_DIR, TESTV_DIR TESTS_DIR = Path(__file__).parent diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index c66792c653..26a5e269d3 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -37,7 +37,6 @@ from tests.hrtf_binary_loading.utils import * from .constants import ( HRTF_TAGS, MC_BITRATE_FOR_FORMAT, - HRTF_TAG_DIFF_FROM_ROM, HRTF_TAG_SAME_AS_ROM, ) diff --git a/tests/hrtf_binary_loading/utils.py b/tests/hrtf_binary_loading/utils.py index 85d55a34d3..af150defb2 100644 --- a/tests/hrtf_binary_loading/utils.py +++ b/tests/hrtf_binary_loading/utils.py @@ -33,12 +33,11 @@ import os import sys import uuid -from typing import Dict, Optional +from typing import Optional import pytest -from tests.renderer.compare_audio import compare_audio_arrays -from tests.renderer.utils import check_BE, run_cmd, run_renderer, test_info +from tests.renderer.utils import check_BE, run_cmd, run_renderer from .constants import * diff --git a/tests/scale_pcm.py b/tests/scale_pcm.py index 614e8cef3f..356cdd90e1 100755 --- a/tests/scale_pcm.py +++ b/tests/scale_pcm.py @@ -10,9 +10,7 @@ sys.path.append(os.path.join(os.path.dirname(THIS_PATH), "../scripts")) import concurrent.futures -import numpy as np import pyaudio3dtools -import pyivastest def scale_folder(folder, factor): diff --git a/tests/split_rendering/constants.py b/tests/split_rendering/constants.py index 623d569376..73346c2980 100644 --- a/tests/split_rendering/constants.py +++ b/tests/split_rendering/constants.py @@ -32,14 +32,6 @@ from pathlib import Path -from tests.renderer.constants import ( - BIN_SUFFIX_MERGETARGET, - CUSTOM_LS_TO_TEST, - FORMAT_TO_FILE_COMPARETEST, - FORMAT_TO_FILE_SMOKETEST, - FORMAT_TO_METADATA_FILES, - METADATA_SCENES_TO_TEST, -) """ Set up paths """ TESTS_DIR = Path(__file__).parent diff --git a/tests/split_rendering/utils.py b/tests/split_rendering/utils.py index 3b37109e91..d5a27662f2 100644 --- a/tests/split_rendering/utils.py +++ b/tests/split_rendering/utils.py @@ -38,7 +38,7 @@ from typing import Tuple import numpy as np import pytest -from tests.renderer.utils import check_BE, run_cmd, test_info +from tests.renderer.utils import check_BE, run_cmd from tests.split_rendering.constants import * sys.path.append(SCRIPTS_DIR) diff --git a/tests/test_26444.py b/tests/test_26444.py index 3bcef2567a..c413be81e4 100644 --- a/tests/test_26444.py +++ b/tests/test_26444.py @@ -35,7 +35,6 @@ Execute tests specified via a parameter file. import filecmp import os import subprocess -from pathlib import Path import pytest diff --git a/tests/test_param_file_ltv.py b/tests/test_param_file_ltv.py index 44c6a388f8..41dfeae30e 100644 --- a/tests/test_param_file_ltv.py +++ b/tests/test_param_file_ltv.py @@ -355,9 +355,9 @@ def test_param_file_tests( metadata_differs = True except FileNotFoundError: if not dut_metadata_file.exists(): - print(f"DUT output metadata missing for expected file: " + md_file) + print("DUT output metadata missing for expected file: " + md_file) if not ref_metadata_file.exists(): - print(f"REF output metadata missing for expected file: " + md_file) + print("REF output metadata missing for expected file: " + md_file) metadata_differs = True if output_differs or metadata_differs: -- GitLab From 628460cbe4d69d90016ba988387903cbf21e96cb Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 12 Mar 2024 14:09:59 +0100 Subject: [PATCH 522/601] remove leftover debugging line --- tests/renderer/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index 52d1ccf19e..a538df7ee8 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -55,7 +55,6 @@ def test_info(request): def run_cmd(cmd, env=None): logging.info(f"\nRunning command\n{' '.join(cmd)}\n") - cmdJoin = " ".join(cmd) try: sp.run(cmd, check=True, capture_output=True, text=True, env=env) except sp.CalledProcessError as e: -- GitLab From cdf32194b72cd7acbae44765dce840ee42f04adf Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 12 Mar 2024 16:26:33 +0100 Subject: [PATCH 523/601] fix wrong command line argument --- ci/smoke_test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index fc835585c4..4135513b3e 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -97,9 +97,9 @@ echo "\n======================= 3. all modes with FEC =======================\n\ formats_with_no_ext_out=$(./scripts/runIvasCodec.py -L | grep -v MASA | grep -v ISM | grep -v OSBA) formats_with_ext_out=$(./scripts/runIvasCodec.py -L | grep 'MASA\|ISM\|OSBA') echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" -./scripts/runIvasCodec.py $verbosity_cmd -m $formats_with_no_ext_out -p $cfg $duration_arg --decoder_only --jbm_file $dly_profile $timeout_cmd | tee smoke_test_output_jbm_noEXT.txt +./scripts/runIvasCodec.py $verbosity_cmd -C $formats_with_no_ext_out -p $cfg $duration_arg --decoder_only --jbm_file $dly_profile $timeout_cmd | tee smoke_test_output_jbm_noEXT.txt echo "\n======================= 5. JBM, modes with EXT =======================\n\n" -./scripts/runIvasCodec.py $verbosity_cmd -m $formats_with_ext_out -p $cfg $duration_arg --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM_IR mono stereo FOA HOA3 5_1 7_1_4 $timeout_cmd | tee -a smoke_test_output_jbm_noEXT.txt +./scripts/runIvasCodec.py $verbosity_cmd -C $formats_with_ext_out -p $cfg $duration_arg --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM_IR mono stereo FOA HOA3 5_1 7_1_4 $timeout_cmd | tee -a smoke_test_output_jbm_noEXT.txt # run all modes with binaural output using external files formats_with_bin_out=$(./scripts/runIvasCodec.py -L | grep -v "mono\|tereo") -- GitLab From f00688e86c549facbbfbc9dbe9c27825dcfa1b7a Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 12 Mar 2024 16:27:20 +0100 Subject: [PATCH 524/601] remove obsolete comment --- ci/smoke_test.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 4135513b3e..57e3e1b154 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -93,7 +93,6 @@ echo "\n======================= 3. all modes with FEC =======================\n\ ./scripts/runIvasCodec.py $verbosity_cmd -p $cfg $duration_arg -f="$ep_file" --decoder_only $timeout_cmd | tee smoke_test_output_plc.txt # run JBM modes - EXT is excluded as not supported yet -# OMASA disabled for now formats_with_no_ext_out=$(./scripts/runIvasCodec.py -L | grep -v MASA | grep -v ISM | grep -v OSBA) formats_with_ext_out=$(./scripts/runIvasCodec.py -L | grep 'MASA\|ISM\|OSBA') echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" -- GitLab From 84bf1c5e26686a5204aaf0cacf06aa02d4a79712 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 13 Mar 2024 10:26:02 +0100 Subject: [PATCH 525/601] [revert] incorrectly removed imports --- scripts/pyivastest/__init__.py | 10 ++++++++++ tests/hrtf_binary_loading/constants.py | 2 +- tests/hrtf_binary_loading/test_codec_ROM_vs_file.py | 1 + tests/hrtf_binary_loading/utils.py | 2 +- tests/split_rendering/constants.py | 8 ++++++++ tests/split_rendering/utils.py | 2 +- 6 files changed, 22 insertions(+), 3 deletions(-) diff --git a/scripts/pyivastest/__init__.py b/scripts/pyivastest/__init__.py index 71ab3180d3..5ab768973f 100644 --- a/scripts/pyivastest/__init__.py +++ b/scripts/pyivastest/__init__.py @@ -40,3 +40,13 @@ Imports functions class """ +from . import ( + IvasBaseClass, + IvasModeAnalyzer, + IvasModeCollector, + IvasModeRunner, + IvasScriptsCommon, + IvasSvnBuilder, + constants, + ivas_svn, +) diff --git a/tests/hrtf_binary_loading/constants.py b/tests/hrtf_binary_loading/constants.py index e2f8523106..1524e9bf57 100644 --- a/tests/hrtf_binary_loading/constants.py +++ b/tests/hrtf_binary_loading/constants.py @@ -33,7 +33,7 @@ import re from pathlib import Path -from tests.renderer.constants import SCRIPTS_DIR, TESTV_DIR +from tests.renderer.constants import OUTPUT_FORMATS_BINAURAL, SCRIPTS_DIR, TESTV_DIR TESTS_DIR = Path(__file__).parent diff --git a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py index 26a5e269d3..c66792c653 100644 --- a/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py +++ b/tests/hrtf_binary_loading/test_codec_ROM_vs_file.py @@ -37,6 +37,7 @@ from tests.hrtf_binary_loading.utils import * from .constants import ( HRTF_TAGS, MC_BITRATE_FOR_FORMAT, + HRTF_TAG_DIFF_FROM_ROM, HRTF_TAG_SAME_AS_ROM, ) diff --git a/tests/hrtf_binary_loading/utils.py b/tests/hrtf_binary_loading/utils.py index af150defb2..c1b34c57cd 100644 --- a/tests/hrtf_binary_loading/utils.py +++ b/tests/hrtf_binary_loading/utils.py @@ -37,7 +37,7 @@ from typing import Optional import pytest -from tests.renderer.utils import check_BE, run_cmd, run_renderer +from tests.renderer.utils import check_BE, run_cmd, run_renderer, test_info from .constants import * diff --git a/tests/split_rendering/constants.py b/tests/split_rendering/constants.py index 73346c2980..623d569376 100644 --- a/tests/split_rendering/constants.py +++ b/tests/split_rendering/constants.py @@ -32,6 +32,14 @@ from pathlib import Path +from tests.renderer.constants import ( + BIN_SUFFIX_MERGETARGET, + CUSTOM_LS_TO_TEST, + FORMAT_TO_FILE_COMPARETEST, + FORMAT_TO_FILE_SMOKETEST, + FORMAT_TO_METADATA_FILES, + METADATA_SCENES_TO_TEST, +) """ Set up paths """ TESTS_DIR = Path(__file__).parent diff --git a/tests/split_rendering/utils.py b/tests/split_rendering/utils.py index d5a27662f2..3b37109e91 100644 --- a/tests/split_rendering/utils.py +++ b/tests/split_rendering/utils.py @@ -38,7 +38,7 @@ from typing import Tuple import numpy as np import pytest -from tests.renderer.utils import check_BE, run_cmd +from tests.renderer.utils import check_BE, run_cmd, test_info from tests.split_rendering.constants import * sys.path.append(SCRIPTS_DIR) -- GitLab From ac8403343fe872a9dfc3dfa5779e884fe1a60cc8 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 13 Mar 2024 13:45:36 +0200 Subject: [PATCH 526/601] Fix issue 1034. --- lib_com/options.h | 1 + lib_enc/ivas_masa_enc.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 6e9f3d7710..b0f2aece2f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,6 +171,7 @@ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ #define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO /* Eri: Issue 1010: Division by zero in Stereo CNG */ +#define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue XXXX, use of wrong numDir state. */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 831e343d72..3e15f90522 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -1448,6 +1448,9 @@ static void detect_metadata_composition( { for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; +#endif hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; @@ -1524,7 +1527,11 @@ static void compensate_energy_ratios( uint8_t numDirs; hMeta = &( hMasa->masaMetadata ); +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + numDirs = hMasa->config.numberOfDirections; +#else numDirs = hMeta->descriptive_meta.numberOfDirections + 1; +#endif for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { @@ -2140,10 +2147,19 @@ static void copy_masa_metadata_subframe( ) { uint8_t dir; +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + uint8_t band; +#endif /* directional metadata */ for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) { +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + hMetaTo->directional_meta[dir].spherical_index[sfTo][band] = hMetaFrom->directional_meta[dir].spherical_index[sfFrom][band]; + } +#endif mvr2r( hMetaFrom->directional_meta[dir].azimuth[sfFrom], hMetaTo->directional_meta[dir].azimuth[sfTo], MASA_FREQUENCY_BANDS ); mvr2r( hMetaFrom->directional_meta[dir].elevation[sfFrom], hMetaTo->directional_meta[dir].elevation[sfTo], MASA_FREQUENCY_BANDS ); mvr2r( hMetaFrom->directional_meta[dir].energy_ratio[sfFrom], hMetaTo->directional_meta[dir].energy_ratio[sfTo], MASA_FREQUENCY_BANDS ); -- GitLab From 315c78ed938a5396ec76e2748d110183940e25bb Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 13 Mar 2024 14:38:31 +0200 Subject: [PATCH 527/601] Code review fix --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index b0f2aece2f..ad2e0a685d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,7 +171,7 @@ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ #define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO /* Eri: Issue 1010: Division by zero in Stereo CNG */ -#define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue XXXX, use of wrong numDir state. */ +#define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ /* ##################### End NON-BE switches ########################### */ -- GitLab From 751f324bc4a9c396efba0ce589c08ce1a931a39d Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Wed, 13 Mar 2024 15:32:10 +0100 Subject: [PATCH 528/601] updated wmc_tool supporting float variants of math functions Linux and Win32 --- scripts/tools/Linux/wmc_tool | Bin 273736 -> 277832 bytes scripts/tools/Win32/wmc_tool.exe | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/tools/Linux/wmc_tool b/scripts/tools/Linux/wmc_tool index effbba41d676161b03519714eaeef2453c9fbff4..7bd75156a6e73bcb86fd8fedebdb66fc5e2c2c11 100755 GIT binary patch delta 19534 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 delta 20023 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 quvl Date: Wed, 13 Mar 2024 15:54:19 +0100 Subject: [PATCH 529/601] update of wmc_auto.h|c helper files --- lib_debug/wmc_auto.c | 1 + lib_debug/wmc_auto.h | 125 ++++++++++++++++++++++--------------------- 2 files changed, 65 insertions(+), 61 deletions(-) diff --git a/lib_debug/wmc_auto.c b/lib_debug/wmc_auto.c index 6ddebc5a78..7dfcf8bff9 100644 --- a/lib_debug/wmc_auto.c +++ b/lib_debug/wmc_auto.c @@ -2169,3 +2169,4 @@ void Reset_BASOP_WMOPS_counter( void ) #endif + diff --git a/lib_debug/wmc_auto.h b/lib_debug/wmc_auto.h index 5670f90722..3b47ceea94 100644 --- a/lib_debug/wmc_auto.h +++ b/lib_debug/wmc_auto.h @@ -613,14 +613,6 @@ extern int cntr_push_pop; #endif -/* mac & msu (Non Instrumented Versions) */ -#ifndef mac -#define mac( a, b, c ) ( ( a ) + ( b ) * ( c ) ) -#endif -#ifndef mac -#define msu( a, b, c ) ( ( a ) - ( b ) * ( c ) ) -#endif - #ifndef WMOPS /* DESACTIVATE the Counting Mechanism */ #define OP_COUNT_( op, n ) @@ -689,63 +681,73 @@ static int wmc_flag_ = 0; #define MISC_( x ) ABS_( x ) /* Math Operations */ -#define abs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), abs ) -#define fabs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), fabs ) -#define labs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), labs ) -#define floor_ OP_COUNT_WRAPPER1_( MISC_( 1 ), floor ) -#define sqrt_ OP_COUNT_WRAPPER1_( SQRT_( 1 ), sqrt ) -#define pow_ OP_COUNT_WRAPPER1_( POWER_( 1 ), pow ) -#define exp_ OP_COUNT_WRAPPER1_( POWER_( 1 ), exp ) -#define log_ OP_COUNT_WRAPPER1_( LOG_( 1 ), log ) -#define log10_ OP_COUNT_WRAPPER1_( LOG_( 1 ), log10 ) -#define cos_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), cos ) -#define sin_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), sin ) -#define tan_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tan ) -#define acos_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), acos ) -#define asin_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), asin ) -#define atan_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), atan ) -#define atan2_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), atan2 ) -#define cosh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), cosh ) -#define sinh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), sinh ) -#define tanh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tanh ) -#define fmod_ OP_COUNT_WRAPPER1_( DIV_( 1 ), fmod ) -/* these macros use any local macros already defined */ -/* min/max and their Variants */ -#define min_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), min( ( a ), ( b ) ) ) -#define max_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), max( ( a ), ( b ) ) ) -#define MIN_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), MIN( ( a ), ( b ) ) ) -#define MAX_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), MAX( ( a ), ( b ) ) ) -#define Min_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), Min( ( a ), ( b ) ) ) -#define Max_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), Max( ( a ), ( b ) ) ) -/* Square and its Variants */ -#define sqr_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), sqr( ( x ) ) ) -#define Sqr_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), Sqr( ( x ) ) ) -#define SQR_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), SQR( ( x ) ) ) -#define square_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), square( ( x ) ) ) -#define Square_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), Square( ( x ) ) ) -#define SQUARE_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), SQUARE( ( x ) ) ) -/* Sign and its Variants */ -#define sign_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), sign( ( x ) ) ) -#define Sign_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), Sign( ( x ) ) ) -#define SIGN_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), SIGN( ( x ) ) ) -/* Square Root and its Variants */ -#define sqrtf_( x ) OP_COUNT_WRAPPER1_( SQRT_( 1 ), sqrtf( ( x ) ) ) -/* Invert Square Root and its Variants */ -#define inv_sqrt_( x ) OP_COUNT_WRAPPER1_( SQRT_( 1 ), inv_sqrt( ( x ) ) ) -/* Others */ +#define abs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), abs ) +#define fabs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), fabs ) +#define fabsf_ OP_COUNT_WRAPPER1_( ABS_( 1 ), fabsf ) +#define labs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), labs ) +#define floor_ OP_COUNT_WRAPPER1_( MISC_( 1 ), floor ) +#define floorf_ OP_COUNT_WRAPPER1_( MISC_( 1 ), floorf ) +#define sqrt_ OP_COUNT_WRAPPER1_( SQRT_( 1 ), sqrt ) +#define sqrtf_ OP_COUNT_WRAPPER1_( SQRT_( 1 ), sqrtf ) +#define pow_ OP_COUNT_WRAPPER1_( POWER_( 1 ), pow ) +#define powf_ OP_COUNT_WRAPPER1_( POWER_( 1 ), powf ) +#define exp_ OP_COUNT_WRAPPER1_( POWER_( 1 ), exp ) +#define expf_ OP_COUNT_WRAPPER1_( POWER_( 1 ), expf ) +#define log_ OP_COUNT_WRAPPER1_( LOG_( 1 ), log ) +#define logf_ OP_COUNT_WRAPPER1_( LOG_( 1 ), logf ) +#define log10_ OP_COUNT_WRAPPER1_( LOG_( 1 ), log10 ) +#define log10f_ OP_COUNT_WRAPPER1_( LOG_( 1 ), log10f ) +#define cos_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), cos ) +#define cosf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), cosf ) +#define sin_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), sin ) +#define sinf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), sinf ) +#define tan_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tan ) +#define tanf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tanf ) +#define acos_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), acos ) +#define acosf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), acosf ) +#define asin_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), asin ) +#define asinf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), asinf ) +#define atan_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), atan ) +#define atanf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), atanf ) +#define atan2_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), atan2 ) +#define atan2f_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), atan2f ) +#define cosh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), cosh ) +#define coshf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), coshf ) +#define sinh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), sinh ) +#define sinhf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), sinhf ) +#define tanh_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tanh ) +#define tanhf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tanhf ) +#define fmod_ OP_COUNT_WRAPPER1_( DIV_( 1 ), fmod ) +#define fmodf_ OP_COUNT_WRAPPER1_( DIV_( 1 ), fmodf ) + +/* the macros below are instrumented versions of user-defined macros that might be used in the source code +/* representing some well-known and recognized mathematical operations (that are not defined in math.h) */ +/* Note: the 'wmc_flag_=wmc_flag_' is used to avoid warning: left-hand operand of comma expression has no effect with gcc */ + +#define min_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), min( ( a ), ( b ) ) ) +#define max_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), max( ( a ), ( b ) ) ) +#define MIN_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), MIN( ( a ), ( b ) ) ) +#define MAX_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), MAX( ( a ), ( b ) ) ) +#define Min_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), Min( ( a ), ( b ) ) ) +#define Max_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), Max( ( a ), ( b ) ) ) +#define sqr_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), sqr( ( x ) ) ) +#define Sqr_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), Sqr( ( x ) ) ) +#define SQR_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), SQR( ( x ) ) ) +#define square_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), square( ( x ) ) ) +#define Square_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), Square( ( x ) ) ) +#define SQUARE_( x ) OP_COUNT_WRAPPER1_( MULT_( 1 ), SQUARE( ( x ) ) ) +#define sign_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), sign( ( x ) ) ) +#define Sign_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), Sign( ( x ) ) ) +#define SIGN_( x ) OP_COUNT_WRAPPER1_( MOVE_( 1 ), SIGN( ( x ) ) ) +#define inv_sqrt_( x ) OP_COUNT_WRAPPER1_( SQRT_( 1 ), inv_sqrt( ( x ) ) ) +#define inv_sqrtf_( x ) OP_COUNT_WRAPPER1_( SQRT_( 1 ), inv_sqrtf( ( x ) ) ) #define log_base_2_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log_base_2( ( x ) ) ) +#define log2_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log2( ( x ) ) ) #define log2_f_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log2_f( ( x ) ) ) -/* The 'wmc_flag_=wmc_flag_' is Used to Avoid: "warning: left-hand operand of comma expression has no effect" - with Cygwin gcc Compiler */ -#define _round_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, _round( ( x ) ) ) -#define round_f_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, round_f( ( x ) ) ) -#define _squant_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, _squant( ( x ) ) ) -/* Set Min/Max */ +#define _round_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, _round( ( x ) ) ) +#define round_f_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, round_f( ( x ) ) ) #define set_min_( a, b ) OP_COUNT_WRAPPER3_( ( ADD_( 1 ), BRANCH_( 1 ), MOVE_( 1 ) ), set_min( ( a ), ( b ) ) ) #define set_max_( a, b ) OP_COUNT_WRAPPER3_( ( ADD_( 1 ), BRANCH_( 1 ), MOVE_( 1 ) ), set_max( ( a ), ( b ) ) ) -/* mac & msu (Instrumented Versions) */ -#define mac_( a, b, c ) OP_COUNT_WRAPPER1_( MAC_( 1 ), mac( a, b, c ) ) -#define msu_( a, b, c ) OP_COUNT_WRAPPER1_( MAC_( 1 ), msu( a, b, c ) ) /* Functions */ #define func_( name, x ) OP_COUNT_WRAPPER1_( FUNC_( x ), name ) @@ -1438,3 +1440,4 @@ static __inline void incrGoto( void) { #endif /* WMOPS_H */ + -- GitLab From b4868c8fcede9a73ec51d1bf9c48e478b4c8ee88 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 14 Mar 2024 13:22:14 +0100 Subject: [PATCH 530/601] add frexp() and frexpf() functions at the cost of MISC(2) --- lib_debug/wmc_auto.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_debug/wmc_auto.h b/lib_debug/wmc_auto.h index 3b47ceea94..41e09b89a0 100644 --- a/lib_debug/wmc_auto.h +++ b/lib_debug/wmc_auto.h @@ -719,6 +719,8 @@ static int wmc_flag_ = 0; #define tanhf_ OP_COUNT_WRAPPER1_( TRANS_( 1 ), tanhf ) #define fmod_ OP_COUNT_WRAPPER1_( DIV_( 1 ), fmod ) #define fmodf_ OP_COUNT_WRAPPER1_( DIV_( 1 ), fmodf ) +#define frexp_ OP_COUNT_WRAPPER1_( MISC_( 2 ), frexp ) +#define frexpf_ OP_COUNT_WRAPPER1_( MISC_( 2 ), frexpf ) /* the macros below are instrumented versions of user-defined macros that might be used in the source code /* representing some well-known and recognized mathematical operations (that are not defined in math.h) */ -- GitLab From 264f6a330aaa649815a3b5bd33fffe5ee716db41 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Thu, 14 Mar 2024 13:33:03 +0100 Subject: [PATCH 531/601] update the binaries --- scripts/tools/Linux/wmc_tool | Bin 277832 -> 277832 bytes scripts/tools/Win32/wmc_tool.exe | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/tools/Linux/wmc_tool b/scripts/tools/Linux/wmc_tool index 7bd75156a6e73bcb86fd8fedebdb66fc5e2c2c11..10c8a7f863d1a2648e122fcc1d72bb86a2766edd 100755 GIT binary patch delta 4561 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

T7YX>s}gXHwyypXS!27{ntrmIi_VL)1^)^ z%Q5XLnQnE8S&n&r>7VKR*O^797o1||V0u?Ny$U2dyKMR_5WS~t`YsT?t9<&cQ_OOV zY}0?9VwPuisrWPf{3T}5=?15nIT$6UTb^c?XY`*Q38Gr3SAr-lv&-AE%dej+aC8k}?)9cPK%Q3BPnLZCB zT|a#JKnB^Her^}vYmS<#~ZVRI9r^kXQ!RfVUndO=8Oq)LMEVB|L zL3H}TbIkHgPftvLbdFh#v1~f$ zd1iS=@9CN#N_M*Ed1iU0>zAizooAL~?48~T67`(E5+pkH?(|dVndO)c+?)OiMBjQd zo$CU#8l&cP!wbyn%sc-7nI3(CS(Z_9dgTRXbw-Zq3okIsGdfQ{2%_4iKLk;-(-|)^ z%QG5HR|HY+(;Y!n%=APMRXDxzBC|5nJ-+G7E;7q8UE-g93`B2}oc`=0vmB$|bkP%;Jrt4i|mSfDA?t6(@o-uiP?j>efWo9+Tl<5aAGs`oYOn-QpS>ADK z+28*WjK~2Q%m@oe836`{v*myPC!yq$SdcV07ug6fFz`=zyuvKcs5w0mM5Rt|yuvK+ zxWDr6e;*W0?r=?e1Q-}zSN{EPk1SsWmIfPoM}UEWYx+ZwX^ztwuQJO!?yLIyKNwjx zlOI?)IOPa3Fnp}~`+pmX{6@HZj35I;`}D-C%<_uwtN;FQMp0G=S2hRKcACEMDziMJ z#q@($nUxvMra!&PEYCE*ZaUjFW+g_~>6+J=0KcD zQ}gsyAo@r1^iv@Eb=UM)*O--;|(Oqww_78_e>I z;?t*ssI2K*Z!pU17oIsS{vem;%ultTLU6mBo(n%5+Co7I!9w{oA`( zS)Oq)G5pwG#K&T$&A4FtN=p`fF1Y*lPk&^|V#Wn?m&1|iN>(gpoHuSl+<9Yrq7}<= NM#cx*HEmer838`c7J&c& delta 4652 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 diff --git a/scripts/tools/Win32/wmc_tool.exe b/scripts/tools/Win32/wmc_tool.exe index 4e29222ee7..b2e2df6c80 100755 --- a/scripts/tools/Win32/wmc_tool.exe +++ b/scripts/tools/Win32/wmc_tool.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6ba980f2498a8ee91253c9dc0fd4aaeb223284f3085f56d9fe7eba30f845c2b -size 242176 +oid sha256:02ec1d6fa014a6bb37f45281b9e83b445812f669623b99c8c90ad320535d383c +size 381952 -- GitLab From 03a826eb9eda719fa3b08d6b24d6ae5fbfb2ed01 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 14 Mar 2024 18:52:43 +0100 Subject: [PATCH 532/601] First try --- lib_com/options.h | 1 + lib_dec/ivas_ism_dec.c | 2 ++ lib_dec/ivas_mct_dec.c | 2 ++ lib_dec/ivas_omasa_dec.c | 3 ++- lib_dec/ivas_sba_dec.c | 2 ++ 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 52357d6c25..b97db1348c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,6 +157,7 @@ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ +#define FIX_1033_MEMORY_LEAK_OMASA /* VA: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index b23b16ca63..3b3c806631 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -272,7 +272,9 @@ static ivas_error ivas_ism_bitrate_switching_dec( if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); +#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; +#endif if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 1df83b0ce5..f9e26c33f3 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1211,7 +1211,9 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); +#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; +#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 763c37a709..76014bb97d 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -393,8 +393,9 @@ ivas_error ivas_omasa_dec_config( { /* TD renderer handle */ ivas_td_binaural_close( &st_ivas->hBinRendererTd ); +#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; - +#endif /* ISM renderer handle + ISM data handle */ ivas_omasa_separate_object_renderer_close( st_ivas ); } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index af102dd96e..e9c61aa233 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -526,7 +526,9 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); +#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; +#endif } } nchan_transport_old += st_ivas->nchan_ism; -- GitLab From 1317979b6feaf0372831c29e44ea335bfde098fe Mon Sep 17 00:00:00 2001 From: norvell Date: Fri, 15 Mar 2024 06:59:39 +0000 Subject: [PATCH 533/601] Correct run command for encoder such that the result is assigned and reported. --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index bbe16f4715..37b5281403 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -332,7 +332,7 @@ class EncoderFrontend: log_dbg_msg(f"{self._type} encoder command:\n{cmd_str}") try: - result = run(command, capture_output=True, check=True, timeout=self.timeout) + result = run(command, capture_output=True, check=False, timeout=self.timeout) except TimeoutExpired: pytest.fail(f"{self._type} encoder run timed out after {self.timeout}s.") -- GitLab From 63d3649624fe57dbbabe522165d3b6e98ea9d55a Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 15 Mar 2024 12:29:22 +0200 Subject: [PATCH 534/601] Add additional fix to OMASA path and adjust threshold to activate validation code more correctly. --- lib_com/ivas_cnst.h | 4 ++++ lib_enc/ivas_masa_enc.c | 3 +++ 2 files changed, 7 insertions(+) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 4960db4712..b9e6c2cfda 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1195,7 +1195,11 @@ enum #define MASA_COHERENCE_TOLERANCE 0.1f #define MASA_COHERENCE_THRESHOLD 0.1f #define MASA_RATIO_TOLERANCE 0.1f +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS +#define MASA_RATIO_THRESHOLD 0.015f +#else #define MASA_RATIO_THRESHOLD 0.1f +#endif #define MASA_ANGLE_TOLERANCE 0.5f #define MASA_LIMIT_NO_BANDS_SUR_COH 8 #define MINIMUM_BIT_BUDGET_NORMAL_META 100 diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 3e15f90522..466287a0fd 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -1260,6 +1260,9 @@ void ivas_masa_combine_directions( ambience2dir = 1.0f - ratioSum; hMeta->directional_meta[0].energy_ratio[j][i] = sumVecLen[j][i] / ( hMeta->directional_meta[0].energy_ratio[j][i] + hMeta->directional_meta[1].energy_ratio[j][i] + ambience2dir / 2.0f ); hMeta->directional_meta[1].energy_ratio[j][i] = 0.0f; +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + hMeta->common_meta.diffuse_to_total_ratio[j][i] = 1.0f - hMeta->directional_meta[0].energy_ratio[j][i]; +#endif if ( computeCoherence ) { ambience1dir = 1.0f - hMeta->directional_meta[0].energy_ratio[j][i]; -- GitLab From 50e695f134149a6bd795e81eca4cae32fc999f70 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 15 Mar 2024 15:41:09 +0100 Subject: [PATCH 535/601] record maximum absolute diff as property in XML report --- tests/cmp_pcm.py | 21 +++++++++++++------ tests/codec_be_on_mr_nonselection/__init__.py | 2 ++ .../test_masa_enc_dec.py | 20 ++++++++++++------ .../test_param_file.py | 10 ++++++--- .../test_sba_bs_dec_plc.py | 10 ++++++--- .../test_sba_bs_enc.py | 10 ++++++--- tests/conftest.py | 3 +-- tests/test_param_file_ltv.py | 5 +++++ 8 files changed, 58 insertions(+), 23 deletions(-) diff --git a/tests/cmp_pcm.py b/tests/cmp_pcm.py index 13a1c1ba5a..45cdf5b832 100755 --- a/tests/cmp_pcm.py +++ b/tests/cmp_pcm.py @@ -49,21 +49,30 @@ def cmp_pcm(file1, file2, out_config, fs, get_mld=False, mld_lim=0) -> (int, str s1, s2, fs, per_frame=False, get_mld=get_mld ) - if cmp_result["bitexact"]: - return 0, "SUCCESS: Files are bitexact" - else: + output_differs = 0 + reason = "SUCCESS: Files are bitexact" + + if not cmp_result["bitexact"]: diff_msg = f"MAXIMUM ABS DIFF ==> {cmp_result['max_abs_diff']} at sample num {cmp_result['max_abs_diff_pos_sample']} (assuming {nchannels} channels)" first_msg = f"First diff found at sample num {cmp_result['first_diff_pos_sample']} in channel {cmp_result['first_diff_pos_channel']}, frame {cmp_result['first_diff_pos_frame']} (assuming {nchannels} channels, {fs} sampling rate)" print(diff_msg) print(first_msg) + + reason = f"Non-BE - MAXIMUM ABS DIFF: {cmp_result['max_abs_diff']}" + output_differs = 1 + if get_mld: mld_msg = f"MLD: {cmp_result['MLD']}" + reason += " - " + mld_msg print(mld_msg) + if cmp_result["MLD"] <= mld_lim: - return 0, f"MLD: {cmp_result['MLD']} <= {mld_lim}" + output_differs = 0 + reason += f" <= {mld_lim}" else: - return 1, f"MLD: {cmp_result['MLD']} > {mld_lim}" - return 1, "Non-BE" + reason += f" > {mld_lim}" + + return output_differs, reason if __name__ == "__main__": diff --git a/tests/codec_be_on_mr_nonselection/__init__.py b/tests/codec_be_on_mr_nonselection/__init__.py index e69de29bb2..aba85788e7 100644 --- a/tests/codec_be_on_mr_nonselection/__init__.py +++ b/tests/codec_be_on_mr_nonselection/__init__.py @@ -0,0 +1,2 @@ +MLD_PATTERN = r"MLD: ([\d\.]*)" +MAX_DIFF_PATTERN = r"MAXIMUM ABS DIFF: (\d*)" diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index 75b01db382..470f2618d0 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -35,6 +35,7 @@ __doc__ = """ import errno import os +import re from filecmp import cmp from typing import Optional @@ -43,6 +44,8 @@ import pytest from tests.cmp_pcm import cmp_pcm from tests.conftest import DecoderFrontend, EncoderFrontend +from . import MLD_PATTERN, MAX_DIFF_PATTERN + # params # output_mode_list = ['MONO', 'STEREO', '5_1', '7_1', '5_1_2', '5_1_4', '7_1_4', 'FOA', 'HOA2', 'HOA3', 'BINAURAL', 'BINAURAL_ROOM', 'EXT'] output_mode_list = ["BINAURAL", "EXT"] @@ -216,11 +219,13 @@ def test_masa_enc_dec( mld_lim=get_mld_lim, ) if get_mld: - mld = 0 - if "MLD" in reason: - mld = float(reason.split(":")[1].split()[0]) + mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] + record_property("MAXIMUM ABS DIFF", max_diff) + if get_mld and get_mld_lim > 0: if pcmcmp_res != 0: pytest.fail(reason) @@ -248,10 +253,13 @@ def test_masa_enc_dec( mld_lim=get_mld_lim, ) if get_mld: - mld = 0 - if "MLD" in reason: - mld = float(reason.split(":")[1].split()[0]) + mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) + + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] + record_property("MAXIMUM ABS DIFF", max_diff) + # Report compare result if cmp_result != 0: pytest.fail(reason) diff --git a/tests/codec_be_on_mr_nonselection/test_param_file.py b/tests/codec_be_on_mr_nonselection/test_param_file.py index 459964a186..e51bd2defa 100644 --- a/tests/codec_be_on_mr_nonselection/test_param_file.py +++ b/tests/codec_be_on_mr_nonselection/test_param_file.py @@ -35,6 +35,7 @@ Execute tests specified via a parameter file. import errno import filecmp import os +import re import platform from pathlib import Path from subprocess import run @@ -45,6 +46,7 @@ from tests.cmp_pcm import cmp_pcm from tests.conftest import DecoderFrontend, EncoderFrontend from tests.cut_pcm import cut_samples from tests.testconfig import PARAM_FILE +from . import MLD_PATTERN, MAX_DIFF_PATTERN VALID_DEC_OUTPUT_CONF = [ "MONO", @@ -342,11 +344,13 @@ def test_param_file_tests( md_out_files = get_expected_md_files(ref_output_file, enc_split, output_config) if get_mld: - mld = 0 - if "MLD" in reason: - mld = float(reason.split(":")[1].split()[0]) + mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] + record_property("MAXIMUM ABS DIFF", max_diff) + metadata_differs = False for md_file in md_out_files: dut_metadata_file = Path(f"{dut_base_path}/param_file/dec/{md_file}") diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py index 11a8aeca04..11b0cfc4c0 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py @@ -34,11 +34,13 @@ __doc__ = """ import errno import os +import re import pytest from tests.cmp_pcm import cmp_pcm from tests.conftest import DecoderFrontend +from . import MLD_PATTERN, MAX_DIFF_PATTERN # params tag_list = ["stvFOA"] @@ -209,11 +211,13 @@ def sba_dec_plc( mld_lim=get_mld_lim, ) if get_mld: - mld = 0 - if "MLD" in reason: - mld = float(reason.split(":")[1].split()[0]) + mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] + record_property("MAXIMUM ABS DIFF", max_diff) + # report compare result if cmp_result != 0: pytest.fail(reason) diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index 4f4c1a3271..3298665eb0 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -35,6 +35,7 @@ __doc__ = """ import errno import os +import re import pytest from cut_bs import cut_from_start @@ -42,6 +43,7 @@ from cut_bs import cut_from_start from tests.cmp_pcm import cmp_pcm from tests.conftest import DecoderFrontend, EncoderFrontend from tests.cut_pcm import cut_samples +from . import MLD_PATTERN, MAX_DIFF_PATTERN # params @@ -727,11 +729,13 @@ def sba_dec( mld_lim=get_mld_lim, ) if get_mld: - mld = 0 - if "MLD" in reason: - mld = float(reason.split(":")[1].split()[0]) + mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] + record_property("MAXIMUM ABS DIFF", max_diff) + # report compare result if cmp_result != 0: pytest.fail(reason) diff --git a/tests/conftest.py b/tests/conftest.py index 37b5281403..07004cad09 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -37,10 +37,9 @@ import os from tests import testconfig import pytest import platform -import tempfile import textwrap from pathlib import Path -from subprocess import STDOUT, CalledProcessError, TimeoutExpired, run +from subprocess import TimeoutExpired, run from typing import Optional, Union logger = logging.getLogger(__name__) diff --git a/tests/test_param_file_ltv.py b/tests/test_param_file_ltv.py index 44c6a388f8..15ce69b177 100644 --- a/tests/test_param_file_ltv.py +++ b/tests/test_param_file_ltv.py @@ -35,6 +35,7 @@ Execute tests specified via a parameter file. import errno import filecmp import os +import re import platform from pathlib import Path from subprocess import run @@ -345,6 +346,10 @@ def test_param_file_tests( mld = float(reason.split(":")[1].split()[0]) record_property("MLD", mld) + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] + record_property("MAXIMUM ABS DIFF", max_diff) + metadata_differs = False for md_file in md_out_files: dut_metadata_file = Path(f"{dut_base_path}/param_file/dec/{md_file}") -- GitLab From 1ff71bb0403a23b8417e711ae0543332d9f8a6fa Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 18 Mar 2024 11:23:57 +0100 Subject: [PATCH 536/601] fix for #1021, fix compile error caused by the merge from main and the resolving of a conflict --- lib_dec/ivas_ism_renderer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index e5aa0b4745..0b54e6c7fe 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -292,7 +292,8 @@ void ivas_ism_render_sf( if ( renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) #else if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) -#endif { +#endif + { st_ivas->hTcBuffer->subframes_rendered += 1; st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; } -- GitLab From 1886d26fc6d3d89715c2a27d7de6862c3163594a Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 18 Mar 2024 11:33:08 +0100 Subject: [PATCH 537/601] fix for #1021, clang-format --- lib_dec/ivas_ism_renderer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 0b54e6c7fe..33e05a0e6a 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -292,8 +292,8 @@ void ivas_ism_render_sf( if ( renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) #else if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) -#endif - { +#endif + { st_ivas->hTcBuffer->subframes_rendered += 1; st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; } -- GitLab From 8b5f1bee8455cc4b850c7a53e3977c9c0345b6cc Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 18 Mar 2024 14:16:59 +0100 Subject: [PATCH 538/601] fix for no failures --- .../codec_be_on_mr_nonselection/test_masa_enc_dec.py | 12 ++++++++---- tests/codec_be_on_mr_nonselection/test_param_file.py | 6 ++++-- .../test_sba_bs_dec_plc.py | 6 ++++-- tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py | 6 ++++-- tests/test_param_file_ltv.py | 11 ++++++----- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index 470f2618d0..9dc8ce9e6d 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -222,8 +222,10 @@ def test_masa_enc_dec( mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) - search_result = re.search(MAX_DIFF_PATTERN, reason) - max_diff = search_result.groups(1)[0] + max_diff = 0 + if pcmcmp_res: + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] record_property("MAXIMUM ABS DIFF", max_diff) if get_mld and get_mld_lim > 0: @@ -256,8 +258,10 @@ def test_masa_enc_dec( mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) - search_result = re.search(MAX_DIFF_PATTERN, reason) - max_diff = search_result.groups(1)[0] + max_diff = 0 + if pcmcmp_res: + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] record_property("MAXIMUM ABS DIFF", max_diff) # Report compare result diff --git a/tests/codec_be_on_mr_nonselection/test_param_file.py b/tests/codec_be_on_mr_nonselection/test_param_file.py index e51bd2defa..f206caed4e 100644 --- a/tests/codec_be_on_mr_nonselection/test_param_file.py +++ b/tests/codec_be_on_mr_nonselection/test_param_file.py @@ -347,8 +347,10 @@ def test_param_file_tests( mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) - search_result = re.search(MAX_DIFF_PATTERN, reason) - max_diff = search_result.groups(1)[0] + max_diff =0 + if output_differs: + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] record_property("MAXIMUM ABS DIFF", max_diff) metadata_differs = False diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py index 11b0cfc4c0..5b52b9bd2f 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py @@ -214,8 +214,10 @@ def sba_dec_plc( mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) - search_result = re.search(MAX_DIFF_PATTERN, reason) - max_diff = search_result.groups(1)[0] + max_diff = 0 + if cmp_result: + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] record_property("MAXIMUM ABS DIFF", max_diff) # report compare result diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index 3298665eb0..47eb8a3d42 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -732,8 +732,10 @@ def sba_dec( mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) - search_result = re.search(MAX_DIFF_PATTERN, reason) - max_diff = search_result.groups(1)[0] + max_diff = 0 + if cmp_result: + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] record_property("MAXIMUM ABS DIFF", max_diff) # report compare result diff --git a/tests/test_param_file_ltv.py b/tests/test_param_file_ltv.py index 15ce69b177..a32ceb2412 100644 --- a/tests/test_param_file_ltv.py +++ b/tests/test_param_file_ltv.py @@ -45,6 +45,7 @@ import pytest from tests.cmp_pcm import cmp_pcm from tests.conftest import DecoderFrontend, EncoderFrontend from tests.cut_pcm import cut_samples +from .codec_be_on_mr_nonselection import MLD_PATTERN, MAX_DIFF_PATTERN # from tests.testconfig import PARAM_FILE @@ -341,13 +342,13 @@ def test_param_file_tests( md_out_files = get_expected_md_files(ref_output_file, enc_split, output_config) if get_mld: - mld = 0 - if "MLD" in reason: - mld = float(reason.split(":")[1].split()[0]) + mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) - search_result = re.search(MAX_DIFF_PATTERN, reason) - max_diff = search_result.groups(1)[0] + max_diff = 0 + if output_differs: + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] record_property("MAXIMUM ABS DIFF", max_diff) metadata_differs = False -- GitLab From 1ca38f5efb8377e5e054cd77ae0a5628a86e1adb Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Mon, 18 Mar 2024 15:27:25 +0100 Subject: [PATCH 539/601] add HRTF binary file tests for MASA and OMASA --- scripts/config/self_test.prm | 8 ++++---- scripts/config/self_test_ltv.prm | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index a9bb024f30..49f7c08c4f 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1067,9 +1067,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 1 testv/stv1MASA1TC48n.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/stv1MASA1TC48n.wav bit ../IVAS_dec FOA 48 bit testv/stv1MASA1TC48n.wav_sw_48-48_FOA.tst -// MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out +// MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) ../IVAS_cod -masa 2 testv/stv1MASA2TC48n.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv1MASA2TC48n.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv1MASA2TC48n.wav_sw_48-48_BINAURAL.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv1MASA2TC48n.wav_sw_48-48_BINAURAL.tst // MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, MONO out ../IVAS_cod -masa 2 testv/stv1MASA2TC48n.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv1MASA2TC48n.wav bit @@ -1588,9 +1588,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_masa 4 2 NULL testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv1MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_1MASA2TC48c.wav bit ../IVAS_dec HOA3 48 bit testv/stvOMASA_4ISM_1MASA2TC48c.wav_HOA3_sw_48-48.tst -// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out (Model from file) ../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit -../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_REVERB 48 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst // OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out ../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 5080418476..0692089692 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1067,9 +1067,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/ltv48_MASA1TC.wav bit ../IVAS_dec FOA 48 bit testv/ltv48_MASA1TC.wav_sw_48-48_FOA.tst -// MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out +// MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_MASA2TC.wav bit -../IVAS_dec BINAURAL 48 bit testv/ltv48_MASA2TC.wav_sw_48-48_BINAURAL.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/ltv48_MASA2TC.wav_sw_48-48_BINAURAL.tst // MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, MONO out ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_MASA2TC.wav bit @@ -1588,9 +1588,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_masa 4 2 NULL testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit ../IVAS_dec HOA3 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_HOA3_sw_48-48.tst -// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out (Model from file) ../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit -../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst // OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out ../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv NULL testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit -- GitLab From 52da583a7b2b1a4dcf64ba83ea1257054d7863db Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Mon, 18 Mar 2024 15:32:43 +0100 Subject: [PATCH 540/601] update company in the switch comment --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index b97db1348c..a504c51182 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,7 @@ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ -#define FIX_1033_MEMORY_LEAK_OMASA /* VA: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ +#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ /* #################### End BE switches ################################## */ -- GitLab From fa428a2c31c646f49000508087b68b728023e96e Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 18 Mar 2024 16:01:04 +0100 Subject: [PATCH 541/601] fix mld value from cmp_pcm and add parsing of more than 1 property --- scripts/parse_mld_xml.py | 25 ++++++++++++++++--------- tests/cmp_pcm.py | 20 ++++++++++---------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/scripts/parse_mld_xml.py b/scripts/parse_mld_xml.py index fb1dc8e73a..088789903d 100644 --- a/scripts/parse_mld_xml.py +++ b/scripts/parse_mld_xml.py @@ -7,6 +7,9 @@ from xml.etree import ElementTree Parse a junit report and create a MLD summary report. """ +PROPERTIES = ["MLD", "MAXIMUM ABS DIFF"] + + # Main routine if __name__ == "__main__": parser = argparse.ArgumentParser( @@ -32,9 +35,12 @@ if __name__ == "__main__": testcases = tree.findall(".//testcase") with open(csv_file, "w") as outfile: + headerline = ";".join(["testcase"] + PROPERTIES) + "\n" + outfile.write(headerline) + for testcase in testcases: - if testcase.find(".//skipped") == None: - if testcase.get("file") == None: + if testcase.find(".//skipped") is None: + if testcase.get("file") is None: fulltestname = ( testcase.get("classname").replace(".", "/") + ".py::" @@ -42,10 +48,11 @@ if __name__ == "__main__": ) else: fulltestname = testcase.get("file") + "::" + testcase.get("name") - if testcase.find(".//property") == None: - mld_val = None - else: - mld_val = testcase.find(".//property").get( - "value" - ) # Currently MLD is the only set property. If more are added updates are needed here. - outfile.write(fulltestname + ";" + str(mld_val) + "\n") + + properties_found = { + p.get("name"): p.get("value") + for p in testcase.findall(".//property") + } + properties_values = [str(properties_found.get(p)) for p in PROPERTIES] + outline = ";".join([fulltestname] + properties_values) + "\n" + outfile.write(outline) diff --git a/tests/cmp_pcm.py b/tests/cmp_pcm.py index 45cdf5b832..c7df4b800d 100755 --- a/tests/cmp_pcm.py +++ b/tests/cmp_pcm.py @@ -61,16 +61,16 @@ def cmp_pcm(file1, file2, out_config, fs, get_mld=False, mld_lim=0) -> (int, str reason = f"Non-BE - MAXIMUM ABS DIFF: {cmp_result['max_abs_diff']}" output_differs = 1 - if get_mld: - mld_msg = f"MLD: {cmp_result['MLD']}" - reason += " - " + mld_msg - print(mld_msg) - - if cmp_result["MLD"] <= mld_lim: - output_differs = 0 - reason += f" <= {mld_lim}" - else: - reason += f" > {mld_lim}" + if get_mld: + mld_msg = f"MLD: {cmp_result['MLD']}" + reason += " - " + mld_msg + print(mld_msg) + + if cmp_result["MLD"] <= mld_lim: + output_differs = 0 + reason += f" <= {mld_lim}" + else: + reason += f" > {mld_lim}" return output_differs, reason -- GitLab From b5e6543964b161355da2115756a2b7409f98f88b Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Mon, 18 Mar 2024 16:12:29 +0100 Subject: [PATCH 542/601] switch output mode to BINAURAL --- scripts/config/self_test.prm | 8 ++++++-- scripts/config/self_test_ltv.prm | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 49f7c08c4f..783a69d42e 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1588,9 +1588,13 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_masa 4 2 NULL testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv1MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_1MASA2TC48c.wav bit ../IVAS_dec HOA3 48 bit testv/stvOMASA_4ISM_1MASA2TC48c.wav_HOA3_sw_48-48.tst -// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out (Model from file) +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out ../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_REVERB 48 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst +../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst + +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) +../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_sw_48-16.tst // OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out ../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 0692089692..741fce166c 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1588,9 +1588,13 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_masa 4 2 NULL testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit ../IVAS_dec HOA3 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_HOA3_sw_48-48.tst -// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out (Model from file) +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out ../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst +../IVAS_dec BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_ROOM_REVERB_sw_48-48.tst + +// OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 16kHz out, BINAURAL out (Model from file) +../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_384k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_sw_48-16.tst // OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out ../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv NULL testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit -- GitLab From 5078e01937c3a49bc2d5de22f6922b38f8aa2fe5 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 18 Mar 2024 16:18:07 +0100 Subject: [PATCH 543/601] add more -hrtf testcases with rate switching --- scripts/config/self_test.prm | 18 +++++++++++------- scripts/config/self_test_ltv.prm | 18 +++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 49f7c08c4f..cfb66a634b 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -517,10 +517,14 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_EXT.tst -// 4 ISm with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out +// 4 ISM with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48n.wav bit ../IVAS_dec HOA3 48 bit testv/stv4ISM48n.wav_brate_sw_48-48_DTX_hoa3.tst +// 4 ISM with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_ROOM_IR out (Model from file) +../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48n.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_IR 48 bit testv/stv4ISM48n.wav_brate_sw_48-48_DTX_hoa3.tst + // 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, HR, directivity configuration, random FER at 5% ../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error @@ -822,9 +826,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv3OA48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv3OA48c.wav_sw_48-48_STEREO.tst -// SBA 3OA bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out +// SBA 3OA bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) ../IVAS_cod -sba 3 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv3OA48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv3OA48c.wav_sw_48-48_BINAURAL.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3OA48c.wav_sw_48-48_BINAURAL.tst // SBA 3OA bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, FOA out ../IVAS_cod -sba 3 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv3OA48c.wav bit @@ -1326,9 +1330,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec STEREO 32 bit_error testv/stv714MC48c.wav_sw_48-32_stereo_FER5.tst -// Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out +// Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv714MC48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_sw_48-48_BINAURAL.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv51MC48c.wav_sw_48-48_BINAURAL.tst // Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out (Model from file) ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit @@ -1686,10 +1690,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 4 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 32 testv/stvOSBA_4ISM_3OA32c.wav bit ../IVAS_dec EXT 48 bit testv/stvOSBA_4ISM_3OA32c.wav_EXT_sw_13k2_512k_32-48.tst -// OSBA FOA 4ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 48kHz out, BINAURAL out, FER at 5%, bandwidth switching +// OSBA FOA 4ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 16kHz out, BINAURAL out (Model from file), FER at 5%, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_FB.txt -ism_sba 4 1 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_4ISM_FOA48c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error -../IVAS_dec BINAURAL 48 bit_error testv/stvOSBA_4ISM_FOA48c.wav_BINAURAL_sw_48-48_FER5.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit_error testv/stvOSBA_4ISM_FOA48c.wav_BINAURAL_sw_48-48_FER5.tst // OSBA 3ISM 2OA at bitrate switching 13.2 to 512 kbps, 48kHz in, 32kHz out, STEREO out, FER at 10% ../IVAS_cod -ism_sba 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_3ISM_2OA48c.wav bit diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 0692089692..a93e7c1dd7 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -517,10 +517,14 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_4ISM.wav bit ../IVAS_dec EXT 48 bit testv/ltv48_4ISM.wav_brate_sw_48-48_EXT.tst -// 4 ISm with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out +// 4 ISM with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out ../IVAS_cod -dtx -ism 4 testv/ltvISM1.csv NULL NULL testv/ltvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_4ISM.wav bit ../IVAS_dec HOA3 48 bit testv/ltv48_4ISM.wav_brate_sw_48-48_DTX_hoa3.tst +// 4 ISM with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_ROOM_IR out (Model from file) +../IVAS_cod -dtx -ism 4 testv/ltvISM1.csv NULL NULL testv/ltvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_4ISM.wav bit +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_IR 48 bit testv/ltv48_4ISM.wav_brate_sw_48-48_DTX_hoa3.tst + // 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, HR, directivity configuration, random FER at 5% ../IVAS_cod -ism +4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 256000 48 testv/ltv48_4ISM.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error @@ -822,9 +826,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_HOA3.wav bit ../IVAS_dec STEREO 48 bit testv/ltv48_HOA3.wav_sw_48-48_STEREO.tst -// SBA 3OA bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out +// SBA 3OA bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) ../IVAS_cod -sba 3 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_HOA3.wav bit -../IVAS_dec BINAURAL 48 bit testv/ltv48_HOA3.wav_sw_48-48_BINAURAL.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/ltv48_HOA3.wav_sw_48-48_BINAURAL.tst // SBA 3OA bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, FOA out ../IVAS_cod -sba 3 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_HOA3.wav bit @@ -1326,9 +1330,9 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error ../IVAS_dec STEREO 32 bit_error testv/ltv48_MC714.wav_sw_48-32_stereo_FER5.tst -// Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out +// Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/ltv48_MC714.wav bit -../IVAS_dec BINAURAL 48 bit testv/ltv48_MC51.wav_sw_48-48_BINAURAL.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/ltv48_MC51.wav_sw_48-48_BINAURAL.tst // Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out (Model from file) ../IVAS_cod -mc 5_1_4 512000 48 testv/ltv48_MC514.wav bit @@ -1686,10 +1690,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 4 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 32 testv/ltv32_OSBA_4ISM_HOA3.wav bit ../IVAS_dec EXT 48 bit testv/ltv32_OSBA_4ISM_HOA3.wav_EXT_sw_13k2_512k_32-32.tst -// OSBA FOA 4ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 48kHz out, BINAURAL out, FER at 5%, bandwidth switching +// OSBA FOA 4ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 16kHz out, BINAURAL out (Model from file), FER at 5%, bandwidth switching ../IVAS_cod -max_band testv/ivas_bws_20fr_start_WB.txt -ism_sba 4 1 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_OSBA_4ISM_FOA.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error -../IVAS_dec BINAURAL 48 bit_error testv/ltv48_OSBA_4ISM_FOA.wav_BINAURAL_sw_48-48_FER5.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit_error testv/ltv48_OSBA_4ISM_FOA.wav_BINAURAL_sw_48-48_FER5.tst // OSBA 3ISM 2OA at bitrate switching 13.2 to 512 kbps, 48kHz in, 32kHz out, STEREO out, FER at 10% // ../IVAS_cod -ism_sba 3 2 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_OSBA_3ISM_2OA.wav bit -- GitLab From baeef46b4b50947441001f6b5997c9ce01686c9a Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 18 Mar 2024 16:44:03 +0100 Subject: [PATCH 544/601] add cmdl arg for tolerance to have better error reporting --- .gitlab-ci.yml | 18 ++++-------------- tests/cmp_pcm.py | 4 +++- .../test_masa_enc_dec.py | 3 +++ .../test_param_file.py | 2 ++ .../test_sba_bs_dec_plc.py | 4 ++++ .../test_sba_bs_enc.py | 12 ++++++++++++ tests/conftest.py | 19 ++++++++++++++++++- 7 files changed, 46 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4c2b943464..b9cff4b364 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -206,26 +206,16 @@ stages: - exit_code20=0 - exit_code10=0 - exit_code5=0 - - errors20=0 - - errors10=0 - - errors5=0 - if [ $CLANG_NUM -eq 1 ]; then sanitizer_type="MemorySanitizer"; elif [ $CLANG_NUM -eq 2 ]; then sanitizer_type="AddressSanitizer"; elif [ $CLANG_NUM -eq 3 ]; then sanitizer_type="UndefinedBehaviorSanitizer"; else echo "Wrong CLANG_NUM $CLANG_NUM given!"; exit 1; fi # ignore exit codes, instead search in the report for errors - python3 -m pytest $SELF_TEST_PRM_FILE -v --update_ref 1 -m create_ref --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code20=$? - - errors20=$(cat report-20ms.html | grep -c "$sanitizer_type") || true + # run with high enough tolerance to have no failures due to non-BE -> the only detected failures will be crashes from the sanitizers + - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only --abs_tol 100000 || exit_code5=$? + - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only --abs_tol 100000 || exit_code10=$? - - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? - - errors10=$(cat report-10ms.html | grep -c "$sanitizer_type") || true - - - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? - - errors5=$(cat report-5ms.html | grep -c "sanitizer_type") || true - - - if [ $errors20 -ne 0 ]; then echo "CLANG $sanitizer_type found errors in 20ms framesize decoding"; fi - - if [ $errors10 -ne 0 ]; then echo "CLANG $sanitizer_type found errors in 10ms framesize decoding"; fi - - if [ $errors5 -ne 0 ]; then echo "CLANG $sanitizer_type found errors in 5ms framesize decoding"; fi - - if [ $errors20 -ne 0 ] || [ $errors10 -ne 0 ] || [ $errors5 -ne 0 ]; then exit 1; fi + - if [ $exit_code20 -ne 0 ] || [ $exit_code10 -ne 0 ] || [ $exit_code5 -ne 0 ]; then exit 1; fi # --------------------------------------------------------------- diff --git a/tests/cmp_pcm.py b/tests/cmp_pcm.py index 13a1c1ba5a..649eb66c54 100755 --- a/tests/cmp_pcm.py +++ b/tests/cmp_pcm.py @@ -12,7 +12,7 @@ import pyaudio3dtools import pyivastest -def cmp_pcm(file1, file2, out_config, fs, get_mld=False, mld_lim=0) -> (int, str): +def cmp_pcm(file1, file2, out_config, fs, get_mld=False, mld_lim=0, abs_tol=0) -> (int, str): """ Compare 2 PCM files for bitexactness """ @@ -51,6 +51,8 @@ def cmp_pcm(file1, file2, out_config, fs, get_mld=False, mld_lim=0) -> (int, str if cmp_result["bitexact"]: return 0, "SUCCESS: Files are bitexact" + elif cmp_result["max_abs_diff"] <= abs_tol: + return 0, "SUCCESS: Maximum absolute diff below threshold" else: diff_msg = f"MAXIMUM ABS DIFF ==> {cmp_result['max_abs_diff']} at sample num {cmp_result['max_abs_diff_pos_sample']} (assuming {nchannels} channels)" first_msg = f"First diff found at sample num {cmp_result['first_diff_pos_sample']} in channel {cmp_result['first_diff_pos_channel']}, frame {cmp_result['first_diff_pos_frame']} (assuming {nchannels} channels, {fs} sampling rate)" diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index 75b01db382..541aec589c 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -110,6 +110,7 @@ def test_masa_enc_dec( get_mld, get_mld_lim, decoder_only, + abs_tol, ): # Input parameters in_fs = 48 @@ -214,6 +215,7 @@ def test_masa_enc_dec( int(out_fs * 1000), get_mld=get_mld, mld_lim=get_mld_lim, + abs_tol=abs_tol, ) if get_mld: mld = 0 @@ -246,6 +248,7 @@ def test_masa_enc_dec( int(out_fs * 1000), get_mld=get_mld, mld_lim=get_mld_lim, + abs_tol=abs_tol, ) if get_mld: mld = 0 diff --git a/tests/codec_be_on_mr_nonselection/test_param_file.py b/tests/codec_be_on_mr_nonselection/test_param_file.py index 459964a186..ab78a1120d 100644 --- a/tests/codec_be_on_mr_nonselection/test_param_file.py +++ b/tests/codec_be_on_mr_nonselection/test_param_file.py @@ -141,6 +141,7 @@ def test_param_file_tests( test_tag, get_mld, get_mld_lim, + abs_tol, ): enc_opts, dec_opts, sim_opts, eid_opts = param_file_test_dict[test_tag] @@ -338,6 +339,7 @@ def test_param_file_tests( fs, get_mld=get_mld, mld_lim=get_mld_lim, + abs_tol=abs_tol, ) md_out_files = get_expected_md_files(ref_output_file, enc_split, output_config) diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py index 11a8aeca04..eb6a45b2ec 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_dec_plc.py @@ -90,6 +90,7 @@ def test_sba_plc_system( gain_flag, get_mld, get_mld_lim, + abs_tol, ): SID = 0 if dtx == "1" and ivas_br not in ["13200", "16400", "24400", "32000", "64000"]: @@ -128,6 +129,7 @@ def test_sba_plc_system( keep_files, get_mld=get_mld, get_mld_lim=get_mld_lim, + abs_tol=abs_tol, ) @@ -151,6 +153,7 @@ def sba_dec_plc( keep_files, get_mld=False, get_mld_lim=0, + abs_tol=0, ): # ------------ run cmd ------------ @@ -207,6 +210,7 @@ def sba_dec_plc( fs, get_mld=get_mld, mld_lim=get_mld_lim, + abs_tol=abs_tol, ) if get_mld: mld = 0 diff --git a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py index 4f4c1a3271..03cb9d29de 100644 --- a/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py +++ b/tests/codec_be_on_mr_nonselection/test_sba_bs_enc.py @@ -105,6 +105,7 @@ def test_pca_enc( get_mld, get_mld_lim, decoder_only, + abs_tol, ): pca = True tag = tag + fs + "c" @@ -159,6 +160,7 @@ def test_pca_enc( get_mld=get_mld, get_mld_lim=get_mld_lim, pca=pca, + abs_tol=abs_tol, ) @@ -190,6 +192,7 @@ def test_sba_enc_system( get_mld, get_mld_lim, decoder_only, + abs_tol, ): if dtx == "1" and ivas_br not in ["13200", "16400", "24400", "32000", "64000"]: # skip high bitrates for DTX until DTX issue is resolved @@ -264,6 +267,7 @@ def test_sba_enc_system( decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, + abs_tol=abs_tol, ) @@ -286,6 +290,7 @@ def test_spar_hoa2_enc_system( get_mld, get_mld_lim, decoder_only, + abs_tol, ): fs = "48" dtx = "0" @@ -337,6 +342,7 @@ def test_spar_hoa2_enc_system( decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, + abs_tol=abs_tol, ) @@ -359,6 +365,7 @@ def test_spar_hoa3_enc_system( get_mld, get_mld_lim, decoder_only, + abs_tol, ): fs = "48" dtx = "0" @@ -410,6 +417,7 @@ def test_spar_hoa3_enc_system( decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, + abs_tol=abs_tol, ) @@ -436,6 +444,7 @@ def test_sba_enc_BWforce_system( get_mld, get_mld_lim, decoder_only, + abs_tol, ): if dtx == "1" and ivas_br not in ["32000", "64000"]: # skip high bitrates for DTX until DTX issue is resolved @@ -493,6 +502,7 @@ def test_sba_enc_BWforce_system( decoder_only, get_mld=get_mld, get_mld_lim=get_mld_lim, + abs_tol=abs_tol, ) @@ -662,6 +672,7 @@ def sba_dec( get_mld=False, get_mld_lim=0, pca=False, + abs_tol=0, ): # -------- run cmd ------------ # sampling rate to BW mapping @@ -725,6 +736,7 @@ def sba_dec( fs, get_mld=get_mld, mld_lim=get_mld_lim, + abs_tol=abs_tol, ) if get_mld: mld = 0 diff --git a/tests/conftest.py b/tests/conftest.py index 37b5281403..c7b053dcb3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -198,6 +198,13 @@ def pytest_addoption(parser): default=False, ) + parser.addoption( + "--abs_tol", + help="Tolerance for absolute difference in PCM output. Differences below this threshold are ignored when deciding about PASS or FAIL.", + type=int, + default=0, + ) + @pytest.fixture(scope="session", autouse=True) def update_ref(request): @@ -235,6 +242,14 @@ def get_mld_lim(request): return float(request.config.getoption("--mld-lim")) +@pytest.fixture(scope="session") +def abs_tol(request) -> int: + """ + Return tolerance value for absolute diff in PCM output. + """ + return request.config.option.abs_tol + + @pytest.fixture(scope="session") def keep_files(request) -> bool: """ @@ -332,7 +347,9 @@ class EncoderFrontend: log_dbg_msg(f"{self._type} encoder command:\n{cmd_str}") try: - result = run(command, capture_output=True, check=False, timeout=self.timeout) + result = run( + command, capture_output=True, check=False, timeout=self.timeout + ) except TimeoutExpired: pytest.fail(f"{self._type} encoder run timed out after {self.timeout}s.") -- GitLab From 2dcaa4c81b518d14ab266a73a384186a495c3689 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 19 Mar 2024 13:12:18 +1100 Subject: [PATCH 545/601] headtracking fix in SBA part of OSBA --- lib_com/options.h | 1 + lib_dec/ivas_binRenderer_internal.c | 4 ++++ scripts/config/self_test.prm | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 52357d6c25..2d65b5b937 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,6 +158,7 @@ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ +#define FIX_1035_HT_OSBA /* Dlb: issue 1035: Issue with headtracking in OSBA*/ /* #################### End BE switches ################################## */ /* #################### Start NON-BE switches ############################ */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 75a8247cc1..a624e81eee 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1122,7 +1122,11 @@ ivas_error ivas_binRenderer_open( /* Define of head rotation has to be done in binRendeder in CLDFB*/ hBinRenderer->rotInCldfb = 0; +#ifdef FIX_1035_HT_OSBA + if ( st_ivas->ivas_format == MC_FORMAT || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) +#else if ( st_ivas->ivas_format == MC_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) +#endif { hBinRenderer->rotInCldfb = 1; } diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index a9bb024f30..6a5243e44c 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1670,6 +1670,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 4 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_4ISM_3OA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvOSBA_4ISM_3OA48c.wav_BINAURAL_sw_13k2_512k_48-48.tst +// OSBA 3OA 4ISM bitrate switching 16.4 to 512, 48kHz in, 48kHz out, BINAURAL out, headtracking +../IVAS_cod -ism_sba 4 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_16k4_512k_50fr.bin 48 testv/stvOSBA_4ISM_3OA48c.wav bit +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stvOSBA_4ISM_3OA48c.wav_BINAURAL_sw_16k4_512k_48-48.tst + // OSBA 3OA 2ISM at 256 kbps, 32kHz in, 32kHz out, HOA3 out ../IVAS_cod -ism_sba 2 3 testv/stvISM1.csv testv/stvISM2.csv 256000 32 testv/stvOSBA_2ISM_3OA32c.wav bit ../IVAS_dec HOA3 32 bit testv/stvOSBA_2ISM_3OA32c.wav_HOA3_256000_32-32.tst -- GitLab From 568ae2397ca0d83ba54fdf6b1c1bf8ae94521f05 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 19 Mar 2024 18:10:29 +1100 Subject: [PATCH 546/601] add OSBA headtracking test case in LTV config prm --- scripts/config/self_test_ltv.prm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 5080418476..8bd327fd8b 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1670,6 +1670,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -ism_sba 4 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_OSBA_4ISM_HOA3.wav bit ../IVAS_dec BINAURAL 48 bit testv/ltv48_OSBA_4ISM_HOA3.wav_BINAURAL_sw_13k2_512k_48-48.tst +// OSBA 3OA 4ISM bitrate switching 16.4 to 512, 48kHz in, 48kHz out, BINAURAL out, headtracking +../IVAS_cod -ism_sba 4 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv ../scripts/switchPaths/sw_16k4_512k_50fr.bin 48 testv/ltv48_OSBA_4ISM_HOA3.wav bit +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/ltvOSBA_4ISM_3OA48c.wav_BINAURAL_sw_16k4_512k_48-48.tst + // OSBA 3OA 2ISM at 256 kbps, 32kHz in, 32kHz out, HOA3 out ../IVAS_cod -ism_sba 2 3 testv/ltvISM1.csv testv/ltvISM2.csv 256000 32 testv/ltv32_OSBA_2ISM_HOA3.wav bit ../IVAS_dec HOA3 32 bit testv/ltv32_OSBA_2ISM_HOA3.wav_HOA3_256000_32-32.tst -- GitLab From b8b8ce08f4b8bd450852e1be2b034d1a1c44f9a8 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 19 Mar 2024 08:23:37 +0100 Subject: [PATCH 547/601] revert unintended MSVC project changes --- Workspace_msvc/encoder.vcxproj | 180 +++++++ Workspace_msvc/lib_debug.vcxproj | 123 +++++ Workspace_msvc/lib_dec.vcxproj.filters | 572 ++++++++++++++++++++++ Workspace_msvc/lib_enc.vcxproj.filters | 629 +++++++++++++++++++++++++ Workspace_msvc/lib_lc3plus.vcxproj | 185 ++++++++ 5 files changed, 1689 insertions(+) create mode 100644 Workspace_msvc/encoder.vcxproj create mode 100644 Workspace_msvc/lib_debug.vcxproj create mode 100644 Workspace_msvc/lib_dec.vcxproj.filters create mode 100644 Workspace_msvc/lib_enc.vcxproj.filters create mode 100644 Workspace_msvc/lib_lc3plus.vcxproj diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj new file mode 100644 index 0000000000..309dc15253 --- /dev/null +++ b/Workspace_msvc/encoder.vcxproj @@ -0,0 +1,180 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + false + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + false + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj new file mode 100644 index 0000000000..5e986bb167 --- /dev/null +++ b/Workspace_msvc/lib_debug.vcxproj @@ -0,0 +1,123 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + false + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + false + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters new file mode 100644 index 0000000000..8eddbb60a0 --- /dev/null +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -0,0 +1,572 @@ + + + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_evs_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + decoder_h + + + + + + {f63b6db2-97ec-4d8d-be9c-e798ac8bb645} + + + {0853864e-7de7-411d-975b-5045652f22c3} + + + {e29aae34-aeeb-45dd-a986-61b39890c5bb} + + + {c33b80b3-67ce-466b-91c0-4adfc9efcb5c} + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj.filters b/Workspace_msvc/lib_enc.vcxproj.filters new file mode 100644 index 0000000000..e74f441c4c --- /dev/null +++ b/Workspace_msvc/lib_enc.vcxproj.filters @@ -0,0 +1,629 @@ + + + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_evs_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_all_c + + + enc_evs_c + + + enc_evs_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_all_c + + + enc_evs_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + enc_ivas_c + + + + + enc_h + + + enc_h + + + enc_h + + + enc_h + + + + + + {b7ee0526-8b79-4554-a3ec-04e51d38475f} + + + {dabed049-70a2-48f2-9da6-3b81a3664033} + + + {5717f1cb-c593-400b-b23a-45c422fd95c8} + + + {6cccabbe-510f-43d3-90e1-8ed5ea3837d7} + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_lc3plus.vcxproj b/Workspace_msvc/lib_lc3plus.vcxproj new file mode 100644 index 0000000000..a2e45cb609 --- /dev/null +++ b/Workspace_msvc/lib_lc3plus.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {95030B82-70CD-4C6B-84D4-61096035BEA2} + Win32Proj + LC3_FL + 10.0.17763.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + liblc3plus + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + + + LC3plus + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\Obj\ + + + + + + Level3 + ..\lib_com;%(AdditionalIncludeDirectories) + Disabled + MultiThreadedDebug + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + 4305;4244;4996 + OldStyle + false + false + + + Console + true + + + + + Level3 + + + ..\lib_com;%(AdditionalIncludeDirectories) + MaxSpeed + MultiThreaded + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + 4244;4305;4996 + false + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- GitLab From 9415752b93ca7ba1fd8bfe6d16e0dfedb19ad925 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 19 Mar 2024 08:25:06 +0100 Subject: [PATCH 548/601] revert unintended MSVC project changes --- Workspace_msvc/lib_rend.vcxproj.filters | 221 ++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 Workspace_msvc/lib_rend.vcxproj.filters diff --git a/Workspace_msvc/lib_rend.vcxproj.filters b/Workspace_msvc/lib_rend.vcxproj.filters new file mode 100644 index 0000000000..942c63712f --- /dev/null +++ b/Workspace_msvc/lib_rend.vcxproj.filters @@ -0,0 +1,221 @@ + + + + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + + + {54449ece-ef29-44b5-9512-ed8f555851a8} + + + {672b0eb6-cce8-425c-8bf2-aba4b45639bb} + + + \ No newline at end of file -- GitLab From 1aa82df0d607aeeda6d503c664eddcb1a06f2cf6 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Tue, 19 Mar 2024 08:50:08 +0100 Subject: [PATCH 549/601] add more variants of log2() and round() --- lib_debug/wmc_auto.h | 3 +++ scripts/tools/Linux/wmc_tool | Bin 277832 -> 277832 bytes scripts/tools/Win32/wmc_tool.exe | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib_debug/wmc_auto.h b/lib_debug/wmc_auto.h index 41e09b89a0..3dae42b661 100644 --- a/lib_debug/wmc_auto.h +++ b/lib_debug/wmc_auto.h @@ -745,9 +745,12 @@ static int wmc_flag_ = 0; #define inv_sqrtf_( x ) OP_COUNT_WRAPPER1_( SQRT_( 1 ), inv_sqrtf( ( x ) ) ) #define log_base_2_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log_base_2( ( x ) ) ) #define log2_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log2( ( x ) ) ) +#define log2f_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log2f( ( x ) ) ) #define log2_f_( x ) OP_COUNT_WRAPPER1_( ( LOG_( 1 ), MULT_( 1 ) ), log2_f( ( x ) ) ) #define _round_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, _round( ( x ) ) ) +#define round_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, round( ( x ) ) ) #define round_f_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, round_f( ( x ) ) ) +#define roundf_( x ) OP_COUNT_WRAPPER1_( wmc_flag_ = wmc_flag_, roundf( ( x ) ) ) #define set_min_( a, b ) OP_COUNT_WRAPPER3_( ( ADD_( 1 ), BRANCH_( 1 ), MOVE_( 1 ) ), set_min( ( a ), ( b ) ) ) #define set_max_( a, b ) OP_COUNT_WRAPPER3_( ( ADD_( 1 ), BRANCH_( 1 ), MOVE_( 1 ) ), set_max( ( a ), ( b ) ) ) diff --git a/scripts/tools/Linux/wmc_tool b/scripts/tools/Linux/wmc_tool index 10c8a7f863d1a2648e122fcc1d72bb86a2766edd..e83bbf4a4bb3ab96f9485348c05773cab643eb65 100755 GIT binary patch delta 8806 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 BEZYD8 delta 8733 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 diff --git a/scripts/tools/Win32/wmc_tool.exe b/scripts/tools/Win32/wmc_tool.exe index b2e2df6c80..9bd753be8e 100755 --- a/scripts/tools/Win32/wmc_tool.exe +++ b/scripts/tools/Win32/wmc_tool.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:02ec1d6fa014a6bb37f45281b9e83b445812f669623b99c8c90ad320535d383c -size 381952 +oid sha256:16feb2cb03093736e9ecb01d475b69659138362d26c9a695fb9a436a78b11fad +size 242688 -- GitLab From 0eb86c5b13793f6e6008c4af947bbf8b1d5e1fd7 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 19 Mar 2024 11:58:45 +0200 Subject: [PATCH 550/601] Update wmc_tool for MacOS --- scripts/tools/Darwin/wmc_tool | Bin 654432 -> 674256 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scripts/tools/Darwin/wmc_tool b/scripts/tools/Darwin/wmc_tool index a9b10dcfb2d32c87dd9c7cc40884ae675f3e4fa0..9b92361236f4dffa1eead2ec4364ea01145c74f9 100755 GIT binary patch literal 674256 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∨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≪ngri)O8@E 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 SjE2By2#kinXb23A5C8y9$}}AS delta 199523 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 J-U1dT4*)}WdLjS- -- GitLab From efc94d9c232e8fabb696012400181c662890014a Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 19 Mar 2024 12:33:23 +0100 Subject: [PATCH 551/601] add/modify swome comments --- .gitlab-ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b9cff4b364..f6648a5274 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -209,9 +209,11 @@ stages: - if [ $CLANG_NUM -eq 1 ]; then sanitizer_type="MemorySanitizer"; elif [ $CLANG_NUM -eq 2 ]; then sanitizer_type="AddressSanitizer"; elif [ $CLANG_NUM -eq 3 ]; then sanitizer_type="UndefinedBehaviorSanitizer"; else echo "Wrong CLANG_NUM $CLANG_NUM given!"; exit 1; fi - # ignore exit codes, instead search in the report for errors + # run encoder and decoder with 20ms renderer framesize first, use reference creation mode - python3 -m pytest $SELF_TEST_PRM_FILE -v --update_ref 1 -m create_ref --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code20=$? - # run with high enough tolerance to have no failures due to non-BE -> the only detected failures will be crashes from the sanitizers + # for 10ms and 5ms renderer framesize, we only need to run the decoder part as renderer framesize is a decoder-only option + # set tolerance very high do ignore any BE differences due to the different renderer framesizes, those can appear due to the limiter being active + # we are only interested in runtime errors from the sanitizers and ignore the diffs - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only --abs_tol 100000 || exit_code5=$? - python3 -m pytest $SELF_TEST_PRM_FILE -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only --abs_tol 100000 || exit_code10=$? -- GitLab From aaf0aa591edc7d6b48af83590cf924f3126cbbf6 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 19 Mar 2024 15:44:57 +0100 Subject: [PATCH 552/601] Remove obsolete parse_mld.py and add sorting of results in parse_mld_xml.py --- scripts/parse_mld.py | 32 ---------------------------- scripts/parse_mld_xml.py | 46 +++++++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 52 deletions(-) delete mode 100644 scripts/parse_mld.py diff --git a/scripts/parse_mld.py b/scripts/parse_mld.py deleted file mode 100644 index b999e83903..0000000000 --- a/scripts/parse_mld.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python3 - -import argparse -import re - -# Main routine -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Parse HTML report to extract MLD values" - ) - parser.add_argument( - "html_report", type=str, help="HTML report input file, e.g. report.html" - ) - parser.add_argument("csv_file", type=str, help="Output CSV file, e.g. output.csv") - args = parser.parse_args() - html_report = args.html_report - csv_file = args.csv_file - - mld = {} - - with open(html_report, "r") as infile: - for line in infile.readlines(): - if "col-name" in line: - test_name = re.search("\[(.*)\]", line).group(1) - mld[test_name] = 0.0 - if "MLD" in line: - mld_val = float(line.split()[1]) - mld[test_name] = mld_val - - with open(csv_file, "w") as outfile: - for test_name in mld: - outfile.write(test_name + ";" + str(mld[test_name]) + "\n") diff --git a/scripts/parse_mld_xml.py b/scripts/parse_mld_xml.py index 088789903d..84acf4fbba 100644 --- a/scripts/parse_mld_xml.py +++ b/scripts/parse_mld_xml.py @@ -4,7 +4,7 @@ import argparse from xml.etree import ElementTree """ -Parse a junit report and create a MLD summary report. +Parse a junit report and create an MLD summary report. """ PROPERTIES = ["MLD", "MAXIMUM ABS DIFF"] @@ -33,26 +33,32 @@ if __name__ == "__main__": ) testcases = tree.findall(".//testcase") + + results_unsorted = {} + + for testcase in testcases: + if testcase.find(".//skipped") is None: + if testcase.get("file") is None: + fulltestname = ( + testcase.get("classname").replace(".", "/") + + ".py::" + + testcase.get("name") + ) + else: + fulltestname = testcase.get("file") + "::" + testcase.get("name") + + properties_found = { + p.get("name"): p.get("value") + for p in testcase.findall(".//property") + } + properties_values = [str(properties_found.get(p)) for p in PROPERTIES] + outline = ";".join([fulltestname] + properties_values) + "\n" + results_unsorted[fulltestname] = outline + + results_sorted = dict(sorted(results_unsorted.items())) with open(csv_file, "w") as outfile: headerline = ";".join(["testcase"] + PROPERTIES) + "\n" outfile.write(headerline) - - for testcase in testcases: - if testcase.find(".//skipped") is None: - if testcase.get("file") is None: - fulltestname = ( - testcase.get("classname").replace(".", "/") - + ".py::" - + testcase.get("name") - ) - else: - fulltestname = testcase.get("file") + "::" + testcase.get("name") - - properties_found = { - p.get("name"): p.get("value") - for p in testcase.findall(".//property") - } - properties_values = [str(properties_found.get(p)) for p in PROPERTIES] - outline = ";".join([fulltestname] + properties_values) + "\n" - outfile.write(outline) + for test in results_sorted: + outfile.write(results_sorted[test]) -- GitLab From 20126ad69166eb3a10bf686b45c4b7fc2bee73bc Mon Sep 17 00:00:00 2001 From: norvell Date: Wed, 20 Mar 2024 07:48:03 +0000 Subject: [PATCH 553/601] Fix typo: replace pcmcmp_res with filecmp_res in BINAURAL output --- tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index 9dc8ce9e6d..b2b7bd60bc 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -259,7 +259,7 @@ def test_masa_enc_dec( record_property("MLD", mld) max_diff = 0 - if pcmcmp_res: + if filecmp_res: search_result = re.search(MAX_DIFF_PATTERN, reason) max_diff = search_result.groups(1)[0] record_property("MAXIMUM ABS DIFF", max_diff) -- GitLab From c7355367a801db779aabd9342060b17e1897191d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 20 Mar 2024 09:14:17 +0100 Subject: [PATCH 554/601] [cleanup] accept FIX_1027_GSC_INT_OVERFLOW --- lib_com/options.h | 1 - lib_dec/gs_dec.c | 4 ---- lib_enc/gs_enc.c | 4 ---- 3 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7b6179c5c6..e0c9fae45c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ #define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ #define FIX_1023_REMOVE_PARAMMC_DEC /* VA: issue 1023: remove unused function ivas_param_mc_dec() */ #define FIX_1022_REMOVE_PARAMISM_DEC /* VA: issue 1022: remove unused function ivas_param_ism_dec() */ diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c index 7319a55615..5debe3c562 100644 --- a/lib_dec/gs_dec.c +++ b/lib_dec/gs_dec.c @@ -643,11 +643,7 @@ void gsc_dec( } if ( concat_out[j] < 0 ) { -#ifdef FIX_1027_GSC_INT_OVERFLOW seed_init = (int16_t) ( (int32_t) seed_init + 3 ); -#else - seed_init += 3; -#endif } } diff --git a/lib_enc/gs_enc.c b/lib_enc/gs_enc.c index 3ec78d8f11..ca0abee085 100644 --- a/lib_enc/gs_enc.c +++ b/lib_enc/gs_enc.c @@ -545,11 +545,7 @@ void gsc_enc( } if ( concat_out[j] < 0 ) { -#ifdef FIX_1027_GSC_INT_OVERFLOW seed_init = (int16_t) ( (int32_t) seed_init + 3 ); -#else - seed_init += 3; -#endif } } -- GitLab From d6cd1f230eac2ba25d38cf3ed40625fc01d66e06 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Wed, 20 Mar 2024 13:31:40 +0100 Subject: [PATCH 555/601] fix incorrect des-instrumentation of one-line functions --- scripts/tools/Linux/wmc_tool | Bin 277832 -> 277832 bytes scripts/tools/Win32/wmc_tool.exe | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/tools/Linux/wmc_tool b/scripts/tools/Linux/wmc_tool index e83bbf4a4bb3ab96f9485348c05773cab643eb65..c8481e76dd25e4abce309a1c089d938a119a724f 100755 GIT binary patch delta 18689 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 dx}p_}xuC>tNPdCQU#CC($}GIS#){<(695tz4{ delta 18905 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 Date: Wed, 20 Mar 2024 15:42:40 +0100 Subject: [PATCH 556/601] Add ivas-conformance-linux job --- .gitlab-ci.yml | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f6648a5274..3bf9d3e404 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,6 +21,7 @@ variables: - 'test-be-release' - 'test-long-self-test' - 'ivas-conformance' + - 'ivas-conformance-linux' GIT_CLEAN_FLAGS: -ffdxq TESTCASE_TIMEOUT_STV_SANITIZERS: 180 TESTCASE_TIMEOUT_LTV_SANITIZERS: 1200 @@ -58,6 +59,10 @@ workflow: variables: IVAS_PIPELINE_NAME: 'Draft IVAS Conformance test: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'trigger' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'ivas-conformance-linux' + variables: + IVAS_PIPELINE_NAME: 'Draft IVAS Conformance test -- Linux: $CI_COMMIT_BRANCH' + stages: - .pre @@ -243,6 +248,8 @@ stages: when: never - if: $MANUAL_PIPELINE_TYPE == 'ivas-conformance' when: never + - if: $MANUAL_PIPELINE_TYPE == 'ivas-conformance-linux' + when: never - when: on_success .rules-merge-request: @@ -1401,6 +1408,87 @@ ivas-conformance: reports: junit: report-junit.xml +ivas-conformance-linux: + tags: + - ivas-linux + stage: test + timeout: "60 minutes" + rules: + - if: ($CI_PIPELINE_SOURCE == 'web' || $CI_PIPELINE_SOURCE == 'trigger') && $MANUAL_PIPELINE_TYPE == 'ivas-conformance-linux' + allow_failure: + exit_codes: + - 123 + script: + - *print-common-info + # Prepare reference exec, use tests and scripts from reference + - $source_branch_commit_sha = $(git rev-parse HEAD) + - git checkout main # This should be set to a relevant reference + - python3 .\scripts\strip_split_rendering.py + + - make -j + - cp IVAS_cod IVAS_cod_ref + - cp IVAS_dec IVAS_dec_ref + - cp IVAS_rend IVAS_rend_ref + - git restore . + - git checkout $source_branch_commit_sha + + # Reference creation + - python3 tests/create_short_testvectors.py + - python3 scripts/prepare_combined_format_inputs.py + - python3 -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref --keep_files + - python3 -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref_part2 --keep_files + - python3 -m pytest tests/renderer/test_renderer.py --create_ref --keep_files + + # Output creation + - python3 -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --html=report_cmd.html --self-contained-html + - python3 scripts/parse_commands.py report_cmd.html Readme_IVAS.txt + + # Copy input data and output ref data + - rm -rf testvec + - mkdir testvec + - mkdir testvec/binauralRenderer_interface + - mkdir testvec/testv + - mkdir testvec/testv/renderer + - mkdir testvec/bin + - cp -r scripts/testv/* testvec/testv + - cp -r scripts/ls_layouts testvec + - cp -r scripts/switchPaths testvec + - cp -r scripts/trajectories testvec + - cp -r scripts/binauralRenderer_interface/binaural_renderers_hrtf_data testvec/binauralRenderer_interface + - cp -r tests/ref testvec/testv/ref + - cp -r tests/dut/* testvec/testv/ref + - cp -r tests/renderer/cut testvec/testv/renderer/ref + - cp -r tests/conformance-test testvec/ + - cp Readme_IVAS_dec.txt testvec + - cp Readme_IVAS_enc.txt testvec + - cp Readme_IVAS_rend.txt testvec + - cp Readme_IVAS_JBM_dec.txt testvec + - cp IVAS_cod.exe testvec/bin + - cp IVAS_dec.exe testvec/bin + - cp IVAS_rend.exe testvec/bin + + # Test run generated scripts in testvec + - cd testvec + - python3 -m pytest conformance-test/test_26252.py --junit-xml=report-junit.xml --html=report.html --self-contained-html + - mv report.html .. + - mv report-junit.xml .. + + artifacts: + name: "ivas-conformance-linux-$CI_COMMIT_SHORT_SHA" + expire_in: 1 week + when: always + paths: + - report-junit.xml + - report.html + - Readme_IVAS_dec.txt + - Readme_IVAS_enc.txt + - Readme_IVAS_rend.txt + - Readme_IVAS_JBM_dec.txt + expose_as: "Draft IVAS conformance -- Linux" + reports: + junit: report-junit.xml + + test-long-self-test: tags: - ivas-linux-fast -- GitLab From 82a6e4ea2fe8c66d6cc06c10414baeae22eb865f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 20 Mar 2024 15:46:14 +0100 Subject: [PATCH 557/601] Fix in ivas-conformance-linux job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3bf9d3e404..076daa0f47 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1421,7 +1421,7 @@ ivas-conformance-linux: script: - *print-common-info # Prepare reference exec, use tests and scripts from reference - - $source_branch_commit_sha = $(git rev-parse HEAD) + - source_branch_commit_sha=$(git rev-parse HEAD) - git checkout main # This should be set to a relevant reference - python3 .\scripts\strip_split_rendering.py -- GitLab From 28bd62601d0809562c05dff056b23d7aeda1d433 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 20 Mar 2024 15:48:43 +0100 Subject: [PATCH 558/601] Fix in ivas-conformance-linux job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 076daa0f47..cf61d317d9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1423,7 +1423,7 @@ ivas-conformance-linux: # Prepare reference exec, use tests and scripts from reference - source_branch_commit_sha=$(git rev-parse HEAD) - git checkout main # This should be set to a relevant reference - - python3 .\scripts\strip_split_rendering.py + - python3 ./scripts/strip_split_rendering.py - make -j - cp IVAS_cod IVAS_cod_ref -- GitLab From 0fe6cda11867594b57a5acad4b9d690f5e52d50b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 20 Mar 2024 15:53:16 +0100 Subject: [PATCH 559/601] Fix in ivas-conformance-linux job 3 --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cf61d317d9..43c4bb8afd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1423,7 +1423,6 @@ ivas-conformance-linux: # Prepare reference exec, use tests and scripts from reference - source_branch_commit_sha=$(git rev-parse HEAD) - git checkout main # This should be set to a relevant reference - - python3 ./scripts/strip_split_rendering.py - make -j - cp IVAS_cod IVAS_cod_ref -- GitLab From c3a07c598b9e14a6a4385e2b37571320e07cbe15 Mon Sep 17 00:00:00 2001 From: norvell Date: Wed, 20 Mar 2024 15:18:34 +0000 Subject: [PATCH 560/601] Fix in ivas-conformance-linux --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 43c4bb8afd..8445f3ab2b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1462,9 +1462,9 @@ ivas-conformance-linux: - cp Readme_IVAS_enc.txt testvec - cp Readme_IVAS_rend.txt testvec - cp Readme_IVAS_JBM_dec.txt testvec - - cp IVAS_cod.exe testvec/bin - - cp IVAS_dec.exe testvec/bin - - cp IVAS_rend.exe testvec/bin + - cp IVAS_cod testvec/bin + - cp IVAS_dec testvec/bin + - cp IVAS_rend testvec/bin # Test run generated scripts in testvec - cd testvec -- GitLab From 7d1a62bcc6562230dcebe8bf4d75bf2ec956bb13 Mon Sep 17 00:00:00 2001 From: norvell Date: Wed, 20 Mar 2024 15:46:00 +0000 Subject: [PATCH 561/601] Use Ericsson windows runner for ivas-conformance for testing --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8445f3ab2b..d997a68996 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1331,7 +1331,7 @@ test-be-to-release: ivas-conformance: tags: - - ivas-windows + - ericsson-windows-runner stage: test timeout: "60 minutes" rules: -- GitLab From c374fbdf16f5655449e09facf0fdfceb54d07c2b Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Wed, 20 Mar 2024 17:04:31 +0100 Subject: [PATCH 562/601] fix the limitation of max string literals to 65535 with MSVC 2017 and older versions --- scripts/tools/Linux/wmc_tool | Bin 277832 -> 363992 bytes scripts/tools/Win32/wmc_tool.exe | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/tools/Linux/wmc_tool b/scripts/tools/Linux/wmc_tool index c8481e76dd25e4abce309a1c089d938a119a724f..ea78156232b09d549eb2acb5af9caad9bdaef8fd 100755 GIT binary patch literal 363992 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

6SQaRC*SARoj#It9bopz$sQ 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 diff --git a/scripts/tools/Win32/wmc_tool.exe b/scripts/tools/Win32/wmc_tool.exe index b2e2df6c80..8bb5dd5924 100755 --- a/scripts/tools/Win32/wmc_tool.exe +++ b/scripts/tools/Win32/wmc_tool.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:02ec1d6fa014a6bb37f45281b9e83b445812f669623b99c8c90ad320535d383c -size 381952 +oid sha256:5cf3b920a28ced03856b6288b95796eb08b674ad813339c3eeb33f3f809dba30 +size 427008 -- GitLab From b3c4ae3c5bcd510d39404a632d6495ab6bc5c6ec Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Thu, 21 Mar 2024 09:57:38 +0200 Subject: [PATCH 563/601] Update wmc_tool for MacOS --- scripts/tools/Darwin/wmc_tool | Bin 674256 -> 657584 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scripts/tools/Darwin/wmc_tool b/scripts/tools/Darwin/wmc_tool index 9b92361236f4dffa1eead2ec4364ea01145c74f9..582cf452b2388031f0dbd53e525ba17d570c44f2 100755 GIT binary patch delta 176802 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 b?2+JJ+}o-*OX*dim^ah9xb5%yS(rQkA#Xnh -- GitLab From fa708c77dbb978fc490a7b0ad77500e2d27f0ded Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 21 Mar 2024 09:34:44 +0100 Subject: [PATCH 564/601] Shorten test case names to be able to run on Windows --- scripts/config/self_test.prm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index a9bb024f30..07a35a1a28 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -539,7 +539,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM_with_no_diegetic_switch.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48n.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48n+non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst -// 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, combined render config, directivity configuration with identifiers +// 4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, rendconf dir w id ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 128000 48 testv/stv4ISM48n.wav bit ../IVAS_dec -render_config testv/rend_config_combined.cfg -dpid 3 0 2 1 BINAURAL_ROOM_REVERB 48 bit testv/stv4ISM48n+combined_render_config_brate_128000-48-binaural_room_reverb.wav @@ -878,7 +878,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba -1 128000 48 testv/stvFOA48c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin -t testv/headrot_case00_3000_q.csv -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stvFOA48c.pcm_planarSBA_12800032-32_BinauralRoomReverb_Config_renderer_Headrot_BinauralFile.tst -// SBA 3OA at 128 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB combined renderer configuration with selected acoustic environment +// SBA 3OA at 128 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB rendconf sel acoustic env ../IVAS_cod -sba 3 128000 48 testv/stv3OA48c.wav bit ../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1 BINAURAL_ROOM_REVERB 48 bit testv/stv3OA48c.pcm_SBA_12800048-48_BinauralRoomReverb_Config_renderer_combined_AEID_1.tst -- GitLab From 41b45f7dffcf5412686cf1114a00dab9fa5d2a5e Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 10:37:05 +0100 Subject: [PATCH 565/601] update rs modes, bitrates and decoding formats for OMASA --- scripts/config/ivas_modes.json | 449 +++++++++++++++++++++++++++++++-- 1 file changed, 430 insertions(+), 19 deletions(-) diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index 86994010aa..ecba4343e4 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -4958,7 +4958,16 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], "stereo": [], "EXT": [] @@ -5033,7 +5042,16 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], "stereo": [], "EXT": [] @@ -5072,7 +5090,16 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], "stereo": [], "EXT": [] @@ -5089,26 +5116,100 @@ "mono": false, "bitrates": { "wb": [ + 13200, 16400, + 24400, + 32000, 48000, + 64000, + 80000, 96000, - 256000 + 128000, + 192000, + 256000, + 384000, + 512000 ], "swb": [ + 13200, + 16400, 24400, + 32000, + 48000, 64000, + 80000, + 96000, 128000, - 384000 + 192000, + 256000, + 384000, + 512000 ], "fb": [ 13200, + 16400, + 24400, 32000, + 48000, + 64000, 80000, + 96000, + 128000, 192000, + 256000, + 384000, 512000 ] } }, + "OMASA_ISM1_1TC_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism_masa", + "1", + "1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], + "HOA3": [], + "HOA2": [], + "FOA": [], + "mono": [], + "stereo": [], + "EXT": [] + }, + "in_config": "OMASA_ISM1_1TC", + "table_name": "OMASA ISM1 1TC @{table_bitrate} RS {bandwidth}", + "nummetadata": 2, + "metadatafilenames": [ + "{item}_ISM{mdi}.csv", + "{item}.met" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + } + } + }, "OMASA_ISM2_2TC_b{bitrate}_{bandwidth}_cbr": { "encmodeoption": [ "-ism_masa", @@ -5121,9 +5222,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM2_2TC", "table_name": "OMASA ISM2 2TC @{table_bitrate} kbps {bandwidth}", @@ -5195,9 +5306,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM2_2TC", "table_name": "OMASA ISM2 2TC @{table_bitrate} RS {bandwidth}", @@ -5233,9 +5354,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM2_1TC", "table_name": "OMASA ISM2 1TC @{table_bitrate} kbps {bandwidth}", @@ -5249,27 +5380,100 @@ "mono": false, "bitrates": { "wb": [ + 13200, 16400, + 24400, + 32000, 48000, + 64000, + 80000, 96000, - 160000, - 256000 + 128000, + 192000, + 256000, + 384000, + 512000 ], "swb": [ + 13200, + 16400, 24400, + 32000, + 48000, 64000, + 80000, + 96000, 128000, - 384000 + 192000, + 256000, + 384000, + 512000 ], "fb": [ 13200, + 16400, + 24400, 32000, + 48000, + 64000, 80000, + 96000, + 128000, 192000, + 256000, + 384000, 512000 ] } }, + "OMASA_ISM2_1TC_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism_masa", + "2", + "1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], + "HOA3": [], + "HOA2": [], + "FOA": [], + "mono": [], + "stereo": [], + "EXT": [] + }, + "in_config": "OMASA_ISM2_1TC", + "table_name": "OMASA ISM2 1TC @{table_bitrate} RS {bandwidth}", + "nummetadata": 3, + "metadatafilenames": [ + "{item}_ISM{mdi}.csv", + "{item}.met" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + } + } + }, "OMASA_ISM3_2TC_b{bitrate}_{bandwidth}_cbr": { "encmodeoption": [ "-ism_masa", @@ -5282,9 +5486,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM3_2TC", "table_name": "OMASA ISM3 2TC @{table_bitrate} kbps {bandwidth}", @@ -5356,9 +5570,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM3_2TC", "table_name": "OMASA ISM3 2TC @{table_bitrate} RS {bandwidth}", @@ -5394,9 +5618,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM3_1TC", "table_name": "OMASA ISM3 1TC @{table_bitrate} kbps {bandwidth}", @@ -5410,27 +5644,100 @@ "mono": false, "bitrates": { "wb": [ + 13200, 16400, + 24400, + 32000, 48000, + 64000, + 80000, 96000, - 160000, - 256000 + 128000, + 192000, + 256000, + 384000, + 512000 ], "swb": [ + 13200, + 16400, 24400, + 32000, + 48000, 64000, + 80000, + 96000, 128000, - 384000 + 192000, + 256000, + 384000, + 512000 ], "fb": [ 13200, + 16400, + 24400, 32000, + 48000, + 64000, 80000, + 96000, + 128000, 192000, + 256000, + 384000, 512000 ] } }, + "OMASA_ISM3_1TC_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism_masa", + "3", + "1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], + "HOA3": [], + "HOA2": [], + "FOA": [], + "mono": [], + "stereo": [], + "EXT": [] + }, + "in_config": "OMASA_ISM3_1TC", + "table_name": "OMASA ISM3 1TC @{table_bitrate} RS {bandwidth}", + "nummetadata": 4, + "metadatafilenames": [ + "{item}_ISM{mdi}.csv", + "{item}.met" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_512k_2fr_start_24k4_omasatechs_3ism.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_512k_2fr_start_48k_omasatechs_3ism.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_13k2_512k_2fr_start_160k_omasatechs_3ism.bin" + } + } + }, "OMASA_ISM4_2TC_b{bitrate}_{bandwidth}_cbr": { "encmodeoption": [ "-ism_masa", @@ -5443,9 +5750,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM4_2TC", "table_name": "OMASA ISM4 2TC @{table_bitrate} kbps {bandwidth}", @@ -5517,9 +5834,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM4_2TC", "table_name": "OMASA ISM4 2TC @{table_bitrate} RS {bandwidth}", @@ -5555,9 +5882,19 @@ ], "dec": { "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], "HOA3": [], + "HOA2": [], + "FOA": [], "mono": [], - "stereo": [] + "stereo": [], + "EXT": [] }, "in_config": "OMASA_ISM4_1TC", "table_name": "OMASA ISM4 1TC @{table_bitrate} kbps {bandwidth}", @@ -5571,25 +5908,99 @@ "mono": false, "bitrates": { "wb": [ + 13200, 16400, + 24400, + 32000, 48000, + 64000, + 80000, 96000, - 256000 + 128000, + 192000, + 256000, + 384000, + 512000 ], "swb": [ + 13200, + 16400, 24400, + 32000, + 48000, 64000, + 80000, + 96000, 128000, - 384000 + 192000, + 256000, + 384000, + 512000 ], "fb": [ 13200, + 16400, + 24400, 32000, + 48000, + 64000, 80000, + 96000, + 128000, 192000, + 256000, + 384000, 512000 ] } + }, + "OMASA_ISM4_1TC_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism_masa", + "4", + "1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "7_1_4": [], + "7_1": [], + "5_1_4": [], + "5_1_2": [], + "5_1": [], + "BINAURAL": [], + "BINAURAL_ROOM_IR": [], + "BINAURAL_ROOM_REVERB": [], + "HOA3": [], + "HOA2": [], + "FOA": [], + "mono": [], + "stereo": [], + "EXT": [] + }, + "in_config": "OMASA_ISM4_1TC", + "table_name": "OMASA ISM4 1TC @{table_bitrate} RS {bandwidth}", + "nummetadata": 5, + "metadatafilenames": [ + "{item}_ISM{mdi}.csv", + "{item}.met" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_512k_2fr_start_32k_omasatechs_4ism.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + } + } } }, "OSBA": { -- GitLab From 913c2834cb303028f86f18e5824acc31339be710 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 21 Mar 2024 10:42:04 +0100 Subject: [PATCH 566/601] add missing test modelROM --- lib_com/options.h | 3 ++- lib_dec/ivas_mct_dec.c | 11 +++++++++-- lib_dec/ivas_omasa_dec.c | 13 ++++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a504c51182..cf5b89ce16 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,8 @@ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ -#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ +//#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ +#define FIX_1033_MEMORY_LEAK_OMASA_BIS /* Nokia / Second solution Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index f9e26c33f3..1b59c74160 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1210,9 +1210,16 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) ) { - ivas_td_binaural_close( &st_ivas->hBinRendererTd ); +#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { +#endif + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); #ifndef FIX_1033_MEMORY_LEAK_OMASA - st_ivas->hHrtfTD = NULL; + st_ivas->hHrtfTD = NULL; +#endif +#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS + } #endif } diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 76014bb97d..37ec1ecb1f 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -391,10 +391,17 @@ ivas_error ivas_omasa_dec_config( } else { - /* TD renderer handle */ - ivas_td_binaural_close( &st_ivas->hBinRendererTd ); +#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { +#endif + /* TD renderer handle */ + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); #ifndef FIX_1033_MEMORY_LEAK_OMASA - st_ivas->hHrtfTD = NULL; + st_ivas->hHrtfTD = NULL; +#endif +#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS + } #endif /* ISM renderer handle + ISM data handle */ ivas_omasa_separate_object_renderer_close( st_ivas ); -- GitLab From 2128537bb20b73c00dcd66854b8c6a59a5253e9f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 21 Mar 2024 13:25:19 +0100 Subject: [PATCH 567/601] Add try/catch to Windows conformance job to get report --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d997a68996..46e53459bb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1355,12 +1355,12 @@ ivas-conformance: # Reference creation - python tests/create_short_testvectors.py - python scripts/prepare_combined_format_inputs.py - - python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref --keep_files - - python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref_part2 --keep_files - - python -m pytest tests/renderer/test_renderer.py --create_ref --keep_files + - try { python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref --keep_files } catch { echo "Errors encountered!" } + - try { python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref_part2 --keep_files } catch { echo "Errors encountered!" } + - try { python -m pytest tests/renderer/test_renderer.py --create_ref --keep_files } catch { echo "Errors encountered!" } # Output creation - - python -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --html=report_cmd.html --self-contained-html + - try { python -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --html=report_cmd.html --self-contained-html } catch { echo "Errors encountered!" } - python scripts/parse_commands.py report_cmd.html Readme_IVAS.txt # Copy input data and output ref data -- GitLab From f3a389a8442a9f677d26d42c1f8236fe1c7570b4 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 21 Mar 2024 13:51:33 +0100 Subject: [PATCH 568/601] Add git pull on reference to ensure it is updated --- .gitlab-ci.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 46e53459bb..6c437cf3b3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1344,6 +1344,7 @@ ivas-conformance: # Prepare reference exec, use tests and scripts from reference - $source_branch_commit_sha = $(git rev-parse HEAD) - git checkout main # This should be set to a relevant reference + - git pull # Ensure to get the latest version - python .\scripts\strip_split_rendering.py - MSBuild.exe -maxcpucount .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug - cp -force IVAS_cod.exe IVAS_cod_ref.exe @@ -1355,12 +1356,12 @@ ivas-conformance: # Reference creation - python tests/create_short_testvectors.py - python scripts/prepare_combined_format_inputs.py - - try { python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref --keep_files } catch { echo "Errors encountered!" } - - try { python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref_part2 --keep_files } catch { echo "Errors encountered!" } - - try { python -m pytest tests/renderer/test_renderer.py --create_ref --keep_files } catch { echo "Errors encountered!" } + - python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref --keep_files + - python -m pytest tests/codec_be_on_mr_nonselection -v -n auto --update_ref 1 -m create_ref_part2 --keep_files + - python -m pytest tests/renderer/test_renderer.py --create_ref --keep_files # Output creation - - try { python -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --html=report_cmd.html --self-contained-html } catch { echo "Errors encountered!" } + - python -m pytest tests/codec_be_on_mr_nonselection tests/renderer/test_renderer.py -v -n auto --keep_files --create_cut --html=report_cmd.html --self-contained-html - python scripts/parse_commands.py report_cmd.html Readme_IVAS.txt # Copy input data and output ref data -- GitLab From a498dc94744566675a5be1792e846edda5f90a99 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Thu, 21 Mar 2024 14:05:32 +0100 Subject: [PATCH 569/601] remove earlier FIX_1033_MEMORY_LEAK_OMASA solution and rename remaining FIX_1033_MEMORY_LEAK_OMASA_BIS into FIX_1033_MEMORY_LEAK_OMASA. allocate tdbin in OMASA. --- lib_com/options.h | 3 +-- lib_dec/ivas_ism_dec.c | 2 -- lib_dec/ivas_mct_dec.c | 6 ++---- lib_dec/ivas_omasa_dec.c | 20 ++++++++++++-------- lib_dec/ivas_sba_dec.c | 2 -- 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index cf5b89ce16..091667b10c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,8 +157,7 @@ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ -//#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ -#define FIX_1033_MEMORY_LEAK_OMASA_BIS /* Nokia / Second solution Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ +#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 3b3c806631..b23b16ca63 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -272,9 +272,7 @@ static ivas_error ivas_ism_bitrate_switching_dec( if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; -#endif if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 1b59c74160..e0ef92ecfc 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1210,15 +1210,13 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) ) { -#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS +#ifdef FIX_1033_MEMORY_LEAK_OMASA if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { #endif ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; -#endif -#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS +#ifdef FIX_1033_MEMORY_LEAK_OMASA } #endif } diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 37ec1ecb1f..b1a0a0e9ee 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -378,11 +378,17 @@ ivas_error ivas_omasa_dec_config( if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { /* Allocate TD renderer for the objects in DISC mode */ - if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) +#ifdef FIX_1033_MEMORY_LEAK_OMASA + if ( st_ivas->hBinRendererTd == NULL ) { - return error; +#endif + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef FIX_1033_MEMORY_LEAK_OMASA } - +#endif /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ if ( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { @@ -391,16 +397,14 @@ ivas_error ivas_omasa_dec_config( } else { -#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS - if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) +#ifdef FIX_1033_MEMORY_LEAK_OMASA + if ( st_ivas->hBinRendererTd != NULL && st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { #endif /* TD renderer handle */ ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; -#endif -#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS +#ifdef FIX_1033_MEMORY_LEAK_OMASA } #endif /* ISM renderer handle + ISM data handle */ diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index e9c61aa233..af102dd96e 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -526,9 +526,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; -#endif } } nchan_transport_old += st_ivas->nchan_ism; -- GitLab From 4854435da54d14db9c283a8b17f50c107e614502 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 14:16:47 +0100 Subject: [PATCH 570/601] use random head trajectory for BINAURAL output --- ci/create_trajectories.py | 25 ++++++++++++++++++++++++ ci/run_scheduled_sanitizer_test.py | 31 ++++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 ci/create_trajectories.py diff --git a/ci/create_trajectories.py b/ci/create_trajectories.py new file mode 100644 index 0000000000..6b957df092 --- /dev/null +++ b/ci/create_trajectories.py @@ -0,0 +1,25 @@ +import numpy as np + + +FRAMES_PER_SEC = 50 + + +def random_trajectory(duration_sec): + n_frames = int(FRAMES_PER_SEC * duration_sec) + trj = np.random.random((n_frames, 4)) + trj[:, 0] = -3 + trj[:, 1] *= 180 + trj[:, 2] *= 90 + trj[:, 3] *= 180 + return trj + + +def constant_trajectory(duration_sec, yaw=0, pitch=0, roll=0): + n_frames = int(FRAMES_PER_SEC * duration_sec) + trj = np.empty((n_frames, 4)) + trj[:, 0] = -3 + trj[:, 1] = yaw + trj[:, 2] = pitch + trj[:, 3] = roll + return trj + diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index d8986233fb..ea52570624 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -33,6 +33,8 @@ import argparse import pathlib import subprocess import sys +import numpy as np +import json CI_SCRIPT_DIR = "./ci" sys.path.append(CI_SCRIPT_DIR) @@ -41,6 +43,8 @@ from collect_artifacts import ( find_failed_files_for_sanitizer_test, ) from combine_genpatt_and_jbm_profile import combine_error_profiles +from create_trajectories import random_trajectory, constant_trajectory + SCRIPT_DIR = pathlib.Path("./scripts").resolve() DURATION = "120" @@ -54,9 +58,9 @@ N_FRAMES_DLY_PROFILE = 7500 GENPATT_CMD = f"gen-patt -tailstat -fer -g192 -gamma 0 -rate 0.15 -tol 0.001 -reset -n {N_FRAMES_DLY_PROFILE} {EP_FILE}" MC_MODES = ["5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] AMBISONICS_MODES = ["HOA3", "HOA2", "FOA", "PlanarHOA3", "PlanarHOA2", "PlanarFOA"] -TIMEOUT = ( - 60 * 20 -) # timeout of 15 minutes per en/decoding to safeguard against endless loops +# timeout of 15 minutes per en/decoding to safeguard against endless loops +TIMEOUT = (60 * 20) +HEAD_TRAJ_FILE = "head_traj.csv" CONSOLE_OUT_FILE = "output_san.txt" @@ -112,6 +116,17 @@ def get_modes(in_format: str) -> list: return mode_list +def assemble_oc_dict(out_formats: list): + oc_dict = {of: [] for of in out_formats} + + head_rot_args = ["-t", HEAD_TRAJ_FILE] + oc_dict["BINAURAL"].extend(head_rot_args) + oc_dict["BINAURAL_ROOM_IR"].extend(head_rot_args) + oc_dict["BINAURAL_ROOM_REVERB"].extend(head_rot_args) + + return json.dumps(oc_dict) + + def get_md_file_command(in_format: str) -> list: cmd = list() @@ -124,10 +139,18 @@ def get_md_file_command(in_format: str) -> list: return cmd +def create_trajectory_file(duration): + traj = random_trajectory(duration) + np.savetext(HEAD_TRAJ_FILE, traj, fmt="%.2f", delimiter=",") + + def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = True): modes = get_modes(in_format) md_file_command = get_md_file_command(in_format) + oc_str = assemble_oc_dict(out_formats) + + create_trajectory_file(DURATION) if len(modes) == 0: return 0 @@ -146,7 +169,7 @@ def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = Tr "-m", *modes, "--oc", - *out_formats, + oc_str, *md_file_command, "--usan_supp_file", USAN_SUPP_FILE, -- GitLab From 355cbdd1aa59f508fb0accf4b3be0c04cc774d1a Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 14:26:33 +0100 Subject: [PATCH 571/601] fix oc dict creation --- ci/run_scheduled_sanitizer_test.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index ea52570624..18a41a8da4 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -59,7 +59,7 @@ GENPATT_CMD = f"gen-patt -tailstat -fer -g192 -gamma 0 -rate 0.15 -tol 0.001 -re MC_MODES = ["5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] AMBISONICS_MODES = ["HOA3", "HOA2", "FOA", "PlanarHOA3", "PlanarHOA2", "PlanarFOA"] # timeout of 15 minutes per en/decoding to safeguard against endless loops -TIMEOUT = (60 * 20) +TIMEOUT = 60 * 20 HEAD_TRAJ_FILE = "head_traj.csv" CONSOLE_OUT_FILE = "output_san.txt" @@ -117,12 +117,13 @@ def get_modes(in_format: str) -> list: def assemble_oc_dict(out_formats: list): - oc_dict = {of: [] for of in out_formats} + ARGS_FOR_OC = { + "BINAURAL": ["-t", HEAD_TRAJ_FILE], + "BINAURAL_ROOM_IR": ["-t", HEAD_TRAJ_FILE], + "BINAURAL_ROOM_REVERB": ["-t", HEAD_TRAJ_FILE], + } - head_rot_args = ["-t", HEAD_TRAJ_FILE] - oc_dict["BINAURAL"].extend(head_rot_args) - oc_dict["BINAURAL_ROOM_IR"].extend(head_rot_args) - oc_dict["BINAURAL_ROOM_REVERB"].extend(head_rot_args) + oc_dict = {of: ARGS_FOR_OC.get(of, list()) for of in out_formats} return json.dumps(oc_dict) -- GitLab From 9b2b63d44be7b240229c6a3a97df6fe2bab514f6 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 14:30:13 +0100 Subject: [PATCH 572/601] convert duration to int --- ci/run_scheduled_sanitizer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 18a41a8da4..4bb9bab91d 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -151,7 +151,7 @@ def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = Tr md_file_command = get_md_file_command(in_format) oc_str = assemble_oc_dict(out_formats) - create_trajectory_file(DURATION) + create_trajectory_file(str(DURATION)) if len(modes) == 0: return 0 -- GitLab From 8a8d29b88d8228eea5de96ad2f4cbfab58cb196c Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 14:31:09 +0100 Subject: [PATCH 573/601] fix last commit --- ci/run_scheduled_sanitizer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 4bb9bab91d..ab3e9c9cc8 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -151,7 +151,7 @@ def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = Tr md_file_command = get_md_file_command(in_format) oc_str = assemble_oc_dict(out_formats) - create_trajectory_file(str(DURATION)) + create_trajectory_file(int(DURATION)) if len(modes) == 0: return 0 -- GitLab From ef5e06d559262266fc0b1593f0bfde452aebcce1 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 14:31:40 +0100 Subject: [PATCH 574/601] fix typo --- ci/run_scheduled_sanitizer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index ab3e9c9cc8..96b0e99c91 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -142,7 +142,7 @@ def get_md_file_command(in_format: str) -> list: def create_trajectory_file(duration): traj = random_trajectory(duration) - np.savetext(HEAD_TRAJ_FILE, traj, fmt="%.2f", delimiter=",") + np.savetxt(HEAD_TRAJ_FILE, traj, fmt="%.2f", delimiter=",") def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = True): -- GitLab From 7f863ead9ed6570227c9ce2768c7e837742812f0 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 21 Mar 2024 14:36:28 +0100 Subject: [PATCH 575/601] keep only fix testing modelROM value --- lib_com/options.h | 3 +-- lib_dec/ivas_ism_dec.c | 2 -- lib_dec/ivas_mct_dec.c | 6 ++---- lib_dec/ivas_omasa_dec.c | 6 ++---- lib_dec/ivas_sba_dec.c | 2 -- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3de7a656d3..da54fa4720 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,8 +156,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -//#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ -#define FIX_1033_MEMORY_LEAK_OMASA_BIS /* Nokia / Second solution Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ +#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue 1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 3b3c806631..b23b16ca63 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -272,9 +272,7 @@ static ivas_error ivas_ism_bitrate_switching_dec( if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; -#endif if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 1b59c74160..e0ef92ecfc 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1210,15 +1210,13 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) ) { -#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS +#ifdef FIX_1033_MEMORY_LEAK_OMASA if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { #endif ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; -#endif -#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS +#ifdef FIX_1033_MEMORY_LEAK_OMASA } #endif } diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 37ec1ecb1f..cbf36e53f1 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -391,16 +391,14 @@ ivas_error ivas_omasa_dec_config( } else { -#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS +#ifdef FIX_1033_MEMORY_LEAK_OMASA if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { #endif /* TD renderer handle */ ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; -#endif -#ifdef FIX_1033_MEMORY_LEAK_OMASA_BIS +#ifdef FIX_1033_MEMORY_LEAK_OMASA } #endif /* ISM renderer handle + ISM data handle */ diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index e9c61aa233..af102dd96e 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -526,9 +526,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); -#ifndef FIX_1033_MEMORY_LEAK_OMASA st_ivas->hHrtfTD = NULL; -#endif } } nchan_transport_old += st_ivas->nchan_ism; -- GitLab From 5f064e2fa2ea13ab16e0fe17336414acbb8f2bb8 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 14:40:56 +0100 Subject: [PATCH 576/601] use abs path of ht trajectory file --- ci/run_scheduled_sanitizer_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 96b0e99c91..bf5e051443 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -43,7 +43,7 @@ from collect_artifacts import ( find_failed_files_for_sanitizer_test, ) from combine_genpatt_and_jbm_profile import combine_error_profiles -from create_trajectories import random_trajectory, constant_trajectory +from create_trajectories import random_trajectory SCRIPT_DIR = pathlib.Path("./scripts").resolve() @@ -60,7 +60,7 @@ MC_MODES = ["5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] AMBISONICS_MODES = ["HOA3", "HOA2", "FOA", "PlanarHOA3", "PlanarHOA2", "PlanarFOA"] # timeout of 15 minutes per en/decoding to safeguard against endless loops TIMEOUT = 60 * 20 -HEAD_TRAJ_FILE = "head_traj.csv" +HEAD_TRAJ_FILE = pathlib.Path("./head_traj.csv").resolve() CONSOLE_OUT_FILE = "output_san.txt" -- GitLab From e1db7001a4f24b95dd05d4778d18a2a1338d9afc Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 14:42:32 +0100 Subject: [PATCH 577/601] turn into string --- ci/run_scheduled_sanitizer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index bf5e051443..b75a29b3c0 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -60,7 +60,7 @@ MC_MODES = ["5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] AMBISONICS_MODES = ["HOA3", "HOA2", "FOA", "PlanarHOA3", "PlanarHOA2", "PlanarFOA"] # timeout of 15 minutes per en/decoding to safeguard against endless loops TIMEOUT = 60 * 20 -HEAD_TRAJ_FILE = pathlib.Path("./head_traj.csv").resolve() +HEAD_TRAJ_FILE = str(pathlib.Path("./head_traj.csv").resolve()) CONSOLE_OUT_FILE = "output_san.txt" -- GitLab From af1816813a3e5a757a1e2c6ed7d905343162fae7 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 16:44:24 +0100 Subject: [PATCH 578/601] add head tracking trajectory to artifacts --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f6648a5274..440c117009 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1539,6 +1539,7 @@ ltv-usan: paths: - ep_015.g192 - dly_profile.dat + - head_traj.csv - ./LOGS_PLC - ./LOGS_noPLC -- GitLab From 1b76b3131b9d11c5c545f637bd0e193c820a14b2 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 16:44:43 +0100 Subject: [PATCH 579/601] add non-diegetic pan to ltv sanitizer testing --- ci/run_scheduled_sanitizer_test.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index b75a29b3c0..85b50ba6a3 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -178,6 +178,12 @@ def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = Tr str(TIMEOUT), ] + # to test non-diegetic panning with mono decoding: + # resue decoder part of StereDmxEVS mode (it is basically a duplicate of "normal" mono run) + if in_format == "StereoDmxEVS": + panning = np.random.randint(-90, 91) + cmd_no_fec += [f'-D="-non_diegetic_pan {panning}"'] + print( "======== Script command line WITHOUT plc: ========\n{}".format( " ".join(cmd_no_fec) -- GitLab From a070c68a30ce5c4bba940a92b53b7dd482dd7886 Mon Sep 17 00:00:00 2001 From: norvell Date: Thu, 21 Mar 2024 15:45:46 +0000 Subject: [PATCH 580/601] Enable all Windows runners for ivas-conformance --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6c437cf3b3..918aa2631c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1331,7 +1331,7 @@ test-be-to-release: ivas-conformance: tags: - - ericsson-windows-runner + - ivas-windows stage: test timeout: "60 minutes" rules: -- GitLab From 4b7e2d67bc1261682601d5089104ce4b9aa51c93 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 16:58:43 +0100 Subject: [PATCH 581/601] fix argument for non-diegetic pan --- ci/run_scheduled_sanitizer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 85b50ba6a3..32f7575897 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -182,7 +182,7 @@ def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = Tr # resue decoder part of StereDmxEVS mode (it is basically a duplicate of "normal" mono run) if in_format == "StereoDmxEVS": panning = np.random.randint(-90, 91) - cmd_no_fec += [f'-D="-non_diegetic_pan {panning}"'] + cmd_no_fec += [f'-D=-non_diegetic_pan {panning}'] print( "======== Script command line WITHOUT plc: ========\n{}".format( -- GitLab From 115af3bbeebacac8a32100116530e3eb45ae72da Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 17:07:22 +0100 Subject: [PATCH 582/601] add random trajectory file for exof as well --- .gitlab-ci.yml | 3 ++- ci/run_scheduled_sanitizer_test.py | 36 +++++++++++++++++------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 440c117009..6aaf34163b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1539,7 +1539,8 @@ ltv-usan: paths: - ep_015.g192 - dly_profile.dat - - head_traj.csv + - head_rot_traj.csv + - exof_traj.csv - ./LOGS_PLC - ./LOGS_noPLC diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 32f7575897..1fa96c001e 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -60,10 +60,20 @@ MC_MODES = ["5_1", "5_1_2", "5_1_4", "7_1", "7_1_4"] AMBISONICS_MODES = ["HOA3", "HOA2", "FOA", "PlanarHOA3", "PlanarHOA2", "PlanarFOA"] # timeout of 15 minutes per en/decoding to safeguard against endless loops TIMEOUT = 60 * 20 -HEAD_TRAJ_FILE = str(pathlib.Path("./head_traj.csv").resolve()) +HEAD_TRAJ_FILE = str(pathlib.Path("./head_rot_traj.csv").resolve()) +EXOF_TRAJ_FILE = str(pathlib.Path("./exof_traj.csv").resolve()) CONSOLE_OUT_FILE = "output_san.txt" +HEAD_ROT_ARGS = ["-t", HEAD_TRAJ_FILE] +EXOF_ARGS = ["-exof", EXOF_TRAJ_FILE] +BINAURAL_OUT_ARGS = HEAD_ROT_ARGS + EXOF_ARGS +ARGS_FOR_OC = { + "BINAURAL": BINAURAL_OUT_ARGS, + "BINAURAL_ROOM_IR": BINAURAL_OUT_ARGS, + "BINAURAL_ROOM_REVERB": BINAURAL_OUT_ARGS, +} + def main(args): in_format = args.in_format @@ -117,12 +127,6 @@ def get_modes(in_format: str) -> list: def assemble_oc_dict(out_formats: list): - ARGS_FOR_OC = { - "BINAURAL": ["-t", HEAD_TRAJ_FILE], - "BINAURAL_ROOM_IR": ["-t", HEAD_TRAJ_FILE], - "BINAURAL_ROOM_REVERB": ["-t", HEAD_TRAJ_FILE], - } - oc_dict = {of: ARGS_FOR_OC.get(of, list()) for of in out_formats} return json.dumps(oc_dict) @@ -140,21 +144,21 @@ def get_md_file_command(in_format: str) -> list: return cmd -def create_trajectory_file(duration): - traj = random_trajectory(duration) - np.savetxt(HEAD_TRAJ_FILE, traj, fmt="%.2f", delimiter=",") - - def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = True): modes = get_modes(in_format) + if len(modes) == 0: + return 0 + md_file_command = get_md_file_command(in_format) oc_str = assemble_oc_dict(out_formats) - create_trajectory_file(int(DURATION)) - - if len(modes) == 0: - return 0 + # create random trajectory files + if "BINAURAL" in oc_str: + trajectory_files = [HEAD_TRAJ_FILE, EXOF_TRAJ_FILE] + for tf in trajectory_files: + traj = random_trajectory(int(DURATION)) + np.savetxt(tf, traj, fmt="%.2f", delimiter=",") ### always run encoder and decoder with no frameloss cmd_no_fec = [ -- GitLab From 1d5393d0df2178b930d6a0847cfd3927c1af9e57 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 17:22:27 +0100 Subject: [PATCH 583/601] add -otr avg --- ci/run_scheduled_sanitizer_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 1fa96c001e..5176a440d1 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -67,6 +67,7 @@ CONSOLE_OUT_FILE = "output_san.txt" HEAD_ROT_ARGS = ["-t", HEAD_TRAJ_FILE] EXOF_ARGS = ["-exof", EXOF_TRAJ_FILE] +OTR_ARGS = ["-otr", "avg"] BINAURAL_OUT_ARGS = HEAD_ROT_ARGS + EXOF_ARGS ARGS_FOR_OC = { "BINAURAL": BINAURAL_OUT_ARGS, -- GitLab From 6ded9da26ac91ef0cf105bbcea0754a75b3625fb Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 21 Mar 2024 17:23:29 +0100 Subject: [PATCH 584/601] actually use OTR --- ci/run_scheduled_sanitizer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 5176a440d1..65c88ee0c0 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -68,7 +68,7 @@ CONSOLE_OUT_FILE = "output_san.txt" HEAD_ROT_ARGS = ["-t", HEAD_TRAJ_FILE] EXOF_ARGS = ["-exof", EXOF_TRAJ_FILE] OTR_ARGS = ["-otr", "avg"] -BINAURAL_OUT_ARGS = HEAD_ROT_ARGS + EXOF_ARGS +BINAURAL_OUT_ARGS = HEAD_ROT_ARGS + EXOF_ARGS + OTR_ARGS ARGS_FOR_OC = { "BINAURAL": BINAURAL_OUT_ARGS, "BINAURAL_ROOM_IR": BINAURAL_OUT_ARGS, -- GitLab From 4286e0ef30805d5889d2eb7f75e43318a7a28e52 Mon Sep 17 00:00:00 2001 From: norvell Date: Fri, 22 Mar 2024 06:26:15 +0000 Subject: [PATCH 585/601] Fix test_masa_enc_dec.py: MAXIMUM ABS DIFF property not set in BINAURAL MASA test cases --- tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py index ffd792363b..9a8d8b35d5 100644 --- a/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py +++ b/tests/codec_be_on_mr_nonselection/test_masa_enc_dec.py @@ -261,10 +261,8 @@ def test_masa_enc_dec( mld = re.search(MLD_PATTERN, reason).groups(1)[0] record_property("MLD", mld) - max_diff = 0 - if filecmp_res: - search_result = re.search(MAX_DIFF_PATTERN, reason) - max_diff = search_result.groups(1)[0] + search_result = re.search(MAX_DIFF_PATTERN, reason) + max_diff = search_result.groups(1)[0] record_property("MAXIMUM ABS DIFF", max_diff) # Report compare result -- GitLab From 42f4a4d0fbdad2d8d30d0a04860f9c6b87773a6f Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 22 Mar 2024 14:45:31 +0100 Subject: [PATCH 586/601] harmonize rate switching patterns in ivas_modes.json --- scripts/config/ivas_modes.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index ecba4343e4..42b4d2b6a4 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -5596,13 +5596,13 @@ "mono": false, "bitrates": { "wb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_24k4_omasatechs_3ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" }, "swb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_48k_omasatechs_3ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" }, "fb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_160k_omasatechs_3ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" } } }, @@ -5728,13 +5728,13 @@ "mono": false, "bitrates": { "wb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_24k4_omasatechs_3ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" }, "swb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_48k_omasatechs_3ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" }, "fb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_160k_omasatechs_3ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" } } }, @@ -5860,10 +5860,10 @@ "mono": false, "bitrates": { "wb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_32k_omasatechs_4ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" }, "swb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" }, "fb": { "all": "{sw_files_path}/sw_13k2_512k.bin" @@ -5992,10 +5992,10 @@ "mono": false, "bitrates": { "wb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_32k_omasatechs_4ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" }, "swb": { - "all": "{sw_files_path}/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin" + "all": "{sw_files_path}/sw_13k2_512k.bin" }, "fb": { "all": "{sw_files_path}/sw_13k2_512k.bin" -- GitLab From 3baafeb18be238e6cab7d1b61d7325b3b5831833 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 25 Mar 2024 15:35:43 +0100 Subject: [PATCH 587/601] issue 1043: JBM MD handle allocation is avoided in non-JBM EXT operations; under FIX_1043_JBM_MD_BUFFER --- lib_com/options.h | 2 ++ lib_dec/ivas_init_dec.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index fda3eb0d4d..fd11f1d0eb 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,6 +161,8 @@ #define FIX_1022_REMOVE_PARAMISM_DEC /* VA: issue 1022: remove unused function ivas_param_ism_dec() */ #define FIX_1035_HT_OSBA /* Dlb: issue 1035: Issue with headtracking in OSBA*/ +#define FIX_1043_JBM_MD_BUFFER /* VA: issue 1043: JBM MD handle allocation is avoided in non-JBM EXT operations */ + /* #################### End BE switches ################################## */ /* #################### Start NON-BE switches ############################ */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b92dc19ded..7858a2d80c 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2262,7 +2262,11 @@ ivas_error ivas_init_decoder( } } +#ifdef FIX_1043_JBM_MD_BUFFER + if ( st_ivas->hJbmMetadata == NULL && st_ivas->hDecoderConfig->Opt_tsm ) +#else if ( st_ivas->hJbmMetadata == NULL ) +#endif { if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { -- GitLab From e23c2baff8c0885c9607bde95f6bb58befc72767 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 25 Mar 2024 16:35:47 +0100 Subject: [PATCH 588/601] fix MASA EXT output --- lib_dec/ivas_jbm_dec.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 1c550fa68f..d734a9bde2 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -214,7 +214,11 @@ ivas_error ivas_jbm_dec_tc( return error; } +#ifdef FIX_1043_JBM_MD_BUFFER + if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hDecoderConfig->Opt_tsm ) +#else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) +#endif { ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); } @@ -413,7 +417,12 @@ ivas_error ivas_jbm_dec_tc( ivas_omasa_render_objects_from_mix( st_ivas, p_output, st_ivas->nchan_ism, output_frame ); } - ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); +#ifdef FIX_1043_JBM_MD_BUFFER + if ( st_ivas->hDecoderConfig->Opt_tsm ) +#endif + { + ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); + } } } else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) @@ -812,7 +821,11 @@ void ivas_jbm_dec_feed_tc_to_renderer( { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); +#ifdef FIX_1043_JBM_MD_BUFFER + if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hDecoderConfig->Opt_tsm ) +#else if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) +#endif { ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); } @@ -897,7 +910,13 @@ void ivas_jbm_dec_feed_tc_to_renderer( if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) { ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); - ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + +#ifdef FIX_1043_JBM_MD_BUFFER + if ( st_ivas->hDecoderConfig->Opt_tsm ) +#endif + { + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); + } } else { -- GitLab From 5d0de7de2633f55775dadb5e5963e16e9da3ad26 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 26 Mar 2024 10:43:19 +0100 Subject: [PATCH 589/601] add new tags for msan jobs --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6aaf34163b..1a82ae44a6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -529,6 +529,9 @@ codec-smoke-test: codec-msan: extends: - .sanitizer-selftest-on-mr + tags: + - ivas-linux + - msan-works before_script: - CLANG_NUM=1 - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_STV_SANITIZERS @@ -656,6 +659,9 @@ renderer-msan: extends: - .test-job-linux - .rules-merge-request + tags: + - ivas-linux + - msan-works needs: ["build-codec-linux-cmake"] stage: test script: -- GitLab From 463fc0992964d8e2a086ccb49553ab59aa0e7e41 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 26 Mar 2024 14:38:50 +0100 Subject: [PATCH 590/601] Revert "add new tags for msan jobs" This reverts commit 5d0de7de2633f55775dadb5e5963e16e9da3ad26. --- .gitlab-ci.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1a82ae44a6..6aaf34163b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -529,9 +529,6 @@ codec-smoke-test: codec-msan: extends: - .sanitizer-selftest-on-mr - tags: - - ivas-linux - - msan-works before_script: - CLANG_NUM=1 - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_STV_SANITIZERS @@ -659,9 +656,6 @@ renderer-msan: extends: - .test-job-linux - .rules-merge-request - tags: - - ivas-linux - - msan-works needs: ["build-codec-linux-cmake"] stage: test script: -- GitLab From b0bc9d0e44419d1599c69f5df87a7eebef533a53 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 26 Mar 2024 17:43:24 +0100 Subject: [PATCH 591/601] Fixes in test_26444.py to report errors --- tests/test_26444.py | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/tests/test_26444.py b/tests/test_26444.py index c413be81e4..d23c01e8a8 100644 --- a/tests/test_26444.py +++ b/tests/test_26444.py @@ -70,17 +70,27 @@ for s in scripts: dec_opts = "" diff_opts = "" - @pytest.mark.parametrize("test_tag", list(test_dict.keys())) -def test_evs_26444(test_tag): +def test_evs_26444(runner_frontend, test_tag): enc_opts, dec_opts, diff_opts = test_dict[test_tag] - + + result = None if enc_opts: enc_opts = enc_opts.replace("./", TEST_DIR + "/") - subprocess.run(["./IVAS_cod", "-q"] + enc_opts.split()[1:]) + enc_opts = enc_opts.replace("-rf rf_config.cfg", "-rf " + TEST_DIR + "/rf_config.cfg") # Special handling of this arguments since the path is missing + cmd = ["./IVAS_cod", "-q"] + enc_opts.split()[1:] + print(" ".join(["Encoder command: "] + cmd)) + runner_frontend.run(cmd) if dec_opts: dec_opts = dec_opts.replace("./", TEST_DIR + "/") - subprocess.run(["./IVAS_dec", "-q"] + dec_opts.split()[1:]) + cmd = ["./IVAS_dec", "-q"] + dec_opts.split()[1:] + print(" ".join(["Decoder command: "] + cmd)) + runner_frontend.run(cmd) + + result = runner_frontend.result + + if result != None and result.returncode: + pytest.fail("Non-zero returncode for command: " + " ".join(cmd)) diff_opts = diff_opts.replace("./", TEST_DIR + "/") if ";" in diff_opts: @@ -95,3 +105,27 @@ def test_evs_26444(test_tag): result2 = True if not (result1 and result2): pytest.fail("Output differs") + + +class Runner: + def __init__(self) -> None: + self.returncode = None + self.result = None + + def run(self, cmd: str) -> None: + result = subprocess.run(cmd, capture_output=True, check=False) + self.result = result + self.returncode = result.returncode + + def _check_run(self): + if self.returncode is not None: + if self.returncode: + pytest.fail( "Command terminated with a non-0 return code" ) + +@pytest.fixture(scope="function") +def runner_frontend() -> Runner: + runner = Runner() + yield runner + + # Fixture teardown + runner._check_run() -- GitLab From a1b756c42944318db321542a44216e57c4b34528 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 26 Mar 2024 21:19:27 +0100 Subject: [PATCH 592/601] [cleanup] accept FIX_1024_REMOVE_PARAMMC_MIXING_MAT --- lib_com/options.h | 1 - lib_dec/ivas_mc_param_dec.c | 137 ---------------------------- lib_dec/ivas_out_setup_conversion.c | 8 -- 3 files changed, 146 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7ae362777b..0072874335 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ #define FIX_1023_REMOVE_PARAMMC_DEC /* VA: issue 1023: remove unused function ivas_param_mc_dec() */ #define FIX_1022_REMOVE_PARAMISM_DEC /* VA: issue 1022: remove unused function ivas_param_ism_dec() */ #define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 21bdcfb856..7e96d09a3d 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -88,10 +88,6 @@ static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hDirAC, float *ild static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); -#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT -static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); - -#endif static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float *mixing_matrix[], float *mixing_matrix_res[], const uint16_t nX, const uint16_t nY ); static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator ); @@ -1456,19 +1452,8 @@ void ivas_param_mc_dec_digest_tc( } -#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT - if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) - { - ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); - } - else - { -#endif /* generate mixing matrices */ ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); -#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT - } -#endif pop_wmops(); @@ -2454,128 +2439,6 @@ static void ivas_param_mc_get_mixing_matrices( return; } -#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT -/*------------------------------------------------------------------------- - * ivas_param_mc_get_mono_stereo_mixing_matrices() - * - * calculate the direct and residual mixing matrices - * for mono and stereo output - *------------------------------------------------------------------------*/ - -static void ivas_param_mc_get_mono_stereo_mixing_matrices( - PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ - float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : transport channel covariance for all parameter bands */ - float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ - float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ - const int16_t nY_intern, /* i : number of channels of the transport format */ - const int16_t nX, /* i : number of transport channels */ - const int16_t nY_cov ) /* i : number of output channels */ -{ - int16_t param_band_idx; - float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float Cy_diag[MAX_CICP_CHANNELS]; - float Cproto_diag[MAX_CICP_CHANNELS]; - float Cproto[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float mat_mult_buffer1[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float *Cx_state; - float *Cx_old_state; - float Cy_state[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float *Cy_old_state; - int16_t nY_band; - float proto_matrix[PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS]; - uint16_t i; - - set_zero( Cproto, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - set_zero( mat_mult_buffer1, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - set_zero( proto_matrix, PARAM_MC_MAX_TRANSPORT_CHANS * MAX_CICP_CHANNELS ); - - mvr2r( hParamMC->h_output_synthesis_params.proto_matrix, proto_matrix, nY_cov * nX ); - nY_band = nY_cov; - - for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) - { - float Cy_full[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float mixing_matrix_woLFE[MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float Nrqq[MAX_OUTPUT_CHANNELS]; - float target_ch_ener[MAX_OUTPUT_CHANNELS]; - int16_t k, l; - float *ild_q; - - Cx_state = Cx_in[param_band_idx]; - Cx_old_state = hParamMC->h_output_synthesis_cov_state.cx_old[param_band_idx]; - Cy_old_state = hParamMC->h_output_synthesis_cov_state.cy_old[param_band_idx]; - set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); - set_zero( target_ch_ener, MAX_OUTPUT_CHANNELS ); - set_zero( Cy_full, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - set_zero( Cy_state, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); - set_zero( Cproto_diag, MAX_CICP_CHANNELS ); - ild_q = hParamMC->icld_q + param_band_idx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; - - /*get back Nrg*/ - for ( k = 0; k < nY_intern; k++ ) - { - float ref_ener = 0.0f; - int16_t ref_channel_cnt; - int16_t ref_channel_idx; - - for ( ref_channel_cnt = 0; ref_channel_cnt < hParamMC->hMetadataPMC->ild_mapping_conf->num_ref_channels[k]; ref_channel_cnt++ ) - { - ref_channel_idx = hParamMC->hMetadataPMC->ild_mapping_conf->ref_channel_idx[k][ref_channel_cnt]; - ref_ener += Cx_state[ref_channel_idx + ref_channel_idx * nX]; - } - Nrqq[hParamMC->hMetadataPMC->ild_mapping_conf->ild_index[k]] = powf( 10.0f, ild_q[k] / 10.0f ) * hParamMC->hMetadataPMC->ild_factors[k] * ref_ener; - } - for ( k = 0; k < nY_cov; k++ ) - { - for ( l = 0; l < nY_intern; l++ ) - { - target_ch_ener[k] += hParamMC->ls_conv_dmx_matrix[k + l * nY_cov] * Nrqq[l]; - } - Cy_state[k + nY_cov * k] = target_ch_ener[k]; - } - - /* Smoothing: Sum over two buffers */ - if ( hParamMC->hMetadataPMC->bAttackPresent ) - { - /* no smoothing on attacks */ - mvr2r( Cx_state, Cx, nX * nX ); - mvr2r( Cy_state, Cy_full, nY_cov * nY_cov ); - } - else - { - /* smoothing gains are now identical to one, simply add up */ - v_add( Cx_state, Cx_old_state, Cx, nX * nX ); - v_add( Cy_state, Cy_old_state, Cy_full, nY_cov * nY_cov ); - } - - /* cov buffer update */ - mvr2r( Cx_state, Cx_old_state, nX * nX ); - mvr2r( Cy_state, Cy_old_state, nY_cov * nY_cov ); - - - matrix_product( proto_matrix, nY_band, nX, 0, Cx, nX, nX, 0, mat_mult_buffer1 ); - - matrix_product_diag( mat_mult_buffer1, nY_band, nX, 0, proto_matrix, nY_band, nX, 1, Cproto_diag ); - - /* Computing the mixing matrices */ - for ( i = 0; i < nY_band; i++ ) - { - Cy_diag[i] = Cy_full[i + nY_band * i]; - Cy_diag[i] = sqrtf( Cy_diag[i] / ( Cproto_diag[i] + EPSILON ) ); - } - - diag_matrix_product( Cy_diag, nY_band, proto_matrix, nY_band, nX, 0, mixing_matrix_woLFE ); - - mvr2r( mixing_matrix_woLFE, mixing_matrix[param_band_idx], nY_cov * nX ); - if ( hParamMC->band_grouping[param_band_idx] < hParamMC->h_output_synthesis_params.max_band_decorr ) - { - set_zero( mixing_matrix_res[param_band_idx], nY_cov * nY_cov ); - } - } - - return; -} -#endif /*------------------------------------------------------------------------- * param_mc_update_mixing_matrices() diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index b66e02e1ee..c6d2585eec 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -973,11 +973,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( set_zero( Nrqq, MAX_OUTPUT_CHANNELS ); set_zero( target_ch_ener, MAX_OUTPUT_CHANNELS ); -#ifdef FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* Step 1.2, get target channel energies for the transported format, Nrqq calculation */ -#else - /* Step 1.2, get target channel energies for the transported format as in ivas_param_mc_get_mono_stereo_mixing_matrices(), Nrqq calculation */ -#endif ild_q = hParamMC->icld_q + bandIdx * hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe; for ( chInIdx = 0; chInIdx < nchan_transport_format; chInIdx++ ) @@ -995,11 +991,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( Nrqq[hParamMC->hMetadataPMC->ild_mapping_conf->ild_index[chInIdx]] = powf( 10.0f, ild_q[chInIdx] / 10.0f ) * hParamMC->hMetadataPMC->ild_factors[chInIdx] * ref_ener; } -#ifdef FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* Step 1.3 get target Cy (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ -#else - /* Step 1.3 get target Cy like in ivas_param_mc_get_mono_stereo_mixing_matrices() (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ -#endif for ( chOutIdx = 0; chOutIdx < nchan_out; chOutIdx++ ) { for ( i = 0; i < nchan_transport_format; i++ ) -- GitLab From 40667261dc00109af60920b89998a2ed19ce24c4 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 26 Mar 2024 21:20:29 +0100 Subject: [PATCH 593/601] [cleanup] accept FIX_1023_REMOVE_PARAMMC_DEC --- lib_com/ivas_prot.h | 7 ------- lib_com/options.h | 1 - lib_dec/ivas_mc_param_dec.c | 41 ------------------------------------- 3 files changed, 49 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index a191d1bf39..56e8942473 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3869,13 +3869,6 @@ void ivas_param_mc_dec_render( float *output_f[] /* o : rendered time signal */ ); -#ifndef FIX_1023_REMOVE_PARAMMC_DEC -void ivas_param_mc_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -); - -#endif /*! r: number of cldfb synthesis instances */ int16_t param_mc_get_num_cldfb_syntheses( Decoder_Struct *st_ivas /* i : IVAS decoder structure */ diff --git a/lib_com/options.h b/lib_com/options.h index 0072874335..b93f3547de 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1023_REMOVE_PARAMMC_DEC /* VA: issue 1023: remove unused function ivas_param_mc_dec() */ #define FIX_1022_REMOVE_PARAMISM_DEC /* VA: issue 1022: remove unused function ivas_param_ism_dec() */ #define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 7e96d09a3d..6fe079eded 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1801,47 +1801,6 @@ void ivas_param_mc_dec_render( } -#ifndef FIX_1023_REMOVE_PARAMMC_DEC -/*------------------------------------------------------------------------- - * ivas_param_mc_dec() - * - * Parametric MC decoding process - *------------------------------------------------------------------------*/ - -void ivas_param_mc_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -) -{ - PARAM_MC_DEC_HANDLE hParamMC; - float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; - uint16_t nSamplesAsked, nSamplesAvailableNext, nSamplesRendered; - - hParamMC = st_ivas->hParamMC; - assert( hParamMC ); - push_wmops( "param_mc_dec" ); - - /* set some handle pointers to the stack buffers */ - hParamMC->Cldfb_RealBuffer_tc = Cldfb_RealBuffer_in; - hParamMC->Cldfb_ImagBuffer_tc = Cldfb_ImagBuffer_in; - - nSamplesAsked = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); - ivas_param_mc_dec_digest_tc( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS, output_f ); - ivas_param_mc_dec_render( st_ivas, nSamplesAsked, &nSamplesRendered, &nSamplesAvailableNext, output_f ); -#ifdef DEBUGGING - assert( nSamplesRendered == nSamplesAsked ); - assert( nSamplesAvailableNext == 0 ); -#endif - - /* set handle pointers back to NULL */ - hParamMC->Cldfb_RealBuffer_tc = NULL; - hParamMC->Cldfb_ImagBuffer_tc = NULL; - - pop_wmops(); - return; -} -#endif /*------------------------------------------------------------------------- * param_mc_dec_init() -- GitLab From c0bfada3531a73bc8da7e214d7e200bf25adce74 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 26 Mar 2024 21:21:32 +0100 Subject: [PATCH 594/601] [cleanup] accept FIX_1022_REMOVE_PARAMISM_DEC --- lib_com/ivas_prot.h | 7 - lib_com/options.h | 1 - lib_dec/ivas_ism_param_dec.c | 308 ----------------------------------- 3 files changed, 316 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 56e8942473..da0e6e7eae 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1095,13 +1095,6 @@ void ivas_param_ism_dec_close( const AUDIO_CONFIG output_config /* i : output audio configuration */ ); -#ifndef FIX_1022_REMOVE_PARAMISM_DEC -void ivas_param_ism_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -); - -#endif void ivas_ism_dec_digest_tc( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); diff --git a/lib_com/options.h b/lib_com/options.h index b93f3547de..92d5da488b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ /*#define SPLIT_REND_WITH_HEAD_ROT */ /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#define FIX_1022_REMOVE_PARAMISM_DEC /* VA: issue 1022: remove unused function ivas_param_ism_dec() */ #define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ #define FIX_1035_HT_OSBA /* Dlb: issue 1035: Issue with headtracking in OSBA*/ diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 9337ccb08a..84caf81b6d 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -324,44 +324,6 @@ static void ivas_param_ism_render_slot( return; } -#ifndef FIX_1022_REMOVE_PARAMISM_DEC -static void ivas_param_ism_rendering( - PARAM_ISM_DEC_HANDLE hParamIsmDec, - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, - float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][4][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][4][CLDFB_NO_CHANNELS_MAX], - float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX], - const int16_t out_slot_idx, - const int16_t slot_idx, - const int16_t num_ch_LS, - const int16_t nchan_transport ) -{ - int16_t outchIdx, inchIdx, bin_idx; - float tmp_1, mixing_matrix_smooth; - - tmp_1 = hParamIsmDec->hParamIsmRendering->interpolator[slot_idx]; - - for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) - { - /* smooth the mixing matrix */ - for ( outchIdx = 0; outchIdx < num_ch_LS; outchIdx++ ) - { - for ( inchIdx = 0; inchIdx < nchan_transport; inchIdx++ ) - { - mixing_matrix_smooth = tmp_1 * mixing_matrix[bin_idx][outchIdx + inchIdx * num_ch_LS] + - ( 1 - tmp_1 ) * hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_old[bin_idx][outchIdx + inchIdx * num_ch_LS]; - - Cldfb_RealBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_RealBuffer_in[inchIdx][slot_idx][bin_idx]; - Cldfb_ImagBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_ImagBuffer_in[inchIdx][slot_idx][bin_idx]; - } - } - } - - return; -} -#endif static ivas_error ivas_param_ism_rendering_init( PARAM_ISM_RENDERING_HANDLE hParamIsmRendering, @@ -729,251 +691,6 @@ void ivas_param_ism_dec_close( return; } -#ifndef FIX_1022_REMOVE_PARAMISM_DEC -/*-------------------------------------------------------------------------* - * ivas_param_ism_dec() - * - * Param ISM decoder - *-------------------------------------------------------------------------*/ - -void ivas_param_ism_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output*/ -) -{ - int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; - int16_t subframe_idx, slot_idx, index_slot, bin_idx; - int32_t ivas_total_brate; - int16_t output_frame; - float *p_tc[PARAM_ISM_MAX_DMX]; - float ref_power[CLDFB_NO_CHANNELS_MAX]; - float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; - /* CLDFB Input Buffers */ - float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - - /* CLDFB Output Buffers */ - float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - - /* Direct Response/EFAP Gains */ - float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; - - /* Covariance Rendering */ - float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; - - PARAM_ISM_DEC_HANDLE hParamIsmDec; - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - - IVAS_OUTPUT_SETUP hSetup; - - /* Initialization */ - hParamIsmDec = st_ivas->hParamIsmDec; - assert( hParamIsmDec ); - hSpatParamRendCom = st_ivas->hSpatParamRendCom; - assert( hSpatParamRendCom ); - for ( i = 0; i < PARAM_ISM_MAX_DMX; i++ ) - { - p_tc[i] = output_f[i]; - } - output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); - - nchan_transport = st_ivas->nchan_transport; - if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) - { - nchan_out = st_ivas->nchan_ism; - nchan_out_woLFE = nchan_out; - st_ivas->hDecoderConfig->nchan_out = nchan_out; - } - else - { - nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; - nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; - } - - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - - hSetup = st_ivas->hIntSetup; - - push_wmops( "ivas_param_ism_dec" ); - - /* set buffers to zero */ - for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) - { - set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); - } - set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); - - /* Frame-level Processing */ - /* De-quantization */ - if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) - { - ivas_param_ism_dec_dequant_DOA( hParamIsmDec, st_ivas->nchan_ism ); - ivas_param_ism_dec_dequant_powrat( hParamIsmDec ); - st_ivas->hISMDTX.dtx_flag = 0; - } - else - { - st_ivas->hISMDTX.dtx_flag = 1; - } - - /* obtain the direct response using EFAP */ - if ( !( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - for ( i = 0; i < st_ivas->nchan_ism; i++ ) - { - efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hParamIsmDec->azimuth_values[i], hParamIsmDec->elevation_values[i], EFAP_MODE_EFAP ); - } - } - else - { - int16_t j; - - for ( i = 0; i < st_ivas->nchan_ism; i++ ) - { - for ( j = 0; j < nchan_out_woLFE; j++ ) - { - if ( i == j ) - { - direct_response[i][j] = 1.0f; - } - else - { - direct_response[i][j] = 0.0f; - } - } - } - - for ( j = 0; j < nchan_out_woLFE; j++ ) - { - if ( hParamIsmDec->azimuth_values[j] > 0.0f ) - { - hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 1.0f; - hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 0.0f; - } - else - { - if ( hParamIsmDec->azimuth_values[j] < 0.0f ) - { - hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 0.0f; - hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 1.0f; - } - else /* == 0.0f */ - { - hParamIsmDec->hParamIsmRendering->proto_matrix[j] = 0.5f; - hParamIsmDec->hParamIsmRendering->proto_matrix[nchan_out_woLFE + j] = 0.5f; - } - } - } - } - - ivas_ism_param_dec_tc_gain_ajust( st_ivas, output_frame, output_frame / 2, p_tc ); - - for ( ch = 0; ch < nchan_transport; ch++ ) - { - /* CLDFB Analysis */ - for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) - { - cldfbAnalysis_ts( &( output_f[ch][hSpatParamRendCom->num_freq_bands * slot_idx] ), Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], hSpatParamRendCom->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); - - ivas_param_ism_collect_slot( hParamIsmDec, Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], ch, ref_power, cx_diag ); - } - } - - /* Obtain Mixing Matrix on a frame-level */ - for ( bin_idx = 0; bin_idx < hSpatParamRendCom->num_freq_bands; bin_idx++ ) - { - set_f( mixing_matrix[bin_idx], 0.0f, nchan_transport * nchan_out_woLFE ); - } - - /* Compute mixing matrix */ - ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hParamIsmDec, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, mixing_matrix ); - - /* subframe loop for synthesis*/ - for ( subframe_idx = 0; subframe_idx < hSpatParamRendCom->nb_subframes; subframe_idx++ ) - { - uint16_t slot_idx_start = subframe_idx * hSpatParamRendCom->subframe_nbslots[subframe_idx]; - uint16_t idx_in; - uint16_t idx_lfe; - - /* Set some memories to zero */ - for ( ch = 0; ch < nchan_out_woLFE; ch++ ) - { - for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hSpatParamRendCom->num_freq_bands ); - set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hSpatParamRendCom->num_freq_bands ); - } - } - - for ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - index_slot = slot_idx_start + slot_idx; - - /* Compute bandwise rendering to target LS using covariance rendering */ - ivas_param_ism_rendering( hParamIsmDec, hSpatParamRendCom, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, - Cldfb_RealBuffer, Cldfb_ImagBuffer, mixing_matrix, slot_idx, index_slot, - nchan_out_woLFE, nchan_transport ); - } - - /* CLDFB Synthesis */ - idx_in = 0; - idx_lfe = 0; - - for ( ch = 0; ch < nchan_out; ch++ ) - { - if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) - { - set_zero( &( output_f[ch][slot_idx_start * hSpatParamRendCom->num_freq_bands] ), hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands ); - if ( idx_lfe < ( hSetup.num_lfe - 1 ) ) - { - idx_lfe++; - } - } - else - { - float *RealBuffer[16]; - float *ImagBuffer[16]; - - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ - for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; - } - - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hSpatParamRendCom->num_freq_bands] ), - hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); - - idx_in++; - } - } - } - - /* copy the memories */ - /* store mixing matrix for next subframe */ - ivas_param_ism_update_mixing_matrix( hParamIsmDec, mixing_matrix, nchan_transport, nchan_out_woLFE ); - - /* store MetaData parameters */ - for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) - { - if ( st_ivas->hParamIsmDec->azimuth_values[ch] > 180.0f ) - { - st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hParamIsmDec->azimuth_values[ch] - 360.0f; - } - else - { - st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hParamIsmDec->azimuth_values[ch]; - } - - st_ivas->hIsmMetaData[ch]->elevation = st_ivas->hParamIsmDec->elevation_values[ch]; - } - - pop_wmops(); - - return; -} -#endif /*-------------------------------------------------------------------------* * ivas_ism_dec_digest_tc() @@ -1533,10 +1250,6 @@ void ivas_param_ism_params_to_masa_param_mapping( st_ivas->hISMDTX.dtx_flag = 1; } -#ifndef FIX_1022_REMOVE_PARAMISM_DEC - if ( st_ivas->nchan_ism > 1 ) - { -#endif if ( st_ivas->hISMDTX.dtx_flag ) { float energy_ratio; @@ -1600,27 +1313,6 @@ void ivas_param_ism_params_to_masa_param_mapping( } } } -#ifndef FIX_1022_REMOVE_PARAMISM_DEC - } - else - { - hSpatParamRendCom->numSimultaneousDirections = 1; - azimuth[0] = (int16_t) roundf( hParamIsmDec->azimuth_values[0] ); - elevation[0] = (int16_t) roundf( hParamIsmDec->elevation_values[0] ); - - for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) - { - for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) - { - hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; - hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; - hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = 1.0f; - hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = 0.0f; - hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = 0.0; - } - } - } -#endif return; } -- GitLab From 18a24a796cfddd53c3b5b3ed1d6eb7c2f32f5ff7 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 26 Mar 2024 21:23:47 +0100 Subject: [PATCH 595/601] [cleanup] accept FIX_1035_HT_OSBA --- lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 92d5da488b..94a602839a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,7 +158,6 @@ #define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ -#define FIX_1035_HT_OSBA /* Dlb: issue 1035: Issue with headtracking in OSBA*/ /* #################### End BE switches ################################## */ /* #################### Start NON-BE switches ############################ */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index a624e81eee..21db31e81a 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1122,11 +1122,7 @@ ivas_error ivas_binRenderer_open( /* Define of head rotation has to be done in binRendeder in CLDFB*/ hBinRenderer->rotInCldfb = 0; -#ifdef FIX_1035_HT_OSBA if ( st_ivas->ivas_format == MC_FORMAT || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) -#else - if ( st_ivas->ivas_format == MC_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) -#endif { hBinRenderer->rotInCldfb = 1; } -- GitLab From 312ba9f1ea10afb475d0bf47a289094843c15d33 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 26 Mar 2024 21:24:55 +0100 Subject: [PATCH 596/601] [cleanup] accept NONBE_FIX_1021_ISM_BRIR_RS_FLUSH --- lib_com/ivas_prot.h | 2 -- lib_com/options.h | 1 - lib_dec/ivas_ism_renderer.c | 14 -------------- lib_dec/ivas_jbm_dec.c | 12 ------------ lib_dec/ivas_osba_dec.c | 4 ---- 5 files changed, 33 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index da0e6e7eae..757db691e9 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5204,9 +5204,7 @@ void ivas_ism_renderer_close( void ivas_ism_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH const RENDERER_TYPE renderer_type, /* i : active renderer type */ -#endif float *output_f[], /* i/o: core-coder transport channels/object output */ const int16_t n_samples_to_render /* i : output frame length per channel */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 94a602839a..5ac0e36092 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1021_ISM_BRIR_RS_FLUSH /* FhG: issue #1021: fix ISM with JBM and RS renderer flushing*/ #define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 33e05a0e6a..d2e7bb4136 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -141,9 +141,7 @@ void ivas_ism_renderer_close( void ivas_ism_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH const RENDERER_TYPE renderer_type, /* i : active renderer type */ -#endif float *output_f[], /* i/o: core-coder transport channels/object output */ const int16_t n_samples_to_render /* i : output frame length per channel */ ) @@ -175,15 +173,7 @@ void ivas_ism_render_sf( assert( slots_to_render == 0 ); assert( last_sf <= st_ivas->hTcBuffer->nb_subframes ); #endif -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH num_objects = st_ivas->nchan_ism; -#else - num_objects = st_ivas->nchan_transport; - if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) - { - num_objects = st_ivas->nchan_ism; - } -#endif nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; @@ -288,11 +278,7 @@ void ivas_ism_render_sf( n_samples_rendered_loop += n_samples_in_subframe; /* update rendered subframe and slots info for all cases apart from a following crend call, the update will then happen in the crend call*/ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH if ( renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) -#else - if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) -#endif { st_ivas->hTcBuffer->subframes_rendered += 1; st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 1c550fa68f..e022c35212 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1093,11 +1093,7 @@ ivas_error ivas_jbm_dec_render( if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf( st_ivas, st_ivas->renderer_type, p_output, *nSamplesRendered ); -#else - ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); -#endif } else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { @@ -1235,11 +1231,7 @@ ivas_error ivas_jbm_dec_render( } /* render objects */ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf( st_ivas, st_ivas->renderer_type, p_output, *nSamplesRendered ); -#else - ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); -#endif /* add already rendered SBA part */ for ( n = 0; n < nchan_out; n++ ) @@ -1636,11 +1628,7 @@ ivas_error ivas_jbm_dec_flush_renderer( /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity ); -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf( st_ivas, renderer_type_old, p_output, hTcBuffer->n_samples_granularity ); -#else - ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); -#endif #if defined SPLIT_REND_WITH_HEAD_ROT if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index 65e05f78be..7473cbaa75 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -284,11 +284,7 @@ ivas_error ivas_osba_render_sf( if ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) { -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf( st_ivas, st_ivas->renderer_type, p_output_ism, *nSamplesRendered ); -#else - ivas_ism_render_sf( st_ivas, p_output_ism, *nSamplesRendered ); -#endif } for ( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) -- GitLab From ff9b79956e663a3931708b371b5bf893735904de Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 26 Mar 2024 21:26:23 +0100 Subject: [PATCH 597/601] [cleanup] accept NONBE_FIX_1034_DRY_MASA_RATIOS --- lib_com/ivas_cnst.h | 4 ---- lib_com/options.h | 1 - lib_enc/ivas_masa_enc.c | 12 ------------ 3 files changed, 17 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index b9e6c2cfda..cd7a38580b 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1195,11 +1195,7 @@ enum #define MASA_COHERENCE_TOLERANCE 0.1f #define MASA_COHERENCE_THRESHOLD 0.1f #define MASA_RATIO_TOLERANCE 0.1f -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS #define MASA_RATIO_THRESHOLD 0.015f -#else -#define MASA_RATIO_THRESHOLD 0.1f -#endif #define MASA_ANGLE_TOLERANCE 0.5f #define MASA_LIMIT_NO_BANDS_SUR_COH 8 #define MINIMUM_BIT_BUDGET_NORMAL_META 100 diff --git a/lib_com/options.h b/lib_com/options.h index 5ac0e36092..baac651607 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,6 @@ /* any switch which is non-be wrt selection floating point code */ /* all switches in this category should start with "NONBE_" */ -#define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 466287a0fd..e4b536dbee 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -1260,9 +1260,7 @@ void ivas_masa_combine_directions( ambience2dir = 1.0f - ratioSum; hMeta->directional_meta[0].energy_ratio[j][i] = sumVecLen[j][i] / ( hMeta->directional_meta[0].energy_ratio[j][i] + hMeta->directional_meta[1].energy_ratio[j][i] + ambience2dir / 2.0f ); hMeta->directional_meta[1].energy_ratio[j][i] = 0.0f; -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS hMeta->common_meta.diffuse_to_total_ratio[j][i] = 1.0f - hMeta->directional_meta[0].energy_ratio[j][i]; -#endif if ( computeCoherence ) { ambience1dir = 1.0f - hMeta->directional_meta[0].energy_ratio[j][i]; @@ -1451,9 +1449,7 @@ static void detect_metadata_composition( { for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; -#endif hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; @@ -1530,11 +1526,7 @@ static void compensate_energy_ratios( uint8_t numDirs; hMeta = &( hMasa->masaMetadata ); -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS numDirs = hMasa->config.numberOfDirections; -#else - numDirs = hMeta->descriptive_meta.numberOfDirections + 1; -#endif for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { @@ -2150,19 +2142,15 @@ static void copy_masa_metadata_subframe( ) { uint8_t dir; -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS uint8_t band; -#endif /* directional metadata */ for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) { -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { hMetaTo->directional_meta[dir].spherical_index[sfTo][band] = hMetaFrom->directional_meta[dir].spherical_index[sfFrom][band]; } -#endif mvr2r( hMetaFrom->directional_meta[dir].azimuth[sfFrom], hMetaTo->directional_meta[dir].azimuth[sfTo], MASA_FREQUENCY_BANDS ); mvr2r( hMetaFrom->directional_meta[dir].elevation[sfFrom], hMetaTo->directional_meta[dir].elevation[sfTo], MASA_FREQUENCY_BANDS ); mvr2r( hMetaFrom->directional_meta[dir].energy_ratio[sfFrom], hMetaTo->directional_meta[dir].energy_ratio[sfTo], MASA_FREQUENCY_BANDS ); -- GitLab From dfbcf03b76a2899303c8b854e287908cb7b36714 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 26 Mar 2024 21:29:37 +0100 Subject: [PATCH 598/601] formatting --- lib_dec/ivas_ism_param_dec.c | 90 ++++++++++++++++++------------------ lib_dec/ivas_ism_renderer.c | 6 +-- lib_dec/ivas_mc_param_dec.c | 5 +- 3 files changed, 50 insertions(+), 51 deletions(-) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 84caf81b6d..2e3720c949 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -1250,69 +1250,69 @@ void ivas_param_ism_params_to_masa_param_mapping( st_ivas->hISMDTX.dtx_flag = 1; } - if ( st_ivas->hISMDTX.dtx_flag ) - { - float energy_ratio; - energy_ratio = powf( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence, 2.0f ); + if ( st_ivas->hISMDTX.dtx_flag ) + { + float energy_ratio; + energy_ratio = powf( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence, 2.0f ); - hSpatParamRendCom->numSimultaneousDirections = 1; - azimuth[0] = (int16_t) roundf( hParamIsmDec->azimuth_values[0] ); - elevation[0] = (int16_t) roundf( hParamIsmDec->elevation_values[0] ); + hSpatParamRendCom->numSimultaneousDirections = 1; + azimuth[0] = (int16_t) roundf( hParamIsmDec->azimuth_values[0] ); + elevation[0] = (int16_t) roundf( hParamIsmDec->elevation_values[0] ); - for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) { - for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) - { - hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; - hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; + hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; + hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; - hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = energy_ratio; + hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = energy_ratio; - hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = 0.0f; - hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = 0.0; - } + hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = 0.0f; + hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = 0.0; } } - else + } + else + { + hSpatParamRendCom->numSimultaneousDirections = 2; + for ( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) { - hSpatParamRendCom->numSimultaneousDirections = 2; - for ( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) - { - brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; - brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; - azimuth[0] = (int16_t) roundf( hParamIsmDec->azimuth_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]] ); - elevation[0] = (int16_t) roundf( hParamIsmDec->elevation_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]] ); - power_ratio[0] = hParamIsmDec->power_ratios[band_idx][0][0]; + azimuth[0] = (int16_t) roundf( hParamIsmDec->azimuth_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]] ); + elevation[0] = (int16_t) roundf( hParamIsmDec->elevation_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]] ); + power_ratio[0] = hParamIsmDec->power_ratios[band_idx][0][0]; - azimuth[1] = (int16_t) roundf( hParamIsmDec->azimuth_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]] ); - elevation[1] = (int16_t) roundf( hParamIsmDec->elevation_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]] ); - power_ratio[1] = hParamIsmDec->power_ratios[band_idx][0][1]; + azimuth[1] = (int16_t) roundf( hParamIsmDec->azimuth_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]] ); + elevation[1] = (int16_t) roundf( hParamIsmDec->elevation_values[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]] ); + power_ratio[1] = hParamIsmDec->power_ratios[band_idx][0][1]; - for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) { - for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) - { - hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; - hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; - hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = power_ratio[0]; - hSpatParamRendCom->azimuth2[sf_idx][bin_idx] = azimuth[1]; - hSpatParamRendCom->elevation2[sf_idx][bin_idx] = elevation[1]; - hSpatParamRendCom->energy_ratio2[sf_idx][bin_idx] = power_ratio[1]; - } + hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; + hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; + hSpatParamRendCom->energy_ratio1[sf_idx][bin_idx] = power_ratio[0]; + hSpatParamRendCom->azimuth2[sf_idx][bin_idx] = azimuth[1]; + hSpatParamRendCom->elevation2[sf_idx][bin_idx] = elevation[1]; + hSpatParamRendCom->energy_ratio2[sf_idx][bin_idx] = power_ratio[1]; } } + } - for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) { - for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) - { - hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = 0.0f; - hSpatParamRendCom->spreadCoherence2[sf_idx][bin_idx] = 0.0f; - hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = 0.0; - } + hSpatParamRendCom->spreadCoherence[sf_idx][bin_idx] = 0.0f; + hSpatParamRendCom->spreadCoherence2[sf_idx][bin_idx] = 0.0f; + hSpatParamRendCom->surroundingCoherence[sf_idx][bin_idx] = 0.0; } } + } return; } diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index d2e7bb4136..b890dd98e5 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -140,10 +140,10 @@ void ivas_ism_renderer_close( *-------------------------------------------------------------------------*/ void ivas_ism_render_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const RENDERER_TYPE renderer_type, /* i : active renderer type */ - float *output_f[], /* i/o: core-coder transport channels/object output */ - const int16_t n_samples_to_render /* i : output frame length per channel */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t n_samples_to_render /* i : output frame length per channel */ ) { int16_t i, j, k, j2; diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 6fe079eded..4e70916212 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1452,8 +1452,8 @@ void ivas_param_mc_dec_digest_tc( } - /* generate mixing matrices */ - ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); + /* generate mixing matrices */ + ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); pop_wmops(); @@ -1801,7 +1801,6 @@ void ivas_param_mc_dec_render( } - /*------------------------------------------------------------------------- * param_mc_dec_init() * -- GitLab From cd4ac0c370490f9b8b7f817a66b6095388de39b5 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 27 Mar 2024 08:58:27 +0100 Subject: [PATCH 599/601] tag codec-msan job with ivas-linux-fast --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6aaf34163b..595e3ed010 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -529,6 +529,8 @@ codec-smoke-test: codec-msan: extends: - .sanitizer-selftest-on-mr + tags: + - ivas-linux-fast before_script: - CLANG_NUM=1 - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_STV_SANITIZERS -- GitLab From 22a72e0b6456fecade61f62497c7c08ce4b95dd4 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 27 Mar 2024 09:44:50 +0100 Subject: [PATCH 600/601] added test case for MC RS with switching to and from TD binaural renderer and external htrfs and head head rotation --- scripts/config/self_test.prm | 4 ++++ scripts/config/self_test_ltv.prm | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 49344f04ed..a075ba2e4b 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -1321,6 +1321,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g ../IVAS_cod -mc 5_1_2 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv512MC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 16 bit testv/stv512MC48c.wav_sw_48-16_Binaural_room.tst +// Multi-channel 7_1 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out (model from file), head rotation +../IVAS_cod -mc 7_1 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv71MC48c.wav bit +../IVAS_dec -t testv/headrot.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv71C48c.wav_sw_48-48_Binaural_model_file_headrot.tst + // Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, HOA3 out ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv714MC48c.wav bit ../IVAS_dec HOA3 48 bit testv/stv51MC48c.wav_sw_48-48_HOA3.tst diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 9b453c36da..87badcc812 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1321,6 +1321,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g ../IVAS_cod -mc 5_1_2 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_MC512.wav bit ../IVAS_dec BINAURAL_ROOM_IR 16 bit testv/ltv48_MC512.wav_sw_48-16_Binaural_room.tst +// Multi-channel 7_1 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out (model from file), head rotation +../IVAS_cod -mc 7_1 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_MC71.wav bit +../IVAS_dec -t testv/headrot.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv71C48c.wav_sw_48-48_Binaural_model_file_headrot.tst + // Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, HOA3 out ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/ltv48_MC714.wav bit ../IVAS_dec HOA3 48 bit testv/ltv48_MC51.wav_sw_48-48_HOA3.tst -- GitLab From 3422fc5cb2b9f55e55624b4a248b9061874885de Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 3 Apr 2024 12:25:38 +0200 Subject: [PATCH 601/601] increase timeout for ltv selftest sanitizer jobs --- .gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4594a1bde2..3a0bf48e45 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1572,7 +1572,7 @@ ltv-msan: - .sanitizer-selftest-ltv rules: - if: $SANITIZER_SCHEDULE_E - timeout: 1 hour + timeout: 2 hour tags: - ivas-linux-fast before_script: @@ -1588,10 +1588,10 @@ ltv-asan: rules: - if: $SANITIZER_SCHEDULE_E when: delayed - start_in: 1 hours + start_in: 2 hours tags: - ivas-linux-fast - timeout: 1 hour + timeout: 2 hour before_script: - CLANG_NUM=2 - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_LTV_SANITIZERS @@ -1605,10 +1605,10 @@ ltv-usan: rules: - if: $SANITIZER_SCHEDULE_E when: delayed - start_in: 2 hours + start_in: 3 hours tags: - ivas-linux-fast - timeout: 1 hour + timeout: 2 hour before_script: - CLANG_NUM=3 - SELFTEST_SANITY_TIMEOUT=$TESTCASE_TIMEOUT_LTV_SANITIZERS -- GitLab