diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f6648a5274afd72340ddcfafef1cf829c41926c6..6aaf34163bec8a7fd3340bf6d0e9029c0324f192 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1539,6 +1539,8 @@ ltv-usan: paths: - ep_015.g192 - dly_profile.dat + - head_rot_traj.csv + - exof_traj.csv - ./LOGS_PLC - ./LOGS_noPLC diff --git a/ci/create_trajectories.py b/ci/create_trajectories.py new file mode 100644 index 0000000000000000000000000000000000000000..6b957df0926bdb2f08a43727571d160ea164894a --- /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 d8986233fb64c8129dd576eb691fa8a999870d68..65c88ee0c0c7f374919c5c5f79de914ee3422f13 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 + SCRIPT_DIR = pathlib.Path("./scripts").resolve() DURATION = "120" @@ -54,12 +58,23 @@ 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 = 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] +OTR_ARGS = ["-otr", "avg"] +BINAURAL_OUT_ARGS = HEAD_ROT_ARGS + EXOF_ARGS + OTR_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 @@ -112,6 +127,12 @@ def get_modes(in_format: str) -> list: return mode_list +def assemble_oc_dict(out_formats: list): + oc_dict = {of: ARGS_FOR_OC.get(of, list()) for of in out_formats} + + return json.dumps(oc_dict) + + def get_md_file_command(in_format: str) -> list: cmd = list() @@ -127,11 +148,19 @@ def get_md_file_command(in_format: str) -> list: 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) - if len(modes) == 0: return 0 + md_file_command = get_md_file_command(in_format) + oc_str = assemble_oc_dict(out_formats) + + # 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 = [ str(SCRIPT_DIR.joinpath("IvasBuildAndRunChecks.py")), @@ -146,7 +175,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, @@ -154,6 +183,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)