From 227547f3dfec77c95b9bf51e307d3e03a8cfd19d Mon Sep 17 00:00:00 2001 From: Ke Zhao Date: Fri, 11 Aug 2023 13:52:14 +1000 Subject: [PATCH 1/5] Fix renderer delay compensation with delays greater than 1 frame --- apps/renderer.c | 24 ++++++++++++++++++++++-- lib_com/options.h | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 6255e87e44..986a221c4c 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1840,7 +1840,11 @@ int main( if ( audioWriter != NULL ) { #endif - if ( delayNumSamples < outBufferSize ) +#ifdef FIX_LARGE_RENDERER_DELAY_COMP + if ( delayNumSamples * num_out_channels < outBufferSize ) +#else + if ( delayNumSamples < outBufferSize ) +#endif { if ( AudioFileWriter_write( audioWriter, &outInt16Buffer[delayNumSamples * num_out_channels], outBufferSize - ( delayNumSamples * num_out_channels ) ) != IVAS_ERR_OK ) { @@ -1851,7 +1855,11 @@ int main( } else { - delayNumSamples -= (int16_t) outBufferSize; +#ifdef FIX_LARGE_RENDERER_DELAY_COMP + delayNumSamples -= (int16_t) ( outBufferSize / num_out_channels ); +#else + delayNumSamples -= (int16_t) outBufferSize; +#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT } @@ -1950,6 +1958,18 @@ int main( #ifdef SPLIT_REND_WITH_HEAD_ROT if ( audioWriter != NULL ) { +#endif +#ifdef FIX_LARGE_RENDERER_DELAY_COMP + while ( zeroPad > (int16_t) ( outBufferSize / outBuffer.config.numChannels ) ) + { + memset( outInt16Buffer, 0, outBufferSize * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + exit( -1 ); + } + zeroPad -= (int16_t) ( outBufferSize / outBuffer.config.numChannels ); + } #endif memset( outInt16Buffer, 0, zeroPad * outBuffer.config.numChannels * sizeof( int16_t ) ); if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPad * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) diff --git a/lib_com/options.h b/lib_com/options.h index 5774d4a8b2..6409ec63d8 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -233,6 +233,7 @@ #define FIX_657_REMOVE_EDITING /* Nokia: Remove remaining unused coded related to object editing */ #define FIX_634_MASA_JBM_UNUSED_PARAMETER /* Nokia: Fix issue 634 by removing the unnecessary argument. */ #define FIX_675_WB_OMASA /* Nokia: Fix for issue 675 solving the crash in OMASA for WB input */ +#define FIX_LARGE_RENDERER_DELAY_COMP /* Fix renderer delay compensation with delays greater than 1 frame */ /* ################## End BE DEVELOPMENT switches ######################### */ -- GitLab From fc40f39218b68239d08301e4abbd345929ba2056 Mon Sep 17 00:00:00 2001 From: Ke Zhao Date: Fri, 11 Aug 2023 16:46:38 +1000 Subject: [PATCH 2/5] Use a new variable to keep the value of zeroPad constant --- apps/renderer.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 986a221c4c..58c753fe0b 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -810,6 +810,9 @@ int main( int16_t delayNumSamples = -1; int16_t delayNumSamples_orig = 0; int16_t zeroPad = 0; +#ifdef FIX_LARGE_RENDERER_DELAY_COMP + int16_t zeroPadToWrite = 0; +#endif int32_t delayTimeScale = 0; int16_t i, numChannels; ivas_error error = IVAS_ERR_OK; @@ -1960,7 +1963,7 @@ int main( { #endif #ifdef FIX_LARGE_RENDERER_DELAY_COMP - while ( zeroPad > (int16_t) ( outBufferSize / outBuffer.config.numChannels ) ) + for ( zeroPadToWrite = zeroPad; zeroPadToWrite > frameSize_smpls; zeroPadToWrite -= frameSize_smpls ) { memset( outInt16Buffer, 0, outBufferSize * sizeof( int16_t ) ); if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) @@ -1968,15 +1971,23 @@ int main( fprintf( stderr, "\nOutput audio file writer error\n" ); exit( -1 ); } - zeroPad -= (int16_t) ( outBufferSize / outBuffer.config.numChannels ); } -#endif - memset( outInt16Buffer, 0, zeroPad * outBuffer.config.numChannels * sizeof( int16_t ) ); - if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPad * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) + + memset( outInt16Buffer, 0, zeroPadToWrite * outBuffer.config.numChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nOutput audio file writer error\n" ); exit( -1 ); } + zeroPadToWrite = 0; +#else + memset( outInt16Buffer, 0, zeroPad * outBuffer.config.numChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPad * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + exit( -1 ); + } +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT } #endif -- GitLab From fabf185d1163165b6e9d7cd7c5114e1c1f038631 Mon Sep 17 00:00:00 2001 From: Ke Zhao Date: Fri, 11 Aug 2023 20:51:47 +1000 Subject: [PATCH 3/5] Reduce the number of split rendering tests --- tests/split_rendering/constants.py | 9 ++++---- tests/split_rendering/test_split_rendering.py | 22 +++++++++---------- .../test_split_rendering_be_comparison.py | 16 +++++++------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/tests/split_rendering/constants.py b/tests/split_rendering/constants.py index 751b632f93..9424a8500c 100644 --- a/tests/split_rendering/constants.py +++ b/tests/split_rendering/constants.py @@ -53,10 +53,6 @@ from tests.renderer.constants import ( FORMAT_TO_FILE_COMPARETEST, FORMAT_TO_FILE_SMOKETEST, FORMAT_TO_METADATA_FILES, - INPUT_FORMATS_AMBI, - INPUT_FORMATS_ISM, - INPUT_FORMATS_MASA, - INPUT_FORMATS_MC, METADATA_SCENES_TO_TEST, ) @@ -132,6 +128,11 @@ FORMAT_TO_NCHAN = { "MASA2": 2, } +INPUT_FORMATS_AMBI_SPLIT_REND = ["FOA", "HOA3"] +INPUT_FORMATS_MC_SPLIT_REND = ["5_1", "7_1_4"] +INPUT_FORMATS_ISM_SPLIT_REND = ["ISM4"] +INPUT_FORMATS_MASA_SPLIT_REND = ["MASA2"] + IVAS_BITRATES_AMBI = ["80000", "512000"] IVAS_BITRATES_MC = ["128000", "160000", "384000"] IVAS_BITRATES_ISM = ["128000"] diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index 7d0ef24393..b18dce760d 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -41,9 +41,9 @@ def check_xfail(test_info, in_fmt, render_config, bitrate=None): and "0dof" in render_config and ( "lc3plus" in render_config - or (in_fmt in INPUT_FORMATS_ISM or in_fmt in INPUT_FORMATS_MC) + or (in_fmt in INPUT_FORMATS_ISM_SPLIT_REND or in_fmt in INPUT_FORMATS_MC_SPLIT_REND) or ( - "external_split" in test_info.node.name and in_fmt in INPUT_FORMATS_AMBI + "external_split" in test_info.node.name and in_fmt in INPUT_FORMATS_AMBI_SPLIT_REND ) # CREND for external renderer ambisonics rendering uses LC3plus by default ) ): @@ -56,7 +56,7 @@ def check_xfail(test_info, in_fmt, render_config, bitrate=None): if ( bitrate - and (in_fmt in INPUT_FORMATS_ISM) + and (in_fmt in INPUT_FORMATS_ISM_SPLIT_REND) and (int(bitrate) > int(IVAS_MAX_ISM_BITRATE[in_fmt[-1]])) ): pytest.skip(f"Unsupported configuration with {in_fmt} at {bitrate}bps") @@ -68,7 +68,7 @@ def check_xfail(test_info, in_fmt, render_config, bitrate=None): @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_AMBI) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_AMBI) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI_SPLIT_REND) def test_ambisonics_full_chain_split( test_info, in_fmt, bitrate, render_config, trajectory ): @@ -89,7 +89,7 @@ def test_ambisonics_full_chain_split( @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_AMBI) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI_SPLIT_REND) def test_ambisonics_external_split(test_info, in_fmt, render_config, trajectory): check_xfail(test_info, in_fmt, render_config) @@ -111,7 +111,7 @@ def test_ambisonics_external_split(test_info, in_fmt, render_config, trajectory) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MC) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MC) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC[2:]) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC_SPLIT_REND) def test_multichannel_full_chain_split( test_info, in_fmt, bitrate, render_config, trajectory ): @@ -132,7 +132,7 @@ def test_multichannel_full_chain_split( @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MC) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC[2:]) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC_SPLIT_REND) def test_multichannel_external_split(test_info, in_fmt, render_config, trajectory): check_xfail(test_info, in_fmt, render_config) @@ -154,7 +154,7 @@ def test_multichannel_external_split(test_info, in_fmt, render_config, trajector @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_ISM) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_ISM) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM_SPLIT_REND) def test_ism_full_chain_split(test_info, in_fmt, bitrate, render_config, trajectory): check_xfail(test_info, in_fmt, render_config, bitrate) @@ -173,7 +173,7 @@ def test_ism_full_chain_split(test_info, in_fmt, bitrate, render_config, traject @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_ISM) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM_SPLIT_REND) def test_ism_external_split(test_info, in_fmt, render_config, trajectory): check_xfail(test_info, in_fmt, render_config) @@ -195,7 +195,7 @@ def test_ism_external_split(test_info, in_fmt, render_config, trajectory): @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MASA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MASA) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA_SPLIT_REND) def test_masa_full_chain_split(test_info, in_fmt, bitrate, render_config, trajectory): check_xfail(test_info, in_fmt, render_config, bitrate) @@ -218,7 +218,7 @@ def test_masa_full_chain_split(test_info, in_fmt, bitrate, render_config, trajec @pytest.mark.parametrize("error_pattern", PLC_ERROR_PATTERNS) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_PLC) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI[-1:]) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI_SPLIT_REND[-1:]) def test_post_rend_plc(test_info, in_fmt, render_config, trajectory, error_pattern): check_xfail(test_info, in_fmt, render_config) diff --git a/tests/split_rendering/test_split_rendering_be_comparison.py b/tests/split_rendering/test_split_rendering_be_comparison.py index 9b0f03b8bb..54136f8d5d 100644 --- a/tests/split_rendering/test_split_rendering_be_comparison.py +++ b/tests/split_rendering/test_split_rendering_be_comparison.py @@ -41,7 +41,7 @@ from tests.split_rendering.utils import * @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_AMBI) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_AMBI) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI_SPLIT_REND) def test_ambisonics_full_chain_split( test_info, in_fmt, bitrate, render_config, trajectory ): @@ -62,7 +62,7 @@ def test_ambisonics_full_chain_split( @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_AMBI) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI_SPLIT_REND) def test_ambisonics_external_split(test_info, in_fmt, render_config, trajectory): check_xfail(test_info, in_fmt, render_config) @@ -84,7 +84,7 @@ def test_ambisonics_external_split(test_info, in_fmt, render_config, trajectory) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MC) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MC) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC[2:]) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC_SPLIT_REND) def test_multichannel_full_chain_split( test_info, in_fmt, bitrate, render_config, trajectory ): @@ -105,7 +105,7 @@ def test_multichannel_full_chain_split( @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MC) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC[2:]) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MC_SPLIT_REND) def test_multichannel_external_split(test_info, in_fmt, render_config, trajectory): check_xfail(test_info, in_fmt, render_config) @@ -127,7 +127,7 @@ def test_multichannel_external_split(test_info, in_fmt, render_config, trajector @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_ISM) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_ISM) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM_SPLIT_REND) def test_ism_full_chain_split(test_info, in_fmt, bitrate, render_config, trajectory): check_xfail(test_info, in_fmt, render_config, bitrate) @@ -146,7 +146,7 @@ def test_ism_full_chain_split(test_info, in_fmt, bitrate, render_config, traject @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_ISM) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM_SPLIT_REND) def test_ism_external_split(test_info, in_fmt, render_config, trajectory): check_xfail(test_info, in_fmt, render_config) @@ -168,7 +168,7 @@ def test_ism_external_split(test_info, in_fmt, render_config, trajectory): @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MASA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MASA) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA_SPLIT_REND) def test_masa_full_chain_split(test_info, in_fmt, bitrate, render_config, trajectory): check_xfail(test_info, in_fmt, render_config, bitrate) @@ -191,7 +191,7 @@ def test_masa_full_chain_split(test_info, in_fmt, bitrate, render_config, trajec @pytest.mark.parametrize("error_pattern", PLC_ERROR_PATTERNS) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_PLC) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI[-1:]) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI_SPLIT_REND[-1:]) def test_post_rend_plc(test_info, in_fmt, render_config, trajectory, error_pattern): check_xfail(test_info, in_fmt, render_config) -- GitLab From e9976a6f8bf8122807221a2c4aef598b51c8f1a5 Mon Sep 17 00:00:00 2001 From: Ke Zhao Date: Fri, 11 Aug 2023 20:56:15 +1000 Subject: [PATCH 4/5] Use ISM bitrates specified, instead of maximum bitrate --- tests/split_rendering/utils.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/split_rendering/utils.py b/tests/split_rendering/utils.py index b9bbee20a4..a89cca1a23 100644 --- a/tests/split_rendering/utils.py +++ b/tests/split_rendering/utils.py @@ -99,10 +99,6 @@ def run_full_chain_split_rendering( cmd[3] = str(FORMAT_TO_FILE_SMOKETEST[in_fmt]) cmd[4] = str(ivas_bitstream) - # set maximum ISM bitrate based on number of objects - if in_fmt.upper().startswith("ISM"): - cmd[1] = IVAS_MAX_ISM_BITRATE[in_fmt[3]] - cmd[1:1] = FORMAT_TO_IVAS_COD_FORMAT[in_fmt] if in_meta_files: -- GitLab From 8a608fcfb26895f40fd66ae546f51f6444959660 Mon Sep 17 00:00:00 2001 From: Ke Zhao Date: Fri, 11 Aug 2023 21:00:26 +1000 Subject: [PATCH 5/5] Add split rendering BINAURAL_SPLIT_PCM tests --- tests/split_rendering/constants.py | 8 +-- tests/split_rendering/test_split_rendering.py | 53 +++++++++++++++++++ .../test_split_rendering_be_comparison.py | 53 +++++++++++++++++++ tests/split_rendering/utils.py | 36 +++++++++---- 4 files changed, 138 insertions(+), 12 deletions(-) diff --git a/tests/split_rendering/constants.py b/tests/split_rendering/constants.py index 9424a8500c..7ec9abc662 100644 --- a/tests/split_rendering/constants.py +++ b/tests/split_rendering/constants.py @@ -145,6 +145,8 @@ IVAS_MAX_ISM_BITRATE = { "4": "512000", } +RENDERER_FORMATS = ["BINAURAL_SPLIT_CODED", "BINAURAL_SPLIT_PCM"] + INPUT_DURATION_SEC = 5 """ PLC constants """ @@ -166,7 +168,7 @@ SPLIT_PRE_DEC_CMD = [ "", # 2 -> pre-trajectory file "-render_config", "", # 4 -> render config file - "BINAURAL_SPLIT_CODED", + "", # 5 -> renderer format "48", "", # 7 -> encoder bitstream "", # 8 -> split rendering bitstream @@ -186,7 +188,7 @@ SPLIT_PRE_REND_CMD = [ "-o", "", # 10 -> split rendering bitstream "-of", - "BINAURAL_SPLIT_CODED", + "", # 12 -> renderer format "-tf", "", # 14 -> post-trajectory file ] @@ -199,7 +201,7 @@ SPLIT_POST_REND_CMD = [ "-i", "", # 4 -> split rendering bitstream "-if", - "BINAURAL_SPLIT_CODED", + "", # 6 -> renderer format "-o", "", # 8 -> output file "-of", diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index b18dce760d..d6b959b572 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -233,3 +233,56 @@ def test_post_rend_plc(test_info, in_fmt, render_config, trajectory, error_patte output_path_base=OUTPUT_PATH_CUT, plc_error_pattern=ERROR_PATTERNS_DIR.joinpath(f"{error_pattern}.ep"), ) + + +""" BINAURAL_SPLIT_PCM """ + + +full_chain_split_pcm_params = [ + ("HOA3", "96000", "split_renderer_config_1dof_512k_default"), + ("7_1_4", "512000", "split_renderer_config_3dofhq_512k_lc3plus"), + ("ISM4", "384000", "split_renderer_config_2dof_768k_default"), + # ("MASA2", "256000", "split_renderer_config_3dof_384k_lcld"), +] + +@pytest.mark.parametrize("in_fmt,bitrate,render_config", full_chain_split_pcm_params) +def test_full_chain_split_pcm(test_info, in_fmt, bitrate, render_config): + check_xfail(test_info, in_fmt, render_config, bitrate) + + trajectory = SPLIT_REND_HR_TRAJECTORIES_TO_TEST[0] + post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") + pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") + + run_full_chain_split_rendering( + in_fmt=in_fmt, + bitrate=bitrate, + render_config=RENDER_CFG_DIR.joinpath(f"{render_config}.txt"), + pre_trajectory=pre_trajectory, + post_trajectory=post_trajectory, + output_path_base=OUTPUT_PATH_CUT, + renderer_fmt="BINAURAL_SPLIT_PCM", + ) + + +external_split_pcm_params = [ + ("FOA", "split_renderer_config_3dofhq_512k_lc3plus"), + ("5_1", "split_renderer_config_1dof_768k_default"), + ("ISM1", "split_renderer_config_3dof_384k_lcld"), +] + +@pytest.mark.parametrize("in_fmt,render_config", external_split_pcm_params) +def test_external_split_pcm(test_info, in_fmt, render_config): + check_xfail(test_info, in_fmt, render_config) + + trajectory = SPLIT_REND_HR_TRAJECTORIES_TO_TEST[0] + post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") + pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") + + run_external_split_rendering( + in_fmt=in_fmt, + render_config=RENDER_CFG_DIR.joinpath(f"{render_config}.txt"), + pre_trajectory=pre_trajectory, + post_trajectory=post_trajectory, + output_path_base=OUTPUT_PATH_CUT, + renderer_fmt="BINAURAL_SPLIT_PCM", + ) diff --git a/tests/split_rendering/test_split_rendering_be_comparison.py b/tests/split_rendering/test_split_rendering_be_comparison.py index 54136f8d5d..a300673660 100644 --- a/tests/split_rendering/test_split_rendering_be_comparison.py +++ b/tests/split_rendering/test_split_rendering_be_comparison.py @@ -206,3 +206,56 @@ def test_post_rend_plc(test_info, in_fmt, render_config, trajectory, error_patte post_trajectory=post_trajectory, plc_error_pattern=ERROR_PATTERNS_DIR.joinpath(f"{error_pattern}.ep"), ) + + +""" BINAURAL_SPLIT_PCM """ + + +full_chain_split_pcm_params = [ + ("HOA3", "96000", "split_renderer_config_1dof_512k_default"), + ("7_1_4", "512000", "split_renderer_config_3dofhq_512k_lc3plus"), + ("ISM4", "384000", "split_renderer_config_2dof_768k_default"), + # ("MASA2", "256000", "split_renderer_config_3dof_384k_lcld"), +] + +@pytest.mark.parametrize("in_fmt,bitrate,render_config", full_chain_split_pcm_params) +def test_full_chain_split_pcm(test_info, in_fmt, bitrate, render_config): + check_xfail(test_info, in_fmt, render_config, bitrate) + + trajectory = SPLIT_REND_HR_TRAJECTORIES_TO_TEST[0] + post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") + pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") + + compare_full_chain_split_args( + test_info, + in_fmt=in_fmt, + bitrate=bitrate, + render_config=RENDER_CFG_DIR.joinpath(f"{render_config}.txt"), + pre_trajectory=pre_trajectory, + post_trajectory=post_trajectory, + renderer_fmt="BINAURAL_SPLIT_PCM", + ) + + +external_split_pcm_params = [ + ("FOA", "split_renderer_config_3dofhq_512k_lc3plus"), + ("5_1", "split_renderer_config_1dof_768k_default"), + ("ISM1", "split_renderer_config_3dof_384k_lcld"), +] + +@pytest.mark.parametrize("in_fmt,render_config", external_split_pcm_params) +def test_external_split_pcm(test_info, in_fmt, render_config): + check_xfail(test_info, in_fmt, render_config) + + trajectory = SPLIT_REND_HR_TRAJECTORIES_TO_TEST[0] + post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") + pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") + + compare_external_split_args( + test_info, + in_fmt=in_fmt, + render_config=RENDER_CFG_DIR.joinpath(f"{render_config}.txt"), + pre_trajectory=pre_trajectory, + post_trajectory=post_trajectory, + renderer_fmt="BINAURAL_SPLIT_PCM", + ) diff --git a/tests/split_rendering/utils.py b/tests/split_rendering/utils.py index a89cca1a23..8130b41467 100644 --- a/tests/split_rendering/utils.py +++ b/tests/split_rendering/utils.py @@ -52,6 +52,7 @@ def run_full_chain_split_rendering( pre_trajectory: Path, post_trajectory: Path, output_path_base: Path, + renderer_fmt: str = "BINAURAL_SPLIT_CODED", binary_suffix: str = "", is_comparetest: bool = False, ) -> Tuple[np.ndarray, int]: @@ -64,8 +65,10 @@ def run_full_chain_split_rendering( cut_in_file = tmp_dir.joinpath("cut_input.wav") ivas_bitstream = tmp_dir.joinpath("ivas.192") split_bitstream = tmp_dir.joinpath("split.bit") + if renderer_fmt == "BINAURAL_SPLIT_PCM": + split_md_file = tmp_dir.joinpath("split_md.bin") out_file = output_path_base.joinpath( - f"{in_fmt}_{bitrate}bps_{pre_trajectory.stem}_split_full_{post_trajectory.stem}__config_{render_config.stem}.wav" + f"{in_fmt}_{bitrate}bps_{renderer_fmt}_{pre_trajectory.stem}_split_full_{post_trajectory.stem}_config_{render_config.stem}.wav" ) # check for metadata files @@ -112,9 +115,13 @@ def run_full_chain_split_rendering( cmd[0] += binary_suffix cmd[2] = str(pre_trajectory) cmd[4] = str(render_config) + cmd[5] = renderer_fmt cmd[7] = str(ivas_bitstream) cmd[8] = str(split_bitstream) + if renderer_fmt == "BINAURAL_SPLIT_PCM": + cmd[5:5] = ["-om", str(split_md_file)] + run_cmd(cmd) # run split renderer @@ -122,9 +129,13 @@ def run_full_chain_split_rendering( cmd[0] += binary_suffix cmd[4] = str(split_bitstream) + cmd[6] = renderer_fmt cmd[8] = str(out_file) cmd[12] = str(post_trajectory) + if renderer_fmt == "BINAURAL_SPLIT_PCM": + cmd[7:7] = ["-im", str(split_md_file)] + run_cmd(cmd) return readfile(out_file) @@ -137,6 +148,7 @@ def run_external_split_rendering( post_trajectory: Path, output_path_base: Path, plc_error_pattern: Path = None, + renderer_fmt: str = "BINAURAL_SPLIT_CODED", binary_suffix: str = "", is_comparetest: bool = False, ) -> Tuple[np.ndarray, int]: @@ -148,15 +160,13 @@ def run_external_split_rendering( with TemporaryDirectory() as tmp_dir: tmp_dir = Path(tmp_dir) split_bitstream = tmp_dir.joinpath("split.bit") + if renderer_fmt == "BINAURAL_SPLIT_PCM": + split_md_file = tmp_dir.joinpath("split_md.bin") + out_file = output_path_base.joinpath( + f"{in_fmt}_{renderer_fmt}_{pre_trajectory.stem}_split_ext_{post_trajectory.stem}_config_{render_config.stem}.wav" + ) if plc_error_pattern: - out_file = output_path_base.joinpath( - f"{in_fmt}_{pre_trajectory.stem}_split_ext_{post_trajectory.stem}__config_{render_config.stem}_plc_{plc_error_pattern.stem}.wav" - ) - else: - out_file = output_path_base.joinpath( - f"{in_fmt}_{pre_trajectory.stem}_split_ext_{post_trajectory.stem}__config_{render_config.stem}.wav" - ) - + out_file = out_file.with_stem(f"{out_file.stem}_plc_{plc_error_pattern.stem}") # check for metadata files if in_fmt.upper().startswith("ISM") or in_fmt.upper().startswith("MASA"): @@ -174,8 +184,12 @@ def run_external_split_rendering( cmd[6] = str(FORMAT_TO_FILE_SMOKETEST[in_fmt]) cmd[8] = in_fmt cmd[10] = str(split_bitstream) + cmd[12] = renderer_fmt cmd[14] = str(pre_trajectory) + if renderer_fmt == "BINAURAL_SPLIT_PCM": + cmd[13:13] = ["-om", str(split_md_file)] + if in_meta_files: cmd[9:9] = ["-im", *in_meta_files] @@ -186,9 +200,13 @@ def run_external_split_rendering( cmd[0] += binary_suffix cmd[4] = str(split_bitstream) + cmd[6] = renderer_fmt cmd[8] = str(out_file) cmd[12] = str(post_trajectory) + if renderer_fmt == "BINAURAL_SPLIT_PCM": + cmd[7:7] = ["-im", str(split_md_file)] + if plc_error_pattern: cmd[1:1] = ["-prbfi", str(plc_error_pattern)] -- GitLab