Commit 079dbd07 authored by Ke Zhao's avatar Ke Zhao
Browse files

Merge branch 'optimize-split-rendering-tests' into 'main'

Optimize split rendering tests

See merge request !945
parents 387e94ec adfec61e
Loading
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -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"]
@@ -144,6 +145,8 @@ IVAS_MAX_ISM_BITRATE = {
    "4": "512000",
}

RENDERER_FORMATS = ["BINAURAL_SPLIT_CODED", "BINAURAL_SPLIT_PCM"]

INPUT_DURATION_SEC = 5

""" PLC constants """
@@ -165,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
@@ -185,7 +188,7 @@ SPLIT_PRE_REND_CMD = [
    "-o",
    "",  # 10 -> split rendering bitstream
    "-of",
    "BINAURAL_SPLIT_CODED",
    "",  # 12 -> renderer format
    "-tf",
    "",  # 14 -> post-trajectory file
]
@@ -198,7 +201,7 @@ SPLIT_POST_REND_CMD = [
    "-i",
    "",  # 4 -> split rendering bitstream
    "-if",
    "BINAURAL_SPLIT_CODED",
    "",  # 6 -> renderer format
    "-o",
    "",  # 8 -> output file
    "-of",
+64 −11
Original line number Diff line number Diff line
@@ -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)

@@ -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",
    )
+61 −8
Original line number Diff line number Diff line
@@ -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)

@@ -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",
    )
+27 −13
Original line number Diff line number Diff line
@@ -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
@@ -99,10 +102,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:
@@ -116,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
@@ -126,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)
@@ -141,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]:
@@ -152,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 plc_error_pattern:
        if renderer_fmt == "BINAURAL_SPLIT_PCM":
            split_md_file = tmp_dir.joinpath("split_md.bin")
        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"
            f"{in_fmt}_{renderer_fmt}_{pre_trajectory.stem}_split_ext_{post_trajectory.stem}_config_{render_config.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"
            )

        if plc_error_pattern:
            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"):
@@ -178,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]

@@ -190,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)]