Loading lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ #define FIX_1995_REVERB_INIT /* issue 1995: Fix use-of-uninitialized-value in ivas_binaural_reverb_init() */ /* #################### End BE switches ################################## */ Loading lib_rend/ivas_prot_rend.h +1 −2 Original line number Diff line number Diff line Loading @@ -945,8 +945,7 @@ ivas_error ivas_binaural_reverb_init( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ const int32_t sampling_rate, /* i : sampling rate */ const float *defaultTimes, /* i : default reverberation times */ const float *defaultEne /* i : default reverberation energies */ , const float *defaultEne, /* i : default reverberation energies */ float *earlyEne /* i/o: Early part energies to be modified */ ); Loading lib_rend/ivas_reverb.c +24 −23 Original line number Diff line number Diff line Loading @@ -79,10 +79,10 @@ #define MAX_NR_OUTPUTS ( 2 ) const int16_t init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; const int16_t default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; const int16_t default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; const int16_t default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; static const int16_t init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; static const int16_t default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; static const int16_t default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; static const int16_t default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; /*------------------------------------------------------------------------------------------* * Local Struct definition Loading Loading @@ -682,8 +682,6 @@ static ivas_error initialize_reverb_filters( { ivas_error error; error = IVAS_ERR_OK; /* init correlation and coloration filters */ if ( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ) != IVAS_ERR_OK ) { Loading @@ -710,7 +708,7 @@ static ivas_error initialize_reverb_filters( return error; } return error; return IVAS_ERR_OK; } Loading Loading @@ -1060,7 +1058,6 @@ ivas_error ivas_reverb_open( int16_t fft_hist_size, transition_start, transition_length; int16_t nr_fc_input, nr_fc_fft_filter; error = IVAS_ERR_OK; output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; predelay_bf_len = output_frame; Loading Loading @@ -1240,7 +1237,7 @@ ivas_error ivas_reverb_open( *hReverb = pState; return error; return IVAS_ERR_OK; } Loading Loading @@ -1859,12 +1856,13 @@ static ivas_error ivas_binaural_reverb_open( return IVAS_ERR_OK; } /*------------------------------------------------------------------------- * ivas_binaural_reverb_init() * * Allocate and initialize binaural room reverberator handle * for CLDFB renderers * Initialize binaural room reverberator handle for FastConv renderer *------------------------------------------------------------------------*/ ivas_error ivas_binaural_reverb_init( REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ Loading @@ -1873,8 +1871,7 @@ ivas_error ivas_binaural_reverb_init( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ const int32_t sampling_rate, /* i : sampling rate */ const float *defaultTimes, /* i : default reverberation times */ const float *defaultEne /* i : default reverberation energies */ , const float *defaultEne, /* i : default reverberation energies */ float *earlyEne /* i/o: Early part energies to be modified */ ) { Loading @@ -1883,24 +1880,23 @@ ivas_error ivas_binaural_reverb_init( float revTimes[CLDFB_NO_CHANNELS_MAX]; float revEne[CLDFB_NO_CHANNELS_MAX]; error = IVAS_ERR_OK; if ( roomAcoustics != NULL ) { if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, revTimes, revEne ) ) != IVAS_ERR_OK ) if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, revTimes, revEne ) ) != IVAS_ERR_OK ) { return error; } preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); /* Convert preDelay from seconds to CLDFB slots as needed by binaural reverb */ preDelay = (int16_t) roundf( roomAcoustics->acousticPreDelay * CLDFB_SLOTS_PER_SECOND ); } else { #ifdef FIX_1995_REVERB_INIT for ( bin = 0; bin < numBins; bin++ ) #else for ( bin = 0; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) #endif { revTimes[bin] = defaultTimes[bin]; revEne[bin] = defaultEne[bin]; Loading @@ -1908,7 +1904,11 @@ ivas_error ivas_binaural_reverb_init( preDelay = 10; } #ifdef FIX_1995_REVERB_INIT for ( bin = 0; bin < numBins; bin++ ) #else for ( bin = 0; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) #endif { /* Adjust the room effect parameters when the reverberation time is less than a threshold value, to avoid spectral artefacts with the synthetic reverberator. */ Loading Loading @@ -1943,6 +1943,7 @@ ivas_error ivas_binaural_reverb_init( return error; } /*------------------------------------------------------------------------- * ivas_binaural_reverb_close() * Loading scripts/find_regressions_from_logs.py +48 −154 Original line number Diff line number Diff line Loading @@ -4,99 +4,7 @@ import argparse from pathlib import Path import pandas as pd REPRODUCE_REGRESSION_SCRIPT_TMPL = """ #!/bin/bash -x SCRIPTS_DIR=/usr/local/scripts LTV_DIR=/usr/local/ltv MIN_DATE={min_date} MIN_SHA={min_sha} LEVEL_SCALING={level_scaling} TESTCASE="{testcase}" REF_ENC1={REF_ENC1} REF_DEC1={REF_DEC1} DUT_ENC1={DUT_ENC1} DUT_DEC1={DUT_DEC1} REF_ENC2={REF_ENC2} REF_DEC2={REF_DEC2} DUT_ENC2={DUT_ENC2} DUT_DEC2={DUT_DEC2} INV_LEVEL_SCALING=$(awk "BEGIN {{print 1.0 / $LEVEL_SCALING}}") # Obtain executables from past reference git checkout `git rev-list -1 --before="$MIN_DATE 22:00:00" ivas-float-update` echo "ivas_float_update, min version: `git rev-parse HEAD`" > versions.txt make clean make -j mv IVAS_cod IVAS_cod_ref_1 mv IVAS_dec IVAS_dec_ref_1 mv IVAS_rend IVAS_rend_ref_1 git checkout $MIN_SHA echo "main, min version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_1 mv IVAS_dec IVAS_dec_1 mv IVAS_rend IVAS_rend_1 # Obtain latest executables git checkout ivas-float-update git pull echo "ivas-float-update, current version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_ref_2 mv IVAS_dec IVAS_dec_ref_2 mv IVAS_rend IVAS_rend_ref_2 git checkout main git pull echo "main, current version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_2 mv IVAS_dec IVAS_dec_2 mv IVAS_rend IVAS_rend_2 # Get fresh copy of scripts, tests and ci cp -r $SCRIPTS_DIR/{{scripts,tests,ci,pytest.ini}} . rm -rf tests/ref tests/dut tests/renderer/ref tests/renderer/cut python3 ci/remove_unsupported_testcases.py scripts/config/self_test.prm scripts/config/self_test_ltv.prm # Get LTVs cp $LTV_DIR/* scripts/testv # Apply level scaling tests/scale_pcm.py ./scripts/testv/ "$LEVEL_SCALING" # Run tests cp IVAS_rend_ref_1 IVAS_rend_ref cp IVAS_rend_1 IVAS_rend python3 -m pytest "$TESTCASE" -n 1 --update_ref 1 --create_ref --param_file scripts/config/self_test_ltv.prm --use_ltv --ref_encoder_path $REF_ENC1 --ref_decoder_path $REF_DEC1 python3 -m pytest "$TESTCASE" -n 1 --create_cut --param_file scripts/config/self_test_ltv.prm --use_ltv --dut_encoder_path $DUT_ENC1 --dut_decoder_path $DUT_DEC1 --mld --ssnr --odg --scalefac $INV_LEVEL_SCALING --junit-xml=report1.xml --html=report1.html --self-contained-html python3 scripts/parse_xml_report.py report1.xml report1.csv # Store results from first run mkdir -p tests1/renderer cp -r tests/ref tests/dut tests1 cp -r tests/renderer/ref tests1/renderer cp -r tests/renderer/cut tests1/renderer cp IVAS_rend_ref_2 IVAS_rend_ref cp IVAS_rend_2 IVAS_rend python3 -m pytest "$TESTCASE" -n 1 --update_ref 1 --create_ref --param_file scripts/config/self_test_ltv.prm --use_ltv --ref_encoder_path $REF_ENC2 --ref_decoder_path $REF_DEC2 python3 -m pytest "$TESTCASE" -n 1 --create_cut --param_file scripts/config/self_test_ltv.prm --use_ltv --dut_encoder_path $DUT_ENC2 --dut_decoder_path $DUT_DEC2 --mld --ssnr --odg --scalefac $INV_LEVEL_SCALING --junit-xml=report2.xml --html=report2.html --self-contained-html python3 scripts/parse_xml_report.py report2.xml report2.csv """ def main(logs_dir, output_filename, measure): def main(logs_dir, output_filename, measure, days, all_results, diff_thr, ratio_thr, curr_value_thr): input_path = Path(logs_dir) logs = [f for f in input_path.iterdir() if f.is_dir()] Loading Loading @@ -142,6 +50,14 @@ def main(logs_dir, output_filename, measure): index=["job", "testcase"], columns="date", values="format" ).reset_index() if days != -1: len_history = len(result.columns) - 2 if len_history < days: print(f"*** Warning: Requested number of days exceeds the number of days in the logs. Will use all {len_history} available days.") if len_history > days: remove_days = len_history - days result = result.drop(result.columns[2:2+remove_days], axis=1) values = result.iloc[:, 2:] last_date = values.columns[-1] Loading @@ -156,69 +72,16 @@ def main(logs_dir, output_filename, measure): 1 # Set ratio to 1 for denominator 0 ) result["min_sha"] = "'" + result["min_sha"] result.to_csv(output_filename, sep=";", index=False) if not all_results: # Filter out test cases above thresholds result = result[result["diff"] > diff_thr] result = result[result["ratio"] > ratio_thr] result = result[result["curr_value"] > curr_value_thr] critical = result.iloc[:, 0:9] formats = list(set(critical["format"])) formats.sort() critical3 = pd.DataFrame() result["min_sha"] = "'" + result["min_sha"] # Add apostrophy to prevent Excel reading this as a number for format in formats: top3 = ( critical[critical["format"] == format] .sort_values(by="ratio", ascending=False) .head(3) ) critical3 = pd.concat([critical3, top3], ignore_index=True) critical3.to_csv("critical3.csv", sep=";", index=False) for row_counter, row in critical3.iterrows(): # Find level level_scaling = 1.0 if "lev+10" in row["job"]: level_scaling = 3.162 if "lev-10" in row["job"]: level_scaling = 0.3162 # Find executables setup REF_ENC1 = "IVAS_cod_ref_1" REF_DEC1 = "IVAS_dec_ref_1" DUT_ENC1 = "IVAS_cod_1" DUT_DEC1 = "IVAS_dec_1" REF_ENC2 = "IVAS_cod_ref_2" REF_DEC2 = "IVAS_dec_ref_2" DUT_ENC2 = "IVAS_cod_2" DUT_DEC2 = "IVAS_dec_2" if "dec" in row["job"]: DUT_ENC1 = "IVAS_cod_ref_1" DUT_ENC2 = "IVAS_cod_ref_2" if "enc" in row["job"]: DUT_DEC1 = "IVAS_dec_ref_1" DUT_DEC2 = "IVAS_dec_ref_2" script_content = REPRODUCE_REGRESSION_SCRIPT_TMPL.format( min_date=row["min_date"], min_sha=row["min_sha"][1:], level_scaling=level_scaling, testcase=row["testcase"], REF_ENC1=REF_ENC1, REF_DEC1=REF_DEC1, DUT_ENC1=DUT_ENC1, DUT_DEC1=DUT_DEC1, REF_ENC2=REF_ENC2, REF_DEC2=REF_DEC2, DUT_ENC2=DUT_ENC2, DUT_DEC2=DUT_DEC2, ) result.to_csv(output_filename, sep=";", index=False) script_filename = f"regression_{row_counter+2:03d}.bash" with open(script_filename, "w") as f: f.write(script_content) if __name__ == "__main__": Loading @@ -239,7 +102,38 @@ if __name__ == "__main__": help="Measure for summary, one of MLD MIN_SSNR MAX_ABS_DIFF MIN_ODG, (default: MLD)", default="MLD", ) parser.add_argument( "--days", type=int, help="Number of days in history, (default: whole history)", default=-1, ) parser.add_argument( "--all_results", action="store_true", help="Output all results, including cases without regression (default: off)", default=False, ) parser.add_argument( "--diff_thr", type=float, help="Include test cases with diff above diff_thr, (default: 0.0)", default=0.0, ) parser.add_argument( "--ratio_thr", type=float, help="Include test cases with ratio above ratio_thr, (default: 1.0)", default=1.0, ) parser.add_argument( "--curr_value_thr", type=float, help="Include test cases with curr_value above curr_value_thr, (default: 0.0)", default=0.0, ) args = parser.parse_args() main(args.logs_dir, args.output_filename, args.measure) main(args.logs_dir, args.output_filename, args.measure, args.days, args.all_results, args.diff_thr, args.ratio_thr, args.curr_value_thr) scripts/generate_scripts_from_regressions.py 0 → 100644 +155 −0 Original line number Diff line number Diff line #!/usr/bin/env python3 import argparse import pandas as pd REPRODUCE_REGRESSION_SCRIPT_TMPL = """ #!/bin/bash -x SCRIPTS_DIR=/usr/local/scripts LTV_DIR=/usr/local/ltv MIN_DATE={min_date} MIN_SHA={min_sha} LEVEL_SCALING={level_scaling} TESTCASE="{testcase}" REF_ENC1={REF_ENC1} REF_DEC1={REF_DEC1} DUT_ENC1={DUT_ENC1} DUT_DEC1={DUT_DEC1} REF_ENC2={REF_ENC2} REF_DEC2={REF_DEC2} DUT_ENC2={DUT_ENC2} DUT_DEC2={DUT_DEC2} INV_LEVEL_SCALING=$(awk "BEGIN {{print 1.0 / $LEVEL_SCALING}}") # Obtain executables from past reference git checkout `git rev-list -1 --before="$MIN_DATE 22:00:00" ivas-float-update` echo "ivas_float_update, min version: `git rev-parse HEAD`" > versions.txt make clean make -j mv IVAS_cod IVAS_cod_ref_1 mv IVAS_dec IVAS_dec_ref_1 mv IVAS_rend IVAS_rend_ref_1 git checkout $MIN_SHA echo "main, min version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_1 mv IVAS_dec IVAS_dec_1 mv IVAS_rend IVAS_rend_1 # Obtain latest executables git checkout ivas-float-update git pull echo "ivas-float-update, current version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_ref_2 mv IVAS_dec IVAS_dec_ref_2 mv IVAS_rend IVAS_rend_ref_2 git checkout main git pull echo "main, current version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_2 mv IVAS_dec IVAS_dec_2 mv IVAS_rend IVAS_rend_2 # Get fresh copy of scripts, tests and ci cp -r $SCRIPTS_DIR/{{scripts,tests,ci,pytest.ini}} . rm -rf tests/ref tests/dut tests/renderer/ref tests/renderer/cut python3 ci/remove_unsupported_testcases.py scripts/config/self_test.prm scripts/config/self_test_ltv.prm # Get LTVs cp $LTV_DIR/* scripts/testv # Apply level scaling tests/scale_pcm.py ./scripts/testv/ "$LEVEL_SCALING" # Run tests cp IVAS_rend_ref_1 IVAS_rend_ref cp IVAS_rend_1 IVAS_rend python3 -m pytest "$TESTCASE" -n 1 --update_ref 1 --create_ref --param_file scripts/config/self_test_ltv.prm --use_ltv --ref_encoder_path $REF_ENC1 --ref_decoder_path $REF_DEC1 python3 -m pytest "$TESTCASE" -n 1 --create_cut --param_file scripts/config/self_test_ltv.prm --use_ltv --dut_encoder_path $DUT_ENC1 --dut_decoder_path $DUT_DEC1 --mld --ssnr --odg --scalefac $INV_LEVEL_SCALING --junit-xml=report1.xml --html=report1.html --self-contained-html python3 scripts/parse_xml_report.py report1.xml report1.csv # Store results from first run mkdir -p tests1/renderer cp -r tests/ref tests/dut tests1 cp -r tests/renderer/ref tests1/renderer cp -r tests/renderer/cut tests1/renderer cp IVAS_rend_ref_2 IVAS_rend_ref cp IVAS_rend_2 IVAS_rend python3 -m pytest "$TESTCASE" -n 1 --update_ref 1 --create_ref --param_file scripts/config/self_test_ltv.prm --use_ltv --ref_encoder_path $REF_ENC2 --ref_decoder_path $REF_DEC2 python3 -m pytest "$TESTCASE" -n 1 --create_cut --param_file scripts/config/self_test_ltv.prm --use_ltv --dut_encoder_path $DUT_ENC2 --dut_decoder_path $DUT_DEC2 --mld --ssnr --odg --scalefac $INV_LEVEL_SCALING --junit-xml=report2.xml --html=report2.html --self-contained-html python3 scripts/parse_xml_report.py report2.xml report2.csv """ def main(critical_list): critical = pd.read_csv(critical_list, sep=";") for row_counter, row in critical.iterrows(): # Find level level_scaling = 1.0 if "lev+10" in row["job"]: level_scaling = 3.162 if "lev-10" in row["job"]: level_scaling = 0.3162 # Find executables setup REF_ENC1 = "IVAS_cod_ref_1" REF_DEC1 = "IVAS_dec_ref_1" DUT_ENC1 = "IVAS_cod_1" DUT_DEC1 = "IVAS_dec_1" REF_ENC2 = "IVAS_cod_ref_2" REF_DEC2 = "IVAS_dec_ref_2" DUT_ENC2 = "IVAS_cod_2" DUT_DEC2 = "IVAS_dec_2" if "dec" in row["job"]: DUT_ENC1 = "IVAS_cod_ref_1" DUT_ENC2 = "IVAS_cod_ref_2" if "enc" in row["job"]: DUT_DEC1 = "IVAS_dec_ref_1" DUT_DEC2 = "IVAS_dec_ref_2" script_content = REPRODUCE_REGRESSION_SCRIPT_TMPL.format( min_date=row["min_date"], min_sha=row["min_sha"][1:], level_scaling=level_scaling, testcase=row["testcase"], REF_ENC1=REF_ENC1, REF_DEC1=REF_DEC1, DUT_ENC1=DUT_ENC1, DUT_DEC1=DUT_DEC1, REF_ENC2=REF_ENC2, REF_DEC2=REF_DEC2, DUT_ENC2=DUT_ENC2, DUT_DEC2=DUT_DEC2, ) script_filename = f"regression_{row_counter+2:03d}.bash" with open(script_filename, "w") as f: f.write(script_content) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Generate bash scripts to reproduce test cases from critical testcase csv list") parser.add_argument( "critical_list", type=str, help="critical file list, e.g. critical.csv", ) args = parser.parse_args() main(args.critical_list) Loading
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ #define FIX_1995_REVERB_INIT /* issue 1995: Fix use-of-uninitialized-value in ivas_binaural_reverb_init() */ /* #################### End BE switches ################################## */ Loading
lib_rend/ivas_prot_rend.h +1 −2 Original line number Diff line number Diff line Loading @@ -945,8 +945,7 @@ ivas_error ivas_binaural_reverb_init( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ const int32_t sampling_rate, /* i : sampling rate */ const float *defaultTimes, /* i : default reverberation times */ const float *defaultEne /* i : default reverberation energies */ , const float *defaultEne, /* i : default reverberation energies */ float *earlyEne /* i/o: Early part energies to be modified */ ); Loading
lib_rend/ivas_reverb.c +24 −23 Original line number Diff line number Diff line Loading @@ -79,10 +79,10 @@ #define MAX_NR_OUTPUTS ( 2 ) const int16_t init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; const int16_t default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; const int16_t default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; const int16_t default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; static const int16_t init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; static const int16_t default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; static const int16_t default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; static const int16_t default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; /*------------------------------------------------------------------------------------------* * Local Struct definition Loading Loading @@ -682,8 +682,6 @@ static ivas_error initialize_reverb_filters( { ivas_error error; error = IVAS_ERR_OK; /* init correlation and coloration filters */ if ( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ) != IVAS_ERR_OK ) { Loading @@ -710,7 +708,7 @@ static ivas_error initialize_reverb_filters( return error; } return error; return IVAS_ERR_OK; } Loading Loading @@ -1060,7 +1058,6 @@ ivas_error ivas_reverb_open( int16_t fft_hist_size, transition_start, transition_length; int16_t nr_fc_input, nr_fc_fft_filter; error = IVAS_ERR_OK; output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; predelay_bf_len = output_frame; Loading Loading @@ -1240,7 +1237,7 @@ ivas_error ivas_reverb_open( *hReverb = pState; return error; return IVAS_ERR_OK; } Loading Loading @@ -1859,12 +1856,13 @@ static ivas_error ivas_binaural_reverb_open( return IVAS_ERR_OK; } /*------------------------------------------------------------------------- * ivas_binaural_reverb_init() * * Allocate and initialize binaural room reverberator handle * for CLDFB renderers * Initialize binaural room reverberator handle for FastConv renderer *------------------------------------------------------------------------*/ ivas_error ivas_binaural_reverb_init( REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ Loading @@ -1873,8 +1871,7 @@ ivas_error ivas_binaural_reverb_init( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ const int32_t sampling_rate, /* i : sampling rate */ const float *defaultTimes, /* i : default reverberation times */ const float *defaultEne /* i : default reverberation energies */ , const float *defaultEne, /* i : default reverberation energies */ float *earlyEne /* i/o: Early part energies to be modified */ ) { Loading @@ -1883,24 +1880,23 @@ ivas_error ivas_binaural_reverb_init( float revTimes[CLDFB_NO_CHANNELS_MAX]; float revEne[CLDFB_NO_CHANNELS_MAX]; error = IVAS_ERR_OK; if ( roomAcoustics != NULL ) { if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, revTimes, revEne ) ) != IVAS_ERR_OK ) if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, revTimes, revEne ) ) != IVAS_ERR_OK ) { return error; } preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); /* Convert preDelay from seconds to CLDFB slots as needed by binaural reverb */ preDelay = (int16_t) roundf( roomAcoustics->acousticPreDelay * CLDFB_SLOTS_PER_SECOND ); } else { #ifdef FIX_1995_REVERB_INIT for ( bin = 0; bin < numBins; bin++ ) #else for ( bin = 0; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) #endif { revTimes[bin] = defaultTimes[bin]; revEne[bin] = defaultEne[bin]; Loading @@ -1908,7 +1904,11 @@ ivas_error ivas_binaural_reverb_init( preDelay = 10; } #ifdef FIX_1995_REVERB_INIT for ( bin = 0; bin < numBins; bin++ ) #else for ( bin = 0; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) #endif { /* Adjust the room effect parameters when the reverberation time is less than a threshold value, to avoid spectral artefacts with the synthetic reverberator. */ Loading Loading @@ -1943,6 +1943,7 @@ ivas_error ivas_binaural_reverb_init( return error; } /*------------------------------------------------------------------------- * ivas_binaural_reverb_close() * Loading
scripts/find_regressions_from_logs.py +48 −154 Original line number Diff line number Diff line Loading @@ -4,99 +4,7 @@ import argparse from pathlib import Path import pandas as pd REPRODUCE_REGRESSION_SCRIPT_TMPL = """ #!/bin/bash -x SCRIPTS_DIR=/usr/local/scripts LTV_DIR=/usr/local/ltv MIN_DATE={min_date} MIN_SHA={min_sha} LEVEL_SCALING={level_scaling} TESTCASE="{testcase}" REF_ENC1={REF_ENC1} REF_DEC1={REF_DEC1} DUT_ENC1={DUT_ENC1} DUT_DEC1={DUT_DEC1} REF_ENC2={REF_ENC2} REF_DEC2={REF_DEC2} DUT_ENC2={DUT_ENC2} DUT_DEC2={DUT_DEC2} INV_LEVEL_SCALING=$(awk "BEGIN {{print 1.0 / $LEVEL_SCALING}}") # Obtain executables from past reference git checkout `git rev-list -1 --before="$MIN_DATE 22:00:00" ivas-float-update` echo "ivas_float_update, min version: `git rev-parse HEAD`" > versions.txt make clean make -j mv IVAS_cod IVAS_cod_ref_1 mv IVAS_dec IVAS_dec_ref_1 mv IVAS_rend IVAS_rend_ref_1 git checkout $MIN_SHA echo "main, min version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_1 mv IVAS_dec IVAS_dec_1 mv IVAS_rend IVAS_rend_1 # Obtain latest executables git checkout ivas-float-update git pull echo "ivas-float-update, current version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_ref_2 mv IVAS_dec IVAS_dec_ref_2 mv IVAS_rend IVAS_rend_ref_2 git checkout main git pull echo "main, current version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_2 mv IVAS_dec IVAS_dec_2 mv IVAS_rend IVAS_rend_2 # Get fresh copy of scripts, tests and ci cp -r $SCRIPTS_DIR/{{scripts,tests,ci,pytest.ini}} . rm -rf tests/ref tests/dut tests/renderer/ref tests/renderer/cut python3 ci/remove_unsupported_testcases.py scripts/config/self_test.prm scripts/config/self_test_ltv.prm # Get LTVs cp $LTV_DIR/* scripts/testv # Apply level scaling tests/scale_pcm.py ./scripts/testv/ "$LEVEL_SCALING" # Run tests cp IVAS_rend_ref_1 IVAS_rend_ref cp IVAS_rend_1 IVAS_rend python3 -m pytest "$TESTCASE" -n 1 --update_ref 1 --create_ref --param_file scripts/config/self_test_ltv.prm --use_ltv --ref_encoder_path $REF_ENC1 --ref_decoder_path $REF_DEC1 python3 -m pytest "$TESTCASE" -n 1 --create_cut --param_file scripts/config/self_test_ltv.prm --use_ltv --dut_encoder_path $DUT_ENC1 --dut_decoder_path $DUT_DEC1 --mld --ssnr --odg --scalefac $INV_LEVEL_SCALING --junit-xml=report1.xml --html=report1.html --self-contained-html python3 scripts/parse_xml_report.py report1.xml report1.csv # Store results from first run mkdir -p tests1/renderer cp -r tests/ref tests/dut tests1 cp -r tests/renderer/ref tests1/renderer cp -r tests/renderer/cut tests1/renderer cp IVAS_rend_ref_2 IVAS_rend_ref cp IVAS_rend_2 IVAS_rend python3 -m pytest "$TESTCASE" -n 1 --update_ref 1 --create_ref --param_file scripts/config/self_test_ltv.prm --use_ltv --ref_encoder_path $REF_ENC2 --ref_decoder_path $REF_DEC2 python3 -m pytest "$TESTCASE" -n 1 --create_cut --param_file scripts/config/self_test_ltv.prm --use_ltv --dut_encoder_path $DUT_ENC2 --dut_decoder_path $DUT_DEC2 --mld --ssnr --odg --scalefac $INV_LEVEL_SCALING --junit-xml=report2.xml --html=report2.html --self-contained-html python3 scripts/parse_xml_report.py report2.xml report2.csv """ def main(logs_dir, output_filename, measure): def main(logs_dir, output_filename, measure, days, all_results, diff_thr, ratio_thr, curr_value_thr): input_path = Path(logs_dir) logs = [f for f in input_path.iterdir() if f.is_dir()] Loading Loading @@ -142,6 +50,14 @@ def main(logs_dir, output_filename, measure): index=["job", "testcase"], columns="date", values="format" ).reset_index() if days != -1: len_history = len(result.columns) - 2 if len_history < days: print(f"*** Warning: Requested number of days exceeds the number of days in the logs. Will use all {len_history} available days.") if len_history > days: remove_days = len_history - days result = result.drop(result.columns[2:2+remove_days], axis=1) values = result.iloc[:, 2:] last_date = values.columns[-1] Loading @@ -156,69 +72,16 @@ def main(logs_dir, output_filename, measure): 1 # Set ratio to 1 for denominator 0 ) result["min_sha"] = "'" + result["min_sha"] result.to_csv(output_filename, sep=";", index=False) if not all_results: # Filter out test cases above thresholds result = result[result["diff"] > diff_thr] result = result[result["ratio"] > ratio_thr] result = result[result["curr_value"] > curr_value_thr] critical = result.iloc[:, 0:9] formats = list(set(critical["format"])) formats.sort() critical3 = pd.DataFrame() result["min_sha"] = "'" + result["min_sha"] # Add apostrophy to prevent Excel reading this as a number for format in formats: top3 = ( critical[critical["format"] == format] .sort_values(by="ratio", ascending=False) .head(3) ) critical3 = pd.concat([critical3, top3], ignore_index=True) critical3.to_csv("critical3.csv", sep=";", index=False) for row_counter, row in critical3.iterrows(): # Find level level_scaling = 1.0 if "lev+10" in row["job"]: level_scaling = 3.162 if "lev-10" in row["job"]: level_scaling = 0.3162 # Find executables setup REF_ENC1 = "IVAS_cod_ref_1" REF_DEC1 = "IVAS_dec_ref_1" DUT_ENC1 = "IVAS_cod_1" DUT_DEC1 = "IVAS_dec_1" REF_ENC2 = "IVAS_cod_ref_2" REF_DEC2 = "IVAS_dec_ref_2" DUT_ENC2 = "IVAS_cod_2" DUT_DEC2 = "IVAS_dec_2" if "dec" in row["job"]: DUT_ENC1 = "IVAS_cod_ref_1" DUT_ENC2 = "IVAS_cod_ref_2" if "enc" in row["job"]: DUT_DEC1 = "IVAS_dec_ref_1" DUT_DEC2 = "IVAS_dec_ref_2" script_content = REPRODUCE_REGRESSION_SCRIPT_TMPL.format( min_date=row["min_date"], min_sha=row["min_sha"][1:], level_scaling=level_scaling, testcase=row["testcase"], REF_ENC1=REF_ENC1, REF_DEC1=REF_DEC1, DUT_ENC1=DUT_ENC1, DUT_DEC1=DUT_DEC1, REF_ENC2=REF_ENC2, REF_DEC2=REF_DEC2, DUT_ENC2=DUT_ENC2, DUT_DEC2=DUT_DEC2, ) result.to_csv(output_filename, sep=";", index=False) script_filename = f"regression_{row_counter+2:03d}.bash" with open(script_filename, "w") as f: f.write(script_content) if __name__ == "__main__": Loading @@ -239,7 +102,38 @@ if __name__ == "__main__": help="Measure for summary, one of MLD MIN_SSNR MAX_ABS_DIFF MIN_ODG, (default: MLD)", default="MLD", ) parser.add_argument( "--days", type=int, help="Number of days in history, (default: whole history)", default=-1, ) parser.add_argument( "--all_results", action="store_true", help="Output all results, including cases without regression (default: off)", default=False, ) parser.add_argument( "--diff_thr", type=float, help="Include test cases with diff above diff_thr, (default: 0.0)", default=0.0, ) parser.add_argument( "--ratio_thr", type=float, help="Include test cases with ratio above ratio_thr, (default: 1.0)", default=1.0, ) parser.add_argument( "--curr_value_thr", type=float, help="Include test cases with curr_value above curr_value_thr, (default: 0.0)", default=0.0, ) args = parser.parse_args() main(args.logs_dir, args.output_filename, args.measure) main(args.logs_dir, args.output_filename, args.measure, args.days, args.all_results, args.diff_thr, args.ratio_thr, args.curr_value_thr)
scripts/generate_scripts_from_regressions.py 0 → 100644 +155 −0 Original line number Diff line number Diff line #!/usr/bin/env python3 import argparse import pandas as pd REPRODUCE_REGRESSION_SCRIPT_TMPL = """ #!/bin/bash -x SCRIPTS_DIR=/usr/local/scripts LTV_DIR=/usr/local/ltv MIN_DATE={min_date} MIN_SHA={min_sha} LEVEL_SCALING={level_scaling} TESTCASE="{testcase}" REF_ENC1={REF_ENC1} REF_DEC1={REF_DEC1} DUT_ENC1={DUT_ENC1} DUT_DEC1={DUT_DEC1} REF_ENC2={REF_ENC2} REF_DEC2={REF_DEC2} DUT_ENC2={DUT_ENC2} DUT_DEC2={DUT_DEC2} INV_LEVEL_SCALING=$(awk "BEGIN {{print 1.0 / $LEVEL_SCALING}}") # Obtain executables from past reference git checkout `git rev-list -1 --before="$MIN_DATE 22:00:00" ivas-float-update` echo "ivas_float_update, min version: `git rev-parse HEAD`" > versions.txt make clean make -j mv IVAS_cod IVAS_cod_ref_1 mv IVAS_dec IVAS_dec_ref_1 mv IVAS_rend IVAS_rend_ref_1 git checkout $MIN_SHA echo "main, min version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_1 mv IVAS_dec IVAS_dec_1 mv IVAS_rend IVAS_rend_1 # Obtain latest executables git checkout ivas-float-update git pull echo "ivas-float-update, current version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_ref_2 mv IVAS_dec IVAS_dec_ref_2 mv IVAS_rend IVAS_rend_ref_2 git checkout main git pull echo "main, current version: `git rev-parse HEAD`" >> versions.txt make clean make -j mv IVAS_cod IVAS_cod_2 mv IVAS_dec IVAS_dec_2 mv IVAS_rend IVAS_rend_2 # Get fresh copy of scripts, tests and ci cp -r $SCRIPTS_DIR/{{scripts,tests,ci,pytest.ini}} . rm -rf tests/ref tests/dut tests/renderer/ref tests/renderer/cut python3 ci/remove_unsupported_testcases.py scripts/config/self_test.prm scripts/config/self_test_ltv.prm # Get LTVs cp $LTV_DIR/* scripts/testv # Apply level scaling tests/scale_pcm.py ./scripts/testv/ "$LEVEL_SCALING" # Run tests cp IVAS_rend_ref_1 IVAS_rend_ref cp IVAS_rend_1 IVAS_rend python3 -m pytest "$TESTCASE" -n 1 --update_ref 1 --create_ref --param_file scripts/config/self_test_ltv.prm --use_ltv --ref_encoder_path $REF_ENC1 --ref_decoder_path $REF_DEC1 python3 -m pytest "$TESTCASE" -n 1 --create_cut --param_file scripts/config/self_test_ltv.prm --use_ltv --dut_encoder_path $DUT_ENC1 --dut_decoder_path $DUT_DEC1 --mld --ssnr --odg --scalefac $INV_LEVEL_SCALING --junit-xml=report1.xml --html=report1.html --self-contained-html python3 scripts/parse_xml_report.py report1.xml report1.csv # Store results from first run mkdir -p tests1/renderer cp -r tests/ref tests/dut tests1 cp -r tests/renderer/ref tests1/renderer cp -r tests/renderer/cut tests1/renderer cp IVAS_rend_ref_2 IVAS_rend_ref cp IVAS_rend_2 IVAS_rend python3 -m pytest "$TESTCASE" -n 1 --update_ref 1 --create_ref --param_file scripts/config/self_test_ltv.prm --use_ltv --ref_encoder_path $REF_ENC2 --ref_decoder_path $REF_DEC2 python3 -m pytest "$TESTCASE" -n 1 --create_cut --param_file scripts/config/self_test_ltv.prm --use_ltv --dut_encoder_path $DUT_ENC2 --dut_decoder_path $DUT_DEC2 --mld --ssnr --odg --scalefac $INV_LEVEL_SCALING --junit-xml=report2.xml --html=report2.html --self-contained-html python3 scripts/parse_xml_report.py report2.xml report2.csv """ def main(critical_list): critical = pd.read_csv(critical_list, sep=";") for row_counter, row in critical.iterrows(): # Find level level_scaling = 1.0 if "lev+10" in row["job"]: level_scaling = 3.162 if "lev-10" in row["job"]: level_scaling = 0.3162 # Find executables setup REF_ENC1 = "IVAS_cod_ref_1" REF_DEC1 = "IVAS_dec_ref_1" DUT_ENC1 = "IVAS_cod_1" DUT_DEC1 = "IVAS_dec_1" REF_ENC2 = "IVAS_cod_ref_2" REF_DEC2 = "IVAS_dec_ref_2" DUT_ENC2 = "IVAS_cod_2" DUT_DEC2 = "IVAS_dec_2" if "dec" in row["job"]: DUT_ENC1 = "IVAS_cod_ref_1" DUT_ENC2 = "IVAS_cod_ref_2" if "enc" in row["job"]: DUT_DEC1 = "IVAS_dec_ref_1" DUT_DEC2 = "IVAS_dec_ref_2" script_content = REPRODUCE_REGRESSION_SCRIPT_TMPL.format( min_date=row["min_date"], min_sha=row["min_sha"][1:], level_scaling=level_scaling, testcase=row["testcase"], REF_ENC1=REF_ENC1, REF_DEC1=REF_DEC1, DUT_ENC1=DUT_ENC1, DUT_DEC1=DUT_DEC1, REF_ENC2=REF_ENC2, REF_DEC2=REF_DEC2, DUT_ENC2=DUT_ENC2, DUT_DEC2=DUT_DEC2, ) script_filename = f"regression_{row_counter+2:03d}.bash" with open(script_filename, "w") as f: f.write(script_content) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Generate bash scripts to reproduce test cases from critical testcase csv list") parser.add_argument( "critical_list", type=str, help="critical file list, e.g. critical.csv", ) args = parser.parse_args() main(args.critical_list)