Skip to content
Commits on Source (645)
variables: variables:
# note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this
# see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information
IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 4eb4c0dfbdc845280a9994b5f7540f69c737537b IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF main
include: include:
- local: .gitlab-ci/variables.yml - local: .gitlab-ci/variables.yml
...@@ -352,6 +352,13 @@ build-codec-instrumented-linux: ...@@ -352,6 +352,13 @@ build-codec-instrumented-linux:
- bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh
- ./scripts/prepare_instrumentation.sh - ./scripts/prepare_instrumentation.sh
- make -j -C scripts/c-code_instrument - make -j -C scripts/c-code_instrument
artifacts:
when: always
access: all
expire_in: "30 days"
paths:
- wmc_tool_output.txt
# make sure that the codec builds with msan, asan and usan # make sure that the codec builds with msan, asan and usan
build-codec-sanitizers-linux: build-codec-sanitizers-linux:
...@@ -419,7 +426,7 @@ codec-smoke-test: ...@@ -419,7 +426,7 @@ codec-smoke-test:
- if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; ret_val=1; fi - if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; ret_val=1; fi
- exit $ret_val - exit $ret_val
artifacts: artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
expire_in: 1 week expire_in: 1 week
when: always when: always
paths: paths:
...@@ -477,7 +484,7 @@ pytest-compare-20ms-and-5ms-rendering: ...@@ -477,7 +484,7 @@ pytest-compare-20ms-and-5ms-rendering:
needs: ["build-codec-linux-cmake", "build-codec-linux-make", "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] needs: ["build-codec-linux-cmake", "build-codec-linux-make", "build-codec-instrumented-linux", "build-codec-sanitizers-linux"]
script: script:
- bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh
- bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/float/disable-limiter.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/disable-limiter.sh
- make clean - make clean
- make -j - make -j
### prepare pytest ### prepare pytest
...@@ -501,7 +508,7 @@ pytest-compare-20ms-and-5ms-rendering: ...@@ -501,7 +508,7 @@ pytest-compare-20ms-and-5ms-rendering:
- if [ $exit_code10 -ne 0 ]; then echo "Non-bitexact cases encountered with 10ms rendering!"; exit_code=1; fi - if [ $exit_code10 -ne 0 ]; then echo "Non-bitexact cases encountered with 10ms rendering!"; exit_code=1; fi
- if [ $exit_code -ne 0 ]; then exit $EXIT_CODE_FAIL; fi - if [ $exit_code -ne 0 ]; then exit $EXIT_CODE_FAIL; fi
artifacts: artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
expire_in: 1 week expire_in: 1 week
when: always when: always
expose_as: "pytest 5ms and 10ms vs 20ms results" expose_as: "pytest 5ms and 10ms vs 20ms results"
...@@ -537,81 +544,69 @@ renderer-smoke-test: ...@@ -537,81 +544,69 @@ renderer-smoke-test:
junit: junit:
- report-junit.xml - report-junit.xml
# test renderer executable with cmake + asan .renderer-sanitizer-job:
renderer-asan:
extends: extends:
- .test-job-linux - .test-job-linux
- .rules-merge-request-to-main - .rules-merge-request-to-main
needs: ["build-codec-linux-cmake"] needs: ["build-codec-linux-cmake"]
stage: test stage: test
script: timeout: "1 hour"
- cmake -B cmake-build -G "Unix Makefiles" -DCLANG=asan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true
- cmake --build cmake-build -- -j
- testcase_timeout=180
- python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout
artifacts: artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
expire_in: 1 week expire_in: 1 week
when: always when: always
paths: paths:
- report-junit.xml - report-junit.xml
expose_as: "renderer asan pytest results" - report.html
reports: reports:
junit: junit:
- report-junit.xml - report-junit.xml
before_script:
- cmake -B cmake-build -G "Unix Makefiles" -DCLANG=$SANITIZER_BUILD_STRING -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true
- cmake --build cmake-build -- -j
# rename files to fit naming convention
# en- and decoder needed because of split rendering testcases
- mv IVAS_cod IVAS_cod_ref
- mv IVAS_dec IVAS_dec_ref
- mv IVAS_rend IVAS_rend_ref
- mv ISAR_post_rend ISAR_post_rend_ref
- testcase_timeout=180
# test renderer executable with cmake + asan
renderer-asan:
extends:
- .renderer-sanitizer-job
variables:
SANITIZER_BUILD_STRING: "asan"
script:
- python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout
artifacts:
expose_as: "renderer asan result"
# test renderer executable with cmake + msan # test renderer executable with cmake + msan
renderer-msan: renderer-msan:
extends: extends:
- .test-job-linux - .renderer-sanitizer-job
- .rules-merge-request-to-main variables:
needs: ["build-codec-linux-cmake"] SANITIZER_BUILD_STRING: "msan"
stage: test
script: script:
- cmake -B cmake-build -G "Unix Makefiles" -DCLANG=msan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout
- cmake --build cmake-build -- -j
- testcase_timeout=180
- python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout
artifacts: artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" expose_as: "renderer msan result"
expire_in: 1 week
when: always
paths:
- report-junit.xml
expose_as: "renderer msan pytest results"
reports:
junit:
- report-junit.xml
# test renderer executable with cmake + usan # test renderer executable with cmake + usan
renderer-usan: renderer-usan:
extends: extends:
- .test-job-linux - .renderer-sanitizer-job
- .rules-merge-request-to-main variables:
needs: ["build-codec-linux-cmake"] SANITIZER_BUILD_STRING: "usan"
stage: test
script: script:
- cmake -B cmake-build -G "Unix Makefiles" -DCLANG=usan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout
- cmake --build cmake-build -- -j
- testcase_timeout=180
- UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1,log_path=usan_log_catchall python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout
- grep_exit_code=0
- touch usan_log_empty # Creates an empty file, this is to avoid "grep: usan_log_*: No such file or directory" in case no USAN failures are reported from pytest
- grep UndefinedBehaviorSanitizer usan_log_* || grep_exit_code=$?
- if [ $grep_exit_code != 1 ] ; then echo "Run errors in test_renderer.py with Clang undefined-behavior-sanitizer"; exit 1; fi
artifacts: artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" expose_as: "renderer usan result"
expire_in: 1 week
when: always
paths:
- report-junit.xml
expose_as: "renderer usan pytest results"
reports:
junit:
- report-junit.xml
# compare renderer bitexactness between target and source branch # compare renderer bitexactness between target and source branch
renderer-pytest-on-merge-request: renderer-pytest-on-merge-request:
...@@ -730,6 +725,7 @@ split-rendering-pytest-on-merge-request: ...@@ -730,6 +725,7 @@ split-rendering-pytest-on-merge-request:
- mv IVAS_cod IVAS_cod_ref - mv IVAS_cod IVAS_cod_ref
- mv IVAS_dec IVAS_dec_ref - mv IVAS_dec IVAS_dec_ref
- mv IVAS_rend IVAS_rend_ref - mv IVAS_rend IVAS_rend_ref
- mv ISAR_post_rend ISAR_post_rend_ref
### If ref_using_main is not set, checkout the source branch to use scripts and input from there ### If ref_using_main is not set, checkout the source branch to use scripts and input from there
- if [ $ref_using_main == 0 ]; then git restore lib_com/options.h; fi # Revert changes back before checking out another branch to avoid conflicts - if [ $ref_using_main == 0 ]; then git restore lib_com/options.h; fi # Revert changes back before checking out another branch to avoid conflicts
...@@ -777,6 +773,12 @@ ivas-pytest-on-merge-request: ...@@ -777,6 +773,12 @@ ivas-pytest-on-merge-request:
stage: compare stage: compare
needs: ["build-codec-linux-cmake", "codec-smoke-test"] needs: ["build-codec-linux-cmake", "codec-smoke-test"]
timeout: "14 minutes" timeout: "14 minutes"
parallel:
matrix:
# note: keep in sync with list in $TESTS_DIR_CODEC_BE_ON_MR
- PYTEST_SCRIPT:
- test_param_file.py
- test_sba.py
script: script:
- bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh
- commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" - commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)"
...@@ -794,7 +796,7 @@ ivas-pytest-on-merge-request: ...@@ -794,7 +796,7 @@ ivas-pytest-on-merge-request:
### prepare pytest ### prepare pytest
# create references # create references
- python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 - python3 -m pytest "$TESTS_DIR_CODEC_BE_ON_MR"/"$PYTEST_SCRIPT" -v --update_ref 1
### Run test using branch scripts and input ### Run test using branch scripts and input
- if [ $ref_using_main == 1 ]; then git checkout $source_branch_commit_sha; fi - if [ $ref_using_main == 1 ]; then git checkout $source_branch_commit_sha; fi
...@@ -802,7 +804,7 @@ ivas-pytest-on-merge-request: ...@@ -802,7 +804,7 @@ ivas-pytest-on-merge-request:
### run pytest ### run pytest
- exit_code=0 - exit_code=0
- testcase_timeout=60 - testcase_timeout=60
- python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout || exit_code=$? - python3 -m pytest "$TESTS_DIR_CODEC_BE_ON_MR"/"$PYTEST_SCRIPT" -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout || exit_code=$?
- zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true
- *merge-request-comparison-check - *merge-request-comparison-check
...@@ -811,7 +813,7 @@ ivas-pytest-on-merge-request: ...@@ -811,7 +813,7 @@ ivas-pytest-on-merge-request:
exit_codes: exit_codes:
- 123 - 123
artifacts: artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
expire_in: 1 week expire_in: 1 week
when: always when: always
paths: paths:
...@@ -862,7 +864,7 @@ ivas-interop-on-merge-request: ...@@ -862,7 +864,7 @@ ivas-interop-on-merge-request:
exit_codes: exit_codes:
- 123 - 123
artifacts: artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
expire_in: 1 week expire_in: 1 week
when: always when: always
paths: paths:
...@@ -914,7 +916,7 @@ evs-pytest-on-merge-request: ...@@ -914,7 +916,7 @@ evs-pytest-on-merge-request:
exit_codes: exit_codes:
- 123 - 123
artifacts: artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
expire_in: 1 week expire_in: 1 week
when: always when: always
paths: paths:
...@@ -1010,7 +1012,7 @@ check-first-frame-is-sid: ...@@ -1010,7 +1012,7 @@ check-first-frame-is-sid:
expose_as: "logs-sidstart" expose_as: "logs-sidstart"
expire_in: "5 days" expire_in: "5 days"
.lc3plus-ensure-no-code-changes: lc3plus-ensure-no-code-changes:
extends: extends:
- .test-job-linux - .test-job-linux
- .rules-merge-request-to-main - .rules-merge-request-to-main
...@@ -1022,7 +1024,7 @@ check-first-frame-is-sid: ...@@ -1022,7 +1024,7 @@ check-first-frame-is-sid:
- ./scripts/lc3plus_lib_setup/get_lc3plus.sh - ./scripts/lc3plus_lib_setup/get_lc3plus.sh
# Ensure git reports no changes # Ensure git reports no changes
- modified_files=$(git status -s) - modified_files=$(git status -su lib_lc3plus)
- if [[ $modified_files ]]; then printf 'LC3plus codebase was modified!\n\n'"$modified_files"'\n\n'; exit $EXIT_CODE_FAIL; fi - if [[ $modified_files ]]; then printf 'LC3plus codebase was modified!\n\n'"$modified_files"'\n\n'; exit $EXIT_CODE_FAIL; fi
check-bitexactness-hrtf-rom-and-file: check-bitexactness-hrtf-rom-and-file:
...@@ -1196,7 +1198,7 @@ codec-comparison-on-main-push: ...@@ -1196,7 +1198,7 @@ codec-comparison-on-main-push:
exit_codes: exit_codes:
- 123 - 123
artifacts: artifacts:
name: "main-push--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" name: "main-push--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
expire_in: 1 week expire_in: 1 week
when: always when: always
paths: paths:
...@@ -1255,6 +1257,7 @@ ivas-conformance: ...@@ -1255,6 +1257,7 @@ ivas-conformance:
- cp -force IVAS_cod.exe IVAS_cod_ref.exe - cp -force IVAS_cod.exe IVAS_cod_ref.exe
- cp -force IVAS_dec.exe IVAS_dec_ref.exe - cp -force IVAS_dec.exe IVAS_dec_ref.exe
- cp -force IVAS_rend.exe IVAS_rend_ref.exe - cp -force IVAS_rend.exe IVAS_rend_ref.exe
- cp -force ISAR_post_rend.exe ISAR_post_rend_ref.exe
# Reference creation # Reference creation
- python scripts/prepare_combined_format_inputs.py - python scripts/prepare_combined_format_inputs.py
...@@ -1320,6 +1323,7 @@ ivas-conformance: ...@@ -1320,6 +1323,7 @@ ivas-conformance:
expire_in: 1 week expire_in: 1 week
when: always when: always
paths: paths:
- report_cmd.html
- report-junit.xml - report-junit.xml
- report.html - report.html
- Readme_IVAS_dec.txt - Readme_IVAS_dec.txt
...@@ -1348,6 +1352,7 @@ ivas-conformance-linux: ...@@ -1348,6 +1352,7 @@ ivas-conformance-linux:
- cp IVAS_cod IVAS_cod_ref - cp IVAS_cod IVAS_cod_ref
- cp IVAS_dec IVAS_dec_ref - cp IVAS_dec IVAS_dec_ref
- cp IVAS_rend IVAS_rend_ref - cp IVAS_rend IVAS_rend_ref
- cp ISAR_post_rend ISAR_post_rend_ref
# Reference creation # Reference creation
- python3 scripts/prepare_combined_format_inputs.py - python3 scripts/prepare_combined_format_inputs.py
......
...@@ -106,7 +106,6 @@ ...@@ -106,7 +106,6 @@
<ClCompile Include="..\lib_lc3plus\apply_global_gain.c" /> <ClCompile Include="..\lib_lc3plus\apply_global_gain.c" />
<ClCompile Include="..\lib_lc3plus\ari_codec.c" /> <ClCompile Include="..\lib_lc3plus\ari_codec.c" />
<ClCompile Include="..\lib_lc3plus\attack_detector.c" /> <ClCompile Include="..\lib_lc3plus\attack_detector.c" />
<ClCompile Include="..\lib_lc3plus\plc_compute_stab_fac.c" />
<ClCompile Include="..\lib_lc3plus\constants.c" /> <ClCompile Include="..\lib_lc3plus\constants.c" />
<ClCompile Include="..\lib_lc3plus\cutoff_bandwidth.c" /> <ClCompile Include="..\lib_lc3plus\cutoff_bandwidth.c" />
<ClCompile Include="..\lib_lc3plus\dct4.c" /> <ClCompile Include="..\lib_lc3plus\dct4.c" />
...@@ -116,13 +115,13 @@ ...@@ -116,13 +115,13 @@
<ClCompile Include="..\lib_lc3plus\enc_entropy.c" /> <ClCompile Include="..\lib_lc3plus\enc_entropy.c" />
<ClCompile Include="..\lib_lc3plus\enc_lc3_fl.c" /> <ClCompile Include="..\lib_lc3plus\enc_lc3_fl.c" />
<ClCompile Include="..\lib_lc3plus\estimate_global_gain.c" /> <ClCompile Include="..\lib_lc3plus\estimate_global_gain.c" />
<ClCompile Include="..\lib_lc3plus\lc3plus_fft.c" />
<ClCompile Include="..\lib_lc3plus\imdct.c" /> <ClCompile Include="..\lib_lc3plus\imdct.c" />
<ClCompile Include="..\lib_lc3plus\lc3.c" /> <ClCompile Include="..\lib_lc3plus\lc3plus_fft.c" />
<ClCompile Include="..\lib_lc3plus\lc3plus.c" />
<ClCompile Include="..\lib_lc3plus\ltpf_coder.c" /> <ClCompile Include="..\lib_lc3plus\ltpf_coder.c" />
<ClCompile Include="..\lib_lc3plus\ltpf_decoder.c" /> <ClCompile Include="..\lib_lc3plus\ltpf_decoder.c" />
<ClCompile Include="..\lib_lc3plus\mdct.c" />
<ClCompile Include="..\lib_lc3plus\mdct_shaping.c" /> <ClCompile Include="..\lib_lc3plus\mdct_shaping.c" />
<ClCompile Include="..\lib_lc3plus\mdct.c" />
<ClCompile Include="..\lib_lc3plus\near_nyquist_detector.c" /> <ClCompile Include="..\lib_lc3plus\near_nyquist_detector.c" />
<ClCompile Include="..\lib_lc3plus\noise_factor.c" /> <ClCompile Include="..\lib_lc3plus\noise_factor.c" />
<ClCompile Include="..\lib_lc3plus\noise_filling.c" /> <ClCompile Include="..\lib_lc3plus\noise_filling.c" />
...@@ -133,35 +132,36 @@ ...@@ -133,35 +132,36 @@
<ClCompile Include="..\lib_lc3plus\pc_update.c" /> <ClCompile Include="..\lib_lc3plus\pc_update.c" />
<ClCompile Include="..\lib_lc3plus\per_band_energy.c" /> <ClCompile Include="..\lib_lc3plus\per_band_energy.c" />
<ClCompile Include="..\lib_lc3plus\plc_classify.c" /> <ClCompile Include="..\lib_lc3plus\plc_classify.c" />
<ClCompile Include="..\lib_lc3plus\plc_compute_stab_fac.c" />
<ClCompile Include="..\lib_lc3plus\plc_damping_scrambling.c" /> <ClCompile Include="..\lib_lc3plus\plc_damping_scrambling.c" />
<ClCompile Include="..\lib_lc3plus\plc_main.c" /> <ClCompile Include="..\lib_lc3plus\plc_main.c" />
<ClCompile Include="..\lib_lc3plus\plc_noise_substitution.c" /> <ClCompile Include="..\lib_lc3plus\plc_noise_substitution.c" />
<ClCompile Include="..\lib_lc3plus\plc_tdc_tdac.c" />
<ClCompile Include="..\lib_lc3plus\plc_update.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_f0_refine_first.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_f0_refine_first.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_fec_hq.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_fec_hq.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_hq_ecu.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_hq_ecu.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_lf_peak_analysis.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_lf_peak_analysis.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_rec_frame.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_rec_frame.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_setf0hz.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_setf0hz.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_subst_spec.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_spec_ana.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_spec_ana.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_subst_spec.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_tba_per_band_gain.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_tba_per_band_gain.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_tba_spect_Xavg.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_tba_spect_Xavg.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_tba_trans_dect_gains.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_tba_trans_dect_gains.c" />
<ClCompile Include="..\lib_lc3plus\plc_phecu_trans_burst_ana_sub.c" /> <ClCompile Include="..\lib_lc3plus\plc_phecu_trans_burst_ana_sub.c" />
<ClCompile Include="..\lib_lc3plus\plc_tdc_tdac.c" />
<ClCompile Include="..\lib_lc3plus\plc_tdc.c" />
<ClCompile Include="..\lib_lc3plus\plc_update.c" />
<ClCompile Include="..\lib_lc3plus\quantize_spec.c" /> <ClCompile Include="..\lib_lc3plus\quantize_spec.c" />
<ClCompile Include="..\lib_lc3plus\reorder_bitstream.c" /> <ClCompile Include="..\lib_lc3plus\reorder_bitstream.c" />
<ClCompile Include="..\lib_lc3plus\resamp12k8.c" /> <ClCompile Include="..\lib_lc3plus\resamp12k8.c" />
<ClCompile Include="..\lib_lc3plus\residual_coding.c" /> <ClCompile Include="..\lib_lc3plus\residual_coding.c" />
<ClCompile Include="..\lib_lc3plus\residual_decoding.c" /> <ClCompile Include="..\lib_lc3plus\residual_decoding.c" />
<ClCompile Include="..\lib_lc3plus\setup_dec_lc3.c" /> <ClCompile Include="..\lib_lc3plus\setup_com_lc3plus.c" />
<ClCompile Include="..\lib_lc3plus\setup_enc_lc3.c" /> <ClCompile Include="..\lib_lc3plus\setup_dec_lc3plus.c" />
<ClCompile Include="..\lib_lc3plus\setup_com_lc3.c" /> <ClCompile Include="..\lib_lc3plus\setup_enc_lc3plus.c" />
<ClCompile Include="..\lib_lc3plus\sns_compute_scf.c" /> <ClCompile Include="..\lib_lc3plus\sns_compute_scf.c" />
<ClCompile Include="..\lib_lc3plus\sns_interpolate_scf.c" /> <ClCompile Include="..\lib_lc3plus\sns_interpolate_scf.c" />
<ClCompile Include="..\lib_lc3plus\sns_quantize_scf.c" /> <ClCompile Include="..\lib_lc3plus\sns_quantize_scf.c" />
<ClCompile Include="..\lib_lc3plus\plc_tdc.c" />
<ClCompile Include="..\lib_lc3plus\tns_coder.c" /> <ClCompile Include="..\lib_lc3plus\tns_coder.c" />
<ClCompile Include="..\lib_lc3plus\tns_decoder.c" /> <ClCompile Include="..\lib_lc3plus\tns_decoder.c" />
</ItemGroup> </ItemGroup>
...@@ -169,14 +169,12 @@ ...@@ -169,14 +169,12 @@
<ClInclude Include="..\lib_lc3plus\clib.h" /> <ClInclude Include="..\lib_lc3plus\clib.h" />
<ClInclude Include="..\lib_lc3plus\constants.h" /> <ClInclude Include="..\lib_lc3plus\constants.h" />
<ClInclude Include="..\lib_lc3plus\defines.h" /> <ClInclude Include="..\lib_lc3plus\defines.h" />
<ClInclude Include="..\lib_lc3plus\file_io.h" />
<ClInclude Include="..\lib_lc3plus\functions.h" /> <ClInclude Include="..\lib_lc3plus\functions.h" />
<ClInclude Include="..\lib_lc3plus\lc3.h" /> <ClInclude Include="..\lib_lc3plus\lc3plus.h" />
<ClInclude Include="..\lib_lc3plus\setup_dec_lc3.h" /> <ClInclude Include="..\lib_lc3plus\license.h" />
<ClInclude Include="..\lib_lc3plus\setup_enc_lc3.h" /> <ClInclude Include="..\lib_lc3plus\setup_dec_lc3plus.h" />
<ClInclude Include="..\lib_lc3plus\setup_enc_lc3plus.h" />
<ClInclude Include="..\lib_lc3plus\structs.h" /> <ClInclude Include="..\lib_lc3plus\structs.h" />
<ClInclude Include="..\lib_lc3plus\tinywavein_c.h" />
<ClInclude Include="..\lib_lc3plus\tinywaveout_c.h" />
<ClInclude Include="..\lib_lc3plus\util.h" /> <ClInclude Include="..\lib_lc3plus\util.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
......
...@@ -175,6 +175,7 @@ ...@@ -175,6 +175,7 @@
<ClCompile Include="..\lib_rend\ivas_rom_rend.c" /> <ClCompile Include="..\lib_rend\ivas_rom_rend.c" />
<ClCompile Include="..\lib_rend\ivas_shoebox.c" /> <ClCompile Include="..\lib_rend\ivas_shoebox.c" />
<ClCompile Include="..\lib_rend\ivas_td_decorr.c" /> <ClCompile Include="..\lib_rend\ivas_td_decorr.c" />
<ClCompile Include="..\lib_rend\ivas_td_ring_buffer.c" />
<ClCompile Include="..\lib_rend\ivas_vbap.c" /> <ClCompile Include="..\lib_rend\ivas_vbap.c" />
<ClCompile Include="..\lib_rend\lib_rend.c" /> <ClCompile Include="..\lib_rend\lib_rend.c" />
</ItemGroup> </ItemGroup>
......
...@@ -32,30 +32,12 @@ ...@@ -32,30 +32,12 @@
<ClCompile Include="..\lib_rend\ivas_hrtf.c"> <ClCompile Include="..\lib_rend\ivas_hrtf.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\lib_rend\ivas_lc3plus_common.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_lc3plus_dec.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_lc3plus_enc.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_limiter.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_masa_merge.c"> <ClCompile Include="..\lib_rend\ivas_masa_merge.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\lib_rend\ivas_mcmasa_ana.c"> <ClCompile Include="..\lib_rend\ivas_mcmasa_ana.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\lib_rend\ivas_MSPred.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_NoiseGen.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_objectRenderer.c"> <ClCompile Include="..\lib_rend\ivas_objectRenderer.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
...@@ -83,15 +65,6 @@ ...@@ -83,15 +65,6 @@
<ClCompile Include="..\lib_rend\ivas_output_init.c"> <ClCompile Include="..\lib_rend\ivas_output_init.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\lib_rend\ivas_PerceptualModel.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_PredDecoder.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_PredEncoder.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_render_config.c"> <ClCompile Include="..\lib_rend\ivas_render_config.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
...@@ -113,9 +86,6 @@ ...@@ -113,9 +86,6 @@
<ClCompile Include="..\lib_rend\ivas_reverb_utils.c"> <ClCompile Include="..\lib_rend\ivas_reverb_utils.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\lib_rend\ivas_RMSEnvGrouping.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_rom_binaural_crend_head.c"> <ClCompile Include="..\lib_rend\ivas_rom_binaural_crend_head.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
...@@ -134,24 +104,6 @@ ...@@ -134,24 +104,6 @@
<ClCompile Include="..\lib_rend\ivas_sba_rendering.c"> <ClCompile Include="..\lib_rend\ivas_sba_rendering.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\lib_rend\ivas_splitRend_lcld_dec.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_splitRend_lcld_enc.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_splitRenderer_utils.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_splitRendererPLC.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_splitRendererPost.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_splitRendererPre.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_shoebox.c"> <ClCompile Include="..\lib_rend\ivas_shoebox.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
...@@ -161,30 +113,15 @@ ...@@ -161,30 +113,15 @@
<ClCompile Include="..\lib_rend\ivas_vbap.c"> <ClCompile Include="..\lib_rend\ivas_vbap.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\lib_rend\ivas_lcld_rom_tables.c"> <ClCompile Include="..\lib_rend\ivas_td_decorr.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_lcld_decoder.c">
<Filter>rend_c</Filter>
</ClCompile>
<ClCompile Include="..\lib_rend\ivas_lcld_encoder.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\lib_rend\ivas_td_decorr.c"> <ClCompile Include="..\lib_rend\ivas_td_ring_buffer.c">
<Filter>rend_c</Filter> <Filter>rend_c</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\lib_rend\lib_rend.h" /> <ClInclude Include="..\lib_rend\lib_rend.h" />
<ClInclude Include="..\lib_rend\ivas_lc3plus_common.h">
<Filter>rend_h</Filter>
</ClInclude>
<ClInclude Include="..\lib_rend\ivas_lc3plus_enc.h">
<Filter>rend_h</Filter>
</ClInclude>
<ClInclude Include="..\lib_rend\ivas_lc3plus_dec.h">
<Filter>rend_h</Filter>
</ClInclude>
<ClInclude Include="..\lib_rend\ivas_prot_rend.h"> <ClInclude Include="..\lib_rend\ivas_prot_rend.h">
<Filter>rend_h</Filter> <Filter>rend_h</Filter>
</ClInclude> </ClInclude>
...@@ -203,12 +140,6 @@ ...@@ -203,12 +140,6 @@
<ClInclude Include="..\lib_rend\ivas_rom_TdBinauralRenderer.h"> <ClInclude Include="..\lib_rend\ivas_rom_TdBinauralRenderer.h">
<Filter>rend_h</Filter> <Filter>rend_h</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\lib_rend\ivas_lcld_prot.h">
<Filter>rend_h</Filter>
</ClInclude>
<ClInclude Include="..\lib_rend\ivas_lcld_rom_tables.h">
<Filter>rend_h</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Filter Include="rend_h"> <Filter Include="rend_h">
......
...@@ -1617,6 +1617,18 @@ static bool parseCmdlIVAS_dec( ...@@ -1617,6 +1617,18 @@ static bool parseCmdlIVAS_dec(
return false; return false;
} }
#ifdef SUPPORT_JBM_TRACEFILE
/* Validate options that depend on other options */
if ( arg->jbmTraceFilename != NULL && arg->delayCompensationEnabled
/* This decMode check should be removed once timestamp sync issues between JBM trace and audio are fixed in EVS */
&& arg->decMode != IVAS_DEC_MODE_EVS )
{
fprintf( stderr, "Error: Writing to a JBM trace file requires delay compensation to be disabled with -no_delay_cmp\n\n" );
usage_dec();
return false;
}
#endif
return true; return true;
} }
...@@ -1653,7 +1665,8 @@ static void usage_dec( void ) ...@@ -1653,7 +1665,8 @@ static void usage_dec( void )
fprintf( stdout, " EVS RTP Payload Format. The SDP parameter hf_only is required.\n" ); fprintf( stdout, " EVS RTP Payload Format. The SDP parameter hf_only is required.\n" );
fprintf( stdout, " Reading RFC4867 AMR/AMR-WB RTP payload format is not supported.\n" ); fprintf( stdout, " Reading RFC4867 AMR/AMR-WB RTP payload format is not supported.\n" );
#ifdef SUPPORT_JBM_TRACEFILE #ifdef SUPPORT_JBM_TRACEFILE
fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF\n" ); fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF. Requires -no_delay_cmp to\n" );
fprintf( stdout, " be enabled so that trace contents remain in sync with audio output.\n" );
#endif #endif
#ifdef DEBUGGING #ifdef DEBUGGING
#ifdef VARIABLE_SPEED_DECODING #ifdef VARIABLE_SPEED_DECODING
...@@ -1858,13 +1871,13 @@ static ivas_error initOnFirstGoodFrame( ...@@ -1858,13 +1871,13 @@ static ivas_error initOnFirstGoodFrame(
return error; return error;
} }
int16_t *zeroBuf = malloc( pcmFrameSize * sizeof( int16_t ) ); /* Write zeros to the output audio buffer */
int16_t *zeroBuf = calloc( pcmFrameSize, sizeof( int16_t ) );
if ( zeroBuf == NULL ) if ( zeroBuf == NULL )
{ {
fprintf( stdout, "Error: Unable to allocate memory for output buffer.\n" ); fprintf( stdout, "Error: Unable to allocate memory for output buffer.\n" );
return IVAS_ERR_FAILED_ALLOC; return IVAS_ERR_FAILED_ALLOC;
} }
memset( zeroBuf, 0, pcmFrameSize * sizeof( int16_t ) );
for ( int16_t i = 0; i < numInitialBadFrames; ++i ) for ( int16_t i = 0; i < numInitialBadFrames; ++i )
{ {
...@@ -1888,7 +1901,6 @@ static ivas_error initOnFirstGoodFrame( ...@@ -1888,7 +1901,6 @@ static ivas_error initOnFirstGoodFrame(
} }
else else
{ {
if ( *pRemainingDelayNumSamples < *numOutSamples ) if ( *pRemainingDelayNumSamples < *numOutSamples )
{ {
if ( ( error = AudioFileWriter_write( *ppAfWriter, zeroBuf, *numOutSamples * *pNumOutChannels - ( *pRemainingDelayNumSamples * *pNumOutChannels ) ) ) != IVAS_ERR_OK ) if ( ( error = AudioFileWriter_write( *ppAfWriter, zeroBuf, *numOutSamples * *pNumOutChannels - ( *pRemainingDelayNumSamples * *pNumOutChannels ) ) ) != IVAS_ERR_OK )
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
the software. This notice grants no license of any kind, including but not limited to patent the software. This notice grants no license of any kind, including but not limited to patent
license, nor is any license granted by implication, estoppel or otherwise. license, nor is any license granted by implication, estoppel or otherwise.
Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
Contributors are required to enter into the IVAS codec Public Collaboration agreement before making Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
contributions. contributions.
......
...@@ -681,6 +681,7 @@ int main( ...@@ -681,6 +681,7 @@ int main(
int argc, int argc,
char **argv ) char **argv )
{ {
bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */
ISAR_POST_REND_HANDLE hIsarPostRend = NULL; ISAR_POST_REND_HANDLE hIsarPostRend = NULL;
RotFileReader *headRotReader = NULL; RotFileReader *headRotReader = NULL;
RotFileReader *externalOrientationFileReader = NULL; RotFileReader *externalOrientationFileReader = NULL;
...@@ -1222,6 +1223,8 @@ int main( ...@@ -1222,6 +1223,8 @@ int main(
* Close files and deallocate resources * Close files and deallocate resources
*------------------------------------------------------------------------------------------*/ *------------------------------------------------------------------------------------------*/
mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */
cleanup: cleanup:
free( inpInt16Buffer ); free( inpInt16Buffer );
...@@ -1252,7 +1255,7 @@ cleanup: ...@@ -1252,7 +1255,7 @@ cleanup:
print_mem( NULL ); print_mem( NULL );
#endif #endif
return 0; return mainFailed ? -1 : 0;
} }
......
...@@ -68,6 +68,8 @@ ...@@ -68,6 +68,8 @@
#define IVAS_MAX16B_FLT 32767.0f #define IVAS_MAX16B_FLT 32767.0f
#define IVAS_MIN16B_FLT ( -32768.0f ) #define IVAS_MIN16B_FLT ( -32768.0f )
#define OMASA_TDREND_MATCHING_GAIN_DB ( -2.0f )
#if !defined( DEBUGGING ) && !defined( WMOPS ) #if !defined( DEBUGGING ) && !defined( WMOPS )
static static
#endif #endif
...@@ -232,13 +234,13 @@ static const CmdLnParser_Option cliOptions[] = { ...@@ -232,13 +234,13 @@ static const CmdLnParser_Option cliOptions[] = {
.id = CmdLnOptionId_inputFormat, .id = CmdLnOptionId_inputFormat,
.match = "input_format", .match = "input_format",
.matchShort = "if", .matchShort = "if",
.description = "Audio format of input file (e.g. 5_1 or HOA3 or META, use -l for a list)", .description = "Audio format of input file (e.g. 5_1 or HOA3 or META,\nuse -l for a list)",
}, },
{ {
.id = CmdLnOptionId_inputMetadata, .id = CmdLnOptionId_inputMetadata,
.match = "input_metadata", .match = "input_metadata",
.matchShort = "im", .matchShort = "im",
.description = "Space-separated list of path to metadata files for ISM or MASA inputs or BINAURAL_SPLIT_PCM input mode. For OMASA, ISM files must be specified first.", .description = "Space-separated list of path to metadata files for ISM/MASA/OMASA/\nOSBA/BINAURAL_SPLIT_PCM inputs. \nFor OMASA, ISM files must be specified first.",
}, },
{ {
.id = CmdLnOptionId_outputFile, .id = CmdLnOptionId_outputFile,
...@@ -256,13 +258,13 @@ static const CmdLnParser_Option cliOptions[] = { ...@@ -256,13 +258,13 @@ static const CmdLnParser_Option cliOptions[] = {
.id = CmdLnOptionId_sampleRate, .id = CmdLnOptionId_sampleRate,
.match = "sample_rate", .match = "sample_rate",
.matchShort = "fs", .matchShort = "fs",
.description = "Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs", .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw\nPCM inputs",
}, },
{ {
.id = CmdLnOptionId_trajFile, .id = CmdLnOptionId_trajFile,
.match = "trajectory_file", .match = "trajectory_file",
.matchShort = "T", .matchShort = "T",
.description = "Head rotation trajectory file for simulation of head tracking (only for binaural outputs)", .description = "Head rotation trajectory file for simulation of head tracking\n(only for binaural outputs)",
}, },
{ {
.id = CmdLnOptionId_outputMetadata, .id = CmdLnOptionId_outputMetadata,
...@@ -280,43 +282,43 @@ static const CmdLnParser_Option cliOptions[] = { ...@@ -280,43 +282,43 @@ static const CmdLnParser_Option cliOptions[] = {
.id = CmdLnOptionId_refRotFile, .id = CmdLnOptionId_refRotFile,
.match = "reference_rotation_file", .match = "reference_rotation_file",
.matchShort = "rf", .matchShort = "rf",
.description = "Reference rotation trajectory file for simulation of head tracking (only for binaural outputs)", .description = "Reference rotation trajectory file for simulation of head tracking\n(only for binaural outputs)",
}, },
{ {
.id = CmdLnOptionId_customHrtfFile, .id = CmdLnOptionId_customHrtfFile,
.match = "custom_hrtf", .match = "custom_hrtf",
.matchShort = "hrtf", .matchShort = "hrtf",
.description = "Custom HRTF file for binaural rendering (only for binaural outputs)", .description = "Custom HRTF file for binaural rendering\n(only for binaural outputs)",
}, },
{ {
.id = CmdLnOptionId_renderConfigFile, .id = CmdLnOptionId_renderConfigFile,
.match = "render_config_parameters", .match = "render_config_parameters",
.matchShort = "render_config", .matchShort = "render_config",
.description = "Binaural renderer configuration parameters in file (only for binaural outputs)", .description = "Binaural renderer configuration parameters in file\n(only for binaural outputs)",
}, },
{ {
.id = CmdLnOptionId_nonDiegeticPan, .id = CmdLnOptionId_nonDiegeticPan,
.match = "non_diegetic_panning", .match = "non_diegetic_panning",
.matchShort = "non_diegetic_pan", .matchShort = "non_diegetic_pan",
.description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right, center or c or 0 ->middle\n", .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right,\ncenter or c or 0 ->middle",
}, },
{ {
.id = CmdLnOptionId_orientationTracking, .id = CmdLnOptionId_orientationTracking,
.match = "tracking_type", .match = "tracking_type",
.matchShort = "otr", .matchShort = "otr",
.description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs)", .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec`\nor `ref_vec_lev` (only for binaural outputs)",
}, },
{ {
.id = CmdlnOptionId_lfePosition, .id = CmdlnOptionId_lfePosition,
.match = "lfe_position", .match = "lfe_position",
.matchShort = "lp", .matchShort = "lp",
.description = "Output LFE position. Comma-delimited triplet of [gain, azimuth, elevation] where gain is linear (like --gain, -g) and azimuth, elevation are in degrees.\nIf specified, overrides the default behavior which attempts to map input to output LFE channel(s)", .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth,\nelevation] where gain is linear (like --gain, -g) and azimuth,\nelevation are in degrees. If specified, overrides the default\nbehavior which attempts to map input to output LFE channel(s)",
}, },
{ {
.id = CmdlnOptionId_lfeMatrix, .id = CmdlnOptionId_lfeMatrix,
.match = "lfe_matrix", .match = "lfe_matrix",
.matchShort = "lm", .matchShort = "lm",
.description = "LFE panning matrix. File (CSV table) containing a matrix of dimensions [ num_input_lfe x num_output_channels ] with elements specifying linear routing gain (like --gain, -g). \nIf specified, overrides the output LFE position option and the default behavior which attempts to map input to output LFE channel(s)", .description = "LFE panning matrix. File (CSV table) containing a matrix of\ndimensions [ num_input_lfe x num_output_channels ] with elements\nspecifying linear routing gain (like --gain, -g). If specified,\noverrides the output LFE position option and the default\nbehavior which attempts to map input to output LFE channel(s)",
}, },
{ {
.id = CmdLnOptionId_noDelayCmp, .id = CmdLnOptionId_noDelayCmp,
...@@ -328,7 +330,7 @@ static const CmdLnParser_Option cliOptions[] = { ...@@ -328,7 +330,7 @@ static const CmdLnParser_Option cliOptions[] = {
.id = CmdLnOptionId_complexityLevel, .id = CmdLnOptionId_complexityLevel,
.match = "complexity_level", .match = "complexity_level",
.matchShort = "level", .matchShort = "level",
.description = "Complexity level, level = (1, 2, 3), will be defined after characterisation.", .description = "Complexity level, level = (1, 2, 3), will be defined after\ncharacterisation.",
}, },
{ {
.id = CmdLnOptionId_quietModeEnabled, .id = CmdLnOptionId_quietModeEnabled,
...@@ -352,13 +354,13 @@ static const CmdLnParser_Option cliOptions[] = { ...@@ -352,13 +354,13 @@ static const CmdLnParser_Option cliOptions[] = {
.id = CmdLnOptionId_referenceVectorFile, .id = CmdLnOptionId_referenceVectorFile,
.match = "reference_vector_file", .match = "reference_vector_file",
.matchShort = "rvf", .matchShort = "rvf",
.description = "Reference vector trajectory file for simulation of head tracking (only for binaural outputs)", .description = "Reference vector trajectory file for simulation of head tracking\n(only for binaural outputs)",
}, },
{ {
.id = CmdLnOptionId_exteriorOrientationFile, .id = CmdLnOptionId_exteriorOrientationFile,
.match = "exterior_orientation_file", .match = "exterior_orientation_file",
.matchShort = "exof", .matchShort = "exof",
.description = "External orientation trajectory file for simulation of external orientations", .description = "External orientation trajectory file for simulation of external\norientations",
}, },
{ {
.id = CmdLnOptionId_framing, .id = CmdLnOptionId_framing,
...@@ -370,19 +372,19 @@ static const CmdLnParser_Option cliOptions[] = { ...@@ -370,19 +372,19 @@ static const CmdLnParser_Option cliOptions[] = {
.id = CmdLnOptionId_syncMdDelay, .id = CmdLnOptionId_syncMdDelay,
.match = "sync_md_delay", .match = "sync_md_delay",
.matchShort = "smd", .matchShort = "smd",
.description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by 5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)", .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by\n5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)",
}, },
{ {
.id = CmdLnOptionId_directivityPatternId, .id = CmdLnOptionId_directivityPatternId,
.match = "ism_directivity_pattern_id", .match = "ism_directivity_pattern_id",
.matchShort = "dpid", .matchShort = "dpid",
.description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated list of up to 4 numbers (unsigned integers) can be specified for BINAURAL and BINAURAL_ROOM_REVERB output configuration.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for ISMs 1,2,3 and 4 respectively.\nThis options needs to be accompanied by a render_config file, otherwise a default directivity pattern is used.", .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated\nlist of up to 4 numbers (unsigned integers) can be specified for\nBINAURAL and BINAURAL_ROOM_REVERB output.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for\nISMs 1,2,3 and 4 respectively. \nThis option needs to be accompanied by a render_config file,\notherwise a default directivity pattern is used.",
}, },
{ {
.id = CmdLnOptionId_acousticEnvironmentId, .id = CmdLnOptionId_acousticEnvironmentId,
.match = "acoustic_environment_id", .match = "acoustic_environment_id",
.matchShort = "aeid", .matchShort = "aeid",
.description = "Acoustic environment ID (number > 0) alternatively, it can be a text file where each line contains \"ID duration\" for BINAURAL_ROOM_REVERB output configuration.", .description = "Acoustic environment ID (number > 0) alternatively, it can be\na text file where each line contains \"ID duration\" for\nBINAURAL_ROOM_REVERB output.",
}, },
}; };
...@@ -562,12 +564,19 @@ static void setupWithSingleFormatInput( ...@@ -562,12 +564,19 @@ static void setupWithSingleFormatInput(
positionProvider->numObjects = args.inConfig.numAudioObjects; positionProvider->numObjects = args.inConfig.numAudioObjects;
for ( int16_t i = 0; i < positionProvider->numObjects; ++i ) for ( int16_t i = 0; i < positionProvider->numObjects; ++i )
{ {
/* It is allowed on CLI to have no metadata for an ISM input - skip opening if string is empty or contains "NULL" */ /* Check if path to metadata file was given */
if ( isEmptyString( args.inMetadataFilePaths[i] ) )
{
fprintf( stderr, "No metadata file was given for ISM input %d\n", i );
exit( -1 );
}
/* It is allowed on CLI to have no metadata for an ISM input - skip opening if string contains "NULL" */
char charBuf[FILENAME_MAX]; char charBuf[FILENAME_MAX];
strncpy( charBuf, args.inMetadataFilePaths[i], min( FILENAME_MAX, RENDERER_MAX_CLI_ARG_LENGTH ) - 1 ); strncpy( charBuf, args.inMetadataFilePaths[i], min( FILENAME_MAX, RENDERER_MAX_CLI_ARG_LENGTH ) - 1 );
charBuf[min( FILENAME_MAX, RENDERER_MAX_CLI_ARG_LENGTH ) - 1] = '\0'; charBuf[min( FILENAME_MAX, RENDERER_MAX_CLI_ARG_LENGTH ) - 1] = '\0';
to_upper( charBuf ); to_upper( charBuf );
if ( isEmptyString( args.inMetadataFilePaths[i] ) || strncmp( charBuf, "NULL", 4 ) == 0 ) if ( strncmp( charBuf, "NULL", 4 ) == 0 )
{ {
continue; continue;
} }
...@@ -659,12 +668,13 @@ int main( ...@@ -659,12 +668,13 @@ int main(
int argc, int argc,
char **argv ) char **argv )
{ {
bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */
IVAS_REND_HANDLE hIvasRend = NULL; IVAS_REND_HANDLE hIvasRend = NULL;
RotFileReader *headRotReader = NULL; RotFileReader *headRotReader = NULL;
RotFileReader *externalOrientationFileReader = NULL; RotFileReader *externalOrientationFileReader = NULL;
RotFileReader *referenceRotReader = NULL; RotFileReader *referenceRotReader = NULL;
IVAS_CLDFB_FILTER_BANK_HANDLE cldfbAna[IVAS_MAX_INPUT_CHANNELS]; IVAS_CLDFB_FILTER_BANK_HANDLE cldfbAna[RENDERER_MAX_INPUT_CHANNELS];
IVAS_CLDFB_FILTER_BANK_HANDLE cldfbSyn[IVAS_MAX_INPUT_CHANNELS]; IVAS_CLDFB_FILTER_BANK_HANDLE cldfbSyn[RENDERER_MAX_INPUT_CHANNELS];
int16_t cldfb_in_flag, CLDFBframeSize_smpls; int16_t cldfb_in_flag, CLDFBframeSize_smpls;
SplitRendBFIFileReader *splitRendBFIReader = NULL; SplitRendBFIFileReader *splitRendBFIReader = NULL;
Vector3PairFileReader *referenceVectorReader = NULL; Vector3PairFileReader *referenceVectorReader = NULL;
...@@ -697,6 +707,7 @@ int main( ...@@ -697,6 +707,7 @@ int main(
SplitFileReadWrite *hSplitRendFileReadWrite; SplitFileReadWrite *hSplitRendFileReadWrite;
int16_t delayNumSamples_temp; int16_t delayNumSamples_temp;
int32_t delayTimeScale_temp; int32_t delayTimeScale_temp;
bool flushRendererLastFrame = false;
int16_t numSamplesRead; int16_t numSamplesRead;
int16_t delayNumSamples = -1; int16_t delayNumSamples = -1;
int16_t delayNumSamples_orig = 0; int16_t delayNumSamples_orig = 0;
...@@ -741,8 +752,11 @@ int main( ...@@ -741,8 +752,11 @@ int main(
CmdlnArgs args = parseCmdlnArgs( argc, argv ); CmdlnArgs args = parseCmdlnArgs( argc, argv );
if ( args.nonDiegeticPan && !( ( args.inConfig.numAudioObjects == 0 && args.inConfig.multiChannelBuses[0].audioConfig == IVAS_AUDIO_CONFIG_MONO ) || if ( args.nonDiegeticPan &&
( args.inConfig.numAudioObjects > 0 && args.inConfig.audioObjects[0].audioConfig == IVAS_AUDIO_CONFIG_OBA && args.inConfig.numAudioObjects == 1 ) ) ) !( ( args.inConfig.numAudioObjects == 0 &&
args.inConfig.multiChannelBuses[0].audioConfig == IVAS_AUDIO_CONFIG_MONO ) ||
( args.inConfig.numAudioObjects > 0 &&
args.inConfig.audioObjects[0].audioConfig == IVAS_AUDIO_CONFIG_OBA && args.inConfig.numAudioObjects == 1 ) ) )
{ {
fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires mono or ISM1 input\n" ); fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires mono or ISM1 input\n" );
goto cleanup; goto cleanup;
...@@ -1063,7 +1077,10 @@ int main( ...@@ -1063,7 +1077,10 @@ int main(
{ {
/* sanity check */ /* sanity check */
if ( ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && !is_split_pre_rend_mode( &args ) ) if ( ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL ) &&
( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) &&
( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) &&
!is_split_pre_rend_mode( &args ) )
{ {
fprintf( stderr, "\nExternal Renderer Config is supported only when binaural output configurations is used as output OR when Split pre-rendering mode is enabled. Exiting. \n" ); fprintf( stderr, "\nExternal Renderer Config is supported only when binaural output configurations is used as output OR when Split pre-rendering mode is enabled. Exiting. \n" );
goto cleanup; goto cleanup;
...@@ -1081,6 +1098,18 @@ int main( ...@@ -1081,6 +1098,18 @@ int main(
goto cleanup; goto cleanup;
} }
if ( ( error = RenderConfigReader_getDirectivity( renderConfigReader, args.directivityPatternId, renderConfig.directivity ) ) != IVAS_ERR_OK )
{
fprintf( stderr, "Failed to get directivity patterns for one or more of IDs: %d %d %d %d\n\n", args.directivityPatternId[0], args.directivityPatternId[1], args.directivityPatternId[2], args.directivityPatternId[3] );
goto cleanup;
}
if ( ( error = RenderConfigReader_getDistanceAttenuation( renderConfigReader, renderConfig.distAtt ) ) != IVAS_ERR_OK )
{
fprintf( stderr, "Failed to get Distance Attenuation \n\n" );
goto cleanup;
}
if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
{ {
aeID = args.aeSequence.count > 0 ? args.aeSequence.pID[0] : 65535; aeID = args.aeSequence.count > 0 ? args.aeSequence.pID[0] : 65535;
...@@ -1140,20 +1169,30 @@ int main( ...@@ -1140,20 +1169,30 @@ int main(
} }
} }
/* Set the total number of objects */
if ( args.inConfig.numAudioObjects > 0 ) if ( args.inConfig.numAudioObjects > 0 )
{ {
/* Set the total number of objects */
if ( ( error = IVAS_REND_SetTotalNumberOfObjects( hIvasRend, args.inConfig.numAudioObjects ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_SetTotalNumberOfObjects( hIvasRend, args.inConfig.numAudioObjects ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nError in IVAS_REND_SetTotalNumberOfObjects(): %s\n", ivas_error_to_string( error ) ); fprintf( stderr, "\nError in IVAS_REND_SetTotalNumberOfObjects(): %s\n", ivas_error_to_string( error ) );
goto cleanup; goto cleanup;
} }
/* Set the metadata delay for objects */
if ( ( error = IVAS_REND_SetIsmMetadataDelay( hIvasRend, args.syncMdDelay ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_SetIsmMetadataDelay( hIvasRend, args.syncMdDelay ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nError in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string( error ) ); fprintf( stderr, "\nError in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string( error ) );
goto cleanup; goto cleanup;
} }
/* For OMASA input and BINAURAL output, apply a gain to objects to match the loudness with MASA part */
if ( args.inConfig.numMasaBuses > 0 && args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL )
{
for ( i = 0; i < args.inConfig.numAudioObjects; ++i )
{
args.inConfig.audioObjects[i].gain_dB += OMASA_TDREND_MATCHING_GAIN_DB;
}
}
} }
IVAS_REND_LfePanMtx lfePanMatrix; IVAS_REND_LfePanMtx lfePanMatrix;
...@@ -1338,7 +1377,7 @@ int main( ...@@ -1338,7 +1377,7 @@ int main(
} }
int16_t numOutChannels; int16_t numOutChannels;
if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_GetNumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nError in IVAS_REND_NumOutChannels(): %s\n", ivas_error_to_string( error ) ); fprintf( stderr, "\nError in IVAS_REND_NumOutChannels(): %s\n", ivas_error_to_string( error ) );
goto cleanup; goto cleanup;
...@@ -1353,31 +1392,16 @@ int main( ...@@ -1353,31 +1392,16 @@ int main(
} }
} }
if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
{
if ( ( error = IVAS_REND_GetSplitRendBitstreamHeader( hIvasRend, &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, &bitsBuffer.config.codec_frame_size_ms, &bitsBuffer.config.isar_frame_size_ms ) ) != IVAS_ERR_OK )
{
fprintf( stderr, "\nError in IVAS_REND_GetSplitRendBitstreamHeader()!\n" );
goto cleanup;
}
if ( IVAS_REND_GetDelay( hIvasRend, &delayNumSamples_temp, &delayTimeScale_temp ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nUnable to get delay of renderer!\n" ); char *outFile = args.outMetadataFilePath;
goto cleanup;
}
if ( ( error = split_rend_writer_open( &hSplitRendFileReadWrite, args.outputFilePath, delayNumSamples_temp, delayTimeScale_temp, bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, bitsBuffer.config.codec_frame_size_ms, bitsBuffer.config.isar_frame_size_ms, args.sampleRate, bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK ) if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED )
{ {
fprintf( stderr, "\nCould not open split rend metadata file %s\n", args.outputFilePath ); outFile = args.outputFilePath;
goto cleanup;
}
audioWriter = NULL; audioWriter = NULL;
} }
else
{
if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
{
if ( ( error = IVAS_REND_GetSplitRendBitstreamHeader( hIvasRend, &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, &bitsBuffer.config.codec_frame_size_ms, &bitsBuffer.config.isar_frame_size_ms ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_GetSplitRendBitstreamHeader( hIvasRend, &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, &bitsBuffer.config.codec_frame_size_ms, &bitsBuffer.config.isar_frame_size_ms ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nError in IVAS_REND_GetSplitRendBitstreamHeader()!\n" ); fprintf( stderr, "\nError in IVAS_REND_GetSplitRendBitstreamHeader()!\n" );
...@@ -1390,13 +1414,15 @@ int main( ...@@ -1390,13 +1414,15 @@ int main(
goto cleanup; goto cleanup;
} }
if ( ( error = split_rend_writer_open( &hSplitRendFileReadWrite, args.outMetadataFilePath, delayNumSamples_temp, delayTimeScale_temp, bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, bitsBuffer.config.codec_frame_size_ms, bitsBuffer.config.isar_frame_size_ms, args.sampleRate, bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK ) if ( ( error = split_rend_writer_open( &hSplitRendFileReadWrite, outFile, delayNumSamples_temp, delayTimeScale_temp, bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, bitsBuffer.config.codec_frame_size_ms, bitsBuffer.config.isar_frame_size_ms, args.sampleRate, bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nCould not open split rend metadata file %s\n", args.outMetadataFilePath ); fprintf( stderr, "\nCould not open split rend metadata file %s\n", outFile );
goto cleanup; goto cleanup;
} }
} }
if ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED )
{
if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK ) if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nFailed to open file: %s\n", args.outputFilePath ); fprintf( stderr, "\nFailed to open file: %s\n", args.outputFilePath );
...@@ -1522,16 +1548,23 @@ int main( ...@@ -1522,16 +1548,23 @@ int main(
if ( numSamplesRead == 0 ) if ( numSamplesRead == 0 )
{ {
/* end of input data */ /* end of input data */
break; flushRendererLastFrame = true;
} }
/* Convert from int to float and from interleaved to packed */ /* Convert from int to float and from interleaved to packed */
if ( !flushRendererLastFrame )
{
convertInputBuffer( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inFloatBuffer, inBuffer.config.is_cldfb, cldfbAna ); convertInputBuffer( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inFloatBuffer, inBuffer.config.is_cldfb, cldfbAna );
}
else
{
memset( inBuffer.data, 0, inBuffer.config.numChannels * inBuffer.config.numSamplesPerChannel * sizeof( float ) );
}
int16_t num_subframes, sf_idx; int16_t num_subframes, sf_idx;
num_subframes = (int16_t) args.render_framesize; num_subframes = (int16_t) args.render_framesize;
if ( isCurrentFrameMultipleOf20ms ) if ( isCurrentFrameMultipleOf20ms && !flushRendererLastFrame )
{ {
IsmPositionProvider_getNextFrame( positionProvider, &mtdBuffer ); IsmPositionProvider_getNextFrame( positionProvider, &mtdBuffer );
...@@ -1643,7 +1676,7 @@ int main( ...@@ -1643,7 +1676,7 @@ int main(
} }
IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.multiChannelBuses[i].inputChannelIndex, numChannels ); IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.multiChannelBuses[i].inputChannelIndex, numChannels );
if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, mcIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, mcIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) );
goto cleanup; goto cleanup;
...@@ -1658,7 +1691,7 @@ int main( ...@@ -1658,7 +1691,7 @@ int main(
{ {
IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, args.inConfig.numAudioObjects ); IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, args.inConfig.numAudioObjects );
if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, ismIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, ismIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) );
goto cleanup; goto cleanup;
...@@ -1675,7 +1708,7 @@ int main( ...@@ -1675,7 +1708,7 @@ int main(
{ {
IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, 1 ); IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, 1 );
if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, ismIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, ismIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) );
goto cleanup; goto cleanup;
...@@ -1698,7 +1731,7 @@ int main( ...@@ -1698,7 +1731,7 @@ int main(
} }
IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.ambisonicsBuses[i].inputChannelIndex, numChannels ); IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.ambisonicsBuses[i].inputChannelIndex, numChannels );
if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, sbaIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, sbaIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) );
goto cleanup; goto cleanup;
...@@ -1714,13 +1747,13 @@ int main( ...@@ -1714,13 +1747,13 @@ int main(
} }
IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.masaBuses[i].inputChannelIndex, numChannels ); IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.masaBuses[i].inputChannelIndex, numChannels );
if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, masaIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_FeedInputAudio( hIvasRend, masaIds[i], tmpBuffer, flushRendererLastFrame ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "IVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); fprintf( stderr, "IVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) );
goto cleanup; goto cleanup;
} }
if ( isCurrentFrameMultipleOf20ms ) if ( isCurrentFrameMultipleOf20ms && !flushRendererLastFrame )
{ {
if ( masaReaders[i] != NULL ) if ( masaReaders[i] != NULL )
{ {
...@@ -1783,7 +1816,7 @@ int main( ...@@ -1783,7 +1816,7 @@ int main(
zeroPad = delayNumSamples; zeroPad = delayNumSamples;
} }
if ( is_split_pre_rend_mode( &args ) ) if ( is_split_pre_rend_mode( &args ) && !flushRendererLastFrame )
{ {
if ( split_rend_write_bitstream_to_file( hSplitRendFileReadWrite, bitsBuffer.bits, &bitsBuffer.config.bitsRead, if ( split_rend_write_bitstream_to_file( hSplitRendFileReadWrite, bitsBuffer.bits, &bitsBuffer.config.bitsRead,
&bitsBuffer.config.bitsWritten ) != IVAS_ERR_OK ) &bitsBuffer.config.bitsWritten ) != IVAS_ERR_OK )
...@@ -1793,7 +1826,7 @@ int main( ...@@ -1793,7 +1826,7 @@ int main(
} }
} }
if ( audioWriter != NULL ) if ( audioWriter != NULL && !flushRendererLastFrame )
{ {
if ( delayNumSamples * num_out_channels < outBufferSize ) if ( delayNumSamples * num_out_channels < outBufferSize )
{ {
...@@ -1814,7 +1847,7 @@ int main( ...@@ -1814,7 +1847,7 @@ int main(
bitsBuffer.config.bitsWritten = 0; bitsBuffer.config.bitsWritten = 0;
/* Write MASA metadata for MASA outputs */ /* Write MASA metadata for MASA outputs */
if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) if ( !flushRendererLastFrame && ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) )
{ {
IVAS_REND_AudioConfigType inputType1; IVAS_REND_AudioConfigType inputType1;
IVAS_REND_AudioConfigType inputType2; IVAS_REND_AudioConfigType inputType2;
...@@ -1886,7 +1919,8 @@ int main( ...@@ -1886,7 +1919,8 @@ int main(
} }
} }
if ( ( args.inConfig.numAmbisonicsBuses > 0 || args.inConfig.numMultiChannelBuses > 0 || args.inConfig.numMasaBuses > 0 ) && args.inConfig.numAudioObjects > 0 ) if ( ( args.inConfig.numAmbisonicsBuses > 0 || args.inConfig.numMultiChannelBuses > 0 || args.inConfig.numMasaBuses > 0 ) &&
args.inConfig.numAudioObjects > 0 )
{ {
inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED; inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED;
if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK )
...@@ -1903,6 +1937,13 @@ int main( ...@@ -1903,6 +1937,13 @@ int main(
} }
} }
/* no new input was actually read, only delay buffers were flushed
* therefore this is not a real frame */
if ( flushRendererLastFrame )
{
break;
}
frame++; frame++;
if ( !args.quietModeEnabled ) if ( !args.quietModeEnabled )
{ {
...@@ -1915,12 +1956,13 @@ int main( ...@@ -1915,12 +1956,13 @@ int main(
#endif #endif
} }
/* add zeros at the end to have equal length of synthesized signals */ /* add zeros at the end to have equal length of synthesized signals
* the output buffer will contain either leftover input samples from delay aligned inputs
* or zeros for padding */
if ( audioWriter != NULL ) if ( audioWriter != NULL )
{ {
for ( zeroPadToWrite = zeroPad; zeroPadToWrite > frameSize_smpls; zeroPadToWrite -= frameSize_smpls ) for ( zeroPadToWrite = zeroPad; zeroPadToWrite > frameSize_smpls; zeroPadToWrite -= frameSize_smpls )
{ {
memset( outInt16Buffer, 0, outBufferSize * sizeof( int16_t ) );
if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nOutput audio file writer error\n" ); fprintf( stderr, "\nOutput audio file writer error\n" );
...@@ -1928,7 +1970,6 @@ int main( ...@@ -1928,7 +1970,6 @@ int main(
} }
} }
memset( outInt16Buffer, 0, zeroPadToWrite * outBuffer.config.numChannels * sizeof( int16_t ) );
if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK )
{ {
fprintf( stderr, "\nOutput audio file writer error\n" ); fprintf( stderr, "\nOutput audio file writer error\n" );
...@@ -1937,9 +1978,10 @@ int main( ...@@ -1937,9 +1978,10 @@ int main(
zeroPadToWrite = 0; zeroPadToWrite = 0;
} }
if ( args.inConfig.numAudioObjects != 0 && ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) if ( args.inConfig.numAudioObjects != 0 &&
( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) )
{ {
fprintf( stdout, "\n\nMetadata delayed %d subframes\n\n", (int16_t) round( args.syncMdDelay / ( 1000 / IVAS_NUM_FRAMES_PER_SEC / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ) ); fprintf( stdout, "\n\nMetadata delayed %d subframes\n\n", (int16_t) round( args.syncMdDelay / ( 1000.f / IVAS_NUM_FRAMES_PER_SEC / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ) );
} }
if ( !args.quietModeEnabled && args.delayCompensationEnabled ) if ( !args.quietModeEnabled && args.delayCompensationEnabled )
...@@ -1965,6 +2007,8 @@ int main( ...@@ -1965,6 +2007,8 @@ int main(
* Close files and deallocate resources * Close files and deallocate resources
*------------------------------------------------------------------------------------------*/ *------------------------------------------------------------------------------------------*/
mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */
cleanup: cleanup:
free( inpInt16Buffer ); free( inpInt16Buffer );
...@@ -2021,7 +2065,7 @@ cleanup: ...@@ -2021,7 +2065,7 @@ cleanup:
print_mem( NULL ); print_mem( NULL );
#endif #endif
return 0; return mainFailed ? -1 : 0;
} }
...@@ -2540,6 +2584,7 @@ static CmdlnArgs defaultArgs( ...@@ -2540,6 +2584,7 @@ static CmdlnArgs defaultArgs(
const char *executableName ) const char *executableName )
{ {
CmdlnArgs args; CmdlnArgs args;
int16_t i;
strncpy( args.executableName, executableName, RENDERER_MAX_CLI_ARG_LENGTH ); strncpy( args.executableName, executableName, RENDERER_MAX_CLI_ARG_LENGTH );
clearString( args.inputFilePath ); clearString( args.inputFilePath );
...@@ -2558,7 +2603,7 @@ static CmdlnArgs defaultArgs( ...@@ -2558,7 +2603,7 @@ static CmdlnArgs defaultArgs(
args.outConfig.outSetupCustom.num_lfe = 0; args.outConfig.outSetupCustom.num_lfe = 0;
args.inConfig.ambisonicsBuses->audioConfig = IVAS_AUDIO_CONFIG_INVALID; args.inConfig.ambisonicsBuses->audioConfig = IVAS_AUDIO_CONFIG_INVALID;
for ( int32_t i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) for ( i = 0; i < RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS; ++i )
{ {
clearString( args.inMetadataFilePaths[i] ); clearString( args.inMetadataFilePaths[i] );
} }
...@@ -2595,7 +2640,7 @@ static CmdlnArgs defaultArgs( ...@@ -2595,7 +2640,7 @@ static CmdlnArgs defaultArgs(
args.render_framesize = IVAS_RENDER_FRAMESIZE_20MS; args.render_framesize = IVAS_RENDER_FRAMESIZE_20MS;
args.syncMdDelay = 0; args.syncMdDelay = 0;
for ( int32_t i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i )
{ {
args.directivityPatternId[i] = 65535; args.directivityPatternId[i] = 65535;
} }
...@@ -3267,7 +3312,8 @@ static void parseObjectPosition( ...@@ -3267,7 +3312,8 @@ static void parseObjectPosition(
*positionDuration = (uint16_t) strtol( line, &endptr, 10 ); *positionDuration = (uint16_t) strtol( line, &endptr, 10 );
readNextMetadataChunk( line, "\n" ); readNextMetadataChunk( line, "\n" );
read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f,%f", &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6], &meta_prm[7] ); read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f,%f",
&meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6], &meta_prm[7] );
if ( read_values < 2 ) if ( read_values < 2 )
{ {
...@@ -3476,14 +3522,8 @@ static void parseCombinedFormatInput( ...@@ -3476,14 +3522,8 @@ static void parseCombinedFormatInput(
inConfig->numAmbisonicsBuses = 1; inConfig->numAmbisonicsBuses = 1;
inConfig->ambisonicsBuses[0].audioConfig = audioConfig; inConfig->ambisonicsBuses[0].audioConfig = audioConfig;
inConfig->ambisonicsBuses[0].inputChannelIndex = inConfig->numAudioObjects; inConfig->ambisonicsBuses[0].inputChannelIndex = inConfig->numAudioObjects;
inConfig->ambisonicsBuses[0].gain_dB = -6.f; inConfig->ambisonicsBuses[0].gain_dB = 0.f;
*configString += 4; *configString += 4;
/* Modify input gain for objects too */
for ( int16_t i = 0; i < inConfig->numAudioObjects; ++i )
{
inConfig->audioObjects[i].gain_dB = -6.f;
}
} }
else if ( audioConfig == IVAS_AUDIO_CONFIG_MASA1 || audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) else if ( audioConfig == IVAS_AUDIO_CONFIG_MASA1 || audioConfig == IVAS_AUDIO_CONFIG_MASA2 )
{ {
...@@ -3722,6 +3762,7 @@ static void printSupportedAudioConfigs( void ) ...@@ -3722,6 +3762,7 @@ static void printSupportedAudioConfigs( void )
"BINAURAL_SPLIT_CODED", "BINAURAL_SPLIT_CODED",
"BINAURAL_ROOM_IR (output only)", "BINAURAL_ROOM_IR (output only)",
"BINAURAL_ROOM_REVERB (output only)", "BINAURAL_ROOM_REVERB (output only)",
"META (Scene description, input only)",
}; };
fprintf( stdout, "Supported audio formats:\n" ); fprintf( stdout, "Supported audio formats:\n" );
...@@ -3729,6 +3770,7 @@ static void printSupportedAudioConfigs( void ) ...@@ -3729,6 +3770,7 @@ static void printSupportedAudioConfigs( void )
{ {
fprintf( stdout, "%s\n", supportedFormats[i] ); fprintf( stdout, "%s\n", supportedFormats[i] );
} }
fprintf( stdout, "\n" );
return; return;
} }
...@@ -3739,7 +3781,7 @@ static ivas_error parseLfePanMtxFile( ...@@ -3739,7 +3781,7 @@ static ivas_error parseLfePanMtxFile(
{ {
int16_t i, lfe_in, ch_out; int16_t i, lfe_in, ch_out;
const char *tok; const char *tok;
char line[200]; /* > (10 chars * IVAS_MAX_OUTPUT_CHANNELS) i.e. "-999, " */ char line[200]; /* > (10 chars * RENDERER_MAX_OUTPUT_CHANNELS) i.e. "-999, " */
FILE *mtxFile; FILE *mtxFile;
if ( strlen( lfeRoutingMatrixFilePath ) < 1 ) if ( strlen( lfeRoutingMatrixFilePath ) < 1 )
...@@ -3758,7 +3800,7 @@ static ivas_error parseLfePanMtxFile( ...@@ -3758,7 +3800,7 @@ static ivas_error parseLfePanMtxFile(
any subsequent issue in file reading will gracefully exit the function */ any subsequent issue in file reading will gracefully exit the function */
for ( lfe_in = 0; lfe_in < RENDERER_MAX_INPUT_LFE_CHANNELS; lfe_in++ ) for ( lfe_in = 0; lfe_in < RENDERER_MAX_INPUT_LFE_CHANNELS; lfe_in++ )
{ {
for ( i = 0; i < IVAS_MAX_OUTPUT_CHANNELS; i++ ) for ( i = 0; i < RENDERER_MAX_OUTPUT_CHANNELS; i++ )
{ {
( *lfePanMtx )[lfe_in][i] = 0.0f; ( *lfePanMtx )[lfe_in][i] = 0.0f;
} }
...@@ -3786,7 +3828,7 @@ static ivas_error parseLfePanMtxFile( ...@@ -3786,7 +3828,7 @@ static ivas_error parseLfePanMtxFile(
{ {
continue; continue;
} }
if ( ch_out > IVAS_MAX_OUTPUT_CHANNELS ) if ( ch_out > RENDERER_MAX_OUTPUT_CHANNELS )
{ {
break; break;
} }
...@@ -3827,13 +3869,13 @@ static void convertInputBuffer( ...@@ -3827,13 +3869,13 @@ static void convertInputBuffer(
if ( cldfb_in_flag ) if ( cldfb_in_flag )
{ {
int16_t slotIdx, numCldfbBands, numFloatPcmSamples; int16_t slotIdx, numCldfbBands, numFloatPcmSamples;
float fIn[IVAS_MAX_OUTPUT_CHANNELS][IVAS_MAX_FRAME_SIZE]; float fIn[RENDERER_MAX_OUTPUT_CHANNELS][IVAS_MAX_FRAME_SIZE];
numFloatPcmSamples = numFloatSamplesPerChannel >> 1; numFloatPcmSamples = numFloatSamplesPerChannel >> 1;
numCldfbBands = numFloatPcmSamples / IVAS_CLDFB_NO_COL_MAX; numCldfbBands = numFloatPcmSamples / IVAS_CLDFB_NO_COL_MAX;
/* CLDFB Analysis*/ /* CLDFB Analysis*/
assert( numIntSamplesPerChannel <= IVAS_MAX_OUTPUT_CHANNELS * IVAS_MAX_FRAME_SIZE ); assert( numIntSamplesPerChannel <= RENDERER_MAX_OUTPUT_CHANNELS * IVAS_MAX_FRAME_SIZE );
for ( smpl = 0; smpl < numFloatPcmSamples; ++smpl ) for ( smpl = 0; smpl < numFloatPcmSamples; ++smpl )
{ {
for ( chnl = 0; chnl < numChannels; ++chnl ) for ( chnl = 0; chnl < numChannels; ++chnl )
...@@ -3908,9 +3950,9 @@ static void convertOutputBuffer( ...@@ -3908,9 +3950,9 @@ static void convertOutputBuffer(
if ( cldfb_in_flag ) if ( cldfb_in_flag )
{ {
int16_t slotIdx, numCldfbBands, numPcmSamples, b; int16_t slotIdx, numCldfbBands, numPcmSamples, b;
float fIn[IVAS_MAX_OUTPUT_CHANNELS][IVAS_MAX_FRAME_SIZE]; float fIn[RENDERER_MAX_OUTPUT_CHANNELS][IVAS_MAX_FRAME_SIZE];
float re[IVAS_MAX_OUTPUT_CHANNELS][IVAS_CLDFB_NO_COL_MAX][IVAS_CLDFB_NO_CHANNELS_MAX]; float re[RENDERER_MAX_OUTPUT_CHANNELS][IVAS_CLDFB_NO_COL_MAX][IVAS_CLDFB_NO_CHANNELS_MAX];
float im[IVAS_MAX_OUTPUT_CHANNELS][IVAS_CLDFB_NO_COL_MAX][IVAS_CLDFB_NO_CHANNELS_MAX]; float im[RENDERER_MAX_OUTPUT_CHANNELS][IVAS_CLDFB_NO_COL_MAX][IVAS_CLDFB_NO_CHANNELS_MAX];
numPcmSamples = numSamplesPerChannel >> 1; numPcmSamples = numSamplesPerChannel >> 1;
numCldfbBands = numPcmSamples / IVAS_CLDFB_NO_COL_MAX; numCldfbBands = numPcmSamples / IVAS_CLDFB_NO_COL_MAX;
......
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
<body> <body>
<h1>Ivas BASOP code Development</h1> <h1>Ivas BASOP code Development</h1>
<h2>Regression tracking</h2>
<li><a href="long_term_regression.html">Long term regression</a></li>
<h2>Daily long testvector tests</h2> <h2>Daily long testvector tests</h2>
<ul> <ul>
......
...@@ -53,7 +53,7 @@ fi ...@@ -53,7 +53,7 @@ fi
# Replace only the first occurrence, as "basop" may be present in the later description # Replace only the first occurrence, as "basop" may be present in the later description
# If the format is correct, then before "_basop", only numbers can occur # If the format is correct, then before "_basop", only numbers can occur
float_ref_branchname="${branchname/basop/ref}" float_ref_branchname="${branchname/basop/ref}"
git_result=$(git branch -av) git_result=$(git branch -a)
# If the branch does not exist, default to "float-pc" # If the branch does not exist, default to "float-pc"
if [[ "$git_result" =~ "$float_ref_branchname" ]]; then if [[ "$git_result" =~ "$float_ref_branchname" ]]; then
......
import os
import pandas as pd
import argparse
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
def read_csv_files(root_dir):
"""Read csv files as dictionary of panda dataframes."""
csv_data = {}
for subdir, dirs, files in os.walk(root_dir):
for file in files:
if file.endswith(".csv"):
file_path = os.path.join(subdir, file)
try:
df = pd.read_csv(file_path)
csv_data[file_path] = df
except Exception as e:
print(f"Failed to read {file_path}: {e}")
exit(-1)
return csv_data
def parse_csv_data(csv_data):
"""keep 'testcase', 'format', 'MLD', 'MAX_ABS_DIFF' and add
'date' column."""
cols_to_keep = ["testcase", "format", "MLD", "MAX_ABS_DIFF"]
parsed_data = {}
for key, df in csv_data.items():
cols = [col for col in cols_to_keep if col in df.columns]
date = os.path.basename(os.path.dirname(key))
new_df = df[cols].copy()
new_df["date"] = date
parsed_data[key] = new_df
# concatenate all dataframe in the dictionary
concat_df = pd.concat(parsed_data.values(), ignore_index=True)
return concat_df
def plot_data(df, output_filename):
"""plot max values for 'MLD' and 'MAX_ABS_DIFF' data and save
to html file."""
# Convert 'date' to datetime
df["date"] = pd.to_datetime(df["date"], errors="coerce")
df["MLD"] = pd.to_numeric(df["MLD"], errors="coerce")
df["MAX_ABS_DIFF"] = pd.to_numeric(df["MAX_ABS_DIFF"], errors="coerce")
# Drop rows with NaT and NaN
clean_df = df.dropna(subset=["date", "MLD", "MAX_ABS_DIFF"])
# Group by 'format' and 'date' to get rows with max 'MLD' per group
max_mld = (
clean_df.groupby(["format", "date"])
.apply(lambda x: x.loc[x["MLD"].idxmax()])
.reset_index(drop=True)
)
# Group by 'format' and 'date' to get rows with max 'MAX_ABS_DIFF' per
# group
max_abs_diff = (
clean_df.groupby(["format", "date"])
.apply(lambda x: x.loc[x["MAX_ABS_DIFF"].idxmax()])
.reset_index(drop=True)
)
formats = sorted(clean_df["format"].unique())
fig = make_subplots(
rows=5,
cols=2,
specs=[[{"secondary_y": True}] * 2] * 5,
subplot_titles=[f"{i}" for i in formats],
shared_xaxes="columns",
)
for i, fmt in enumerate(formats):
row = i // 2 + 1
col = i % 2 + 1
data_mld = max_mld[max_mld["format"] == fmt].sort_values("date")
data_diff = max_abs_diff[max_abs_diff["format"]
== fmt].sort_values("date")
# Add max 'MLD' to primary y-axis
fig.add_trace(
go.Scatter(
x=data_mld["date"],
y=data_mld["MLD"],
mode="lines+markers",
name=f" {fmt} - Max MLD",
hovertext=[
f"Testcase: {tc}<br>MLD: {mld:.4f}<br>MAX_ABS_DIFF:"
f"{abs_diff}<br>Format:"
f" {format}<br>Date: {date.date()}"
for tc, mld, abs_diff, format, date in zip(
data_mld["testcase"],
data_mld["MLD"],
data_mld["MAX_ABS_DIFF"],
data_mld["format"],
data_mld["date"],
)
],
hoverinfo="text",
),
row=row,
col=col,
secondary_y=False,
)
# Add max 'MAX_ABS_DIFF' to secondary y-axis
fig.add_trace(
go.Scatter(
x=data_diff["date"],
y=data_diff["MAX_ABS_DIFF"],
mode="lines+markers",
name=f"{fmt} - Max MAX_ABS_DIFF",
hovertext=[
f"Testcase: {tc}<br>MLD: {mld:.4f}<br>MAX_ABS_DIFF:"
f" {abs_diff:.4f}<br>Format:"
f" {format}<br>Date: {date.date()}"
for tc, mld, abs_diff, format, date in zip(
data_diff["testcase"],
data_diff["MLD"],
data_diff["MAX_ABS_DIFF"],
data_diff["format"],
data_diff["date"],
)
],
hoverinfo="text",
),
row=row,
col=col,
secondary_y=True,
)
fig.update_layout(
title_text="Long-term regression: max MLD and max MAX_ABS_DIFF",
legend=dict(x=1, y=1, orientation="v"),
hovermode="x unified",
)
fig.update_xaxes(automargin=True)
fig.update_yaxes(automargin=True)
# Update y-axes titles per subplot
for i in range(10):
yaxis_num = i * 2 + 1
yaxis2_num = yaxis_num + 1
fig["layout"][f"yaxis{yaxis_num}"].update(
title="Max MLD", titlefont=dict(color="blue"), tickfont=dict(color="blue")
)
fig["layout"][f"yaxis{yaxis2_num}"].update(
title="Max MAX_ABS_DIFF",
titlefont=dict(color="green"),
tickfont=dict(color="green"),
)
# Save to html
fig.write_html(output_filename)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Plot long term logs")
parser.add_argument(
"root_dir",
type=str,
help="Root directory containing subdirectories" " with CSV log files",
)
parser.add_argument(
"output_filename",
type=str,
help="Filename of the generated plot. e.g" ". long_term_regression.html",
)
args = parser.parse_args()
csv_data = read_csv_files(args.root_dir)
data = parse_csv_data(csv_data)
plot_data(data, args.output_filename)
...@@ -104,8 +104,9 @@ TESTCASES_MAIN_PC = [ ...@@ -104,8 +104,9 @@ TESTCASES_MAIN_PC = [
"Multi-channel 5_1 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM_REVERB out", "Multi-channel 5_1 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM_REVERB out",
"OSBA 2OA 2ISM bitrate switching, 32kHz in, 48kHz out, BINAURAL_ROOM_REVERB out, JBM Prof 5", "OSBA 2OA 2ISM bitrate switching, 32kHz in, 48kHz out, BINAURAL_ROOM_REVERB out, JBM Prof 5",
] ]
TESTCASES_MAIN_PC_REENABLE = [
"4 ISM with extended metadata at 128 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_REVERB out, rendconf dir w id",
]
def remove_testcases(cfg: Path, testcases: list): def remove_testcases(cfg: Path, testcases: list):
""" """
Go through file line by line and copy all testcases except the given ones Go through file line by line and copy all testcases except the given ones
...@@ -136,7 +137,11 @@ if __name__ == "__main__": ...@@ -136,7 +137,11 @@ if __name__ == "__main__":
testcases = TESTCASES_MAIN testcases = TESTCASES_MAIN
if args.use_main_pc_set: if args.use_main_pc_set:
# Add further unsupported test cases
testcases.extend(TESTCASES_MAIN_PC) testcases.extend(TESTCASES_MAIN_PC)
# Re-enable test cases that are now supported
for case in TESTCASES_MAIN_PC_REENABLE:
testcases.remove(case)
for f in args.cfg_files: for f in args.cfg_files:
remove_testcases(f, testcases) remove_testcases(f, testcases)
...@@ -69,6 +69,7 @@ JOBS_BASOP_REPO = { ...@@ -69,6 +69,7 @@ JOBS_BASOP_REPO = {
"complexity-stereo-in-stereo-out": "Stereo in, Stereo out", "complexity-stereo-in-stereo-out": "Stereo in, Stereo out",
# "timeless" jobs (not complexity) # "timeless" jobs (not complexity)
"coverage-test-on-main-scheduled": "Coverage", "coverage-test-on-main-scheduled": "Coverage",
"ivas-long-term-job-logs-overview": "Long term logs",
} }
JOBS_FOR_PROJECT_ID = { JOBS_FOR_PROJECT_ID = {
......
...@@ -52,7 +52,6 @@ else ...@@ -52,7 +52,6 @@ else
usage usage
fi fi
cfg=./scripts/config/ci_linux.json cfg=./scripts/config/ci_linux.json
dly_profile=./scripts/dly_error_profiles/dly_error_profile_10_smoke_test.dat dly_profile=./scripts/dly_error_profiles/dly_error_profile_10_smoke_test.dat
ism_md_cmd="--ism_metadata_files /usr/local/ltv/ltvISM1.csv /usr/local/ltv/ltvISM2.csv /usr/local/ltv/ltvISM3.csv /usr/local/ltv/ltvISM4.csv" ism_md_cmd="--ism_metadata_files /usr/local/ltv/ltvISM1.csv /usr/local/ltv/ltvISM2.csv /usr/local/ltv/ltvISM3.csv /usr/local/ltv/ltvISM4.csv"
...@@ -77,10 +76,6 @@ if [ $BUILD -eq 1 ];then ...@@ -77,10 +76,6 @@ if [ $BUILD -eq 1 ];then
fi fi
# prepare combined format test signals
echo -e "\n======================= 0. preparing combined format test inputs =======================\n\n"
./scripts/prepare_combined_format_inputs.py
# run all modes vanilla-fashion # run all modes vanilla-fashion
# treat ISM modes separately because passing the metadata files to MASA modes causes crashes # treat ISM modes separately because passing the metadata files to MASA modes causes crashes
readarray -t ism_modes < <(./scripts/runIvasCodec.py -l | grep ISM) readarray -t ism_modes < <(./scripts/runIvasCodec.py -l | grep ISM)
......
...@@ -61,10 +61,6 @@ duration_arg="" ...@@ -61,10 +61,6 @@ duration_arg=""
complexity_cmd="--checks COMPLEXITY --create_complexity_tables" complexity_cmd="--checks COMPLEXITY --create_complexity_tables"
max_num_workers="--max_workers $MAX_CORES" max_num_workers="--max_workers $MAX_CORES"
# prepare combined format test signals
echo "\n======================= 0. preparing combined format test inputs =======================\n\n"
./scripts/prepare_combined_format_inputs.py
# Modes # Modes
mono_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^mono) mono_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^mono)
FOA_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^FOA) FOA_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^FOA)
...@@ -91,7 +87,6 @@ ISM_plus2_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^ISM+2) ...@@ -91,7 +87,6 @@ ISM_plus2_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^ISM+2)
ISM_plus3_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^ISM+3) ISM_plus3_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^ISM+3)
ISM_plus4_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^ISM+4) ISM_plus4_modes=$(./scripts/IvasBuildAndRunChecks.py -l | grep ^ISM+4)
echo "\n======================= 1. Mono =======================\n\n" echo "\n======================= 1. Mono =======================\n\n"
./scripts/IvasBuildAndRunChecks.py $complexity_cmd ltv_complexity_mono_no_fec -m $mono_modes -p $cfg $duration_arg $max_num_workers | tee smoke_test_output_mono.txt ./scripts/IvasBuildAndRunChecks.py $complexity_cmd ltv_complexity_mono_no_fec -m $mono_modes -p $cfg $duration_arg $max_num_workers | tee smoke_test_output_mono.txt
rm -r ./COMPLEXITY/dec/ rm -r ./COMPLEXITY/dec/
......
...@@ -552,7 +552,6 @@ ivas_error config_acelp1( ...@@ -552,7 +552,6 @@ ivas_error config_acelp1(
const int16_t tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ const int16_t tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */
const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */
const int16_t idchan, /* i : stereo channel ID */ const int16_t idchan, /* i : stereo channel ID */
const int16_t active_cnt, /* i : Active frame counter */
const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/
const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */
const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */
...@@ -770,7 +769,7 @@ ivas_error config_acelp1( ...@@ -770,7 +769,7 @@ ivas_error config_acelp1(
bits -= acelp_cfg->mid_lsf_bits; bits -= acelp_cfg->mid_lsf_bits;
} }
else if ( tdm_lp_reuse_flag == 1 && idchan == 1 && active_cnt != 1 ) else if ( tdm_lp_reuse_flag == 1 && idchan == 1 )
{ {
bits -= TDM_IC_LSF_PRED_BITS; bits -= TDM_IC_LSF_PRED_BITS;
} }
......
...@@ -50,6 +50,9 @@ ...@@ -50,6 +50,9 @@
#include "ivas_cnst.h" #include "ivas_cnst.h"
#include "ivas_rom_com.h" #include "ivas_rom_com.h"
#include "wmc_auto.h" #include "wmc_auto.h"
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
#include <string.h>
#endif
#ifdef DEBUGGING #ifdef DEBUGGING
...@@ -209,6 +212,9 @@ ivas_error ind_list_realloc( ...@@ -209,6 +212,9 @@ ivas_error ind_list_realloc(
{ {
new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].id = old_ind_list[i].id;
new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].value = old_ind_list[i].value;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 );
#endif
} }
new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits;
} }
...@@ -217,6 +223,9 @@ ivas_error ind_list_realloc( ...@@ -217,6 +223,9 @@ ivas_error ind_list_realloc(
for ( ; i < max_num_indices; i++ ) for ( ; i < max_num_indices; i++ )
{ {
new_ind_list[i].nb_bits = -1; new_ind_list[i].nb_bits = -1;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
sprintf( new_ind_list[i].function_name, "RESET in ind_list_realloc" );
#endif
} }
/* update parameters in all SCE elements */ /* update parameters in all SCE elements */
...@@ -802,6 +811,9 @@ void move_indices( ...@@ -802,6 +811,9 @@ void move_indices(
new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].id = old_ind_list[i].id;
new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].value = old_ind_list[i].value;
new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 );
#endif
old_ind_list[i].nb_bits = -1; old_ind_list[i].nb_bits = -1;
} }
...@@ -813,8 +825,14 @@ void move_indices( ...@@ -813,8 +825,14 @@ void move_indices(
new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].id = old_ind_list[i].id;
new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].value = old_ind_list[i].value;
new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 );
#endif
old_ind_list[i].nb_bits = -1; old_ind_list[i].nb_bits = -1;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
sprintf( old_ind_list[i].function_name, "RESET in move_indices" );
#endif
} }
} }
...@@ -895,6 +913,1880 @@ ivas_error check_ind_list_limits( ...@@ -895,6 +913,1880 @@ ivas_error check_ind_list_limits(
return error; return error;
} }
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
const char *named_indices_table[] = {
"IND_IVAS_FORMAT",
"IND_SMODE_OMASA",
"IND_SMODE",
"IND_SID_TYPE",
"IND_BWIDTH",
"IND_CORE",
"IND_PPP_NELP_MODE",
"IND_ACELP_16KHZ",
"IND_ACELP_SIGNALLING",
"IND_SHARP_FLAG",
"IND_MDCT_CORE",
"IND_TCX_CORE",
"IND_BWE_FLAG",
"IND_HQ_SWITCHING_FLG",
"IND_LAST_L_FRAME",
"IND_VAD_FLAG",
"IND_HQ_BWIDTH",
"IND_TC_SUBFR",
"IND_TC_SUBFR",
"IND_TC_SUBFR",
"IND_TC_SUBFR",
"IND_GSC_IVAS_SP",
"IND_LSF_PREDICTOR_SELECT_BIT",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_LSF",
"IND_MID_FRAME_LSF_INDEX",
"IND_ISF_0_0",
"IND_ISF_0_1",
"IND_ISF_0_2",
"IND_ISF_0_3",
"IND_ISF_0_4",
"IND_ISF_1_0",
"IND_ISF_1_1",
"IND_ISF_1_2",
"IND_ISF_1_3",
"IND_ISF_1_4",
"IND_IC_LSF_PRED",
"IND_GSC_ATTACK",
"IND_GSC_SWB_SPEECH",
"IND_NOISE_LEVEL",
"IND_HF_NOISE",
"IND_PIT_CONTR_IDX",
"IND_FEC_CLAS",
"IND_FEC_ENR",
"IND_FEC_POS",
"IND_ES_PRED",
"IND_HARM_FLAG_ACELP",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"IND_ALG_CDBK_4T64_2_24KBIT",
"TAG_ALG_CDBK_4T64_24KBIT_END",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"IND_HF_GAIN_MODIFICATION",
"TAG_ACELP_SUBFR_LOOP_END",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_MEAN_GAIN2",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_TMP",
"IND_Y_GAIN_HF",
"IND_HQ_VOICING_FLAG",
"IND_HQ_SWB_CLAS",
"IND_NF_IDX",
"IND_LC_MODE",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_YNRM",
"IND_SWB_FENV_HQ",
"IND_SWB_FENV_HQ",
"IND_SWB_FENV_HQ",
"IND_SWB_FENV_HQ",
"IND_SWB_FENV_HQ",
"IND_FB_FENV_HQ",
"IND_FB_FENV_HQ",
"IND_FB_FENV_HQ",
"IND_FB_FENV_HQ",
"IND_FB_FENV_HQ",
"IND_DELTA_ENV_HQ",
"IND_HVQ_BWE_NL",
"IND_HVQ_BWE_NL",
"IND_NUM_PEAKS",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_POS_IDX",
"IND_FLAGN",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_PG_IDX",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_PEAKS",
"IND_HVQ_NF_GAIN",
"IND_HVQ_NF_GAIN",
"IND_HQ2_SWB_CLAS",
"IND_HQ2_DENG_MODE",
"IND_HQ2_DENG_8SMODE",
"IND_HQ2_DENG_8SMODE_N0",
"IND_HQ2_DENG_8SMODE_N1",
"IND_HQ2_DENG_8SPOS",
"IND_HQ2_DENG_8SDEPTH",
"IND_HQ2_DENG_HMODE",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_DIFF_ENERGY",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_P2A_FLAGS",
"IND_HQ2_LAST_BA_MAX_BAND",
"IND_HQ2_LAST_BA_MAX_BAND",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_START",
"IND_RC_END",
"IND_HVQ_PVQ_GAIN",
"IND_HVQ_PVQ_GAIN",
"IND_HVQ_PVQ_GAIN",
"IND_HVQ_PVQ_GAIN",
"IND_HVQ_PVQ_GAIN",
"IND_HVQ_PVQ_GAIN",
"IND_HVQ_PVQ_GAIN",
"IND_HVQ_PVQ_GAIN",
"IND_NOISINESS",
"IND_ENERGY",
"IND_CNG_HO",
"IND_SID_BW",
"IND_CNG_ENV1",
"IND_WB_FENV",
"IND_WB_CLASS",
"IND_IG1",
"IND_IG2A",
"IND_IG2B",
"IND_NELP_FID",
"IND_DELTALAG",
"IND_POWER",
"IND_AMP0",
"IND_AMP1",
"IND_GLOBAL_ALIGNMENT",
"IND_PVQ_FINE_GAIN",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_UV_FLAG",
"IND_SHB_SUBGAIN",
"IND_SHB_FRAMEGAIN",
"IND_STEREO_ICBWE_MSFLAG",
"IND_SHB_ENER_SF",
"IND_SHB_RES_GS",
"IND_SHB_RES_GS",
"IND_SHB_RES_GS",
"IND_SHB_RES_GS",
"IND_SHB_RES_GS",
"IND_SHB_VF",
"IND_SHB_LSF",
"IND_SHB_LSF",
"IND_SHB_LSF",
"IND_SHB_LSF",
"IND_SHB_LSF",
"IND_SHB_MIRROR",
"IND_SHB_GRID",
"IND_SWB_CLASS",
"IND_SWB_TENV",
"IND_SWB_TENV",
"IND_SWB_TENV",
"IND_SWB_TENV",
"IND_SWB_FENV",
"IND_SWB_FENV",
"IND_SWB_FENV",
"IND_SWB_FENV",
"IND_SHB_CNG_GAIN",
"IND_DITHERING",
"IND_FB_SLOPE",
"IND_HQ2_SPT_SHORTEN",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_TCQ",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_SUBBAND_GAIN",
"IND_HQ2_DUMMY",
"IND_LAGINDICES",
"IND_NOISEG",
"IND_AUDIO_GAIN",
"IND_AUDIO_DELAY",
"IND_AUDIO_DELAY",
"IND_AUDIO_DELAY",
"IND_AUDIO_DELAY",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"IND_NQ2",
"TAG_HR_BWE_LOOP_END",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_CELP_SUBFRAME",
"IND_CORE_SWITCHING_AUDIO_DELAY",
"IND_CORE_SWITCHING_AUDIO_GAIN",
"IND_STEREO_ICBWE_REF",
"IND_STEREO_ICBWE_SP",
"IND_STEREO_ICBWE_GS",
"IND_STEREO_REFCHAN",
"IND_STEREO_CORRSTATS",
"IND_STEREO_GD",
"IND_STEREO_LRTD_FLAG",
"IND_STEREO_LPC_REUSE",
"IND_STEREO_TD_ALPHA",
"IND_STEREO_2ND_CODER_T",
"IND_UNUSED"
};
#endif
/*-------------------------------------------------------------------* /*-------------------------------------------------------------------*
* push_indice() * push_indice()
...@@ -965,6 +2857,9 @@ ivas_error push_indice( ...@@ -965,6 +2857,9 @@ ivas_error push_indice(
hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id;
hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits;
hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100 );
#endif
} }
} }
...@@ -973,6 +2868,9 @@ ivas_error push_indice( ...@@ -973,6 +2868,9 @@ ivas_error push_indice(
hBstr->ind_list[i].id = id; hBstr->ind_list[i].id = id;
hBstr->ind_list[i].value = value; hBstr->ind_list[i].value = value;
hBstr->ind_list[i].nb_bits = nb_bits; hBstr->ind_list[i].nb_bits = nb_bits;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( hBstr->ind_list[i].function_name, named_indices_table[id], 100 );
#endif
/* updates */ /* updates */
hBstr->nb_ind_tot++; hBstr->nb_ind_tot++;
...@@ -987,19 +2885,15 @@ ivas_error push_indice( ...@@ -987,19 +2885,15 @@ ivas_error push_indice(
* Push a new indice into the buffer at the next position * Push a new indice into the buffer at the next position
*-------------------------------------------------------------------*/ *-------------------------------------------------------------------*/
#ifdef DEBUG_BS_READ_WRITE #if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
ivas_error push_next_indice_( ivas_error push_next_indice_(
const char *caller,
#else #else
ivas_error push_next_indice( ivas_error push_next_indice(
#endif #endif
BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
uint16_t value, /* i : value of the quantized indice */ uint16_t value, /* i : value of the quantized indice */
int16_t nb_bits /* i : number of bits used to quantize the indice */ int16_t nb_bits /* i : number of bits used to quantize the indice */
#ifdef DEBUG_BS_READ_WRITE
,
int16_t line,
const char *func
#endif
) )
{ {
int16_t prev_id; int16_t prev_id;
...@@ -1007,9 +2901,6 @@ ivas_error push_next_indice( ...@@ -1007,9 +2901,6 @@ ivas_error push_next_indice(
error = IVAS_ERR_OK; error = IVAS_ERR_OK;
#ifdef DEBUG_BS_READ_WRITE
printf( "%s: %d: %d: %d\n", func, line, nb_bits, value );
#endif
#ifdef DEBUGGING #ifdef DEBUGGING
if ( nb_bits < ( 32 - 1 ) && ( value >> nb_bits ) > 0 ) if ( nb_bits < ( 32 - 1 ) && ( value >> nb_bits ) > 0 )
{ {
...@@ -1043,6 +2934,9 @@ ivas_error push_next_indice( ...@@ -1043,6 +2934,9 @@ ivas_error push_next_indice(
hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id;
hBstr->ind_list[hBstr->nb_ind_tot].value = value; hBstr->ind_list[hBstr->nb_ind_tot].value = value;
hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100 );
#endif
/* updates */ /* updates */
hBstr->nb_ind_tot++; hBstr->nb_ind_tot++;
...@@ -1057,19 +2951,15 @@ ivas_error push_next_indice( ...@@ -1057,19 +2951,15 @@ ivas_error push_next_indice(
* Push a bit buffer into the buffer at the next position * Push a bit buffer into the buffer at the next position
*-------------------------------------------------------------------*/ *-------------------------------------------------------------------*/
#ifdef DEBUG_BS_READ_WRITE #if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
ivas_error push_next_bits_( ivas_error push_next_bits_(
const char *caller,
#else #else
ivas_error push_next_bits( ivas_error push_next_bits(
#endif #endif
BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
const uint16_t bits[], /* i : bit buffer to pack, sequence of single bits */ const uint16_t bits[], /* i : bit buffer to pack, sequence of single bits */
const int16_t nb_bits /* i : number of bits to pack */ const int16_t nb_bits /* i : number of bits to pack */
#ifdef DEBUG_BS_READ_WRITE
,
int16_t line,
const char *func
#endif
) )
{ {
uint16_t code; uint16_t code;
...@@ -1079,9 +2969,6 @@ ivas_error push_next_bits( ...@@ -1079,9 +2969,6 @@ ivas_error push_next_bits(
ivas_error error; ivas_error error;
error = IVAS_ERR_OK; error = IVAS_ERR_OK;
#ifdef DEBUG_BS_READ_WRITE
printf( "%s: %d: %d\n", func, line, nb_bits );
#endif
ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; ptr = &hBstr->ind_list[hBstr->nb_ind_tot];
...@@ -1112,11 +2999,11 @@ ivas_error push_next_bits( ...@@ -1112,11 +2999,11 @@ ivas_error push_next_bits(
ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; ptr = &hBstr->ind_list[hBstr->nb_ind_tot];
ptr->value = code; ptr->value = code;
#ifdef DEBUG_BS_READ_WRITE
printf( "code: %d\n", code );
#endif
ptr->nb_bits = 16; ptr->nb_bits = 16;
ptr->id = prev_id; ptr->id = prev_id;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( ptr->function_name, caller, 100 );
#endif
hBstr->nb_ind_tot++; hBstr->nb_ind_tot++;
++ptr; ++ptr;
} }
...@@ -1135,11 +3022,11 @@ ivas_error push_next_bits( ...@@ -1135,11 +3022,11 @@ ivas_error push_next_bits(
ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; ptr = &hBstr->ind_list[hBstr->nb_ind_tot];
ptr->value = bits[i]; ptr->value = bits[i];
#ifdef DEBUG_BS_READ_WRITE
printf( "value: %d\n", ptr->value );
#endif
ptr->nb_bits = 1; ptr->nb_bits = 1;
ptr->id = prev_id; ptr->id = prev_id;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( ptr->function_name, caller, 100 );
#endif
hBstr->nb_ind_tot++; hBstr->nb_ind_tot++;
++ptr; ++ptr;
} }
...@@ -1209,6 +3096,9 @@ uint16_t delete_indice( ...@@ -1209,6 +3096,9 @@ uint16_t delete_indice(
hBstr->ind_list[j].id = hBstr->ind_list[i].id; hBstr->ind_list[j].id = hBstr->ind_list[i].id;
hBstr->ind_list[j].value = hBstr->ind_list[i].value; hBstr->ind_list[j].value = hBstr->ind_list[i].value;
hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100 );
#endif
} }
j++; j++;
...@@ -1220,6 +3110,9 @@ uint16_t delete_indice( ...@@ -1220,6 +3110,9 @@ uint16_t delete_indice(
{ {
/* reset the shifted indices at the end of the list */ /* reset the shifted indices at the end of the list */
hBstr->ind_list[j].nb_bits = -1; hBstr->ind_list[j].nb_bits = -1;
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
sprintf( hBstr->ind_list[j].function_name, "RESET in delete_indice" );
#endif
} }
return i - j; return i - j;
...@@ -1666,6 +3559,73 @@ static ivas_error write_indices_element( ...@@ -1666,6 +3559,73 @@ static ivas_error write_indices_element(
} }
} }
#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
if ( is_SCE ) /* EVS and SCE */
{
static FILE *f1 = 0;
if ( f1 == 0 )
f1 = fopen( "bitstream_text", "w" );
for ( int16_t i = 0; i < sts[0]->hBstr->nb_ind_tot; i++ )
{
Indice *ind_list = sts[0]->hBstr->ind_list;
int16_t value = ind_list[i].value;
int16_t nb_bits = ind_list[i].nb_bits;
char *function_name = ind_list[i].function_name;
fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value );
}
if ( st_ivas->hSCE[element_id]->hMetaData != NULL )
{
for ( int16_t i = 0; i < st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; i++ )
{
Indice *ind_list = st_ivas->hSCE[element_id]->hMetaData->ind_list;
int16_t value = ind_list[i].value;
int16_t nb_bits = ind_list[i].nb_bits;
char *function_name = ind_list[i].function_name;
fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value );
}
}
}
else
{
static FILE *f1 = 0;
if ( f1 == 0 )
f1 = fopen( "bitstream_text", "w" );
for ( n = 0; n < n_channels; n++ )
{
for ( int16_t i = 0; i < sts[n]->hBstr->nb_ind_tot; i++ )
{
Indice *ind_list = sts[n]->hBstr->ind_list;
int16_t value = ind_list[i].value;
int16_t nb_bits = ind_list[i].nb_bits;
char *function_name = ind_list[i].function_name;
fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, n, i, function_name, nb_bits, value );
}
}
if ( st_ivas->hCPE[element_id]->hMetaData != NULL )
{
for ( int16_t i = 0; i < st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; i++ )
{
Indice *ind_list = st_ivas->hCPE[element_id]->hMetaData->ind_list;
int16_t value = ind_list[i].value;
int16_t nb_bits = ind_list[i].nb_bits;
char *function_name = ind_list[i].function_name;
fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, -1, i, function_name, nb_bits, value );
}
}
}
#endif
/*----------------------------------------------------------------* /*----------------------------------------------------------------*
* Clearing of indices * Clearing of indices
* Reset index pointers * Reset index pointers
......
...@@ -524,6 +524,7 @@ enum ...@@ -524,6 +524,7 @@ enum
#define ACELP_TCX_TRANS_NS 1250000 /* Duration of the ACELP->TCX overlap - 1.25 ms */ #define ACELP_TCX_TRANS_NS 1250000 /* Duration of the ACELP->TCX overlap - 1.25 ms */
#define L_FRAME_MAX L_FRAME48k /* Max 20ms frame size @48kHz */ #define L_FRAME_MAX L_FRAME48k /* Max 20ms frame size @48kHz */
#define L_FRAME_PLUS 1200 /* Max frame size (long TCX frame) */ #define L_FRAME_PLUS 1200 /* Max frame size (long TCX frame) */
#define L_FRAME_PLUS_INTERNAL 800 /* Max frame size (long TCX frame) at maximum internal sampling rate */
#define L_MDCT_OVLP_MAX NS2SA( 48000, ACELP_LOOK_NS ) /* = Max mdct overlap */ #define L_MDCT_OVLP_MAX NS2SA( 48000, ACELP_LOOK_NS ) /* = Max mdct overlap */
#define N_TCX10_MAX 480 /* Max size of TCX10 MDCT spectrum */ #define N_TCX10_MAX 480 /* Max size of TCX10 MDCT spectrum */
#define BITS_TEC 1 /* number of bits for TEC */ #define BITS_TEC 1 /* number of bits for TEC */
......
...@@ -50,8 +50,7 @@ ...@@ -50,8 +50,7 @@
#define IVAS_MAX_BITS_PER_FRAME ( 512000 / IVAS_NUM_FRAMES_PER_SEC ) /* maximum bits per frame; corresponds to maximum bitrate of 512 kbps */ #define IVAS_MAX_BITS_PER_FRAME ( 512000 / IVAS_NUM_FRAMES_PER_SEC ) /* maximum bits per frame; corresponds to maximum bitrate of 512 kbps */
#define IVAS_MAX_NUM_OBJECTS 4 #define IVAS_MAX_NUM_OBJECTS 4
#define IVAS_MAX_INPUT_CHANNELS 16 #define IVAS_MAX_LS_CHANNELS 16
#define IVAS_MAX_OUTPUT_CHANNELS 16 /* Note: there is an exception for OSBA and EXT otuput where it can be 20 (HOA3 + 4 ISM channels) */
#define IVAS_CLDFB_NO_COL_MAX 16 #define IVAS_CLDFB_NO_COL_MAX 16
#define IVAS_CLDFB_NO_CHANNELS_MAX 60 #define IVAS_CLDFB_NO_CHANNELS_MAX 60
...@@ -190,10 +189,10 @@ typedef struct ivas_LS_setup_custom IVAS_LSSETUP_CUSTOM_STRUCT; ...@@ -190,10 +189,10 @@ typedef struct ivas_LS_setup_custom IVAS_LSSETUP_CUSTOM_STRUCT;
typedef struct _IVAS_LS_CUSTOM_LAYOUT typedef struct _IVAS_LS_CUSTOM_LAYOUT
{ {
int16_t num_spk; int16_t num_spk;
float azimuth[IVAS_MAX_OUTPUT_CHANNELS]; float azimuth[IVAS_MAX_LS_CHANNELS];
float elevation[IVAS_MAX_OUTPUT_CHANNELS]; float elevation[IVAS_MAX_LS_CHANNELS];
int16_t num_lfe; int16_t num_lfe;
int16_t lfe_idx[IVAS_MAX_OUTPUT_CHANNELS]; int16_t lfe_idx[IVAS_MAX_LS_CHANNELS];
} IVAS_CUSTOM_LS_DATA; } IVAS_CUSTOM_LS_DATA;
......