Commit b2a1dad3 authored by norvell's avatar norvell
Browse files

Merge branch 'main' into ci/update-basop-ci-branch

parents d38933e7 46645488
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 ################################## */

+1 −2
Original line number Diff line number Diff line
@@ -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      */
);

+24 −23
Original line number Diff line number Diff line
@@ -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
@@ -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 )
    {
@@ -710,7 +708,7 @@ static ivas_error initialize_reverb_filters(
        return error;
    }

    return error;
    return IVAS_ERR_OK;
}


@@ -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;
@@ -1240,7 +1237,7 @@ ivas_error ivas_reverb_open(

    *hReverb = pState;

    return error;
    return IVAS_ERR_OK;
}


@@ -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               */
@@ -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   */
)
{
@@ -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];
@@ -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. */
@@ -1943,6 +1943,7 @@ ivas_error ivas_binaural_reverb_init(
    return error;
}


/*-------------------------------------------------------------------------
 * ivas_binaural_reverb_close()
 *
+48 −154
Original line number Diff line number Diff line
@@ -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()]
@@ -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]

@@ -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__":
@@ -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)
+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)