Skip to content
Commits on Source (32)
...@@ -69,7 +69,9 @@ stages: ...@@ -69,7 +69,9 @@ stages:
# compare to last target branch commit before pipeline was created # compare to last target branch commit before pipeline was created
- target_commit=$(git log $CI_MERGE_REQUEST_TARGET_BRANCH_NAME -1 --oneline --before=${CI_PIPELINE_CREATED_AT} --format=%H) - target_commit=$(git log $CI_MERGE_REQUEST_TARGET_BRANCH_NAME -1 --oneline --before=${CI_PIPELINE_CREATED_AT} --format=%H)
.check-for-testvectors: &check-for-testvectors
# check if the testvector files specified in scripts/config/ci_linux*.json are present
- python3 -m pytest tests/ci/test_vectors_available.py
.merge-request-comparison-setup-codec: .merge-request-comparison-setup-codec:
&merge-request-comparison-setup-codec ### build test binaries, initial clean for paranoia reasons &merge-request-comparison-setup-codec ### build test binaries, initial clean for paranoia reasons
...@@ -660,30 +662,35 @@ clang-format-check: ...@@ -660,30 +662,35 @@ clang-format-check:
expose_as: 'formatting patch' expose_as: 'formatting patch'
# check for crashes if first received frame on decoder side is an SID # check for crashes if first received frame on decoder side is an SID
.check-first-frame-is-sid: check-first-frame-is-sid:
extends: extends:
- .test-job-linux-needs-testv-dir - .test-job-linux-needs-testv-dir
- .rules-merge-request - .rules-merge-request
tags: tags:
- ivas-linux - ivas-linux
stage: test stage: test
needs: ["build-codec-linux-cmake"] # needs: ["build-codec-linux-cmake"]
script: script:
- *print-common-info - *print-common-info
- *update-ltv-repo - *update-ltv-repo
- *check-for-testvectors
- cmake . - cmake .
- make -j - make -j
# TODO: for some MASA modes, we currently do not have testvectors that actually trigger DTX # TODO: for some MASA modes, we currently do not have testvectors that actually trigger DTX
- modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v MASA) # SBA is run separately to use shorter part of file
- echo $modes - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v MASA | grep -v SBA)
- scripts/runIvasCodec.py -p scripts/config/ci_linux_sidstart_test.json -m $modes -s --bs_length 500 - scripts/runIvasCodec.py -p scripts/config/ci_linux_sidstart_test.json -m $modes -s --bs_length 500 -U 0:20 || exit_code_no_sba=$?
- modes=$(scripts/runIvasCodec.py -l | grep dtx | grep SBA)
- scripts/runIvasCodec.py -p scripts/config/ci_linux_sidstart_test.json -m $modes -s --bs_length 500 -U 70:80 || exit_code_sba=$?
- if [ $exit_code_no_sba != 0 || $exit_code_sba != 0]; then exit 1; fi
artifacts: artifacts:
paths: paths:
- out/logs - out/logs
when: on_failure when: on_failure
name: "$CI_JOB_NAME--$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--sidstart" name: "$CI_JOB_NAME--$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--sidstart"
expose_as: "logs-sidstart" expose_as: "logs-sidstart"
expire_in: "5 days"
# --------------------------------------------------------------- # ---------------------------------------------------------------
# Test jobs for main branch # Test jobs for main branch
......
...@@ -161,6 +161,9 @@ ...@@ -161,6 +161,9 @@
#define IGF_TUNING_96 /* FhG: Issue 546: slight tuning of IGF config used in 96 kbps stereo, 128 kbps SBA and others */ #define IGF_TUNING_96 /* FhG: Issue 546: slight tuning of IGF config used in 96 kbps stereo, 128 kbps SBA and others */
#define FIX_522_ISM_FIRST_SID /* VA: fix ISM decoder crash if first received frame is an SID */
/* ################## End DEVELOPMENT switches ######################### */ /* ################## End DEVELOPMENT switches ######################### */
/* clang-format on */ /* clang-format on */
......
...@@ -282,6 +282,37 @@ ivas_error ivas_dec_setup( ...@@ -282,6 +282,37 @@ ivas_error ivas_dec_setup(
st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate;
} }
} }
#ifdef FIX_522_ISM_FIRST_SID
if ( st_ivas->ini_frame == 0 && st_ivas->ivas_format == ISM_FORMAT )
{
/* read the number of objects */
st_ivas->nchan_transport = 1;
nchan_ism = 1;
k = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ) - SID_FORMAT_NBITS;
while ( st_ivas->bit_stream[k] && nchan_ism < MAX_NUM_OBJECTS )
{
nchan_ism++;
k--;
}
k--;
st_ivas->nchan_ism = nchan_ism;
/* read ism_mode */
if ( nchan_ism > 2 )
{
k -= nchan_ism; /* SID metadata flags */
idx = st_ivas->bit_stream[k];
st_ivas->ism_mode = (ISM_MODE) ( idx + 1 );
}
if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK )
{
return error;
}
}
#endif
} }
/*-------------------------------------------------------------------* /*-------------------------------------------------------------------*
......
...@@ -67,7 +67,6 @@ static ivas_error ivas_ism_bitrate_switching( ...@@ -67,7 +67,6 @@ static ivas_error ivas_ism_bitrate_switching(
RENDERER_TYPE renderer_type_old; RENDERER_TYPE renderer_type_old;
error = IVAS_ERR_OK; error = IVAS_ERR_OK;
nCPE_old = st_ivas->nCPE; nCPE_old = st_ivas->nCPE;
nSCE_old = st_ivas->nSCE; nSCE_old = st_ivas->nSCE;
...@@ -205,12 +204,7 @@ static ivas_error ivas_ism_bitrate_switching( ...@@ -205,12 +204,7 @@ static ivas_error ivas_ism_bitrate_switching(
ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin );
/* Open Crend Binaural renderer */ /* Open Crend Binaural renderer */
if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
st_ivas->intern_config,
st_ivas->hOutSetup.output_config,
st_ivas->hRenderConfig,
st_ivas->hSetOfHRTF,
st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
{ {
return error; return error;
} }
...@@ -364,10 +358,8 @@ ivas_error ivas_ism_dec_config( ...@@ -364,10 +358,8 @@ ivas_error ivas_ism_dec_config(
int16_t nchan_transport_old; int16_t nchan_transport_old;
error = IVAS_ERR_OK; error = IVAS_ERR_OK;
ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
/* Assumes that num of input objects are constant */ /* Assumes that num of input objects are constant */
nchan_transport_old = st_ivas->nchan_ism; nchan_transport_old = st_ivas->nchan_ism;
......
...@@ -634,6 +634,10 @@ ivas_error ivas_ism_metadata_dec_create( ...@@ -634,6 +634,10 @@ ivas_error ivas_ism_metadata_dec_create(
st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0; st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0;
st_ivas->hIsmMetaData[ch]->last_true_elevation = 0; st_ivas->hIsmMetaData[ch]->last_true_elevation = 0;
#ifdef FIX_522_ISM_FIRST_SID
st_ivas->hIsmMetaData[ch]->last_azimuth = 0;
st_ivas->hIsmMetaData[ch]->last_elevation = 0;
#endif
ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] );
} }
......
...@@ -2,24 +2,24 @@ ...@@ -2,24 +2,24 @@
"afspPath": "not_needed", "afspPath": "not_needed",
"utilPath": "/tools", "utilPath": "/tools",
"inpaths": { "inpaths": {
"MONO": "/usr/local/testv/test_mono.wav", "MONO": "/usr/local/testv/stv48n.wav",
"STEREO": "/usr/local/testv/test_stereo.wav", "STEREO": "/usr/local/ltv/ltv48_STEREO.wav",
"FOA": "/usr/local/ltv/ltv48_FOA.wav", "FOA": "/usr/local/ltv/ltv48_FOA.wav",
"HOA2": "/usr/local/ltv/ltv48_HOA2.wav", "HOA2": "/usr/local/ltv/ltv48_HOA2.wav",
"HOA3": "/usr/local/ltv/ltv48_HOA3.wav", "HOA3": "/usr/local/ltv/ltv48_HOA3.wav",
"SBA": "/usr/local/ltv/ltv48_HOA3.wav", "SBA": "/usr/local/ltv/ltv48_HOA3.wav",
"MASA1TC1DIR": "/usr/local/testv/test_MASA_1dir1TC.wav", "MASA1TC1DIR": "/usr/local/testv/stv1MASA1TC48n.wav",
"MASA1TC2DIR": "/usr/local/testv/test_MASA_2dir1TC.wav", "MASA1TC2DIR": "/usr/local/testv/stv2MASA1TC48c.wav",
"MASA2TC1DIR": "/usr/local/testv/test_MASA_1dir2TC.wav", "MASA2TC1DIR": "/usr/local/testv/stv1MASA2TC48n.wav",
"MASA2TC2DIR": "/usr/local/testv/test_MASA_2dir2TC.wav", "MASA2TC2DIR": "/usr/local/testv/stv2MASA2TC48c.wav",
"5_1": "/usr/local/testv/test_MC51.wav", "5_1": "/usr/local/testv/stv51MC48c.wav",
"5_1_2": "/usr/local/testv/test_MC51p2.wav", "5_1_2": "/usr/local/testv/stv512MC48c.wav",
"5_1_4": "/usr/local/testv/test_MC51p4.wav", "5_1_4": "/usr/local/testv/stv514MC48c.wav",
"7_1": "/usr/local/testv/test_MC71.wav", "7_1": "/usr/local/testv/stv71MC48c.wav",
"7_1_4": "/usr/local/testv/test_MC71p4.wav", "7_1_4": "/usr/local/testv/stv714MC48c.wav",
"ISM1": "/usr/local/testv/test_mono.wav", "ISM1": "/usr/local/ltv/ltv48_1ISM.wav",
"ISM2": "/usr/local/testv/test_ISM_2obj.wav", "ISM2": "/usr/local/ltv/ltv48_2ISM.wav",
"ISM3": "/usr/local/testv/test_ISM_3obj.wav", "ISM3": "/usr/local/ltv/ltv48_3ISM.wav",
"ISM4": "/usr/local/testv/test_ISM_4obj.wav" "ISM4": "/usr/local/ltv/ltv48_4ISM.wav"
} }
} }
...@@ -182,7 +182,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): ...@@ -182,7 +182,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
self.max_workers = max_workers self.max_workers = max_workers
self.flat_output_structure = flat_output_structure self.flat_output_structure = flat_output_structure
self.limit_duration = False self.limit_duration = False
self.max_duration = 0.0 self.end_time = 0.0
self.start_time = 0.0 self.start_time = 0.0
self.encoder_cmdline_options = [] self.encoder_cmdline_options = []
self.decoder_cmdline_options = [] self.decoder_cmdline_options = []
...@@ -542,7 +542,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): ...@@ -542,7 +542,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
str(sample_rate_in), str(sample_rate_in),
"_", "_",
config["cmd"]["in_config"].upper(), config["cmd"]["in_config"].upper(),
"_L{}-{}s".format("_".join(str(self.start_time).split(".")), "_".join(str(self.max_duration).split("."))), "_L{}-{}s".format("_".join(str(self.start_time).split(".")), "_".join(str(self.end_time).split("."))),
".pcm", ".pcm",
] ]
) )
...@@ -613,13 +613,14 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): ...@@ -613,13 +613,14 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
if start_time_samples >= in_len: if start_time_samples >= in_len:
raise RuntimeError("Signal is shorter than given start time") raise RuntimeError("Signal is shorter than given start time")
cut_len_samples = int(float(self.max_duration) * fs) end_time_samples = int(float(self.end_time) * fs)
cut_len_samples = end_time_samples - start_time_samples
if cut_len_samples + start_time_samples < in_len or start_time_samples > 0: if cut_len_samples + start_time_samples < in_len or start_time_samples > 0:
out_len = min(cut_len_samples, in_len - start_time_samples) end_time_samples = min(end_time_samples, in_len)
sig = ar.cut(sig, (start_time_samples, out_len)) sig = ar.cut(sig, (start_time_samples, end_time_samples))
pcm_log.write("Limit signal length to {}:{} samples".format(start_time_samples, out_len)) pcm_log.write("Limit signal length to {}:{} samples".format(start_time_samples, end_time_samples))
af.writefile(pcm_name_cpy_transformed, sig, fs) af.writefile(pcm_name_cpy_transformed, sig, fs)
resamp_in_path = pcm_name_cpy_transformed resamp_in_path = pcm_name_cpy_transformed
......
...@@ -563,7 +563,7 @@ def runner_setup(runner, args): ...@@ -563,7 +563,7 @@ def runner_setup(runner, args):
except ValueError: except ValueError:
raise ValueError(f"Given duration string {arg} is invalid") raise ValueError(f"Given duration string {arg} is invalid")
runner.max_duration = end runner.end_time = end
runner.start_time = start runner.start_time = start
if "fer_file" in args.keys() or "ber_file" in args.keys(): if "fer_file" in args.keys() or "ber_file" in args.keys():
......
import pytest
import pathlib
import json
import itertools
TEST_CONFIG_DIR = pathlib.Path(__file__).parent.parent.parent.joinpath("scripts/config")
TEST_CONFIGS = [f for f in TEST_CONFIG_DIR.iterdir() if f.name.startswith("ci_linux")]
def get_testvectors_from_config(config) -> list:
with open(config) as f:
cfg = json.load(f)
return list(cfg["inpaths"].values())
TESTVECTORS = sorted(set(itertools.chain(*[get_testvectors_from_config(cfg) for cfg in TEST_CONFIGS])))
@pytest.mark.parametrize("testvector", TESTVECTORS)
def test_vectors_available(testvector):
if not pathlib.Path(testvector).exists():
raise FileNotFoundError(f"Testvector {testvector} can not be found")
...@@ -102,10 +102,9 @@ def test_masa_enc_dec( ...@@ -102,10 +102,9 @@ def test_masa_enc_dec(
# Apply test skipping here # Apply test skipping here
if dtx: if dtx:
if output_mode == 'EXT' and ivas_br in test_split_br: if output_mode != 'EXT':
pytest.skip("Skipping some DTX bitrates for EXT") if ivas_br not in test_split_br:
else: pytest.skip("Skipping some DTX bitrates for other than EXT output to save time")
pytest.skip("Skipping some other DTX bitrates for other outputs")
# Set reference encoder and decoder # Set reference encoder and decoder
ref_encoder_frontend = EncoderFrontend(ref_encoder_path, "REF") ref_encoder_frontend = EncoderFrontend(ref_encoder_path, "REF")
......